2022년

[개발업무] Mybatis | 오라클 US7ASCII 인코딩 처리

더밸류(THEVALUE) 2022. 9. 23. 10:10

운영서버 및 테스트서버의 오라클 캐릭터 정보가 "US7ASCII" 로 설정되어 있는 상황에서 기존 시스템을 도입하여 반영하는 프로젝트를 진행.

문제는 쿼리 리턴 결과 전부가 한글이 깨지는 현상이 발생.

하나하나 소스 수정이 힘든 상황이므로 아래와 같이 Mybatis 타입 핸들러 설정을 통해 리턴되는 결과를 치환하여 사용하는 방법으로 한글 처리를 완료한 상황.

 

[ TypeHandler 클래스 작성 ]

package mybatis;

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 OracleTypeHandler implements TypeHandler<Object> {

	@Override
	public String getResult(ResultSet rs, String columnName) throws SQLException {
		String s = rs.getString(columnName);
        // 결과 타입에 따라 별도의 처리를 해주면 됨 
        // ex> 자리수가 큰 소수점의 경우 지수 표현으로 표시되므로
        // java.sql.Types 클래스를 통한 리턴 타입 체크 후 
        // Numeric에 해당하면 bigDecimal을 활용하여 변환해서 사용하도록 처리 
		return decodeUS7ASCII(s);
	}

	@Override
	public String getResult(ResultSet rs, int columnIndex) throws SQLException {
		String s = rs.getString(columnIndex);
		return decodeUS7ASCII(s);
	}

	@Override
	public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
		String s = cs.getString(columnIndex);
		return decodeUS7ASCII(s);
	}

	@Override
	public void setParameter(PreparedStatement ps, int i, String str, JdbcType jdbcType) throws SQLException {
		ps.setString(i, encodeUS7ASCII(str));
	}
	
	public static String encodeUS7ASCII(String value) {
		if(value == null) {
			return "";
		}
		
		String str = "";
		try {
			str = new String(value.getBytes("KSC5601"), "8859_1");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return str;
	}
	
	public static String decodeUS7ASCII(String value) {
		if(value == null) {
			return "";
		}
		
		String str = "";
		try {
			str = new String(value.getBytes("8859_1"), "KSC5601");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return str;
	}

}

 

[ Mybaits 설정파일 - Handler 클래스 적용 ]

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  
<configuration>
	<settings>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		<setting name="jdbcTypeForNull" value="NULL"/>
		<setting name="callSettersOnNulls" value="true"/>
	</settings>
	
	<typeAliases>
		<typeAlias alias="orderedMap" type="java.util.LinkedHashMap"/>
	</typeAliases>
	
	<typeHandlers>
		<typeHandler javaType="java.lang.Object" handler="mybatis.OracleTypeHandler"/>
	</typeHandlers>
	
	<plugins>
		<plugin interceptor="com.koreaap.rms.framework.mybatis.MroInterceptor"/>
	</plugins>
</configuration>