문제 상황
게시판에서 POST 요청으로 글 작성 시 한글이 깨지는 현상이 나타났다.
아니 어제까지도 잘 됐는데 갑자기..?
전체 페이지가 그런 것은 아니었다.
작성되어 있던 글은 잘만 나오는데 새롭게 작성하는 글은 모두 저런 형태로 출력되었다.
자, 그럼 어디서부터 잘못된 건지 찾아보도록 하자.
먼저 데이터베이스 쪽을 살펴보았다
출력만 그런 게 아니라 애초에 DB에 들어갈 때 이렇게 되는구나?
어디서 깨지는 거야 도대체
Controller에서 로그를 찍어보니 이미 한글이 깨진 채로 전송이 된다는 걸 알 수 있었다.
해결 방법
1. 데이터를 가장 먼저 마주하는 Controller의 문제일까?
RequestMapping 부분을 다음과 같이 수정했다. → 실패
@RequestMapping(value = "/product/*", produces = "text/plain;charset=UTF-8")
2. 이클립스의 문제일까?
라고 하기엔 이미 초반 인코딩 세팅을 잘해둠
3. 그럼 post 방식의 문제인가 보다!
현재 게시판의 form 태그는 파일 첨부가 가능하도록 enctype="multipart/form-data" 설정을 해둔 상태이다. 거기에 다음의 설정을 추가한다. → 실패
<form action="/product/write" method="post" enctype="multipart/form-data" accept-charset="UTF-8">
4. 그래 이건 WebConfig의 문제야
그렇지만 이미 인코딩 필터 설정을 해두었다.
이 부분에서 구글링을 하던 중 새로운 키워드를 만났는데 바로 'Security'다.
생각해보니 시큐리티 설정 이후 나타난 오류잖아?!
대다수의 글이 web.xml에서 Encoding Filter를 SecurityFilterChain보다 앞에 두라는 말을 하고 있었다.
그치만 난 Java Config 인걸..?
5. Security Config 클래스의 configure 메서드에 다음과 같이 설정한다.
@Override
protected void configure(HttpSecurity http) throws Exception {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
http.addFilterBefore(filter, CsrfFilter.class);
// 생략
}
2시간의 삽질 끝에 드디어.. 성공!
Security는 Dispatcher Servlet 보다 먼저 작동하기 때문에 Encoding Filter를 거치지 않았을 것으로 생각된다.
그래서 CSRF 토큰을 처리하기 전에 Encoding filter 가 동작할 수 있도록 해주었다.
해결 끝!
'👾 Trouble Shooting' 카테고리의 다른 글
[OS] Window10(윈도우 10) 비정상적인 메모리 사용량 해결 방법 (0) | 2022.06.18 |
---|---|
[MySQL] Access denied for user '유저아이디'@'localhost' (using password: YES) 에러 해결방법 (11) | 2022.05.27 |