본문 바로가기

Programming/Tip&Informaion

[Java/Oracle] DB 인코딩 문제로 한글이 깨질 때 해결 방법

java에서 오라클을 select 쿼리를 실행해야 하는 상황에서 한글의 경우 문자가 깨지는 현상이 발생하는 경우가 있다.

POST방식을 기준으로

  1. request.setCharaterEncoding("euc-kr"); 선언.
    을 getParameter 등을 하기 전에 선언 해주면 대부분 해결된다.
    이게 안 될 경우, 보통 model이나 controller 단에서 getParameter 등을 쓰는 경우가 있어서 그 전에 선언해주면 된다.
  2. Oracle (db) 의 인코딩이 한글을 지원 안 할 경우.
    이 경우는 인코딩 변환을 수동으로 해줘야 하는데 일단 where절에 한글 값을 주니 값이 아예 나오질 않았다. 그래서 where 절에 자바 스트링 값을 넣어줄 때
    string afterStr = new String(beforeStr.getBytes("euc-kr"), "8859\_1");  
    이런 식으로 인코딩을 변환한 값을 where 절 조건에 넣어주니 되었다.
  • 이 부분을 설명하자면 브라우저에 한글이 나오는 경우는 보통 인코딩이 euc-kr 이나 ksc5601 인데, 한글이 잘 나오는 스트링의 인코딩이 euc-kr 가정하고, euc-kr로 디코딩한 byte 값을 8859_1로 인코딩해서 db에 넣어주는 것이다.
  • 8859_1은 영어 기준으로 기본 인코딩이라 생각하면 될 듯 (사실 정확히는 모름)
  • 보통 이 경우 db 인코딩 문제이므로 대부분 db의 인코딩을 바꾸는 경우가 많은 것 같으나 그렇게 할 수 없는 경우 아래와 같이 해보자.

같은 원리로 select 해서 rs.getString(idx) 등을 한 값을 8859_1로 바이트 형태로 디코딩한 뒤, euc-kr로 인코딩해서 출력해주면 될 것이다.

string afterStr = new String(beforeStr.getBytes("8859_1"), "euc-kr");  

그런데 잘 안 되는 경우가 있다.

내 경우엔 euc-kr로 인코딩했을 때 한글이 이미 ??? 로 나왔다. 대부분 ???의 경우 한글이 2번 이상 인코딩 됐을 때 자주 나오는 현상이다. 그래서 아예 인코딩하지 않고 select한 것을 바로 출력해보았는데 역시나 ??? 로만 나왔다.

삽질하다 해결했는데, db에서 값을 가져올 때 getSring 을 사용하니 java 기본 string 인코딩으로 인코딩이 되어서 그런 것으로 추정된다. 따라서 getBytes 로 바이트 배열을 받을 것을 euc-kr로 인코딩하여 해결했다.

string str = new String(rs.getBytes(), "euc-kr");  

이렇게 하니 잘 나온다...

삽질하다보니 인코딩과 byte 에 대해 공부할 수 있는 계기가 된 것 같다.