JeongJin's Blog

Mybatis collection 사용하기 본문

백엔드/Mybatis

Mybatis collection 사용하기

정진킴 2024. 1. 17. 14:04

상세 조회 시 응답 데이터 생성 시 분산된 테이블에서 데이터를 가져온다고 하면 부모 테이블 조회 후 자식 테이블을 조회하는 mapper를 각각 만들어서 서비스 영역에서 요청 후 조립하여 생성하는 로직을 구현한 경험이 있으실 겁니다.

 

mybatis에서는 <resultMap> 태그 하위에 <collection> 태그를 이용하여 한꺼번에 데이터를 바인딩 할 수 있다.

<resultMap id="[resultMap 속성 아이디]" type="[반환할 도메인 클래스]">
	<result property="[도메인 클래스 변수명]" column="[테이블 컬럼명]" />
    ...
	<collection property="[도메인 클래스 변수명]" 
                column="[select 조회 조건 변수명]" 
                select="[쿼리명]" />
    ...
</resultMap>

// 예시
<select id="getEdoc" resultMap="edocMap"></select>
<select id="getPropertyByEdocSeq" resultMap="propertyMap"></select>
<select id="getItemsByEdocSeq" resultMap="itemMap"></select>
<select id="getAttacheFilesByEdocSeq" resultMap="attachFileMap"></select>
<select id="getLinksByEdocSeq" resultMap="linkMap"></select>

// getEdoc 아이디의 resultMap 이 edocMap
<resultMap id="edocMap" type="com.knet.msa.edoc.edoc.domain.Edoc">
    <id property="edocSeq" column="edocSeq" />
    <result property="uuid" column="uuid" />
    ...
    <collection property="properties" column="edocSeq" select="getPropertyByEdocSeq" />
    <collection property="items" column="edocSeq" select="getItemsByEdocSeq" />
    <collection property="attachFiles" column="edocSeq" select="getAttacheFilesByEdocSeq" />
    <collection property="links" column="edocSeq" select="getLinksByEdocSeq" />
</resultMap>

// 클래스 예시
public class Edoc {
	private Long edocSeq;
	private String uuid;

 	// collection property
	List<Property> properties;
	List<Item> items;
	List<AttachFile> attachFiles;
	List<Link> links;
}

 

collection select 속성에 정의한 쿼리명 다른 테이블 조회 시 사용하며 xml에서 <select> 로 정의해서 사용한다.

이렇게 하면 분산 테이블을 각각 조회할 수 있어서 resultMap 에 데이터 바인딩이 가능하다.

 

주의할 점

1. collection column 에 정의하는 변수명은 resultMap 하위에 정의된 태크 property 명을 정의 해야 한다.

 

Mybatis에서 Map과 List 사용 foreach (tistory.com)