LocalDateTime vs Instant 어떤걸 쓸까?

일단 해볼게·2023년 10월 30일
0

Java

목록 보기
2/3

기존 Date 클래스가 Deprecated된 이유

Java 8 이전에 사용하던 Date 관련 클래스는 DateCalendarSimpleDateFormat 등이 있었으나, 여러 문제가 있어 자바 8 버전 이후부터는 새로운 날짜 관련 API를 제공한다.

기존 클래스들의 문제는 다음과 같다.

  1. mutable
    • Date 클래스는 Thread-safe 하지 않다.
  2. Calendar 클래스의 경우 입력값의 month가 0이 1월로 처리됩니다. 그래서 Calendar.SEPTEMBER 같은 상수를 사용해야 하며, DB 데이터랑 연결하면서 서로 다르게 해석된다.

위의 여러한 문제들이 있어 Java8 이전에서는 Joda-Time이라는 라이브러리를 사용했다. 그러나, Java 8부터는 Joda-Time이 자바 표준 라이브러리로 들어왔다.

Java 8 이후 해결된 문제

  1. Immutable
    • Thread-safe 하다.
  2. UTC에 연결하여 명시적 시간 척도를 기반
  3. date, time, instant, time-zone을 포함하는 공식 시간 개념 지원

LocalDateTime

  • Local 이 들어가면 “시간대(Zone Offset/Zone Region)에 대한 정보가 없다”를 의미

    • Timezone이 없다. 현재 지역에 맞춰서 시간을 표시
      • 글로벌 서비스에 적합하지 않다. 단일 리전 서비스일 때 적합하다.
  • LocalDateTimenow는 default time-zone의 정보를 사용

    • 내부적으로는 Instant형으로 바꾼 후, ZoneOffset으로 한번 바꾼 뒤 EpochSecond로 바꾼 이후에야 LocalDateTime으로 표현
  • 생일이나 기념일 등에 주로 사용

  • 분명한 시간대에서 일어난 이벤트를 나타내는 데는 적합하지 않다.

Instant

  • 1970년 1월 1일 UTC의 첫 번째 순간 이후의 현재 시간까지의 나노초를 나타낸 값
  • 일반적으로 순간을 표현할 때 사용하며, Unix Timestamp를 구할 때 사용
    • Unix Timestamp를 사용하면 되지 않나?
      • Unix Timestamp는 2038년 문제가 있다. 1970년 1월 1일 자정에서부터 2147483647 초가 지난 2038년 1월 19일 화요일 03:14:07 UTC 까지 표현이 가능하다. 이것을 보완한 것이 Instant 클래스이다.
    • 숫자 자료형을 가지고 연산을 하기 때문에 Local/Offset/ZonedDateTime과 비교했을 때 연산 속도가 훨씬 빠르다.
  • 대부분의 비즈니스 로직, 데이터 저장 및 데이터 변경은 UTC로 이루어져야 하므로 자주 사용하기에 편리하다.
  • 특정 지역 시간을 나타내는 데는 적합하지 않다.

참고

https://www.baeldung.com/java-instant-vs-localdatetime

https://sujl95.tistory.com/85

https://dev.gmarket.com/49

https://stackoverflow.com/questions/32437550/whats-the-difference-between-instant-and-localdatetime

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글