프로그래밍/트러블슈팅
📌[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을 문제없이 사용할 수 있다! 🎉