Solution/MyBatis
[MyBatis] resultType vs resultMap 차이점
JB1104
2022. 9. 23. 18:23
728x90
반응형
SMALL
SQL 쿼리문을 작성하다 보면, resultType, resultMap과의 차이를 잘 모르고 사용해서 쓰곤 했다.
그래서 이번 기회에 개념을 잡고 싶어서 정리해봤다.
resultType : 클래스명 전체 또는 Alias를 입력해야 한다. VO, DTO 등의 객체를 담을 수 있는 클래스의 경로를 명시하여 사용하면 된다.
<select id="selectFavoriteStores" resultType="com.core.store.domain.MyStore">
SELECT MYSTORE_ID
, USER_ID
, BIZ_NO
, CREATED_DT
, ( SELECT FN_IS_XCPT_STORE_YN( #{bizNo} ) FROM DUAL ) AS XCPT_YN
FROM EMCS_MY_STORE
<where>
USER_ID = #{userId}
<if test="bizNo != null">
AND BIZ_NO = #{bizNo}
</if>
</where>
</select>
resultMap : 개발자가 직접 POJO(VO) 클래스에 매핑하며, 제한 없이 사용 가능하다.
<resultMap id="storeRecomMap" type="hashmap">
<id property="recomId" column="RECOM_ID" />
<result property="regionCd" column="RECOM_REGION_CD" />
<result property="regionNm" column="RECOM_REGION_NM" />
<result property="storeNm" column="RECOM_STORE_NM" />
<result property="storeMenu" column="RECOM_STORE_MENU" />
<result property="area" column="RECOM_AREA" />
<result property="storeAddr" column="RECOM_STORE_ADDR" />
<result property="storeLink" column="RECOM_STORE_LINK" />
<result property="storeLat" column="RECOM_STORE_LAT" />
<result property="storeLon" column="RECOM_STORE_LON" />
<result property="distance" column="DISTANCE" />
<result property="storeCnt" column="STORE_CNT" />
</resultMap>
<select id="selectStoreRecomRegionList" resultMap="storeRecomMap">
SELECT
RECOM_REGION_CD, RECOM_REGION_NM, COUNT(*) AS STORE_CNT
FROM EMCS_STORE_RECOMM
GROUP BY RECOM_REGION_CD, RECOM_REGION_NM
ORDER BY RECOM_REGION_CD ASC
</select>
그렇다면, 번거롭게 굳이 resultMap을 사용해서 매핑을 직접 해서 쓰는 이유가 있을까?라는 생각이 들것이다.
그 이유는, 재사용성 때문이다.
쉽게 말하면, 아래와 같은 VO가 있다고 가정하자.
public class MyStore {
private String mystoreId;
private int userId;
private String bizNo;
private Date createdDt;
private String xcptYn;
}
그리고 아래처럼 resultType으로 매핑해서 사용한다고 가정해보자.
<select id="selectFavoriteStores" resultType="store.domain.MyStore">
SELECT MYSTORE_ID
, USER_ID
, BIZ_NO -- IF,BIZ_NO가 BIZ로 컬럼명이 변경된다면 사용할 수 없다
, CREATED_DT
, ( SELECT FN_IS_XCPT_STORE_YN( #{bizNo} ) FROM DUAL ) AS XCPT_YN
FROM EMCS_MY_STORE
<where>
USER_ID = #{userId}
<if test="bizNo != null">
AND BIZ_NO = #{bizNo}
</if>
</where>
</select>
위의 쿼리를 실행하면 문제가 없다.
하지만 칼럼명이 BIZ_NO -> BIZ로 변경되었다고 가정해보자.
그렇다면 resultType으로 매핑할 수 있는 VO를 찾지 못한다.
이럴 때는 resultMap을 사용해서 직접 매핑해서 사용해주면 된다.
이런 이유로 resultMap을 사용하게 된다. 즉, 필요에 따라 사용할 수 있다.
728x90
반응형
LIST