[해결]JPA 사용 시 DB 에 들어가는 시간과 실제 시간이 안맞는 경우
가끔 JPA 를 사용하다 보면 @createdAt 이나 @updatedAt 과 같이
자동으로 타임스탬프를 찍어주는 기능을 사용하는데 이 때 찍혀들어가는 시간과 실제 시간이 안 맞는 경우가 있다.
이런 문제의 원인은 JVM 내의 TimeZone 설정이 안맞아서 그런 경우가 많다.
필자가 이럴 때 해결한 방법중 몇 가지를 소개하고자 한다.
방법 1. URL parameter로 Timezone 설정
MySQL은 기본적으로 useLegacyDatetimeCode=true를 사용한다.
Timezone을 변경하려면 이 옵션을 false로 변경하고 serverTimezone 옵션도 추가한다.
아래와 같이 application.properties에 적어주면 된다.
{} 를 본인의 값으로 대체하면 된다.
spring.datasource.url=jdbc:mysql://{JDBC URL 적어주자}/{SCHEMA 명}?serverTimezone=UTC &useLegacyDatetimeCode=false
spring.datasource.username={}
spring.datasource.password={}
방법 2. Spring Boot 옵션
JPA를 사용할 경우 아래와 같이 옵션을 적용할 수 있다.
단, 방법 1에서 사용했던 useLegacyDatetimeCode=false 옵션도 적용해야 한다.
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
방법 3. JVM 기본 시간대 변경
아래와 같이 JVM 기본 시간대를 변경할 수 있으나,
이 방법 또한 useLegacyDatetimeCode=false 옵션도 적용해야 한다.
@PostConstruct는 Bean이 완전히 초기화 된 후, 단 한번만 호출되는 메소드 이다.
아래 코드를 @Configuration 과 같이 어플리케이션 설정코드 안에 같이 넣어주자.
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
방법 4. Java 실행 옵션으로 timezone 적용
아래와 같이 jar를 실행 할 때 -Duser.timezone 옵션으로 timezone을 변경할 수 있다.
단, 이 경우에는 매번 지정해줘야 하기 때문에 번거로움이 있을 수 있다.
java -jar -Duser.timezone=Asia/Seoul test.jar
'에러해결 & 최적화 > Spring' 카테고리의 다른 글
[해결]접근가능한 url 권한 설정이 안되는 문제(SpringSecurity) (0) | 2021.11.02 |
---|---|
[해결] QueryString이 @RequestParam으로 인식이 안되는 경우 (0) | 2021.09.12 |