Tomcat/JSP와 한글 프로그래밍

총 정리 차원에서...
Tomcat 한글 설정하기
일반적으로 웹 어플리케이션이 GET과 POST 방식으로 파라미터를 넘겨 받을 때 request.setCharacterEncoding()을 통한 문자셋 인코딩이 필요하다.

◎ Tomcat 4.x
단순히 JSP 혹은 서블릿의 최 상단에 request.setCharacterEncoding("euc-kr");을 하면 된다.
GET과 POST 방식에 상관없이 인코딩을 해준다.

◎ Tomcat 5.x
POST 방식은 request.setCharacterEncoding("euc-kr");로 계속 하면된다.
하지만 GET 방식은 server.xml의 설정 부분을 바꿔줘야만 한다.

<Connector port="8080"
  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  enableLookups="false" redirectPort="8443" acceptCount="100"
  debug="0" connectionTimeout="20000"
  disableUploadTimeout="true" URIEncoding="euc-kr"/>

<Connector port="8009"
  enableLookups="false" redirectPort="8443" debug="0"
  protocol="AJP/1.3" URIEncoding="euc-kr"/>

위에서 URIEncoding="euc-kr" 부분이다.그리고 아래의 port="8009" 부분은 mod_jk를 이용해서 Apache와 Tomcat 5.x 를 연동할 때 URIEncoding="euc-kr"을 지정할 필요가 있다.

URIEncoding으로 지정할 경우, 만약 웹 어플리케이션이 EUC-KR과 UTF-8을 각 요청 별로 따로 처리할 필요가 있을경우 그에 대응할 수 없다. 대신, useBodyEncodingForURI="true"을 사용하면 Tomcat 4.x와 동일한 방식으로 즉, request.setCharacterEncoding() 값에 따라 GET/POST 방식 모두를 처리할 수도 있다. (참조 : http://tomcat.apache.org/tomcat-5.5-doc/config/http.html)

결론적으로 Tomcat 4.x와 Tomcat 5.x 는 모두 request.setCharacterEncoding()이 필요하다는 사실에는 변함이 없다.

◎ 한글 파라미터를 가진 링크를 만들 때
JSP페이지에서 링크를 생성할 때, 한글이 됐든 공백이나 특수문자를 가진 영어가 됐든, 순수하게 영어와 숫자, 밑줄 등으로만 이뤄진게 아닌 모든 파라미터를 넘길 때는 무조건 URLEncoding을 해야한다고 봐도 된다.

Web Container에 따라 URLEncoding을 안하고 넘겨도 작동하는 경우가 있는데, 동일한 웹 컨테이너라도 버전에 따라 한글을 제대로 인식하지 못하는 경우도 있고, 또 다른 컨테이너에서는 URLEncoding이 안된 한글을 전혀 인식하지 못할 수도 있다.

그러므로 무조건 표준을 따라서 java.net.URLEncoder.encode()메 소드를 사용해 인코딩해서 넘기도록 한다. 디코드 작업은 request.setCharacterEncoding()에 의해서 자동으로 이뤄지므로 해줄것이 없다.(Tomcat 3.x대- JSP Spec 1.1 -에서는 request.setCharacterEncoding()이 없으므로 String.getBytes()를 이용해 직접 디코딩을 해줘야만 했다)

◎ <%@ include file="test.jspf"%> 에서의 한글
위와 같이 test.jspf를 static include 할 경우에 test.jspf에 있는 한글이 모두 깨질 수 있다. test.jspf에도 한글 설정이 필요한데, 이 경우에는 test.jspf의 최 상단에 다음을 추가하면 된다.

<%@page pageEncoding="euc-kr"%>

  • static include : JSP 페이지를 컴파일하는 시점에 해당 jspf 파일의 내용을 문자열 그대로 현재 jsp에 삽입하여 컴파일 하는 것. static include 방식에서 include 되는 대상 jsp의 확장자는 .jspf로 하는 것이 표준이다. .jspf 는 단독 실행을 위한 것이 아니라 항상 다른 JSP에 포함되어 쓰이는 목적으로 만들어졌기 때문에 완전한 JSP의 형태를 갖추고 있지 않다.
  • <jsp:include page=""/> 이 방식은 동적 include 방식으로, JSP 페이지가 실행되는 중간에 page에 지정된 jsp를 실행한 결과를 삽입하는 방식이다. 이 방식에서는 include 되는 JSP 페이지가 원래부터 페이지 인코딩 정보 등을 포함한 완전한 JSP 형태를 갖추고 있어야만 한다.

핑백

덧글

  • psyoblade 2006/11/08 16:49 #

    좋은정보 잘 얻고 갑니다. 항상 한글 인코딩 문제에서 문제가 되더군요.
    그리고 당연한 결과이지만, 인코딩 한 페이지를 다시 인코딩해도 문제가 되네요. 예를들어 하나의 페이지에서 자신 페이지로 submit 하는 테스트 페이지를 사용하였는데, 결국 계속 인코딩을 하게되니 두번 submit 하면 한글이 깨지는군요 쩝.
    결국 두개의 jsp 페이지를 만들어야만 하나요 ?
  • 권남 2006/11/09 13:24 #

    psyoblade님// 흠.. form 의 action을 자기자신으로 정하고서 submit을 한다고 해서 한글이 깨지지는 않습니다.
    뭔가 한글 인코딩 설정을 잘못하신걸로 보입니다.
  • guest 2006/11/29 23:48 # 삭제

    좋은 정보 감사합니다.
  • LinDol 2007/01/18 22:52 # 삭제

    좋은 정보 감사 합니다.

    getBytes, "UTF-8" 이걸 해야했었군요
    SERVLET 2.4에선 setCharacterEncoding가 안되는건가요?
    그래서 그랬었나.

  • 권남 2007/01/19 15:10 #

    LinDol님// Servlet Spec 2.4에서 setCharacterEncoding 됩니다. 단, GET 방식에 대해서는 설정파일에서 URIEncoding 값 설정 작업이 추가적으로 있는 것입니다. 글 내용에 이에 관한 언급이 있습니다.
  • bangsuni 2007/03/15 16:23 # 삭제

    좋은 정보 감사합니다. 덕분에 인코딩 문제를 깨끗하게 해결했네요 ㅋㅋ
  • 쫑아 2008/01/09 11:10 # 삭제

    완전 캄사해요 ㅠㅠ 덕분에 해결됐어요!!! ^0^
  • 김석영 2008/02/04 17:25 # 삭제

    좋은정보 감사합니다..
    한글 처리 때문에 고생을 하고 있었는되..
    해결을 할수 있을꺼 갔내요...
    해당 글 스크랩을 해가도 될련지요...
  • 지환빠 2012/09/06 14:48 # 삭제

    좋은 정보 감사합니다.
    잘쓰겠습니다.
  • hi 2016/04/17 21:14 # 삭제

    요즘은 웹 html 문자셋은 가급적 UTF-8로 쓰세요.
    저 문자셋으로 거의 통일됨.
    그래야 다른 유럽어 등 다국어도 다 제대로 바르게 표현된다고 합니다.
※ 로그인 사용자만 덧글을 남길 수 있습니다.