Java8+ Instant vs LocalDateTime 각 사용방법

Ssabae·2020년 9월 3일
13
post-thumbnail

JAVA Instant와 LocalDateTime의 다른점

Java 8 이상되면서 Date, Time, Timestamp등이 레거시가 되어버리고
무의식적으로 LocalDateTime, ZonedDateTime, LocalTime 등을 Database Entity에서 사용하는것을 많이 봐왔습니다.
그러던중 Instant라는 객체를 발견하면서부터 의구심이 들었습니다.
더 좋은거 같은데 왜 사람들이 안쓰는거였지? 하는 생각부터 하게되면서
어떠한 타입을 어느곳에 적절하게 사용하여야 하는지 조사해본 결과를 공유하려 포스팅을 남깁니다.

각 특징만 간단하게만 소개하고 사용 방법에 대해서는 생략 하도록 하겠습니다

Table of Contents

Instant

java-date-instant
많은 사람들이 long형 Unix Timestamp(POSIX Time, Epoch Time)을 쓰는 이유는 간단합니다.
integer, long type을 이용한 정렬 / 연산등에서 다른 타입들보다는 빠른 속도를 자랑합니다.
하지만 Unix Timestamp는 Year 2038 problem을 가지고 있기 때문에 지금이라도 다른 타입을 사용하는게 좋습니다.
그래서 나온것이 Java의 Instant입니다.

Instant는 자바 1.8 java.time package에 들어가있으며 UTC의 타임 라인에있는 순간으로,
1970년 1월 1일 UTC의 첫 번째 순간 이후의 현재 시간까지의 나노초를 나타낸 값 입니다.
부분의 비즈니스 로직, 데이터 저장 및 데이터 변경은 UTC로 이루어져야하므로 자주 사용하기에 편리한 클래스입니다.

LocalDate, LocalTime, LocalDateTime

java-date-localdate
java-date-localtime
java-date-time-localdatetime

Java Time에서 Local이 들어간다는것은 시간대(Zone Offset/Zone Region)에 대한 정보가 없다는 의미입니다.
보통 이런날을 사용하는것은 그 날이 의미하는 즉, 생일 이나 기념일에 많이 사용하게 됩니다.

다른나라에서 하는 이벤트 시간을 맞추기 위해서는 반드시 OffsetDateTime, ZonedDateTime을 사용해야 합니다.

OffsetDateTime

java-date-offsetdatetime
LocalDateTime + ZoneOffset의 개념으로
OffsetDateTime는 UTC보다 몇 시간/분/초 또는 의 컨텍스트를 사용하여 순간을 날짜 및 시간으로 나타냅니다.
Offset의 크기(시간/분/초)는 ZoneOffset 클래스로 표시됩니다.
시간/분/초가 0이면 OffsetDateTimeInstant 동일한 UTC의 순간을 나타냅니다.

ZonedDateTime

java-date-zoneddatetime
OffsetDateTime + ZoneRegion에 대한 정보까지 포함한 객체입니다.
OffsetDateTime과의 차이점은 DST(Daylight Saving Time)와 같은 Time Transition Rule을 포함하는 ZoneRegion의 유무차이 입니다.
DST에는 CET(겨울), CEST(여름) 형태가 있는데 Time Zone(CET)로 통일하고 Time Transition Rule을 가지는 ZoneRules를 통해 알아서 내부적으로 계산해줍니다.

Legacy에서 마이그레이션시 추천 타입

java-date-time-types

기존에 사용하고 있는 형태에 대해서는 해당 표와 같이 변경하는것을 추천드립니다.

JDBC에서 변경되는 형태

JDBC는 Java와 Database Scheme 사이의 컨버팅을 다음과 같이 자동으로 변경이 됩니다.

java-date-java-sql

참고
https://stackoverflow.com/questions/32437550/whats-the-difference-between-instant-and-localdatetime
https://perfectacle.github.io/2018/09/26/java8-date-time/

profile
Front-End 부터 Back-End 까지 잘 하고 싶은 개발자

2개의 댓글

comment-user-thumbnail
2020년 9월 10일

좋은 정리글 감사합니다!

답글 달기
comment-user-thumbnail
2021년 10월 21일

정말 정리가 잘돼있네요. 감사합니다.

답글 달기