본문 바로가기
IT/JPA

LocalDate, LocalTime JPA Timezone 문제

by 최고영회 2020. 3. 25.
728x90
반응형
SMALL

Java8 이전에는 Date 에 대해서 대응하는 것이 다소 허접했다.
물론 Joda-Time (https://www.joda.org/joda-time/) 이 있었지만
그래도... 이렇게나 많이 쓰이고 있는 Language 에서 Date, Time 을 다루는 객체가 너무 허접했다.
Java8 에서 LocalDate, LocalTime, LocalDateTime 등이 나오면서 매우 편리해 졌다.

Spring Boot 와 JPA 를 사용하면서 도메인 모델에 맞는 제대로 된 Type 을 사용하게 되면서
LocalDate 와 LocalTime 을 구분해서 많이 사용한다.

새로운 API 개발 및 테스트를 진행하다가 이상한 문제에 맞닥뜨렸다.

Entity 의 일부 내용 중 적용기간과 적용시간에 대해서 아래와 같이 정의 했고

// 적용 기간 
@Convert(converter = LocalDateConverter.class)
private LocalDate startDate; 

@Convert(converter = LocalDateConverter.class) 
private LocalDate endDate; 

// 적용 시간 
@Column(columnDefinition = "TIME") 
@Convert(converter = LocalTimeConverter.class)
private LocalTime startTime; 

@Column(columnDefinition = "TIME") 
@Convert(converter = LocalTimeConverter.class) 
private LocalTime endTime;

Test 시 아래 그림 처럼
- startDate: 2020-03-26, endDate : 2020-03-28
- startTime: 00:00:00, endTime:23:59:59
로 데이터를 보냈고

실제로 hibernate 에 의해 아래와 같이 제대로 insert 되었다고 로그를 통해 확인 할 수 있었다.

그리고 다른 API 를 테스트 하는데 예상했던 것 처럼 동작하지 않아 Database 를 확인 해 보니

start_date 와 end_date 는 -1 로 들어가 있고 time 은 전혀 엉뚱한 시간이 들어가 있다.

이상하다...왜그럴까??
위에 hibernate의 bind 되는 로그를 잘 살펴보니 timezone 이 UTC 가 아니라 KST 로 되어 있는 것을 확인 했다.....
jdbc url 에는 timezone UTC 옵션이 적용되어 있는데....

그래서 ​boot main class 에 아래와 같이 timezone 을 UTC 로 셋팅한다.

@PostConstruct 
public void started() { 
  TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
}

잘된다.

728x90
반응형
LIST