서버프로그래밍/Tomcat

톰켓-한글처리

zelkova 2011. 5. 18. 20:58

JSP 한글처리 방법

◎ 기본적으로 알아두어야 할 내용 

 JSP -> JAVA -> .CLASS 로 컴파일되는 과정에서 특별히 지정해주지 않게되면 한글이깨지는 경우가 많다.

한글 처리 문제에 대해서 살펴보기 이전에 기본적으로 알아야 하는 내용은 서블릿 2.2/JSP 1.1 스펙은 HTTP 요청 파라미터의 캐릭터셋을 "ISO-8859-1"로 가정하고 읽어온다는 점이다. 우리가 흔히 톰캣 3.x 버전을 사용할 때 클라이언트로부터 읽어온 값을 오라클 DB에 저장할 때 캐릭터 셋을 "ISO-8859-1"에서 "EUC-KR"로 변환하곤 하는데, 이렇게 캐릭터 셋을 변환하는 이유는 바로 톰캣 3.x 버전은 서블릿 2.2 규약을 따르고 있으며 따라서 파라미터를 "ISO-8859-1"로 읽어오기 때문이다. (오라클과 톰캣 사이에서의 한글 처리 문제에 대해서는 뒤에서 보다 자세히 다루도록 하겠다.)

또한, 서블릿과 JSP에서 한글을 처리하는 방식이 달라질 수 있다는 점이다. 서블릿의 경우는 우리가 컴파일한 클래스가 그대로 사용되는 것이지만 JSP의 경우는 개발자가 작성한 JSP 코드를 JSP 엔진이 서블릿 소스 코드로 변환한 후 다시 서블릿 클래스로 컴파일한다. JSP 엔진에 따라 JSP 소스 코드를 서블릿 소스 코드로 변환하는 과정에서 캐릭터 셋을 변환하기도 하며 또한 컴파일하는 과정에서 캐릭터셋을 변환하기도 한다. 이 얘기는 같은 JSP 코드라도 사용하는 JSP 엔진에 따라서 한글 처리가 달라질 수도 있다는 점이다

 

◎ 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"/>


◎ 한글 파라미터를 가진 링크를 만들 때
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 형태를 갖추고 있어야만 한다.


링크>>>http://javacan.tistory.com/61

반응형