본문 바로가기
BE/Error

[Spring Boot] 한글이 ??? 로 나올 때, 한글 깨짐 이슈

by 틴디 2024. 8. 23.
728x90
반응형

문제 상황

스테이징 서버에서 문제 없는 것 확인하고 운영서버 배포했다

앱에서 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 감사합니다 ㅠㅠ

728x90
반응형

댓글