Mybatis - resultMap 사용방법 및 활용예제
MyBatis는 ORM 기술 중 하나로 객체지향 언어의 객체와 관계형 데이터를 서로 변환해 줄 수 있다.
resultMap
DB조회 결과를 복잡한 객체 구조로 변환 해주어야 할 때 활용할 수 있다. resultMap은 반환 타입으로 개발자가 xml 내에 정의한 형식으로 반환받을 수 있게 된다.
간단 활용 예제
이 글에서는 여러가지 sql 매퍼를 resultMap xml 정의를 통해 조인한 것 처럼 반환받도록 활용한 예제이다.
먼저 간략히 RDBMS의 테이블 관계를 설명하자면 해당 예제의 메인 테이블은 ORDERS 테이블로 PK로 ORDER_ID를 가진다. 또, ORDERS테이블을 기준으로 1:N 구조를 가지는 ORDER_MENUS 와 ORDER_PAYMENTS 테이블이 있다.
그래서 ORDERS 테이블에서 조회된 orderAmount, orderDate를 제외한 1:N구조를 갖는 조회 결과를 List로 바로 반환받도록 Mapper에서 조회된 결과를 아래의 OrderInfo 객체로 바로 매핑되도록 구현해보려 한다.
@Getter
public class OrderInfo {
private Long orderAmount;
private String orderDate;
private List<OrderMenu> orderMenus;
private List<OrderPayment> orderPayments;
}
OrderInfo
는 조인된 주문 정보를 반환받을 DTO 객체이다.
-- resultMap 정의
<resultMap id="orderInfoGroup" type="kr.co.order.dto.OrderInfo">
<result column="orderAmount" property="orderAmount" javaType="Long"/>
<result column="orderDate" property="orderDate" javaType="String"/>
<collection property="orderMenus" column="orderId" ofType="kr.co.order.dto.OrderMenu"
javaType="java.util.ArrayList" select="selectOrderMenuListById"/>
<collection property="orderPayments" column="orderId" ofType="kr.co.order.dto.OrderPayment"
javaType="java.util.ArrayList" select="selectOrderPaymentListById"/>
</resultMap>
<select id="selectOrderById" resultMap="orderInfoGroup">
SELECT ORDER_ID AS orderId,
ORDER_AMOUNT AS orderAmount,
TO_CHAR(ORDER_DATE,'YYYY-MM-DD') AS orderDate
FROM ORDERS
WHERE ORDER_ID = #{orderId}
</select>
<select id="selectOrderMenuById" resultType="OrderMenu">
SELECT PRODUCT_NAME AS productName,
PRICE AS price
FROM ORDER_MENUS
WHERE ORDER_ID = #{orderId}
</select>
<select id="selectOrderPaymentById" resultType="OrderPayment">
SELECT PAYMENT_ID AS paymentId,
PAYMENT_METHOD AS paymentMethod,
TO_CHAR(PAYMENT_DATE, 'YYYY-MM-DD') AS paymentDate
FROM ORDER_PAYMENTS
WHERE ORDER_ID = #{orderId}
</select>
위처럼 resultMap을 정의해주면 된다.
@Mapper
public interface OrderMapper {
Optional<OrderInfo> selectOrderById(@Param("orderId") String orderId);
}
Mapper에서는 OrderInfo
로 리턴해주고 Optional로 감싸서 받도록 처리하였다.
여기까지 내 프로젝트에서 활용한 resultMap 활용 예제이며 이 외에 resultMap을 활용하여 더욱 복잡한 결과를 매핑되게 할 수도 있다. 자세한 문서는 아래 공식 문서를 참조하자.
https://mybatis.org/mybatis-3/ko/sqlmap-xml.html#result-maps
'DB & SQL' 카테고리의 다른 글
[DB] H2 database 설정 초기화 (0) | 2023.05.07 |
---|---|
[DB] Redis - 개념, 특징, 활용 방법 정리 (1) | 2022.12.19 |
[MariaDB] 윈도우 MariaDB 설치/접속 (1) | 2022.10.04 |
[MySQL] 현재 데이터베이스 조회 및 변경 (0) | 2022.07.02 |
[Oracle] 중복 데이터 제거 (distinct, group by) (0) | 2021.07.31 |