본문 바로가기
Mybatis/고급 매핑 기법

조인 결과 매핑 (1:1, 1:N)

by DEVLIB 2025. 4. 17.
728x90

1:1 조인 결과 매핑 (association 사용)

예시: Order 객체 안에 User 정보 포함

데이터 관계

  • orders 테이블: 주문 정보 (order_id, user_id, order_date)
  • users 테이블: 사용자 정보 (id, name, email)

XML: resultMap + association

<resultMap id="orderResultMap" type="Order">
  <id property="orderId" 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"/>
    <result property="email" column="user_email"/>
  </association>
</resultMap>

<select id="selectOrders" resultMap="orderResultMap">
  SELECT o.order_id, o.order_date,
         u.id AS user_id, u.name AS user_name, u.email AS user_email
  FROM orders o
  JOIN users u ON o.user_id = u.id
</select>

Java 객체

public class Order {
    private int orderId;
    private Date orderDate;
    private User user;
    // getter/setter
}

public class User {
    private int id;
    private String name;
    private String email;
    // getter/setter
}

association은 1:1 관계일 때 내부 객체로 매핑해줍니다.


1:N 조인 결과 매핑 (collection 사용)

예시: User 객체 안에 List<Order> 포함

데이터 관계

  • 한 명의 사용자(User)는 여러 주문(Order)을 가질 수 있음

XML: resultMap + collection

<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id"/>
  <result property="name" column="user_name"/>
  <result property="email" column="user_email"/>
  <collection property="orders" ofType="Order">
    <id property="orderId" column="order_id"/>
    <result property="orderDate" column="order_date"/>
  </collection>
</resultMap>

<select id="selectUsersWithOrders" resultMap="userResultMap">
  SELECT u.id AS user_id, u.name AS user_name, u.email AS user_email,
         o.order_id, o.order_date
  FROM users u
  LEFT JOIN orders o ON u.id = o.user_id
</select>

Java 객체

public class User {
    private int id;
    private String name;
    private String email;
    private List<Order> orders;
    // getter/setter
}

public class Order {
    private int orderId;
    private Date orderDate;
    // getter/setter
}

collection은 1:N 관계일 때 리스트 형태로 매핑해줍니다.


주의할 점

항목 주의사항
컬럼명 중복 반드시 AS 별칭으로 충돌 방지 (예: u.id AS user_id)
SQL 결과 중복 조인으로 인해 중복 row가 많아져도 MyBatis가 자동 그룹핑
성능 큰 테이블 조인 시에는 N+1 문제가 발생하지 않도록 JOIN + collection을 적절히 설계해야 합니다.

요약 정리

관계 MyBatis 태그목적
1:1 <association> 내부 객체 하나로 매핑
1:N <collection> 리스트 형태로 매핑
LIST

'Mybatis > 고급 매핑 기법' 카테고리의 다른 글

SQL 재사용 (<sql>, <include>)  (0) 2025.04.17
컬렉션 매핑 (collection, association)  (0) 2025.04.17
다중 파라미터 처리  (0) 2025.04.17