본문 바로가기
Spring/Spring

`java.time.LocalDateTime` not supported

by 유코_ 2023. 12. 12.

발생 예외

com.fasterxml.jackson.databind.exc.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...

Java 8의 날짜/시간 유형은 기본적으로 지원되지 않습니다. 
이를 처리하도록 사용하려면 com.fastxml.jackson.datatype:jsr310 모듈을 추가해야 합니다.

오류 내용

  • Java 8에 추가된 날짜/시간 타입인 LocalDate, LocalTime, LocalDateTime이 기본적으로 Jackson 라이브러리에 의해 지원되지 않기 때문에 발생하는 것 입니다.
  • Dto 객체를 직렬화 하는 과정에서 필드에 존재하는 java.time.LocalDateTime의 데이터 타입이 지원되지 않아 처리할 수 없다는 내용 입니다.
through reference chain: subproject.admin.common.dto.Result["data"]->
subproject.admin.board.dto.response.BoardPageResponse["items"]->
subproject.admin.board.dto.item.BoardPageItem["contents"]->
java.util.Collections$UnmodifiableRandomAccessList[0]->
subproject.admin.board.dto.projection.SearchBoardPageDto["createDate"])
  • @RestController 또는 @ResponseBody를 사용할 경우 리턴 값이 Json 형식으로 변환되어 응답 되며, 이 때 내부 MessageConverter에 정의된 ObjectMapper에 의해 데이터가 직렬화 됩니다.
  • 반대로 @RequestBody 어노테이션을 사용할 경우 요청 Json 데이터를 Object로 변환하는데 이 때 역직렬화 기술이 사용 됩니다.

해결

  • JavaTimeModule을 등록한 ObjectMapper를 스프링 빈으로 등록해서 사용 합니다.
@Configuration
public class ModuleConfig {

@Bean
public ObjectMapper objectMapper() {
    return JsonMapper.builder()
                .addModule(new JavaTimeModule())
                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
                .build();
}

Object Mapper


Java에서 JSON을 다루는데 사용되는 Jackson 라이브러리의 주요 클래스로

주로 JSON과 Java 객체 간의 변환(직렬화 및 역직렬화)을 담당 합니다.

  • 직렬화(Serialization): Java 객체를 JSON으로 변환하는 과정
  • 역직렬화(Deserialization) : JSON을 Java객체로 변환하는 과정

ObjectMapper는 이러한 직렬화 및 역직렬화 작업을 수행하는 다양한 메서드를 제공합니다.

컬렉션 타입, 날짜/시간 타입과 같은 복잡한 데이터 유형을 적절하게 처리하기 위한 사용자 정의 모듈을 추가하는 기능도 제공합니다.

복잡한 데이터 유형을 적절하게 처리하기 위해서는 사용자 정의 모듈을 추가해야 합니다.

JavaTimeModule

  • 날짜 / 시간 타입의 데이터를 처리하기 위해 추가해야 하는 모듈
  • Java 8에 도입된 새로운 날짜 및 시간 API(LocalDate, LocalTime, LocalDateTime)를 Jackson 라이브러리에서 적절하게 처리할 수 있게 해주는 모듈
  • 기본적으로 Jackson 라이브러리는 Java 8의 새로운 날짜 및 시간 타입들을 인식하지 못하기 때문에 해당 타입들을 JSON으로 직렬화하거나 JSON에서 역직렬화 할 때 문제가 발 생할 수 있습니다.

기본 설정으로 Java 8의 날짜 / 시간 타입을 정확히 처리하지 못하는 이유는 해당 타입들은 표준 Java 라이브러리 일부가 아니라 Java 8에 처음 도입된 JSR 310 날짜 / 시간 API의 일부이기 때문