resultMap은 Mybatis에서 select 결과가 join(조인)과 같이 복잡할 경우에 resultType 대신 사용할 수 있다.
다음은 resultMap에서 사용할 수 있는 속성들이다.
속성 | 설명 |
resultMap | 결과 매핑 사용하는 가장 상위 엘리먼트. id 속성과 매핑 클래스 정의하는 type속성을 가집니다. |
id | 기본 키에 해당 |
result | 기본 키가 아닌 나머지 컬럼에 대한 매핑 |
constructor | setter 메서드나 리플렉션을 통해 설정하지 않고 생성자를 통해 값을 설정 |
association | 1:1관계 처리 |
collection | 1:N관계 처리 |
discriminator | 매핑 과정에서 조건 지정하여 값 설정 |
resultMap에서 Collection은 아래 예시와 같이 데이터 구조(1:N 관계)를 가지고 있을 경우 사용할 수 있다.
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의 관계이다.
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에서 사용할 수 있는 속성 값이다.
속성 | 설명 |
column | 데이터베이스의 컬럼명 |
javaType | 패키지를 포함함 클래스명 혹은 타입 별칭 |
ofType | collection의 타입 |
select | 서브쿼리로 실행할 id |
위 방식은 간단한 예제나 작은 프로젝트에서는 괜찮지만 규모가 커지면 N+1 셀렉트 문제가 발생할 수 있다.
성능 최적화를 위해서는 조인문을 사용해서 한번에 데이터를 가져오는 것이 나을 수 있다.
Mybatis 객체 형식으로 insert, select 하기 (0) | 2022.05.09 |
---|---|
Mybatis 데이터베이스 접속 (0) | 2022.05.04 |
Mybatis 개발환경 설정(with Intellij) (0) | 2022.05.03 |
댓글 영역