Spring UTF-8 한글 깨짐
오류 내용
Spring 프로젝트에서 한글이 깨짐
▶ 한글이 깨지는 이유
보통 브라우저 -> 서버 -> DBMS로 같은 내용의 한글이 서비스 처리를 하는 단계에서 매번 다른 문자코드를 사용하여 재표현되기 때문이다.
▶ 한글을 올바르게 표현하는 방법
1. GET와 POST방식이 다르다.
2. GET
→ 3이용
→ 데이터가 GET방식에서는 요청정보 Header의 URI에 포함되어 전달된다.
→ 서블릿의 영역 밖에 존재한다.
→ URI에 대해 인코딩 처리 작업
3. POST
→ 1+2이용
→ 데이터가 POST방식에서는 요청정보 Body에 포함되어 전달된다.
→ 서블릿에서 어느 정도 컨트롤이 가능하다.
해결 방법
1. [POST 방식] 스프링 웹 프로젝트 web.xml에 utf-8설정
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
▶ Spring Web Project - POST 방식에서의 한글 깨짐 해결 방법
▶ 역할
- 브라우저 -> 요청정보 Body 데이터 - utf-8 인코딩 -> Java 단에서의 데이터 처리
- CharacterEncodingFilter
-> HTTP 상에서 주고 받는 데이터의 헤더값을 UTF-8로 인코딩
- Servlet에서의 request.setCharacterEncoding("utf-8");
-> POST로 인코딩 데이터를 받는 Servlet에서의 request.setCharacterEncoding("utf-8"); 처리와 동일한 기능을 수행한다.
-> 즉, 이 Filter를 설정하면 Post 요청을 보내는 (Submit) 또는 Controller(Servlet) 마다 request.setCharacterEncoding("utf-8") 내용을 추가하지 않아도 된다,.
- 또한 DB에서 불러올 한글 데이터들의 한글 깨짐 현상을 해결한다.
▶ 사용
- 해당 filter를 매핑할 때 모든 URL에 대해 인코딩될 수 있도록 /*와 같이 url-pattern을 설정한다.
- 주의!) Spring Security 설정이 있는경우, 한글 필터 설정이 sppringSecurityFilterChain앞에 위치해야 한다.
2. [POST 방식] .jsp파일에 utf-8설정
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
▶ Spring Web Project - POST 방식에서의 한글 깨짐 해결 방법
▶ 역할
- 응답정보 Body 데이터(JSP내의 JAva 코드 + HTML) UTF-8인코딩 -> 브라우저
-> JSP의 인코딩 방식이 무엇인지 알 수 있게 선언하는 것
-> JSP 파일에서의 한글 깨짐이 해결된다.
- sERVLET에서의 response.setContentType("text/html; charset=utf-8");
-> Servlet에서의 response.setContentType("text/html; charset=utf-8"); 처리와 유사한 기능을 수행한다.
-> Servlet/JsP단에서의 설정 방법의 차이점은
serlvet-context.xml에서의 설정과 차이점을 참고하자
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
<property name="contentType" value="text/html; charset=UTF-8"/>
</bean>
* Servlet/jsp 단에서의 설정
- servlet-context.xml 에서의 설정은 Servlet 단에서의 설정을 의미한다.
- .jsp파일 상의 page 설정은 jsp 단에서의 설정을 의미한다.
* Servlet/jsp 단에서의 설정 방법의 차이
- jsp 디폴트 contentType ; ISO-8859-1
- 아무리 Servlet에서 response.setContentType 결정해서 보내더라도 .jsp page 자체의 contentType은 jsp spec에서 결정되므로 직접 기술해주지 않으면 ISO-8859-1로 설정된다.
- Servlet 단에서의 설정은 jsp가 아닌 텍스트 리턴 시에만 이요된다.
* 따라서, 직접 .jsp page에 기술하는 것이 좋다.
Reference : gmlwjd9405.github.io/2019/01/01/spring-utf8.html
'Study > Spring' 카테고리의 다른 글
Spring task Scheduler Cron Expression 크론 표현식 (0) | 2020.11.16 |
---|---|
구글 로그인 api 웹 인증하기 (0) | 2020.11.02 |
스프링 암호화 기능 (0) | 2020.10.22 |
AOP란? (AOP 적용 예제) (0) | 2020.10.16 |
Interceptor (0) | 2020.10.13 |
댓글