

Future Engineering
기술의 최전선을 기록합니다.
Jackson Datatype JSR310 활용한 ObjectMapper LocalDateTime 변환 문제 해결
jackson-datatype-jsr310은 JSON 데이터와 Java 객체 간 변환을 담당하는 Jackson 라이브러리 확장 모듈입니다. 날짜 및 시간 API (JSR-310)을 Jackson이 올바르게 처리할 수 있도록 지원하는 핵심 기능을 제공합니다.
무슨 기능이고 왜 설치해야 하는가? (기능 및 설치 이유)
기본 ObjectMapper가 Java8의 날짜/시간 객체를 JSON문자열로 변환(직렬화)하고, 반대로 JSON 문자열을 어떻게 Java8 날짜/시간 객체로 변환(역직렬화)해야 할지 몰랐습니다. 직렬화, 역직렬화 문제를 해결하기 위해 도입됐습니다.
-
직렬화 (Serialization): Java 객체 → JSON 문자열 (Java 안에서 밖으로)
-
역직렬화 (Deserialization): JSON 문자열 → Java 객체 (Java 밖에서 안으로)
jackson-datatype-jsr310
라이브러리를 설치하지 않고 LocalDateTime
과 같은 필드를 가진 객체를 JSON으로 변환하려고 하면, 다음과 같은 InvalidDefinitionException
오류가 발생하게 됩니다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default
jackson-datatype-jsr310
의존성을 추가하면 JavaTimeModule
이라는 모듈이 제공됩니다. 이 모듈을 Jackson의 ObjectMapper
에 등록하면, ObjectMapper
는 LocalDate
, LocalDateTime
등의 JSR-310 타입을 인식하고, 국제 표준 형식인 ISO 8601 (예: "2025-06-20T14:30:00")으로 직렬화 및 역직렬화를 자동으로 수행합니다.
결론적으로, 이 라이브러리는 Java 8 이상의 환경에서 Jackson을 사용하여 JSON을 다룰 때, 날짜/시간 데이터를 안정적이고 표준화된 방식으로 처리하기 위해 반드시 설치해야 하는 필수 요소입니다.
언제 사용하는가?
jackson-datatype-jsr310
는 다음과 같은 상황에 사용됩니다.
-
Java 객체(DTO, Entity 등)에
LocalDate
,LocalDateTime
,LocalTime
,ZonedDateTime
,Instant
등java.time
패키지의 클래스를 필드로 포함하고 있을 경우 -
해당 객체를 Spring Web MVC의
@RequestBody
나@ResponseBody
를 통해 JSON 형태로 주고받는 RESTful API를 개발할 때 -
객체를 JSON 형태로 변환하여 Redis와 같은 캐시 저장소나 메시지 큐에 저장 또는 전송할 때
-
파일이나 데이터베이스에 객체 상태를 JSON 형식으로 저장하고 읽어올 때
ObjectMapper에 모듈 등록 예시
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
// ...
ObjectMapper objectMapper = new ObjectMapper();
// JavaTimeModule을 등록하여 Java 8 날짜/시간 API 지원 활성화
objectMapper.registerModule(new JavaTimeModule());
직렬화 (Serialization) 예시: Java 객체 → JSON 문자열
[처리 전: Java 객체 상태]
product.setLaunchDate(LocalDateTime.of(2025, 6, 20, 14, 37, 23)); // ⬅️ Java가 이해하는 LocalDateTime 객체
[처리 후: JSON 문자열 상태]
{
"launchDate": "2025-06-20T14:37:23"
}
역직렬화 (Deserialization) 예시: JSON 문자열 → Java 객체
[처리 전: JSON 문자열 상태]
{
"launchDate": "2025-06-20T14:37:23"
}
[처리 후: Java 객체 상태]
product.setLaunchDate( /* "2025-06-20T14:37:23" 문자열로부터 완벽하게 복원된 LocalDateTime 객체 */ );