본문 바로가기
Study/Spring

Spring UTF-8 한글 깨짐

by 오늘만 사는 여자 2020. 10. 26.
728x90
반응형

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

 

[Spring] Spring UTF8 한글 설정하기 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

728x90
반응형

'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

댓글