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