위와 같은 웹 페이지에서 제목란에 'bbb', 내용란에 '안녕하세요'를 입력하면 어떻게 될까? (폼 태그의 method="POST"이다.)
'bbb'는 정상적으로 출력이 되지만, '안녕하세요'는 이상한 문자(?)로 출력이 된다.
왜 한글은 이상하게 출력이 되는 것일까?
클라이언트에서 서버로 영문자를 전송할 때는 '1바이트'의 크기가 사용된다.
하지만 한글을 전송할 때는 '2바이트'의 크기가 사용된다.
'UTF-8' 인코딩 방식을 이용하면 한글을과 영어를 모두 정상적으로 사용할 수 있지만 톰캣은 기본적으로 'UTF-8' 인코딩 방식이 아닌 'ISO-8859-1' 인코딩 방식을 사용한다.
예를들어 '안녕'을 전송하면 'UTF-8'방식은 '안녕'을 '안(2byte)', '녕(2byte)'로 나누어 전송하기 때문에 올바르게 출력하지만, 'ISO-8859-1' 인코딩 방식은 '안녕'을 1byte씩 4개로 전송하기 때문에 한글이 깨진다.
이를 해결하기 위해 request.setCharacterEncoding("UTF-8")을 서블릿 코드에 작성하여 '사용자가 전달한 값을 읽어들이기 전에 UTF-8형식으로 읽어들이겠다'라고 설정을 먼저 해야한다.
이와 비슷한 response.setCharacterEncoding과 response.setContentType에 관한 글은 아래 포스팅을 참고해주세요.
그렇다면 여기서 생기는 의문이 있다.
서블릿은 하나가 아니라 여러 개인데 request.setCharacterEncoding("UTF-8")을 여러 개 써야하나요?
그렇다. 필터(Filter)를 사용하지 않으면 각각의 서블릿마다 위의 인코딩 방식을 적용해야 한다.
Filter
필터는 위의 문제점인 각각 서블릿마다 노가다해서 request.setCharacterEncoding을 작성하는 것을 해결하기 위한 기법으로 필터만 설정해 놓으면 딱 한 번만의 request.setCharacterEncoding 작성을 통해 한글 문제를 처리할 수 있다.
필터를 사용하는 방법은 두 가지가 있다.
1. web.xml 방식
2. 어노테이션(Annotation) 방식
web.xml 방식을 대체하기 위해 나온 방식이 어노테이션 방식이기 때문에 어노테이션 방식만 설명하겠습니다.
어노테이션 방식
우선 필터 클래스를 생성한다.
원하는 클래스명을 입력하고 Finish를 누르면 안되고 필터 클래스이기 때문에 인터페이스 Add를 눌러 Filter Interface를 추가해 주어야한다.
아래는 만든 필터 클래스이다. Filter Interface를 참조하는 모습을 볼 수 있다.
필터에서는 FilterChain의 인스턴스인 chain의 메서드인 doFilter를 사용해야 한다.
chain.doFilter(request, response)를 기준으로 원하는 구문을 넣어주면 된다.
chain.doFilter는 다음 필터 또는 서블릿이 실행되도록 흐름을 넘기는 역할을 한다.
다음 서블릿이나 필터로 넘기기 전에 모든 파일에서 한글 처리가 가능하도록 해야하니 chain.doFilter 전에 request.setCharacterEncoding("UTF-8")을 적어줘야 한다.
12번째 라인은 어노테이션 방식이다. "/*"은 모든 파일에 필터를 적용하겠다는 의미이다.
이로써 한글이 깨지는 문제를 해결할 수 있다.
잘 된다.
'Programming > Servlet' 카테고리의 다른 글
[JSP] JSTL <fmt: formatDate> 태그로 날짜 형식 변경하기 (0) | 2020.08.06 |
---|---|
[JSP & 서블릿] 모델(Model)1, 2 방식에 대해 알아보자 (0) | 2020.08.04 |
서블릿(Servlet) url 매핑기법 2가지(web.xml 방식, 어노테이션 방식) (0) | 2020.07.30 |
[JSP] JSTL(Jsp Standard Tag Library) 정리 - <c:set>,<c:out>,<c:remove>,<c:if>,<c:choose>,<c:when>,<c:otherwise>,<c:forEach>,<c:forTokens> 등 (1) | 2019.10.27 |
[JSP] JSP Beans(빈즈)에 대해 알아보자 (0) | 2019.10.09 |