프로젝트 진행 중에 데이터를 생성한 시간과 업데이트한 시간에 대한 필드를 정의하며 타입에 대한 고민이 들었다. LocalDateTime 만을 고려하고 있다가 Instant 라는 타입을 처음 알았기 때문이다. 해서 그에 대해 정리를 해보려한다.
LocalDateTime 과 Instant
이 둘은 자바 8부터 도입된 날짜와 시간을 표현하는 데에 사용된다.
1. LocalDateTime
- 시간대 정보를 포함하지 않으며 단순히 연, 월, 일, 시 등의 지역 날짜와 시간을 나타낸다.
- 로컬 서버의 날짜와 시간을 나타내며 그것이 어느 시간대에 속하는 지는 명시하지 않는다.
- 날짜, 시간 등을 더하고 빼는 등의 연산이 간단하다.
- 시간대에 민감하지 않고 지역적인 서비스에 적합하다.
2. Instant
- UTC( 협정 세계시 )를 기준으로 한다.
- 특정 시점을 전 세계적으로 동일하게 나타내기 때문에 이를 통해 다른 시간대의 시간과 비교하거나 변환할 수 있다.
- ZonedDateTime 객체로 변환하여 원하는 지역의 시간대를 출력할 수 있다.
- 전 세계적으로 일관된 시간을 갖기 때문에 글로벌 서비스나 정확한 시간을 요구하는 경우에 적합하다.
3. 사용방법
LocalDateTime 은 로컬 시간대 설정으로 출력되고 Instant를 서울 시간대로 변경하고 싶으면 ZonedDateTime 객체로 변환하여 출력할 수 있다.
public class Main {
public static void main(String[] args) {
Instant instantTime = Instant.now(); // 2023-12-28T11:38:16.299516Z
LocalDateTime localDateTime = LocalDateTime.now(); // 2023-12-28T20:38:16.312511600
/* Instant 객체로 서울 시간대 출력 */
ZonedDateTime zonedDateTime =
instantTime.atZone(ZoneId.of("Asia/Seoul")); // 2023-12-28T20:38:16.299516+09:00[Asia/Seoul]
}
}
각 타입별 장단점
위 데이터들은 모두 Database 에 저장되기 때문에 DB 관점에서의 고려도 필요하다.
LocalDateTime
1. 장점
- 일상적인 날짜와 시간 형태로 표현되어 사용자가 이해하기 쉽다.
- 특정 지역의 로컬 이벤트나 일정 관리에 적합하다.
2. 단점
- 다른 지역의 사용자에게 정확한 시간을 전달하기 어렵다.
- 다른 시간대의 사용자가 데이터를 해석할 때 혼란을 겪을 수 있다.
Instant
1. 장점
- UTC 기반으로, 전 세계 어디서나 동일한 시간을 나타내기 때문에 국제적으로 사용되는 애플리케이션에 적합하다.
- 필요한 경우 다른 시간대로 쉽게 변환이 가능하다.
2. 단점
- 로컬 시간을 직접 파악하기 어려울 수 있다.
- 일반적으로 사용자가 읽고 이해하기 어려운 형태일 수 있다.
ZonedDateTime
1. 장점
- 특정 시간대의 정확한 시간을 나타내기 때문에 다양한 지역의 사용자에게 시간 정보를 제공하는 데 유리하다.
- 다른 시간대에 있는 사용자들도 시간을 올바르게 이해할 수 있기 때문에 국제화에 적합하다.
2. 단점
- 시간대를 고려해야하기 때문에 복잡성이 증가할 수 있다.
- mySql 등 위 타입을 지원하지 않는 경우가 있어 호환성 문제가 생길 수 있다. 그럴 때는 UTC 시간으로 변환하여 저장하고 필요할 경우에 ZonedDateTime 으로 변환해서 사용할 수 있다.
정리
여러 시간대로의 변환이나 정확한 시간을 출력한다는 것에서 Instant 타입이 유리해보이나 출력할 때마다 데이터를 변환해야한다는 점에서 서비스의 타깃이 국내에 한정된 경우에는 LocalDateTime 을 쓰는 것이 좋을 것 같다.
참고
https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html
https://www.baeldung.com/java-instant-vs-localdatetime
'JAVA' 카테고리의 다른 글
[Java] ArrayList 와 HashMap (0) | 2024.04.07 |
---|---|
[JAVA] 체크 예외와 언체크 예외 (2) | 2023.10.29 |
[이펙티브자바] Item1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2023.10.15 |
[Java] Access Level 에 관하여 (0) | 2023.09.24 |
[Java] stream.map() 동작 및 예제 (0) | 2023.08.20 |