[Java] 55. Spring framework에서 문자 깨짐 문제를 해결하는 방법(Encoding 설정)


Study/Java  2021. 6. 30. 14:27

안녕하세요. 명월입니다.


이 글은 Spring framework에서 문자 깨짐 문제를 해결하는 방법(Encoding 설정)에 대한 글입니다.


Eclipse에서 기본적으로 우리가 프로그램을 만들 때, 기본적으로 문서의 문자 코드를 설정합니다.

위 예제는 java파일과 jsp 파일에 설정한 문자 코드입니다만, 그 외에 xml 파일이라던가 properties 파일 파일에도 우리는 기본적으로 UTF-8를 설정합니다.


이러한 것들은 파일에 대한 문자 코드이지 서버와 클라이언트 간의 통신에 대한 문자 코드는 아닙니다. 즉, 브라우저에서 요청이 오면 그 안에는 요청 해더 값이 있고 이 헤더 값은 어느 문자 코드인지 지정해야 합니다.

또 브라우저에서 요청이 온 것을 다시 controller의 값과 view의 데이터를 파싱하여 반환을 하게 되는 데 여기에도 문자 코드의 설정이 필요하게 됩니다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <!-- 요청시에 헤더 데이터를 보내기 위한 form 태그 -->
  <form method="post">
    <!-- text 박스 -->
    <input type="text" name="paramdata"><br />
    <!-- submit 버튼 -->
    <input type="submit">
  </form>
  <!-- modelmap으로 넘겨 받는 데이터 -->
  ${Data} 
</body>
</html>
package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class Home {
  // 요청 url 패턴 (index.html) - get 방식으로 요청하는 경우
  @RequestMapping(value = "/index.html", method = RequestMethod.GET)
  public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmap에 데이터 설정
    modelmap.addAttribute("Data", "");
    return "index";
  }

  // 요청 url 패턴 (index.html) - submit 버튼을 눌러 post 방식으로 요청하는 경우
  @RequestMapping(value = "/index.html", method = RequestMethod.POST)
  public String post(@RequestParam String paramdata, ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmap에 데이터 설정
    modelmap.addAttribute("Data", paramdata);
    return "index";
  }
}

위 소스를 작성하고 기동을 하게 되면 index 함수가 호출이되고 index.jsp 파일이 파싱이 되면서 text박스와 submit 버튼이 표시되는 화면이 나옵니다.

그리고 textbox에 '안녕하세요'라고 데이터를 놓고 submit 버튼을 누르면 textbox의 데이터가 name명인 paramdata의 변수명으로 form 데이터로 post 함수가 호출이 됩니다. 그리고 파라미터 paramdata로 데이터를 받고 modelmap의 Data가 설정된 다음 index.jsp 파일이 파싱되면서 브라우저로 응답합니다.

결과를 보시면 예상되는 것은 submit 버튼 밑에 안녕하세요라는 데이터가 표시되기를 예상했으나 문자 깨짐으로 무슨 글자인지 알 수가 없는 문자가 되었네요.


여기서 우리는 브라우저에서 요청이 오는 데이터를 문자 변환을 해야합니다.

먼저 web.xml에 filter 설정으로 스프링 문자 코드를 설정합니다.

<!-- 모든 요청은 encodingFilter의 필터명을 호출한다. -->
<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>
<!-- encoding 패턴 (Post 등의 헤더 값 인코딩 설정) -->
<filter>
  <!-- 필터명을 설정 - encodingFilter -->
  <filter-name>encodingFilter</filter-name>
  <!-- 호출할 클래스 이름을 설정 (package 포함) -->
  <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>

참고 - CharacterEncodingFilter.html


filter에 대해서는 이전 글에서 설명한 적이 있습니다.

링크 - [Java] 54. Spring framework에서 Web filter를 사용하는 방법


문자 변환 클래스를 필터에 적용을 시키면 브라우저에서의 모든 요청은 CharacterEncodingFilter 클래스를 거치게 됩니다.

거기서 모든 요청의 문자 코드는 자동으로 설정이 되고 호출되는 controller에 표시가 되겠습니다. 그 이후는 문자 코드가 설정된 다음이 되기 때문에 문자 깨짐이 사라지겠네요.

여기서는 사실 문자 깨짐을 해결하는 방법에 대해서 설명하였습니다만, 사실 Filter를 세션 확인에 사용하는 로그인 인증 확인 이외의 방법에 대해 사용 방법을 설명한 예제입니다.

여러가지 Filter를 어떤 방법으로 사용할 수 있는 예제가 있을까 고민한 끝에 가장 자주 사용할 만한 문자 깨짐을 해결하는 것을 예로 들어 봤습니다.


여기까지 Spring framework에서 문자 깨짐 문제를 해결하는 방법(Encoding 설정)에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.