[Spring Boot] Time Zone - 9시간 차이에 대해

hameee·2023년 12월 21일
1

Spring Boot

목록 보기
9/20
post-thumbnail

📍 Timezone

구분확인법기본값
운영 체제의 시스템 타임존CLI > date사용자가 초기 설정함
MySQL 서버의 타임존SELECT @@system_time_zone;MySQL 서버가 설치된 운영 체제의 시스템 타임존
Spring Boot 애플리케이션에서 MySQL 서버 연결 시 사용하는 타임존application.properties파일 > spring.datasource.url 요청 파라미터 중 serverTimezoneMySQL 서버의 타임존

따라서 타임존에 어떠한 설정도 하지 않았다면 기본값에 따라 운영 체제의 시스템 타임존 => MySQL 서버의 타임존 => Spring Boot 애플리케이션에서 MySQL 서버 연결 시 사용하는 타임존으로 타임존이 설정되어 동일한 타임존을 갖게 되고, 정상적으로 시간이 표시된다.

📍 실제 시간과 9시간 차이나는 원인 & 해결법

문제 상황으로 원인과 해결법을 파악해보자.

1) 문제 상황

클라이언트 화면에서만 실제+9시간으로 표시된다.

구분표시 시간
실제 데이터 입력 시간2023-12-21 22:49:52(한국 시간)
MySQL Workbench 표시 시간2023-12-21 22:49:52
화면 출력 시간Fri Dec 22 07:49:52 KST 2023
(= 실제 + 9시간)

2) 원인

application.properties파일의 spring.datasource.url 요청 파라미터로 serverTimezone=UTC가 보내지고 있어, MySQL 서버의 타임존Spring Boot 애플리케이션에서 MySQL 서버 연결 시 사용하는 타임존이 통일되지 않았다. (운영 체제의 시스템 타임존은 통일되지 않아도 된다.)

구분타임존
운영 체제의 시스템 타임존KST
MySQL 서버의 타임존KST
Spring Boot 애플리케이션에서 MySQL 서버 연결 시 사용하는 타임존UTC (🚩 MySQL 서버의 타임존과 MySQL 서버 연결 시 사용하는 타임존 차이 발생)

따라서

  • 데이터베이스의 시간을 (KST인데) UTC로 인식하여 SELECT
  • 클라이언트의 운영 체제의 시스템 타임존(KST)에 따라 +9시간을 함(KST=UTC+9)
  • 화면에 출력

의 흐름으로 실제 시간보다 9시간 이후의 시간이 화면에 표시된 것이다.

3) 해결

application.properties파일의 spring.datasource.url 요청 파라미터 serverTimezone=UTC를 삭제한다. 그러면 기본값인 MySQL 서버의 타임존과 동일하게 설정되어 화면에 제대로 출력된다.

👉 MySQL Workbench에서는 제대로 표시되는 이유
MySQL Workbench도 하나의 클라이언트이다. MySQL Workbench에서 MySQL 서버 연결 시 사용하는 타임존이 KST로 설정되어있어 실제 시간으로 표시되는 것이다.

📍 결론

MySQL 서버의 타임존MySQL 서버 연결 시 사용하는 타임존을 동일하게 설정해야 한다.

📍 AJAX 통신을 하는 경우

  • 일반적으로 AJAX 통신을 처리하는 메서드는 @Controller + @ResponseBody + return 객체(Map, List, Class 등) 형식이 된다.
  • 이 경우 Jackson Library가 실행되는데 Jackson Library는 기본적으로 UTC를 기준으로 한다.
  • 따라서 MySQL 서버(KST) - Jackson Library(UTC) - 운영 체제의 시스템(KST)을 통해 데이터가 처리되는 경우 타임존이 일치하지 않아 화면에 제대로 출력되지 않을 수 있다.
  • 이 경우 Jackson Library의 타임존을 KST 설정하면 문제를 해결할 수 있다. 아래와 같이 application.properties 파일에 작성한다.
// 🟢 application.properties

spring.jackson.deserialization.adjust-dates-to-context-time-zone=false
spring.jackson.time-zone=Asia/Seoul

References

🔗 https://marobiana.tistory.com/168

0개의 댓글