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

차윤하·2025년 5월 6일

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)을 제대로 처리하기 위해서는 별도 모듈을 등록하거나 설정을 명시적으로 바꿔야 한다.

원인 정리

  • 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개의 댓글