JSP/서블릿 흝어 보기

한글처리

※ 질의 문자열에 한글을 입력했을 때 깨지는 현상을 확인해보자.

한글깨짐 현상

memberInput.html 화면에서 자기소개를 한글로 입력하고 전송을 눌른다.

memberInput.html의 폼 메소드 값이 post로 되어 있기 때문에 doPost( )가 실행되었다.
실행결과를 보면 한글로 입력한 질의문자열 값이 깨지는 것을 볼 수 있다.

위와 같이 한글이 깨지는 이유는 보통 브라우저→서버→DBMS 로 같은 내용의 한글이 서비스 처리를 하는 단계에서 매번 다른 문자코드를 사용하여 재표현되기 때문이다.

한글을 올바르게 표현하는 방법은 GET와 POST 방식이 다르다. GET방식은 요청정보 헤더의 URI에, POST방식은 요청정보 몸체에 포함되어 전달되기 때문이다.

POST 방식의 한글 처리

POST 방식에서 한글 처리를 해주는 메소드는 HttpServletRequest의 상위객체인 ServletRequest에서 제공하는 setCharacterEncoding( ) 메소드이다. 

setCharacterEncoding( ) 메소드는 클라이언트가 전달한 요청 정보 몸체에 있는 문자열들을 메소드 인자값으로 지정한 문자코드로 인코딩해준다.

package job.study.web;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MemberQueryTestServlet
 */
@WebServlet("/memberQueryTest")
public class MemberQueryTestServlet extends HttpServlet {
    
    .... 생략 ....

    /**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<html><head><title>Query 문자열 테스트</title></head>");
		out.print("<body>");
		out.print("<h1>POST 방식으로 요청되었습니다</h1>");
		
		//요청정보 몸체에 있는 문자열들을 인자값으로 지정한 문자코드로 인코딩한다.
		request.setCharacterEncoding("UTF-8");
		
		//getParameter는 중복되지 않고 유일하게 하나만 넘어올 떄 사용된다.
		//getParameter의 반환값은 String이다. 
		String userId = request.getParameter("userId");
		String passwd = request.getParameter("passwd");
		String email = request.getParameter("email");
		String hp_1 = request.getParameter("hp_1");
		String hp_2 = request.getParameter("hp_2");
		String emailAgree = request.getParameter("emailAgree");
		//getParameterValues는 체크박스처럼 다중 선택되는 입력 양식의 값을 추출할 떄 사용된다.
		String[] interest = request.getParameterValues("interest");
		String introduce = request.getParameter("introduce");
        
            .... 생략 ....
	}
}

setCharacterEncoding( ) 메소드를 적용한 doPost( ) 메소드의 실행된 결과이다. 한글이 깨지지 않고 정상적으로 출력되는 것을 확인할 수 있다.

GET 방식의 한글처리

GET 방식으로 전달된 질의 문자열들은 URI에 포함되어 전달되기 때문에 URI에 대해 인코딩 처리 작업을 해야한다. 서버마다 기본적으로 URI 인코딩 문자코드가 정해져 있으며 톰캣8 버전에서는 UTF-8 문자코드가 기본값으로 적용된다. 

작업환경에서 사용중인 WAS로 톰캣8을 사용하고 있으므로 다음과 같이 한글이 올바르게 출력되는 것을 볼 수 있다.

만약 서버의 URI인코딩 처리 문자코드를 지정하고 싶다면 다음처럼 서버의 환경 설정 파일 중 server.xml 파일에 인코딩 문자코드를 설정해줍니다.

댓글

댓글 본문