문제 상황
스테이징 서버에서 문제 없는 것 확인하고 운영서버 배포했다
앱에서 request시 보내주는 데이터를 로그로 확인하니
한국어만 ? 로 나오는 이슈가 있었다. 영어는 정상적으로 데이터가 찍히는 걸 확인했다.
바로 파악하기 어려웠던건 request, response 모두 암호화 해서 주고 받고 있고 내부적으로 모두 Base64 utf-8 인코딩을 사용했다.
스테이징 서버에서 동작하던 것이 운영서버에서 다르게 동작했기 때문에 두 환경의 차이점을 먼저 살펴보는 것이 맞았다
해결방법
-Dfile.encoding=UTF-8
jvm 옵션에서 file.encoding 옵션을 추가한다
"java", "-Dspring.profiles.active=prod", "-Dfile.encoding=UTF-8", "-jar"
위치가 중요한데 -jar 옵션(JAR 파일 실행) 이전에 설정해주어야 한다!!
JVM이 시스템 속성을 설정한 후 JAR 파일을 실행해야 설정이 반영된다
그 밖에 시도한 것
서블릿 강제 인코딩
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
server.servlet.encoding.force-response=true
HTTP response에 지정된 문자 인코딩 (server.servlet.encoding.charset)을 강제로 적용하는 옵션이다
response의 Content-Type 헤더에 인코딩이 지정되지 않았을 때 클라이언트에서 인코딩 문제가 발생할 수 있다
주로 HTML 페이지에서 한글이 ? 로 나올 때 사용되는 방법
잘 못된 위치에 옵션 추가
jvm 옵션에 순서가 있고 이 순서가 중요한지 몰랐다
바로 위에 작성한 서블릿 강제 인코딩은 response에 대한 것이었다면 이번에 발생한 문제는 request부터 문제가 발생했기 때문에 애플리케이션 실행시 필요한 시스템 속성 설정을 해줘야 했다
-jar 옵션 다음에 -Dfile.encoding=UTF-8을 설정해 줬었는데 반영되지 않았다
JVM 옵션
java [JVM options] -jar [JAR file] [applica tion arguments]
시스템 속성 설정
-D 옵션은 JVM이 시작될 때 시스템 속성을 설정한다
예) -Dspring.profiles.active=prod는 애플리케이션 실행시 spring.profiles.active를 prod로 설정 -Dfile.encoding=UTF-8 은 JVM이 파일, 문자열, IO 작업에 대해 UTF-8을 기본적으로 사용하도록 설정 |
-D 옵션은 -jar 옵션 이전에 배치되어야 JVM이 시스템 속성을 설정한 뒤 jar 파일을 실행하여 설정을 반영할 수 있다.
-jar 옵션
- jvm이 지정된 jar 파일을 실행하게 한다
- -jar 이후 나오는 옵션은 애플리케이션 인자로 처리된다
- -jar은 JAR 파일 경로와 함께 명시된다
도움을 주신 동료분들과 문서와, chat gpt 감사합니다 ㅠㅠ
댓글