• Home
  • About
    • Junseok photo

      Junseok

      개발자 블로그

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Java
    • java-basic
    • java-solid
    • java-pattern
    • java-logging
  • Javascript
  • Angular
  • spring
    • spring-framework
    • spring-boot
    • spring-test
  • server
    • jeus
    • webtob
    • tomcat
  • test
    • junit
    • assertj
    • hamcrest
    • dbunit
    • spring
  • docker
  • unix
  • maven
  • db
  • network
  • eclipse
  • intellij
  • microservices
  • etc

Encoding 설정

05 Apr 2019

Reading time ~2 minutes

1. 소개

UTF-8은 웹 응용 프로그램에서 사용되는 가장 일반적인 문자 인코딩입니다.
중국어, 한국어, 일본어를 비롯하여 현재 전세계에서 사용되는 모든 언어를 지원합니다.
아래는 UTF-8 구성을 보여줍니다.

2. Connector Configuration

커넥터는 특정 포트의 연결을 수신합니다. 모든 커넥터가 UTF-8을 사용하여 요청을 인코딩하는지 확인해야합니다.
TEMCAT_ROOT/conf/server.xml의 모든 커넥터에 URIEncoding="UTF-8"매개 변수를 추가합시다.

<Connector
  URIEncoding="UTF-8"
  port="8080"
  redirectPort="8443"
  connectionTimeout="20000"
  protocol="HTTP/1.1"/>

<Connector
  URIEncoding="UTF-8"
  port="8009"
  redirectPort="8443"
  protocol="AJP/1.3"/>

3. Character Set Filter

커넥터를 구성한 후에는 웹 응용 프로그램이 모든 요청과 응답을 UTF-8로 처리하도록해야합니다.
CharacterSetFilter라는 클래스를 정의 해 보겠습니다.

public class EncodingFilter extends OncePerRequestFilter {

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
		filterChain.doFilter(request, response);
	}
}

모든 요청과 응답에 적용되도록 필터를 응용 프로그램의 web.xml에 추가해야합니다.


<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>com.junseok.blog.config.filter.EncodingFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

또는


<filter>
  <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
  <url-pattern>*.do</url-pattern>
</filter-mapping>

해석

아래는 characterEncodingFilter.java 파일 입니다.

.
.
.
protected void doFilterInternal(
    HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
    throws ServletException, IOException {

  String encoding = getEncoding();
  if (encoding != null) {
    if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
      request.setCharacterEncoding(encoding);
    }
    if (isForceResponseEncoding()) {
      response.setCharacterEncoding(encoding);
    }
  }
  filterChain.doFilter(request, response);
}

web.xml 에서 encoding 값을 주지 않으면 해당 필터는 동작하지 않습니다. encoding 값이 null 이 아닌 경우만 동작하도록 되어 있습니다.

web.xml 에서 forceEncoding 을 true로 설정한 경우 HttpServletResponse 에도 Encoding 설정을 해줍니다. forceEncoding 을 true로 설정하지 않은 경우 HttpServletRequest에 encoding 설정이 되어 있다면 filter에서는 encoding을 해주지 않습니다.

encoding 설정을 강제하고 싶고 HttpServletResponse 에도 인코딩 설정을 해주고 싶다면 init-param 에서 forceEncoding 을 true로 설정해 주세요.

4. Server Page Encoding

우리가 구성해야하는 웹 애플리케이션의 다른 부분은 Java 서버 페이지입니다. 서버 페이지에서 UTF-8을 보장하는 가장 좋은 방법은이 태그를 각 JSP 페이지의 맨 위에 추가하는 것입니다.

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

5. HTML Page Encoding

서버 페이지 인코딩은 JVM에게 페이지 문자를 처리하는 방법을 알려주지 만 HTML 페이지 인코딩은 페이지 문자를 처리하는 방법을 브라우저에 알려줍니다.

모든 HTML 페이지의 head 섹션에 이 <meta> 태그를 추가해야합니다.

<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />

실제 인코딩 설정

현재로서는 이것만 필요 함.

filter 없어도 됨.
meta 태그 없어도 됨.

jsp 파일에 아래 코드만 있으면 한글 안깨짐.


<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

template(tiles).jsp 파일에도 있어야 하고, body쪽 해당 jsp 파일에도 있어야 한글이 안 깨진다.

  • javascript 한글 문자
  1. 템플릿 jsp 파일에 없고 body 쪽 jsp에 있으면 파람스값 로 출력 됨.

  2. 템플릿 jsp 파일에 있고 body 쪽 jsp에 없으면 ???? 로 출력 됨.

  3. 둘 다 없으면 파람스값 이렇게 표시 됨.

  • jsp el
  1. 템플릿 jsp 파일에 없고 body 쪽 jsp에 있으면 ??? 로 출력 됨.

  2. 템플릿 jsp 파일에 있고 body 쪽 jsp에 없으면 정상 출력 됨.

  3. 둘 다 없으면 ??? 이렇게 표시 됨.



springframeworkencoding Share Tweet +1