이 글은 한글깨짐을 해결하기 위해서라기 보다는 문제를 해결하는 방식에 대한 정리를 위해서 입니다.
기술적인 내용은 링크한 내용들을 참고하시면 보다 많은 정보를 얻을 수 있습니다.
저는 업무에서 기술적인 문제해결을 위해서
"환경분석-> 계획수립-> 테스트 케이스 생성-> 테스트 및 문제해결-> 검증" 의 순서로 진행합니다.
누구나 빠른 문제해결을 원하지만 실제로는 "바로 해결하기"를 하는 경우가 많습니다.
다행스럽게도 운이 좋아서 빠른시간에 해결이 된다면 좋겠지만, 여러가지 포인트에서 문제발생의 여지가 있는 경우가 대부분 이므로, 빠른 문제해결을 위해서는 절차를 따르는 것이 좋습니다.
실제 많이 경험하시게 되는 웹페이지의 한글이 깨어지고 있는 상황을 가정하고, 문제를 추적해 보겠습니다.
1. 환경분석
장애가 일어난 시스템의 구조는 Apache, Proxy_ajp, Tomcat, MySQL로 구성되어 있습니다.
그런 경우 euc-kr 또는 UTF-8로 인해서 문제가 일어날 수 있는 WeakPoint 는 아래와 같은 곳입니다.
2. 계획수립
사소한 일이라면 그냥 머리속으로 계획을 세우면 되겠죠.
하지만 좀 시간이 걸리는 일이라면, WBS를 구성해서 제대로된 일정계획이 있는 것이 업무를 현명하게 하는 방법입니다.
이 문제는 그렇게 오래 걸리는 문제가 아닐꺼라고 판단하고, 즉시 수행하기로 했습니다.
3. 테스트케이스생성
해당 문제를 해결하기 위한 테스트에 필요한 케이스를 우선 구상합니다.
머리속으로 하셔도 되고, 메모하셔도 좋습니다. 전 그냥 머리속으로 했습니다 :-)
WEB
- 캐릭셋을 설정하지 않고 한글을 제대로 표현하는지 테스트합니다.
- 캐릭셋을 원하는 설정으로 변경하고 한글표현을 테스트합니다.
Connector
- get으로 한글을 전달해서 제대로 나오는지 확인합니다.
WAS
- 캐릭셋을 설정하지 않은 상태에서 한글이 제대로 나오는지 확인합니다.
- 캐릭셋을 변경해서 변환이 정상적으로 되는지 확인합니다.
DB
- 콘솔에서 직접 한글을 조회해서 확인합니다.
- collection을 확인하고 원하는 설정으로 변경해서 한글을 입력하고 조회해 봅니다.
4. 테스트 및 문제해결
생각한 테스트 케이스를 수행하면서, 문제를 해결하는 단계입니다.
기술수준이나 경험에 따라서 차이가 좀 있겠지만, 차근차근 한가지씩 해결해나가는 방법이 가장 빠른방법입니다.
WEB
이 시스템은 웹서버로 Apache를 사용하는 경우 입니다.
아파치의 경우 html문서의 상단에 아래와 같은 방식의 정의가 없다면 기본적으로 사용할 캐릭셋을 설정가능합니다.
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
httpd.conf 파일에서 AddDefaultcharset을 원하는 캐릭셋으로 변경한 후 한글의 출력상태를 확인합니다.
Connector
웹서버의 요청을 WAS로 넘겨주는 역할을 합니다.
이 부분에서 POST, GET으로 넘기는 변수를 WAS로 전달할 때 캐릭셋을 변경할 수 있기때문에 확인해야 합니다.
이 시스템의 경우 tomcat 의 server.xml 파일에서 URIEncoding을 설정해 주거나, useBodyEncodingForURI="true" 를 설정하여 캐릭셋을 설정할 수 있습니다.
useBodyEncodingForURI 설정은 이전페이지에 설정된 캐릭셋을 그대로 따른다는 설정이다.
JAVA
Tomcat이 구동될 때 별도의 설정이 없다면 JVM은 ISO-8859-1로 동작합니다.
따라서 한글의 사용을 위해서 tomcat 구동을 시키는 계정의 .bash_profile을 수정해서CATALINA_OPTIONS=-Dfile.encoding=euc-kr 을 추가해서 동작하도록 설정해야 합니다.
캐릭셋이 지정되어 있지 않은 경우의 기본 캐릭셋 설정은 web.xml파일에 아래처럼
기본적으로 사용할 캐릭셋을 지정할 수 있습니다.
<mime-mapping>
<extension>htm</extension>
<mime-type>text/html;charset=euc-kr</mime-type>
</mime-mapping>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=euc-kr</mime-type>
</mime-mapping>
톰캣의 한글 파라미터 설정에 대한 다른 글 http://bit.ly/9DsGlW
JDK
String클래스의 getBytes() 메소드 사용하여 변경하는 경우는 아래처럼 사용합니다.
String(str.getBytes("8859_1"),"KSC5601");
페이지 상단에 캐릭셋을 지정하는 경우는 이런방식으로 사용합니다.
request.setCharacterEncoding("UTF-8");
JDBC
JDBC에서 유니코드 사용하기를 참고하세요 http://bit.ly/cEP9Qa
MySQL Server
my.cnf 파일에서 한글관련 설정을 변경해줍니다.
default-character-set=euckr
자세하세 설명한 글이 있어서 링크합니다.
http://bit.ly/ac8jdT
DB, Table, Field
아래의 명령어를 이용해서 현재의 설정을 확인 후 변경해 줍니다.
show variables like "%character%";
show variables like "%collation%";
자세한 변경방법
http://bit.ly/awd7Jk
5. 검증
실 서버에 적용하고, 통합테스트를 수행해서 검증합니다.