ibatis 1:N 관계에 대한 처리

프로그래밍/iBatis 2009. 12. 15. 14:45

관계형 데이터 베이스에서 테이블간의 관계는 필연적으로 나타나게 된다.
테이블간의 관계를 쉽게 쿼리해오기 위해 Hibernate 가 사용되기도 하지만 아직까지는 공부를 안해서인지 정확한 사용법을 모르겠다.
ibatis 매뉴얼을 보던중 설정을 통해 간단하게 처리할 수 있는 방법이 있었다.

예를 들어 회사와 개인의 관계는 흔히 1:N 관계로 표현된다. 회사내에 여러 개인이 포함되는 관계이다. 개인들을 회사로 그룹화 할 수 있을 때
1:N 관계로 말해지곤 한다. 
기존에는  DB 에서 개인에 대한 정보를 가져온뒤 회사 정보가 필요할 때마다 회사 테이블에 쿼리를 날려서 얻어오곤 했다.
하지만 ibatis 에서는 개인정보를 가져오면 회사정보 또한 자동적으로 가져올 수 있도록 설정을 통해 정의할 수 있다.
여기에 데이터가 자주 변하지 않는 회사 테이블에 cacheMedel 을 적용하면 금상첨화라고 할 수 있으려나...

<sqlMap namespace="Company">

<cacheModel id="cache-day" type="LRU">
	<flushInterval hours="24"/>
	<property name="size" value="100"/>
</cacheModel>

<resultMap id="rm-company" class="examples.domain.Company">
	<result property="id" column="COM_ID"/>
	<result property="name" column="COM_NAME"/>
</resultMap>

<select id="getCompany" parameterClass="java.lang.Integer" resultMap="rm-company" cacheModel="cache-day">
	SELECT * 
	FROM company 
	WHERE com_id = #value#
</select>
</sqlMap>

위 설정은 회사 테이블에 대한 일반적인 설정이다. 이 Company.xml 파일을 사용해서 Person.xml 파일에 약간만 수정을 가하면 Person 객체를 가져올 때 Company 객체또한 자동적으로 가져올 수 있다. 회사 정보는 자주 변하지 않기에 해당 getCompany 구문에 cacheModel 을 설정해 놓았다.

<resultMap id="rm-person" class="examples.domain.Person">
	<result property="id" column="PER_ID"/>
	<result property="firstName" column="PER_FIRST_NAME"/>
	<result property="lastName" column="PER_LAST_NAME"/>
	<result property="birthDate" column="PER_BIRTH_DATE"/>
	<result property="weightInKilograms" column="PER_WEIGHT_KG"/>
	<result property="heightInMeters" column="PER_HEIGHT_M"/>
	<result property="company" column="COM_ID" select="getCompany"/>
</resultMap>

<result property="company" column="COM_ID" select="getCompany"/>
이 부분이 추가된 부분이다. person 테이블의 com_id 컬럽의 값으로 getCompany 구문을 실행하라는 의미이다.
그리고 리턴된 Company 객체는 Person 객체의 company property 에 세팅하라는 의미이다.
물론 Person 객체에는 Company 객체를 property 에 담을 수 있도록 Company property 가 정의되어 있어야 한다.

Person person = ex.getPerson(1);
System.out.println( person.getCompany().getName());

따라서 위와 같은 호출이 가능해진다.
: