지난 게시물에서 로그가 한글로 출력되지 않는 문제, 한글이 깨지는 문제의 대부분을 해결하였다. 하지만 딱 하나! 쿼리 결과를 로깅하는 부분에서만 한글이 깨졌다.
처음에는 콘솔 자체에서 한글이 깨졌으니 톰캣, JVM 등의 문제라고 생각했지만, 지난 게시물에서 언급한 방법을 다 거쳤음에도 해결이 되지 않아 다른 방법을 시도하게 되었다.
public Map<String, Object> send(생략, 생략, Map<String, Object> requestData){
try{
logger.info("function request message --> [{}] " , convertMapToJsonString(requestData));
(생략)
logger.info("function response message --> [{}] " , convertMapToJsonString(exportData));
(생략)
문제가 되는 코드는 이거였다. slf4j Logger와 LoggerFactory를 사용해 로그를 남기는데, 자꾸 한글이 깨지는 거다. 처음에는 convertMapToJsonString() 메서드에서 문제가 생기나, ObjectMapper 객체 설정 때문인가 한참을 들여다 봤는데 아니더라고.
그래서 JSON으로 변환되었을 때 문제인지, Map 객체로 넘어올 때부터 문제인지 파악을 위해 위와 같은 코드 2줄을 추가해 보았다.
System.out.println("convertMapToJsonString(requestData) = " + convertMapToJsonString(requestData));
logger.info("한글을 남겨 보자");
그리고 애플리케이션을 실행해 보았더니 soutv로 찍었을 때는 한글이 깨지지 않고, 로그에서는 깨지는 것이 확인되었다.
2024-08-19 09:50:43.224 [INFO ][(클래스명).java] send(185) : convertMapToJsonString(requestData) = {(생략) "ITEM":[{"GOOD_NAME":"클라우드 구축","GOOD_SEQ":"1"....
2024-08-19 09:50:43.224 [INFO ][(클래스명).java] send(186) : �ѱ��� ���� ����
이에 다음과 같은 방법으로 문제를 해결하였다.
먼저 내가 이미 시도한 방법들
1. JVM 인코딩 설정 추가하기 : -Dfile.encoding=UTF-8
2. Settings > Languages & Frameworks > JVM Logging : Logger slf4j로 지정하기
위 방법들로는 해결이 되지 않아 내가 최후에 시도한 방법은 slf4j의 로거 구현체인 Logback 설정을 변경하는 거였다.
할 수 있는 모든 설정들이 UTF-8로 되어 있어 의심조차 하지 않았는데, logback.xml을 확인했더니
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="3 seconds">
<appender name="(생략)" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>logFileName</key>
<defaultValue>weblog</defaultValue>
</discriminator>
<sift>
<appender class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>EUC-KR</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%F] %M\(%L\) : %m%n</pattern>
</encoder>
</appender>
</sift>
</appender>
이렇게! 인코더의 캐릭터셋이 EUC-KR로 되어 있는 거다.
그래서 <charset>UTF-8</charset>로 변경한 뒤 애플리케이션을 실행했더니 로그가 깨지지 않았다 !!!

역시 이리저리 찍어 보는 게 오류 해결에 최고인 것 같다 !!