본문 바로가기

프로젝트

Java에서 Mybatis Custom TypeHandler 생성해서 사용하기

문제 사항

Java에서 DB를 위해 Mybatis를 사용을 하고 있다. Mybatis에서는 기본적으로 제공을 해주는 타입이 아니면 변환을 하지 못해서 Sql 예외를 발생시킨다. 이번에 PK를 UUID로 사용을 하기로 했고, UUID를 Binary(16)으로 저장하기로 하면서 위와 같은 문제가 발생했다. 이를 해결 하기 위해 TypeHandler를 설정함으로 UUID가 Binary(16)으로 바뀔 수 있도록 작성을 해줘야 했다.  

TypeHandler 정의

package com.example.typehandler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;

public class UuidTypeHandler extends BaseTypeHandler<UUID> {

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

    @Override
    public UUID getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String uuidStr = rs.getString(columnName);
        return uuidStr != null ? UUID.fromString(uuidStr) : null;
    }

    @Override
    public UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String uuidStr = rs.getString(columnIndex);
        return uuidStr != null ? UUID.fromString(uuidStr) : null;
    }

    @Override
    public UUID getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String uuidStr = cs.getString(columnIndex);
        return uuidStr != null ? UUID.fromString(uuidStr) : null;
    }
}

Mybatis 설정에 TypeHandler 적용

<configuration>
    <typeHandlers>
        <typeHandler handler="com.example.typehandler.UUIDTypeHandler" javaType="java.util.UUID"/>
    </typeHandlers>
</configuration>

추가 설정하기

UUID를 Binary(16)으로 저장을 했기때문에 String으로 가져오고 String을 Binary로 변환하는 MySQL의 함수를 사용해주어야 했다. 회사에서 Mybatis 실행 이전에 파라미터 값의 쿼리문과 결과 값을 외부와 통신을 통해 직렬화 역직렬화가 발생하기 때문에, 바로 Binary(16)으로 변환하지 않은 것이다.

 

binary 값을 UUID String으로 변환을 해주는 함수

BIN_TO_UUID(element)

 

UUID String을 binary 값으로 변환을 해주는 함수

UNHEX(REPLACE(element,"-",""))