LocalDate, LocalTime JPA Timezone 문제

LocalDate, LocalTime JPA Timezone 문제

기억과 기록

최고영회 최고영회 2020. 3. 25. 09:08

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")); }

잘된다.

from http://kimyhcj.tistory.com/382 by ccl(A) rewrite - 2020-03-25 09:20:36

댓글

이 블로그의 인기 게시물

[Linux] 파일 로그 보기(tail)

[샤니마스 SPRING PARTY2020] THE IDOLM @ STER SHINY COLORS SPRING...

2020 LCK 롤챔스 Spring 경기 재개 및 일정