entity-config.xml
location : src/main/config/entity-config/**.xml
관리주체 :개발자
관련 있는 테이블들을 하나의 xml 단위로 묶어서 설정합니다.
TIP
generate 하려는 테이블을 business 영역 단위로 하나의 xml 로 묶어서 관리 합니다.
이는 java package 의 기준이 되기도 합니다.
다음은 member 와 관련 있는 테이블들을 member.xml 에 정의한 예입니다.
<!-- /entity-config/member.xml -->
<skrull>
<entityConfigs>
<!-- 회원 테이블 -->
<entityConfig tableName="tbl_member" subPackage="member" alias="mem">
<!-- 인터페이스 구현이 필요한 경우 -->
<implementsInterfaces>
<implementsInterface fullType="com.unvus.domain.UnvusSecureUser"/>
</implementsInterfaces>
<!-- 재정의가 필요한 컬럼의 경우 -->
<columnConfigs>
<columnConfig columnName="mem_deleteYN" mappedType="M_BOOLEAN"/>
</columnConfigs>
</entityConfig>
<!-- 권한 테이블 -->
<entityConfig tableName="tbl_role" subPackage="member" alias="role"></entityConfig>
</entityConfigs>
</skrull>
gen
플러그인 실행시, 해당 entity config 에 정의된 내용이 반영 되도록 하려면, 반드시 skrull-config.xml
에 등록해 주어야 합니다.
<skrull>
<includes>
<include filename="entity-config/member.xml"/>
...
</includes>
...
</skrull>
skrull-config 를 참고해주세요
1. entityConfig
하나의 테이블을 나타내며 다음과 같은 속성을 가지고 있습니다.
attribute | 설명 |
---|---|
tableName | 대상이 되는 테이블명을 입력합니다. |
subPackage | 비즈니스 도메인 영문명을 입력합니다. 코드 생성시 modules/{subPackage}/ 하위에 domain, repository 패키지가 위치하게 됩니다. |
alias | 테이블의 alias 를 입력합니다. 이는 생성되는 sql 에서 테이블 alias, mybatis dsl alias, javascript domain model 의 기본 alias 등으로 사용 됩니다. |
customId | primary 키로 자동 증가값이 아닌 사용자 정의값을 사용할때만 true 값을 정의하도록 합니다. 이 값이 true 이면 skrull 은 SQL 문에 자동 증가값을 사용 하지 않는다고 판단하고, primary 키값을 직접 파라미터로 부터 받아서 처리하는 방식으로 SQL 을 생성합니다. |
sequenceName | oracle, postgreSQL 등에서 sequence 를 사용하여 primary key 값을 결정할때, 해당 sequence 명을 입력합니다. |
2. columnConfig
컬럼의 속성을 정의 합니다.
신규 구축하는 프로젝트라면 이 설정을 enum 을 사용하는 경우 외에는 특별히 설정할 필요는 없습니다.
아무런 설정을 하지 않아도, jdbc 타입에 맞춰 java type 이 결정되어 지고, java field name 또한 camel case 로 자동 변환 됩니다.
반면, 기존 legacy 시스템 기반의 프로젝트의 경우에는, 목적에 맞지 않는 type 과, 네이밍 문제 등으로 인해 columnConfig
설정이 필요할 경우가 많이 생깁니다.
attribute | 설명 |
---|---|
columnName | 대상이 되는 컬럼명 입력합니다. |
fieldName | java domain 모델에 사용할 field 명을 입력합니다. |
mappedType | java type 을 입력합니다. IDE의 코드 어시스트 기능을 통해 지원되는 type(모두 M_ 으로 시작) 들을 볼 수 있습니다. |
mappedUserType | 위 mappedType 에 정의되지 않은 class 를 java type 으로 사용하려고 할때 입력합니다. 주로 type 으로 enum 을 적용할때 이 속성을 사용합니다. 패키지명을 포함한 풀네임을 적습니다. |
sequenceName | oracle, postgreSQL 등에서 sequence 를 사용하여 primary key 값을 결정할때, 해당 sequence 명을 입력합니다. |
label | 이 값을 정의하면 생성되는 schema.html 문서에 어트리뷰트명 으로 기본 column comment 대신 들어가게 됩니다. |
password | 이 값이 true 이면, 생성되는 schema.html 문서에 암호화대상 으로 표기 됩니다. |
2.1. prefix, suffix
insert, update 할때, 그리고 select 할때, 단순 컬럼명이 아닌 앞뒤로 어떤 문자열들을 조합해야 하는 경우가 있습니다.
주로 dbms function 을 태워야 하는 경우이며, 암호화 솔루션 사용시 특히 많이 사용됩니다.
이러한 경우에는 metaAttribute 를 활용 하도록 합니다.
다음은 휴대폰 번호를 암호화 하는 xx1.enc_varchar2_ins
function 과 복호화 하는 xx1.dec_varchar2_sel
function 을 적용한 예입니다.
<columnConfig columnName="mem_phone" fieldName="phone" password="true" mappedType="M_STRING" label="휴대전화번호">
<metaAttributes>
<metaAttribute name="insPrefix" value="xx1.enc_varchar2_ins("/>
<metaAttribute name="insSuffix" value=", 10, 'PHONE')"/>
<metaAttribute name="selPrefix" value="xx1.dec_varchar2_sel("/>
<metaAttribute name="selSuffix" value=", 10, 'PHONE')"/>
</metaAttributes>
</columnConfig>
insPrefix
,insSuffix
: insert, update 문에서 각각 파라미터 명 앞, 뒤로 붙게 됩니다.selPrefix
,selSuffix
: select 문에서 각각 column 명 앞, 뒤로 붙게 됩니다.
2.2. Mybatis TypeHandler
nv-gen 에 의해서 대부분의 TypeHandler 를 이미 등록되어 있으나, 추가로 특정 컬럼별로 특정 타입핸들러를 적용 할 필요가 있을 수 있습니다.
typeHandler 역시 metaAttribute 를 활용합니다.
다음은 성별 컬럼을 처리하는 com.unvus.mybatis.types.GenderTypeHandler
타입 핸들러의 적용 예입니다.
<columnConfig columnName="mem_gender">
<metaAttributes>
<metaAttribute name="typeHandler" value="com.unvus.mybatis.types.GenderTypeHandler"/>
</metaAttributes>
</columnConfig>
이는 다음과 같은 mapper sql xml 결과를 생성해 냅니다.
<resultMap id="simpleMemberResult_" type="com.unvus.modules.member.domain.Member">
<!-- 생략 -->
<result property="gender" column="mem_gender" jdbcType="VARCHAR" typeHandler="com.unvus.mybatis.types.GenderTypeHandler"/>
<!-- 생략 -->
</resultMap>
<sql id="update_content_">
<!-- 생략 -->
, mem_gender = #{gender, jdbcType=VARCHAR, typeHandler=com.unvus.mybatis.types.GenderTypeHandler}
<!-- 생략 -->
</sql>
<sql id="insert_values_">
<!-- 생략 -->
#{gender, jdbcType=VARCHAR, typeHandler=com.unvus.mybatis.types.GenderTypeHandler},
<!-- 생략 -->
</sql>
3. implementsInterface
생성되어지는 java domain 클래스가 특정 인터페이스를 implements 해야 하는 경우에 사용합니다.
skrull 에 의해 2가지 domain 클래스가 생성됩니다.
- generated-java 폴더에
skrull
에 의해 관리되는 base domain java 파일 - java 폴더에
개발자
에 의해 관리되는 위 base domain 을 상속받는 java 파일
후자의 경우에는 개발자가 직접 implement 할 interface 를 정의하면 되지만,
전자의 경우에는 그렇게 할 수가 없습니다.
왜냐하면, skrull
에 의해 관리되는 파일은 수정을 해도 다음 gen
플러그인 실행시 수정된 내용이 사라지게 되기 때문입니다.
즉, implementsInterface
는 generated-java 폴더에 생성되는 domain 클래스에 인터페이스 상속을 정의해야 할때 사용하도록 합니다.