개발군싹

Mybatis - TypeHandler 설정 본문

Mybatis

Mybatis - TypeHandler 설정

개발자군싹 2023. 12. 4. 22:50

데이터 베이스에 스트링으로 저장된 데이터를 DTO객체에 배열로 가져오고 싶을 때 Mybatis에서 제공하는 TypeHandler를 이용하여 처리할 수 있다.

<result column="hobby" property="hobby" typeHandler="strArr"/>

데이터베이스의 취미 데이터를 ',' 기준으로 hobby (String[]) 배열에 저장하기 위해 mapper의 <resultMap> 내부에 <result> 태그의 속성으로 'typeHandler' 선언한다.

 

 

클래스 생성 중 Mybatis가 제공하는 'TypeHandler Interface'를 추가한다.

제네릭 타입을 배열타입으로 변경 ( <T> -> String[] )

package com.mybatis.common;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

public class StringArrayTypeHandler implements TypeHandler<String[]> {

	@Override
	public String[] getResult(ResultSet arg0, String arg1) throws SQLException {
		String data = arg0.getString(arg1);
		return data!=null?data.split(","):null;
	}

	@Override
	public String[] getResult(ResultSet arg0, int arg1) throws SQLException {
		String data = arg0.getString(arg1);
		return data!=null?data.split(","):null;
	}

	@Override
	public String[] getResult(CallableStatement arg0, int arg1) throws SQLException {
		String data = arg0.getString(arg1);
		return data!=null?data.split(","):null;
	}

	@Override
	public void setParameter(PreparedStatement arg0, int arg1, String[] arg2, JdbcType arg3) throws SQLException {
		arg0.setString(arg1, arg2!=null?String.join(",",arg2):null);

	}

}

➡️ TypeHandler Interface Implements(상속) 시 위 코드와 같이 오버라이드 메소드가 생성되고 해당 오버라이드 메소드를 재정의 해주어  동작시킬 수 있다. => Mybatis 또한 JDBC를 기반으로 만들어진 Framework이기 때문에 ResultSet, PreparedStatement를 이용하여 데이터베이스의 값을 조작하는것을 알 수 있다.

 

➡️ TypeHandler는 Mybatis가 내부적으로 동작하는 메소드를 재정의 함으로써 <result>태그에서 Typehandler 선언부를 만났을 시 오버라이딩 메소드를 실행시켜 배열 데이터 또한 처리가 가능하다.