[Java] US7ASCII 오라클 한글 깨짐 이슈 해결 방법 (Spring boot, UTF-8)
캐릭터셋이 US7ASCII인 오라클을 쓰고 있는 레거시와의 연동을 위해 삽질했던 경험을 기록으로 남긴다.
* 상황 설명
데이터를 가지고 오는 어플리케이션 : Java, Spring boot, UTF-8
* 이 어플리케이션은 AWS EC2 서버에 올라가 데이터 조회 API 역할을 하게 되며 이 API를 호출하는 녀석은 AWS API Gateway에 등록되어 있는 Lambda임
여기서 최대의 난제는 한글이 깨진다는 거였고 구글링을 해본 결과 아래와 같은 방식으로 하면 된다는 글들이 많았다.
new String(str.getBytes("8859_1"), "UTF-8")
안됐다..
그렇다면,
new String(str.getBytes("8859_1"), "KSC5601")
역시 안됐다.. 그래서,
new String(str.getBytes("8859_1"),"KSC5601")
new String(str.getBytes("KSC5601"),"8859_1")
new String(str.getBytes("8859_1"), "UTF-8")
new String(str.getBytes("UTF-8"), "8859_1")
new String(str.getBytes("8859_1"), "EUC_KR")
new String(str.getBytes("EUC_KR"), "8859_1")
new String(str.getBytes("ISO-8859-1"), "utf-8")
new String(str.getBytes("UTF-8"), "ISO-8859-1")
등등... 모든 경우의 수를 다 콘솔로 찍어보았으나... 전부.... 안됐다..
아아.. 애자일 스프린트 주기가 끝나가고 있는데... 애가 타는 순간이었다.
바로 그때! 어렴풋이 예전 플젝의 기억이 떠올랐다.
이번 경우와 완전 동일한 상황은 아니었지만
US7ASCII 오라클의 데이터를 꺼내서 UTF-8 오라클로 바로 집어넣는 배치 시스템이었는데
UTL_RAW.CAST_TO_RAW 함수를 사용해서 해결했었다.
음.. 뭔가 응용해볼 수 있겠다는 생각이 들었다.
결과는...
두둥 몇시간 삽질 끝에 예쁜 한글을 볼 수 있었..!
아래는 관련 소스
/* 쿼리 단 */
SELECT UTL_RAW.CAST_TO_RAW(CUST_NAME) as custNm
FROM CUSTOMER
WHERE CUST_ID = #{custId, jdbcType=VARCHAR}
/* 서비스 단 */
Customer result = memberInfoDao.selectCustomer(customer);
String tmpStr = result.getCustNm();
byte[] bytes = new BigInteger(tmpStr, 16).toByteArray();
result.setCustNm(new String(bytes).trim());
다 해놓고 보니 꼴랑 몇 줄밖에 안돼서 잠깐 허무했지만,
결론은 그렇게 또 하나의 스프린트가 무사히 끝났다는 이야기..!
끝.