구분 | 확인법 | 기본값 |
---|---|---|
운영 체제의 시스템 타임존 | CLI > date | 사용자가 초기 설정함 |
MySQL 서버의 타임존 | SELECT @@system_time_zone; | MySQL 서버가 설치된 운영 체제의 시스템 타임존 |
Spring Boot 애플리케이션에서 MySQL 서버 연결 시 사용하는 타임존 | application.properties 파일 > spring.datasource.url 요청 파라미터 중 serverTimezone | MySQL 서버의 타임존 |
타임존에 어떠한 설정도 하지 않았다면 기본값에 따라 운영 체제의 시스템 타임존 => MySQL 서버의 타임존 => Spring Boot 애플리케이션에서 MySQL 서버 연결 시 사용하는 타임존
으로 타임존이 설정되어 동일한 타임존을 갖게 되고, 정상적으로 시간이 표시된다.
문제 상황으로 원인과 해결법을 파악해보자.
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 서버 연결 시 사용하는 타임존 차이 발생) |
따라서
의 흐름으로 실제 시간보다 9시간 이후의 시간이 화면에 표시된 것이다.
3) 해결
application.properties
파일의 spring.datasource.url
요청 파라미터 serverTimezone=UTC
를 삭제한다. 그러면 기본값인 MySQL 서버의 타임존과 동일하게 설정되어 화면에 제대로 출력된다.
👉 MySQL Workbench에서는 제대로 표시되는 이유
MySQL Workbench도 하나의 클라이언트이다.MySQL Workbench에서 MySQL 서버 연결 시 사용하는 타임존
이 KST로 설정되어있어 실제 시간으로 표시되는 것이다.
MySQL 서버의 타임존과 MySQL 서버 연결 시 사용하는 타임존을 동일하게 설정해야 한다.
@Controller + @ResponseBody + return 객체(Map, List, Class 등)
형식이 된다.// 🟢 application.properties
spring.jackson.deserialization.adjust-dates-to-context-time-zone=false
spring.jackson.time-zone=Asia/Seoul