Spring Boot에서 React로 LocalDateTime 을 받아올 때 타입 문제

차윤하·2025년 5월 6일
2

Spring Boot에서 LocalDateTime을 API 응답으로 내려줄 때, 우리가 기대하는 "2025-05-02 03:47:19" 같은 문자열이 아니라 이상한 숫자 배열이나 timestamp 형태로 응답되는 경우를 많이 겪었을 것이다.

이 글에서는 왜 그런 현상이 생기는지, 그리고 어떻게 해결할 수 있는지 정리했다.


왜 날짜가 배열처럼 보일까?

Spring Boot에서는 기본적으로 Jackson 라이브러리를 통해 객체를 JSON으로 직렬화한다.
하지만 LocalDateTime은 Jackson 기본 설정에 의해 이렇게 [year, month, day, hour, minute, second, nano] 배열 형태나 숫자 형태의 timestamp로 처리된다.

[2025, 5, 2, 3, 47, 19, 939277000]

혹은

20255234719939277000

이런 현상은 Spring Boot가 사용하는 JSON 직렬화 도구인 Jackson의 기본 설정 때문이다. Jackson은 Java 8의 LocalDateTime을 자동으로 지원하지 않으며, JSR-310(java.time)을 제대로 처리하기 위해서는 별도 모듈을 등록하거나 설정을 명시적으로 바꿔야 한다.

원인 정리

Spring Boot는 Jackson을 통해 객체를 JSON으로 직렬화한다. 그러나 Java 8의 LocalDateTime은 Jackson 2.x 기준으로 기본 지원 대상이 아니며, 아래와 같은 문제가 발생한다:

  • Jackson이 JSR-310 타입(LocalDateTime, LocalDate, ZonedDateTime)을 배열 형태로 직렬화
  • ObjectMapperWRITE_DATES_AS_TIMESTAMPS 설정을 true로 유지할 경우 timestamp처럼 처리

해결 방법

1. application.yml 설정 추가

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    serialization:
      write-dates-as-timestamps: false
  • date-format: 우리가 원하는 문자열 형식 지정
  • write-dates-as-timestamps: false: timestamp 형태 사용 금지

이 설정을 통해 Jackson은 날짜/시간을 배열이나 timestamp가 아닌, 우리가 원하는 문자열 포맷으로 직렬화한다. 단, 이 방법은 java.util.Date, java.sql.Timestamp 등 구형 날짜 클래스에는 적용되지만, LocalDateTime에는 일부 제한이 있다.

2. 필드에 @JsonFormat 어노테이션으로 명시

엔티티나 DTO 클래스의 필드에 직접 적용하고 싶을 때 어노테이션을 붙이는 것이 확실하다.

@JsonFormat(pattern = "yyyy.MM.dd HH:mm:ss")
private LocalDateTime createdAt;

Jackson이 이 어노테이션을 통해 해당 필드만 원하는 포맷으로 직렬화한다. 포맷을 변경하거나 필드별로 다르게 적용하고 싶은 경우 유용하다.


응답 결과 확인

이제 응답에서 아래처럼 문자열 포맷으로 잘 나오는 걸 확인할 수 있다.

"createdAt": "2025.05.02 03:47:19"


마무리

  • LocalDateTime은 기본적으로 배열이나 timestamp처럼 내려온다.
  • 프론트엔드와 연동 시 날짜 포맷은 프로젝트 초기에 미리 설정해두면 좋을 것 같다.
  • 전역 설정(application.yml) 또는 개별 설정(@JsonFormat) 중 선택 가능
profile
풀스택 개발자가 되고 싶은 꿈나무

0개의 댓글