카테고리 없음

[Servlet] jsp post 요청 시 한글 깨짐 문제 해결 방법

벤권 2023. 9. 28. 16:58

JSP에서 POST로 요청을 보내고 컨트롤러에서 HttpServletRequest객체의 getParameter() 함수를 호출하여 파라미터 값들을 가져오면 한글의 경우 계속 깨졌다.

위 사진을 보면 title이라는 parameter의 value로 한글을 넣으면 이상한 문자가 표시되는 것을 알 수 있다.

 

단순히 콘솔 출력 문제가 아니고 실제 DB에도 동일하게 저장이 되었다.

 

자바 웹개발 워크북 저자의 카페에 질문을 하여 답변을 받아보았지만 큰 도움은 안되었고 받은 답변은 그냥 콘솔 출력 인코딩 값으로 보였다.

 

 

톰캣은 서블릿 개발자에게 doXXX 메소드를 통해 HttpServletRequest, HttpServletResponse 인터페이스를 제공 하는데

HttpServletRequsetFacade에 생성자에서 Requset를  전달 받아 필드에 할당 한다.

그래서 사용자가 doXXX 메소드 내부에서 사용하는 객체는 Facade객체이고 내부에 필드로 Requset객체를 가지고 있고  이 내부를 뒤지다 보면 coyoteRequset객체 안에 paramter를 볼 수가 있는데 여기에 요청한 파라미터를 어떤 방식으로 인코딩하는지 볼 수 있는데

ISO-8859-1이라고 되어있다. 

 

인코딩  방식 변경 setCharacterEncoding("UTF-8");

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    log.info("/todo/register -> doPost" + req.getParameter("title"));
    TodoDTO todoDTO = TodoDTO.builder()
                    .title(req.getParameter("title"))
                            .dueDate(LocalDate.parse(req.getParameter("dueDate"), DATEFORMATTER)).build();

    log.info(todoDTO);
    try {
        toDoService.register(todoDTO);
    } catch (Exception e){
        e.printStackTrace();
    }
    resp.sendRedirect("/todo/list");

}

req.setCharacterEncoding()으로 UTF-8로 변경해주면 정상적으로 한글이 인코딩 된다.