마이바티스에서 일대다(본문+파일/본문+댓글) 관계 데이터 추출 코-오드

본문에 첨부된 이미지 또는 본문에 달린 답글과 같은 관계를 1:다(1:N) 관계라고 한다.
설계시에 자주 이용되는 패턴인데 구현 방법을 정리해본다.
처음에는 무식하게(?) 본문 리스트를 뽑은 후 for loop를 사용하여 
딸린 댓글/이미지이 있는지 재조회 후에 있을 경우 별도의 모델을 생성하여 추가하는 식으로 작업하고 했다.

낑낑대고 있자 선임분이 mybatis collection 키워드를 알려주셔서 검색해 보았다.
처음에는 가장 기본적인 형태로 시도해 보았다.
아래와 같이 2개의 resultMap을 선언한 후 부모자식관계 형태로 정의한다.

<resultMap id="post" type="map">
<result property="title" column="title">
<result property="content" column="content">
...
<collection property="attachfiles" javaType="java.util.ArrayList" resultMap="attachList"/>
</resultMap>
<resultMap id="attachList" type="map">
<result property="attachfile" column="attachfile">
</resultMap>

정의 후 조인 쿼리를 수행하면 결과내에서 그룹핑 하여 데이터 셋을 만들어 준다.
주의할 점은 데이터 셋의 사이즈가 유동적이다.
일반적인 경우 위와 같은 형태 사용해도 좋으나 스크롤등과 연동하여 사용하는 경우 데이터 셋의 고정적인 사이즈를 확보하여야 한다.
그럴 때에는 Collection 을 위한 내포된(Nested) Select의 경우로 사용하면 된다.
작동원리 1차 리스트(예제에서는 포스팅 리스트를 )를 조회 후에 자바로직에서 for loop와 같이 1차 리스트이 특정 키값을 이용하여 2차 리스트(포스팅에 첨부된 파일)를 조회, 데이터셋에 넣어주는 식이다. 
형태는 아래와 같다.

데이터 세팅을 위한 리저트맵 선언
<resultMap id="post" type="map">
<result property="title" column="title">
<result property="content" column="content">
...
<collection property="attachfiles" javaType="java.util.ArrayList" column="idx" select="selectAttachedImgForList"/>
</resultMap>

...
2차 리스트 조회를 위한 셀렉트 쿼리
 <select id="selectAttachedImgForList" resultType="map">
select a,b,c from tb_attached_file
</select>





adsense