Develop/CS

[Mybatis] ResultMap 이용하기

연로그 2021. 8. 2. 17:58
반응형

📔 개요

현재 진행중인 프로젝트에서는 mssql, Oracle 등 다양한 종류의 database를 사용하고 있다.

mssql에서 데이터 타입이 'ntext'인 컬럼을 조회하는 SQL문을 실행했는데 HashMap에 매핑되지 않는 현상이 발생했다.

원인 파악에 도움을 받았는데 Mybatis 설정 중에 varchar로 받아내게 하는 부분이 존재했고, ntext형식의 데이터를 varchar 형식으로 매핑하려니 문제가 생긴 것이다.

이를 어떻게 해결할까 고민하다가 resultMap을 이용하기로 했다.

 

 

📚 ResultMap이란?

복잡한 결과 매핑을 간편하게 만들어주기 위해 만들어진 태그다.

 

📕 예제 1

일반적인 Mybatis의 매핑 구문은 다음과 같다.

<select id="selectUsers" resultType="map">
  select id, username, hashedPassword
  from some_table
  where id = #{id}
</select>

resultType이 map인 것을 보아 {key, value}일 때 {"id",id값}, {"username",username값}, {"hashedPassword",hashedPassword값} 이 매핑될 것을 예상할 수 있다.

 

 

📒 예제 2

아래와 같은 User 객체가 있다고 가정해보자

@Getter @Setter
public class User {
  private int id;
  private String username;
  private String hashedPassword;
}

 

Mybatis의 resultType을 User 객체로 바꾸어주었다.

<select id="selectUsers" resultType="User객체경로.User">
  select id, username, hashedPassword
  from some_table
  where id = #{id}
</select>

User객체의 필드명과 selectUsers의 조회 컬럼명이 일치하므로 쉽게 매핑된다.

 

 

📘 예제 3

하지만 쿼리문이 아래와 같이 달라진다면 이야기가 달라진다.

<select id="selectUsers" resultType="User객체경로.User">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{id}
</select>

물론 AS 키워드를 이용해서 매핑할 수는 있다.

하지만 (그럴 일은 없겠지만) 필드명이 자주 바뀐다거나, 매칭되는 타입(number -> String)이 다른 경우에는 매핑할 수 없게 된다.

이 때 사용하게 되는 것이 ResultMap이다.

 

아래와 같은 ResultMap을 적용해본 코드를 보자.

<resultMap id="testMap" type="User객체경로.User">
  <result column="user_id" property="id" jdbcType="NVARCHAR" javaType="String"/>
  <result column="user_name" property="username" jdbcType="NVARCHAR" javaType="String"/>
  <result column="hashed_password" property="hashedPassword" jdbcType="NVARCHAR" javaType="String"/>
</resultMap>

<select id="selectUsers" resultMap="testMap">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{id}
</select>

user_id는 resultMap을 통해 User 객체의 id에 매칭된다.

jdbcType이나 javaType도 지정이 가능하다.

(다양한 옵션이 존재하니 공식 홈페이지를 참고 바란다. 글 하단의 참고 1 링크)

 

 

📌 유사한 문제

데이터 형식 varbinary을(를) text(으)로 명시적으로 변환할 수 없습니다.

👉 binary를 text로 convert 할 경우 발생. null 또는 ''의 경우 binary로 인식하기 때문

 


참고

  1. ResultMap - Mybatis 공식 홈페이지
  2. "데이터 형식 varbianry을(를) text(으)로 명시적으로 변환할 수 없습니다." 에러 
반응형