Mybatis/고급 매핑 기법
컬렉션 매핑 (collection, association)
DEVLIB
2025. 4. 17. 09:02
728x90
핵심 요약
태그 | 용도 | 예시 |
association | 1:1 관계 매핑 | 주문 안에 사용자 객체 |
collection | 1:N 관계 매핑 | 사용자 안에 주문 리스트 |
1. <association> – 1:1 관계 매핑
예시: Order 안에 User 객체가 포함된 경우
SQL
SELECT o.id AS order_id, o.order_date,
u.id AS user_id, u.name AS user_name
FROM orders o
JOIN users u ON o.user_id = u.id
resultMap
<resultMap id="orderResultMap" type="Order">
<id property="id" column="order_id"/>
<result property="orderDate" column="order_date"/>
<association property="user" javaType="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
</association>
</resultMap>
Java 클래스
public class Order {
private int id;
private Date orderDate;
private User user;
}
public class User {
private int id;
private String name;
}
association은 내부 객체(1:1)를 Java 필드에 자동으로 매핑해줍니다.
2. <collection> – 1:N 관계 매핑
예시: User 안에 여러 Order 객체가 포함된 경우
SQL
SELECT u.id AS user_id, u.name AS user_name,
o.id AS order_id, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
resultMap
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="orderDate" column="order_date"/>
</collection>
</resultMap>
Java 클래스
public class User {
private int id;
private String name;
private List<Order> orders;
}
public class Order {
private int id;
private Date orderDate;
}
collection은 리스트 형태(1:N)를 자동으로 매핑합니다.
주의 사항
항목 |
설명 |
컬럼 중복 | 조인 시 컬럼 이름이 겹치지 않게 AS 별칭으로 구분 필수 |
중복 제거 | MyBatis는 내부적으로 동일한 객체 키(id)가 있으면 자동으로 중복 제거 |
N+1 문제 | collection은 조인 기반으로 가져와야 성능 저하 방지 |
실전
- association 안에서도 중첩 association 사용 가능해요.
- collection 안에 또 다른 association도 가능해서 복잡한 객체 구조도 표현할 수 있어요.
- lazyLoadingEnabled를 통해 지연 로딩도 설정할 수 있습니다 (고급 설정).
정리 요약
목적 | 사용 태그 | Java | 타입예시 |
1:1 객체 포함 | <association> | 단일 객체 | 주문 → 사용자 |
1:N 리스트 포함 | <collection> | List<> | 사용자 → 주문 목록 |
LIST