봉 블로그

Date 대신 LocalDateTime을 사용하자 본문

java

Date 대신 LocalDateTime을 사용하자

idkbj 2025. 7. 15. 09:01
반응형

Java에서 Date 대신 LocalDateTime을 사용하는 것이 권장되는 이유는 다음과 같습니다:


1. 불변성 (Immutability)

  • java.util.Date는 mutable(변경 가능) 합니다.
  • LocalDateTime은 immutable(불변) 합니다.
    • 불변 객체는 멀티스레드 환경에서 안전하고, 예측 가능한 동작을 합니다.
    • 예: date.setTime(...)처럼 기존 값을 변경할 수 있는 Date는 실수나 버그의 원인이 될 수 있음.

2. 명확한 설계와 API

  • Date는 내부적으로 밀리초 기준의 숫자(time) 를 저장하며, 날짜·시간 정보를 명확하게 표현하지 않음.
  • LocalDateTime은 날짜와 시간을 분리해서 명확하게 표현:
  • LocalDateTime.of(2025, 7, 14, 13, 45);
  • Date는 시간대(timezone) 개념이 혼재되어 있고 혼동을 줄 수 있음.
  • LocalDateTime은 시간대가 없는 시간을 명확히 나타냄. 시간대가 필요하면 ZonedDateTime을 사용.

3. 풍부한 기능 제공

  • LocalDateTime은 비교, 조작, 포맷 등의 기능이 훨씬 많고 직관적입니다.
  • LocalDateTime now = LocalDateTime.now(); now.plusDays(5).minusHours(2); now.isAfter(otherDateTime);
  • Date는 이런 기능이 거의 없으며, 대부분 Calendar를 함께 사용해야 함 → 코드가 복잡해짐.

4. 표준화된 포맷과 파싱

  • LocalDateTime은 DateTimeFormatter와 함께 사용하여 날짜 포맷팅과 파싱이 명확하고 안전함.
  • Date는 SimpleDateFormat을 사용하며 스레드 안전하지 않음.

5. JDK 권장 (java.time 패키지)

  • Java 8부터 도입된 java.time 패키지 (LocalDateTime, ZonedDateTime, 등)는 Joda-Time을 모델로 만들어졌고, 공식적으로 Date, Calendar 등을 대체하도록 설계됨.
  • Oracle은 더 이상 Date 사용을 권장하지 않음.

❌ 언제 Date를 사용할 수밖에 없나?

  • 레거시 코드나 오래된 라이브러리에서 Date를 사용하고 있을 때
  • DB나 외부 시스템과 연동 시 Date 타입을 사용하는 경우

→ 이 경우에도 LocalDateTime ↔ Date 간 변환은 java.time 패키지에서 제공되므로 안전하게 변환 가능.


변환 예시

// LocalDateTime → Date
LocalDateTime ldt = LocalDateTime.now();
Date date = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

// Date → LocalDateTime
Date date = new Date();
LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

결론

LocalDateTime은 안전성, 명확성, 기능성 면에서 Date보다 우수하며, 현대 Java 개발에서는 사실상 표준입니다. 가능하면 Date 대신 LocalDateTime을 사용하세요.

필요하다면 위 내용에 대해 코드 예시나 실무 적용 방법도 더 도와드릴 수 있습니다.