WeeklyStudy / modern-java-in-action

Modern Java in Action Study
0 stars 0 forks source link

Java 8의 Instant vs LocalDateTime #29

Open ahah525 opened 1 year ago

ahah525 commented 1 year ago

문제

보통 프로젝트에서 날짜/시간을 다룰 때 아래와 같이 LocalDateTime 을 사용했었다.

스크린샷 2023-08-22 오전 10 05 34

Instant 클래스를 새롭게 학습하면서 우리 프로젝트에서 썼던 LocalDateTime 타입이 적절한지에 대해 생각해보게 되었다. Instant 와 LocalDateTime 클래스의 차이를 알아보고 어느 경우에 사용하는게 적절한가에 대해 생각해보자.

관련 목차

참고자료

ahah525 commented 1 year ago

💡LocalDateTime

로컬(PC)의 날짜, 시간을 표현하는 클래스(날짜 + 시간)

Untitled (10)

1. 특징

2. LocalDateTime 을 사용했을 때 문제 상황

한국-서울(Asia/Seoul), 프랑스-파리(Europe/Paris)에서 글로벌 서비스를 운영하고 있다고 가정한다.

각 리전에 위치한 서버의 타임존은 다를 것이다.

각 인스턴스에서 LocalDateTime.now() 로 DB에 날짜/시간 정보를 저장하면 타임존을 UTC로 설정해주지 않는 이상, 각 타임존에 맞게 데이터가 저장된다.

한국 타임존에서 2023-08-21 19:00:00와 프랑스 타임존에서 2023-08-21 12:00:00은 동일한 시점이지만 DB에는 타임존 정보가 저장되지 않기 때문에 문제가 생긴다.

3. LocalDateTime을 사용하는 경우

  1. 특정 날짜/시간을 여러 리전에서 적용해야하는 경우
    • 글로벌 서비스에서 2024-01-01 00:00:00에 새해 알림을 해야하는 경우
    • 서울과 파리는 서로 다른 시간대를 사용하므로 특정 시점(타임존)을 적용하면 안된다.
  2. 글로벌 서비스가 아닌 단일 리전 서비스인 경우
    • 한국에서만 운영하는 서비스라면 굳이 타임존 개념을 사용할 필요는 없다.

💡Instant

UTC 타임라인의 특정 시점의 타임 스탬프를 표현하는 클래스(날짜 + 시간 + UTC)

📍타임 스탬프

EPOCH TIME(1970-01-01 00:00:00 UTC)로부터 경과된 시간을 나노초(10^-9) 단위의 양수 또는 음수로 표현한 값이다.

Untitled (11)

1. 특징

2. Instant를 사용하는 경우

  1. 타임스탬프를 UTC 기준으로 저장하는 경우
    • DB, 백엔드 비즈니스 로직, 데이터 교환 등
  2. 글로벌 서비스를 개발하는 경우

💡결론

1. Java 8+ 날짜 다루기

Untitled (12)

클래스 설명
LocalDate 로컬 날짜
LocalTime 로컬 시간
LocalDateTime(LocalDate + LocalTime) 로컬 날짜+시간
ZonedDateTime(LocalDateTime + 타임존/시차) 지정한 시간대의 특정 시점(날짜+시간)
Instant(LocalDateTime + UTC) UTC의 특정 시점(날짜+시간)

2. 우리 프로젝트에서는?

네컷지도 프로젝트는 서울 리전의 EC2 서버 1대로 운영되고 있다. 글로벌 서비스를 지원할 계획도 없기 때문에 LocalDateTime 타입을 써도 괜찮을 것 같다.

자바에서는 LocalDateTime 타입을 사용하고 있고 DB(MySQL)에서는 datetime 타입을 사용 중인데 여유가 된다면 MySQL의 datetimetimestamp 타입의 차이에 대해서도 공부해보면 좋을 것 같다.

Reference