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"));
}
잘된다.
'IT > JPA' 카테고리의 다른 글
QueryDSL select specific columns (0) | 2020.08.25 |
---|---|
[JPA] null value was assigned to a property of primitive type setter of (0) | 2019.11.14 |
Spring Data JPA + QueryDsl (2) | 2019.09.09 |
JPQL, NativeSQL, Criteria, QueryDSL, JOOQ... (0) | 2019.09.06 |
@OneToMany 단방향을 @ManyToOne 양방향으로 (2) | 2019.08.28 |