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' 카테고리의 다른 글
Actuator (0) | 2023.12.26 |
---|---|
Swagger (0) | 2023.12.26 |
[Spring FW] Filter (0) | 2023.12.10 |
[Spring FW] Interceptor (0) | 2023.12.09 |
Spring에서 ApplicationEvent 처리하기 (0) | 2023.11.29 |