본문 바로가기
연재/NHibernate

[챕터3] 도메인 모델 작성 및 간단한 하이버네이트 XML 매핑

by 그저그런보통사람 2011. 8. 7.



지난번 챕터에 이어 이번 챕터에서는 도메인 모델 작성과 간단한 하이버네이트 매핑 작업을 하도록 하겠습니다.
챕터2 에서 작업했던 업무에 대한 ERD의 엔터티를 클래스로 작성합니다.

우선 회원 엔터티부터 시작해볼까요?! 

Joejy0109.Model 프로젝트에 클래스 하나를 추가합니다.


클래스명은 회원이니까 Member 로 짓겠습니다.
Member 클래스를 생성하고 ERD에 정의된 속성을 추가합니다.


"Id" 속성은 ERD의 "회원 번호"가 될 것이고, "UserId"는 "아이디" ... 해서 닉네임(NickName)까지 필요한 속성을 모두 작성했습니다. 이제 Member 클래스는 데이터베이스의 회원 테이블과 매핑되는 도메인 모델이 되었습니다.
하지만 이렇게 도메인 모델 클래스만 작성 했다고 데이터베이스와 매핑될 일은 죽었다 깨어나도 없겠죠.
하이버네이트가 어떻게 클래스와 DB (앞으로 데이터베이스를 DB로 줄여 쓰겠습니다) 테이블과의 중간에서 데이터를 끌어와 클래스 객체를 생성할지나 클래스 객체의 데이터를 어떻게 DB 테이블의 레코드로 추가/수정/삭제 처리할지를 알려면 좀 더 많은 정보가 필요합니다. 그래서 필요한 작업이 xml 메타데이터를 작성하는 것입니다.

매핑을 위한 또 다른 방법...

Joejy0109.DAL 에 ModelMap 폴더를 하나 생성하고 해당 폴더에 xml 파일을 하나 추가합니다. 파일명을 작성할 때 주의할 점은 반드시 .xml 확장자 앞에 .hbm 이 붙어야 한다는 것입니다.
예를 들어 Member 클래스에 대한 xml 매핑 파일명은 Member.xml 이 아니라 Member.hbm.xml 로 해야합니다. 이것은 하이버네이트의 기본 작명규칙이니 꼭 따라주세요. ^^;



그리고 마지막 작업으로 xml 메타데이터 파일의 [속성] 메뉴에서 아래와 같이 "포함 리소스 (Emabadded Recourse)"로 설정해줍니다.



그리고 나서 다음과 같이 xml 파일을 추가하고 아래와 같이 작성합니다.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                   assembly="Joejy0109.Model" 
                   namespace="Joejy0109.Model">
  <class name="Member" table="Members">
    <id name="Id" column="member_no">
      <generator class="native"/>      
    </id>
    <property name="UserId" column="user_id" not-null="true" length="30" />
    <property name="Password" column="user_pwd" not-null="true" length="30" />
    <property name="UserName" column="user_name" not-null="true" length="30" />
    <property name="NickName" column="nick_name" length="30" />
  </class
</hibernate-mapping>
위 xml 에 대한 설명을 시작하겠습니다.

하이버네이트 매핑 파일의 시작 엘리먼트는 hibernate-mapping 입니다.
xmlns 는 규칙화된 기본 속성이고 assembly 와 namespace는 제가 추가한 속성입니다.
assembly 속성은 현 xml 메타데이터가 매핑할 모델 클래스가 포함된 어셈블리명을 입력하고, namespace 속성은 assembly 속성에 정의한 어셈블리 내의 어떤 네임스페이스에 모델 클래스가 위치했는지 입력하면 됩니다. 예를 들어 우리가 Joejy0109.Model 프로젝트에 별도로 폴더를 생성해서 (그 이름이 Domain 이라고 가정하면) 생성한 폴더에 Member 클래스를 추가했다면 namespace는 Joejy0109.Model.Domain 이라고 입력하면 됩니다. 차~~~암 쉽죠잉~~ ^^;

class 엘리먼트는 이름 그대로 우리가 작성한 모델 클래스에 대한 정의입니다.
첫번째 속성으로 name 이 있는데 이 속성에는 클래스명이 들어가면되고 table 속성은 대상 클래스가 매핑될 DB의 테이블명을 입력하면 됩니다. 위에서는 Members 라고 정의했지만, 여러분이 원한다면 "member_list" 나 "MEMBERS" 등으로 입력해도 무방합니다. 나중에 실제 스키마를 생성하면 입력한 그대로 테이블이 생성되는 것을 보실 수 있습니다.

다음으로 class 내에 첫 번째로 추가되어야 하는 (반드시) 엘리먼트로 id 가 있습니다.
id 엘리먼트는 테이블의 식별자로 사용됩니다. 즉 PK 가 되겠습니다.
id 엘리먼트의 첫번째 속성인 name은 모델 클래스의 "Id" 속성명과 동일한 이름으로 입력하고, column 은 DB 테이블의 컬럼명을 입력합니다.

딱봐도 의미가 보이지 않습니까?! 각 엘리먼트의 name 속성은 도메인 모델 클래스의 속성명과 동일합니다. column 속성은 선택적인데, 만약 포함하지 않는다면 자동으로 name 속성에 지정된 이름을 따라갑니다.

id 내에 지정된 generator 는 식별자 데이터를 생성하는 알고리즘 종류를 의미합니다. class 속성명의 의미는 우리가 생각하는 OOP의 클래스가 아닌 "어떤 종류" 인가를 의미합니다. class 값으로 "native"가 지정되었는데, MS-SQL 에서는 identity(1,1) 로 지정됩니다. native 외에 "Identity", "GUID", "sequence", "UUID hex", "Hi/Lo" 등 여러가지 있습니다만, 여기선 일단 그냥 넘어가기로 합니다. ^^;;;

마지막으로 property 가 있습니다.
이 속성은 식별키로 사용되거나 참조 외래키로 사용되는 속성을 제외하고 일반적인 속성을 매핑할 때 사용됩니다.
not-null 속성은 실제 컬럼의 규칙이 null을 허용할지에 대한 속성이고, length는 자료형의 길이가 되겠습니다.
type 속성도 존재해서 varchar 나 nvarchar 를 지정할 수도 있지만, 이식성을 위해 별도로 지정하지 않습니다. 이렇게 되면ms-sql일 경우 nvarchar가 되고 오라클인 경우 varchar2 로 자동 지정됩니다. 다른 매핑 속성도 type을 지정하지 않을 경우 모델 클래스 타입이 DateTime 이면 대상 RDBMS의  날짜형 타입으로, Int 타입이면 기본 숫자형으로 지정됩니다.
좀 더 다양한 옵션이 존재합니다만, 이번 챕터에서는 "간단한" 매핑 작성 시간이므로 요기까지 하겠습니다. 헤헤~~~
 

 
다음 챕터에서는 Member 도메인 클래스가 xml 매핑 파일과 더불어 실제로 DB에 테이블이 생성되는 작업을 간단하게 살펴보고, ERD 설계에서 나타난 여러 엔터티간 연관 관계를 구현해보도록 하겠습니다.

p.s xml 매핑을 좀 더 편하게....




또 다시 커밍 쑤~~~~운!!!!