상세 컨텐츠

본문 제목

Mybatis(마이바티스) resultMap collection 사용

프레임워크/Mybatis

by 최승호 2022. 4. 1. 17:31

본문

resultMap

resultMap은 Mybatis에서 select 결과가 join(조인)과 같이 복잡할 경우에 resultType 대신 사용할 수 있다.

다음은 resultMap에서 사용할 수 있는 속성들이다.

속성 설명
resultMap 결과 매핑 사용하는 가장 상위 엘리먼트. id 속성과 매핑 클래스 정의하는 type속성을 가집니다.
id 기본 키에 해당
result 기본 키가 아닌 나머지 컬럼에 대한 매핑
constructor setter 메서드나 리플렉션을 통해 설정하지 않고 생성자를 통해 값을 설정
association 1:1관계 처리
collection 1:N관계 처리
discriminator 매핑 과정에서 조건 지정하여 값 설정

 

resultMap에서 Collection은 아래 예시와 같이 데이터 구조(1:N 관계)를 가지고 있을 경우 사용할 수 있다.

Java Class 구성

  1) Member.java

@Data
public class Member {
	private String id;
	private String name;
	private ArrayList<Project> projectList;
}

 

  2) Project.java

@Data
public class Project {
	private int project_seq;
	private String id;
	private String title; 
}

 

한 명의 Member가 여러개의 Project를 가지고 있는 1:N의 관계이다.

 

 

Mybatis 구성

  1) mybatis-config.xml

...
	<typeAliases>
		<typeAlias type="member.vo.Member" alias="member"/>
		<typeAlias type="member.vo.Project" alias="project"/>
	</typeAliases>
...
	<mappers>
		<mapper resource="mapper/MemberMapper.xml"/>	
	</mappers>
...

 

  2) MemberMapper.xml

<!-- 프로젝트 조회 -->
<resultMap type="member" id="memberMap">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<collection property="projectList" column="id" javaType="list" ofType="project" select="selectProject">
		<id property="project_seq" column="project_seq"/>
		<result property="id" column="id"/>
		<result property="title" column="title"/>
	</collection>
</resultMap> 
<select id="selectMember" resultMap="memberMap">
	select
		id,
		name
	from 
    	tb_member
</select>

<select id="selectProject" parameterType="string" resultType="project">
	select
		project_seq,
		id,
		title
	from 
		tb_project
	where
		id = #{id}
</select>

 

메인 쿼리는 selectMember이며 resultMap은 memberMap으로 지정되어 있다. tb_member테이블과 tb_project 테이블을 조인하여 결과를 Map 형식으로 가져올 수 있지만 위와 같이 collection을 이용하면 Member 객체 타입으로 바로 가져올 수 있다. 다음은 collection에서 사용할 수 있는 속성 값이다.

 

collection 속성

 

속성 설명
column 데이터베이스의 컬럼명
javaType 패키지를 포함함 클래스명 혹은 타입 별칭
ofType collection의 타입
select 서브쿼리로 실행할 id

주의점

위 방식은 간단한 예제나 작은 프로젝트에서는 괜찮지만 규모가 커지면 N+1 셀렉트 문제가 발생할 수 있다.

성능 최적화를 위해서는 조인문을 사용해서 한번에 데이터를 가져오는 것이 나을 수 있다.

 

관련글 더보기

댓글 영역