Open ahah525 opened 1 year ago
로컬(PC)의 날짜, 시간을 표현하는 클래스(날짜 + 시간)
타임존(시간대)
를 나타내지 않는다. 즉, 한 지역 혹은 시간대에 묶이지 않는다.시차(ZoneOffset)
혹은 타임존(ZoneId)
같은 추가 정보가 제공되지 않는 한 타임라인의 특정 지점을 나타낼 수 없다.Instant
혹은 ZonedDateTime
를 사용함)한국-서울(Asia/Seoul), 프랑스-파리(Europe/Paris)에서 글로벌 서비스를 운영하고 있다고 가정한다.
각 리전에 위치한 서버의 타임존은 다를 것이다.
각 인스턴스에서 LocalDateTime.now()
로 DB에 날짜/시간 정보를 저장하면 타임존을 UTC로 설정해주지 않는 이상, 각 타임존에 맞게 데이터가 저장된다.
한국 타임존에서 2023-08-21 19:00:00
와 프랑스 타임존에서 2023-08-21 12:00:00
은 동일한 시점이지만 DB에는 타임존 정보가 저장되지 않기 때문에 문제가 생긴다.
UTC 타임라인의 특정 시점의 타임 스탬프를 표현하는 클래스(날짜 + 시간 + UTC)
📍타임 스탬프
EPOCH TIME(1970-01-01 00:00:00 UTC)로부터 경과된 시간을 나노초(10^-9) 단위의 양수 또는 음수로 표현한 값이다.
클래스 | 설명 |
---|---|
LocalDate | 로컬 날짜 |
LocalTime | 로컬 시간 |
LocalDateTime(LocalDate + LocalTime) | 로컬 날짜+시간 |
ZonedDateTime(LocalDateTime + 타임존/시차) | 지정한 시간대의 특정 시점(날짜+시간) |
Instant(LocalDateTime + UTC) | UTC의 특정 시점(날짜+시간) |
LocalDateTime
을 사용해도 무방하다.Instant
를 사용하는 것이 좋다.네컷지도 프로젝트는 서울 리전의 EC2 서버 1대로 운영되고 있다. 글로벌 서비스를 지원할 계획도 없기 때문에 LocalDateTime
타입을 써도 괜찮을 것 같다.
자바에서는 LocalDateTime
타입을 사용하고 있고 DB(MySQL)에서는 datetime
타입을 사용 중인데 여유가 된다면 MySQL의 datetime
과 timestamp
타입의 차이에 대해서도 공부해보면 좋을 것 같다.
문제
보통 프로젝트에서 날짜/시간을 다룰 때 아래와 같이
LocalDateTime
을 사용했었다.Instant
클래스를 새롭게 학습하면서 우리 프로젝트에서 썼던LocalDateTime
타입이 적절한지에 대해 생각해보게 되었다. Instant 와 LocalDateTime 클래스의 차이를 알아보고 어느 경우에 사용하는게 적절한가에 대해 생각해보자.관련 목차
참고자료