본문 바로가기
개발/Spring FW

[MyBatis] TypeHandler

by Devsong26 2023. 12. 12.

MyBatis에서 `TypeHandler`는 Java 타입과 JDBC 타입 간의 변환을 담당하는 중요한 구성 요소입니다. 데이터베이스와의 상호작용에서, `TypeHandler`는 Java 객체를 SQL 쿼리에 사용할 수 있는 JDBC 타입으로 변환하거나, SQL 쿼리의 결과를 Java 객체로 매핑하는 역할을 합니다.

 


`TypeHandler`의 주요 기능

  • Java 타입 → JDBC 타입 변환
    • `PreparedStatement`에 값을 설정할 때, `TypeHandler`는 Java 객체를 적절한 JDBC 타입으로 변환합니다. 이는 `setParameter` 메소드를 통해 이루어집니다.
  • JDBC 타입 → Java 타입 변환
    • `ResultSet`에서 값을 읽을 때, `TypeHandler`는 데이터베이스의 데이터 타입을 Java 객체로 변환합니다. 이는 `getResult` 메소드를 통해 이루어집니다.
  • 사용자 정의 타입 처리
    • 기본적으로 MyBatis는 자주 사용되는 Java 타입들에 대한 `TypeHandler`를 제공합니다. 하지만 특수한 경우나 사용자 정의 타입에 대해서는 개발자가 직접 `TypeHandler`를 구현할 수 있습니다.

 


`TypeHandler` 인터페이스

 

`TypeHandler` 인터페이스는 다음과 같은 메소드를 포함합니다:

  • `void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException`
    • SQL 쿼리의 파라미터를 설정합니다.
  • `T getResult(ResultSet rs, String columnName) throws SQLException`
    • `ResultSet`으로부터 값을 읽어서 반환합니다.
  • `T getResult(ResultSet rs, int columnIndex) throws SQLException`
    • 컬럼 인덱스를 사용하여 `ResultSet`으로부터 값을 읽어서 반환합니다.
  • `T getResult(CallableStatement cs, int columnIndex) throws SQLException`
    • 저장 프로시저나 함수 호출 결과로부터 값을 읽어서 반환합니다.

 

 

사용자 정의 `TypeHandler` 구현 예시

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;
import java.time.LocalDate;

public class LocalDateTypeHandler implements TypeHandler<LocalDate> {

    @Override
    public void setParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType) throws SQLException {
        if (parameter != null) {
            ps.setDate(i, java.sql.Date.valueOf(parameter));
        } else {
            ps.setNull(i, jdbcType.TYPE_CODE);
        }
    }

    @Override
    public LocalDate getResult(ResultSet rs, String columnName) throws SQLException {
        java.sql.Date sqlDate = rs.getDate(columnName);
        return sqlDate != null ? sqlDate.toLocalDate() : null;
    }

    @Override
    public LocalDate getResult(ResultSet rs, int columnIndex) throws SQLException {
        java.sql.Date sqlDate = rs.getDate(columnIndex);
        return sqlDate != null ? sqlDate.toLocalDate() : null;
    }

    @Override
    public LocalDate getResult(CallableStatement cs, int columnIndex) throws SQLException {
        java.sql.Date sqlDate = cs.getDate(columnIndex);
        return sqlDate != null ? sqlDate.toLocalDate() : null;
    }
}

 


결론

 

`TypeHandler`는 MyBatis에서 데이터베이스와 Java 애플리케이션 간의 데이터 타입 변환을 매끄럽게 처리하기 위한 핵심적인 구성 요소입니다. 표준 Java 타입 외에도 사용자 정의 타입이나 특수한 데이터 타입을 처리해야 하는 경우에 사용자 정의 `TypeHandler`를 구현하고 등록하여 사용할 수 있습니다. 이를 통해 MyBatis를 사용하는 애플리케이션에서 데이터 타입 관련 문제를 유연하게 해결할 수 있습니다.

'개발 > Spring FW' 카테고리의 다른 글

트랜잭션 동일성 비교하기  (0) 2024.02.08
Actuator  (0) 2023.12.26
[Spring FW] Filter  (0) 2023.12.10
[Spring FW] Interceptor  (0) 2023.12.09
Spring에서 ApplicationEvent 처리하기  (0) 2023.11.29