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 등으로 사용 됩니다.
customIdprimary 키로 자동 증가값이 아닌 사용자 정의값을 사용할때만 true 값을 정의하도록 합니다.
이 값이 true 이면 skrull 은 SQL 문에 자동 증가값을 사용 하지 않는다고 판단하고,
primary 키값을 직접 파라미터로 부터 받아서 처리하는 방식으로 SQL 을 생성합니다.
sequenceNameoracle, postgreSQL 등에서 sequence 를 사용하여 primary key 값을 결정할때, 해당 sequence 명을 입력합니다.

2. columnConfig

컬럼의 속성을 정의 합니다.

신규 구축하는 프로젝트라면 이 설정을 enum 을 사용하는 경우 외에는 특별히 설정할 필요는 없습니다.
아무런 설정을 하지 않아도, jdbc 타입에 맞춰 java type 이 결정되어 지고, java field name 또한 camel case 로 자동 변환 됩니다.

반면, 기존 legacy 시스템 기반의 프로젝트의 경우에는, 목적에 맞지 않는 type 과, 네이밍 문제 등으로 인해 columnConfig 설정이 필요할 경우가 많이 생깁니다.

attribute설명
columnName대상이 되는 컬럼명 입력합니다.
fieldNamejava domain 모델에 사용할 field 명을 입력합니다.
mappedTypejava type 을 입력합니다.
IDE의 코드 어시스트 기능을 통해 지원되는 type(모두 M_ 으로 시작) 들을 볼 수 있습니다.
mappedUserTypemappedType 에 정의되지 않은 class 를 java type 으로 사용하려고 할때 입력합니다.
주로 type 으로 enum 을 적용할때 이 속성을 사용합니다.
패키지명을 포함한 풀네임을 적습니다.
sequenceNameoracle, 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 플러그인 실행시 수정된 내용이 사라지게 되기 때문입니다.

즉, implementsInterfacegenerated-java 폴더에 생성되는 domain 클래스에 인터페이스 상속을 정의해야 할때 사용하도록 합니다.