[스프링 부트, MySQL] 타임존(timeZone) 설정하기- 서버 별 시간 불일치 해결 방법
스프링 부트를 이용해 간단한 메모장을 만들고 있습니다. DB는 MySQL을 사용하고 있는데 개발 단계에서 로컬 서버에서 저장할 때와 도커서버에 업로드한 배포 버전에서 메모가 저장되는 시간이 서로 다른 문제가 발생하여 이번 시간에는 어떻게 해결 했는지 소개 해보도록 하겠습니다.
로컬서버와 배포서버 시간 불일치 문제
일단 저는 @EnableJpaAuditing를 사용해서 수정시간, 작성 시간을 자동으로 저장하고 있습니다. 로컬 서버던 배포 스프링 부트 서버건 하나의 MySQL 서버의 데이터 베이스를 사용하여 어떤 서버에서 작성하던 같은 데이터가 보이도록 했습니다. 하지만 이렇게 하니 로컬 서버(localhost:8080)에서 저장한 시간와 배포서버에서 저장한 시간이 불일치하는 일이 발생하였습니다.
문제는 타임존 설정
문제의 원인은 타임존(timeZone) 설정에 있었습니다. 기존에는 별다른 타임존 설정을 하지 않아 서버의 시간을 기준으로 작성시간, 수정시간이 저장되었습니다. 그래서 DB에는 서버 시간 기준으로 작성되었고 DB 서버에 저장된 시간은 UTC 시간과 한국 시간이 섞여 있는 상황이었습니다.
JPA설정으로 MySQL에 저장되는 시간을 UTC로 하기
컴퓨터로 실행하는 localhost:8080 서버에서 저장할때의 시간과 이미 배포된 서버에서 데이터를 저장할 때 시간이 다른 문제를 해결하기 위해서는 우선 DB에 저장되는 시간을 어떤 환경에서든 UTC로 저장할 수 있도록 아래와 같이 스프링 설정파일(application.properties)에 가셔서 아래의 jpa 설정을 추가하시면 됩니다.
application.properties에 아래와 같이 설정을 추가하세요
spring.jpa.properties.hibernate.jdbc.time_zone = UTC
위에 설정을 추가하면 JPA로 저장되는 시간이 로컬 서버인지, 배포 서버인지 상관없이 UTC시간으로 저장됩니다.
스프링 부트 서버를 한국시간으로 설정하기
이제 DB에 저장되는 시간을 UTC 시간으로 통일 시켰습니다. 스프링 부트 서버 시작될 때 사용할 기본 시간대를 명시적으로 설정해야 우리가 원하는 한국시간으로 UTC시간을 변경해서 보여 주도록 해야합니다.
메인 함수에 타임존으로 설정하면 한국 시간으로 스프링 부트 서버가 작동합니다.
@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {
// 이렇게 하니 JPA로 날짜 검색을 하니 하루 전날로 나와서 메인 함수에서 실행하는 것으로 바꿨습니다.
// @PostConstruct
// public void init() {
// TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
// }
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
System.out.println("현재 시간은??" + LocalDateTime.now());
SpringApplication.run(DemoApplication.class, args);
}
}
추가 사항
@PostConstruct를 사용하니 날짜로 검색하는 기능이 하루 전날 데이터가 출력되었습니다. 그래서 해결 방법을 찾다가 아래 블로그 를 보고 메인 함수에서 타임존을 설정하는 것으로 바꾸니 정상작동하였습니다.
Spring Boot에서 MySQL DB TimeZone 불일치 문제 해결하기
최근 운영 중인 플랫폼에서 JPA의 LocalDate 필드(환자 생일, 결제 요청일)가 하루씩 내려가는 문제가 발생했습니다. 이 문제의 원인과 해결 과정을 공유합니다. 문제 상황문제 증상LocalDate 필드(환
dami97.tistory.com
댓글