[Mybatis] 사용자 정의 데이터 타입(TypeHandler) 개념과 예제

MyBatis의 사용자 정의 데이터 타입(TypeHandler)은 Java 객체와 데이터베이스 칼럼 간의 변환을 처리하는 역할을 합니다. 데이터베이스와 Java 타입 간의 매핑이나 변환 로직이 복잡한 경우에 사용자 정의 TypeHandler를 구현하여 매핑을 커스터마이즈할 수 있습니다.

예제: 사용자 정의 TypeHandler 구현

  1. TypeHandler 인터페이스 구현: org.apache.ibatis.type.TypeHandler 인터페이스를 구현하여 사용자 정의 TypeHandler를 생성합니다.
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CustomTypeHandler extends BaseTypeHandler<CustomType> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, CustomType parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toString());
    }

    @Override
    public CustomType getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        return CustomType.fromString(value);
    }

    @Override
    public CustomType getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String value = rs.getString(columnIndex);
        return CustomType.fromString(value);
    }

    @Override
    public CustomType getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        return CustomType.fromString(value);
    }
}` 
  1. 매퍼 XML에서 사용자 정의 TypeHandler 설정: 매퍼 XML 파일에서 사용자 정의 TypeHandler를 설정합니다.
<!-- com/example/BookMapper.xml -->
<mapper namespace="com.example.BookMapper">
    <resultMap id="bookMap" type="Book">
        <result column="custom_column" property="customProperty" javaType="com.example.CustomType" typeHandler="com.example.CustomTypeHandler"/>
        <!-- ... -->
    </resultMap>
</mapper>` 
  1. MyBatis 설정에 사용자 정의 TypeHandler 등록: MyBatis 설정 파일에서 사용자 정의 TypeHandler를 등록합니다.
<configuration>
    <typeHandlers>
        <typeHandler handler="com.example.CustomTypeHandler"/>
    </typeHandlers>
    <!-- ... -->
</configuration>` 

위의 예제에서는 사용자 정의 CustomTypeHandler 클래스를 구현하여 데이터베이스 칼럼과 Java 객체 간의 변환 로직을 처리하고 있습니다. 이를 통해 데이터베이스와 Java 객체 간의 매핑을 커스터마이즈할 수 있습니다.