프로그래밍/트러블슈팅

📌[Java] Spring Boot 단위 테스트에서 LocalDateTime JSON 직렬화/역직렬화 문제 해결하기

프로그래민구찌 2025. 2. 12. 13:27

🛑 문제 상황

Spring Boot의 단위 테스트를 작성하면서 LocalDateTime을 포함한 객체를 JSON으로 변환할 때 다음과 같은 예외가 발생했다.

.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: 
add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling 
(through reference chain: com.mini.miniServer.dto.request.PageReq["startDate"])

즉, ObjectMapper가 LocalDateTime을 기본적으로 처리할 수 없어서 JSON 직렬화/역직렬화 과정에서 오류가 발생했다.


🟢 해결 방법: jackson-datatype-jsr310 추가

위 문제를 해결하기 위해 Jackson의 jackson-datatype-jsr310 모듈을 추가하면 된다.

1️⃣ jackson-datatype-jsr310 라이브러리 추가

Maven 프로젝트라면 pom.xml에 다음을 추가한다.

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.15.0</version>
</dependency>

Gradle을 사용한다면 build.gradle에 추가한다.

implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.0'

2️⃣ ObjectMapper에 JavaTimeModule 등록

Spring Boot에서 ObjectMapper를 직접 설정하려면 JavaTimeModule을 등록해야 한다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());

3️⃣ DTO에 @JsonFormat 추가 (선택)

만약 JSON 직렬화/역직렬화 시 특정 포맷(yyyy-MM-dd HH:mm:ss)으로 변환하고 싶다면 DTO에 @JsonFormat을 추가할 수 있다.

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;

public class PageReq {
    private int pageNum;
    private int limit;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startDate;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endDate;

    // Getters and Setters...
}

위와 같이 설정하면 JSON 변환 시 LocalDateTime이 "yyyy-MM-dd HH:mm:ss" 형식의 문자열로 변환된다.


✅ 단위 테스트 코드 적용 예시

이제 단위 테스트에서 정상적으로 LocalDateTime을 처리할 수 있다.

@Test
@DisplayName("LocalDateTime 포함 객체 JSON 직렬화 테스트")
void testLocalDateTimeSerialization() throws Exception {
    // Given
    PageReq pageReq = new PageReq();
    pageReq.setPageNum(1);
    pageReq.setLimit(10);
    pageReq.setStartDate(LocalDateTime.of(2024, 2, 10, 12, 30));
    pageReq.setEndDate(LocalDateTime.of(2024, 2, 11, 15, 45));

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());

    // When
    String json = objectMapper.writeValueAsString(pageReq);

    // Then
    System.out.println(json);
    assertNotNull(json);
}

📌 정리

  • Spring Boot에서 LocalDateTime을 JSON으로 변환할 때 jackson-datatype-jsr310이 필요하다.
  • jackson-datatype-jsr310을 의존성으로 추가하고 JavaTimeModule을 등록하면 해결된다.
  • DTO에 @JsonFormat을 추가하면 원하는 날짜 형식으로 변환할 수 있다.
  • 단위 테스트에서도 ObjectMapper에 JavaTimeModule을 등록하면 LocalDateTime을 정상적으로 직렬화/역직렬화할 수 있다.

이제 단위 테스트에서도 LocalDateTime을 문제없이 사용할 수 있다! 🎉