들어가기 전

코프링 토이프로젝트를 진행하면서 LocalDateTime을 자바에서 사용하듯이 사용을 했는데 예외가 발생했습니다.

발생한 예외를 해결하기 위해 검색을 했는데 정보가 존재하지 않아서 해결하는데 시간을 많이 투자했습니다.

그래서 이번 포스팅에서는 예외 내용과 예외 해결하는 방법에 대해 알아보겠습니다.

 

 

예외 내용

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"

 

위에 예외를 해결하려고 두 가지 방식을 시도를 해봤습니다.

 

첫 번째 방법

예외를 해결하기 위한 의존성을 추가하는 것입니다.

 

build.gradle

 

implementation("com.fasterxml.jackson.core:jackson-databind:2.15.0")

 

위에 의존성을 추가를 했는데도 똑같은 예외가 발생을 하였습니다. 즉 의존성을 추가하여도 예외를 해결을 못하였습니다.

 

두 번째 방법

 

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class JacksonConfig {
    @Bean
    fun objectMapper(): ObjectMapper {
        val objectMapper = ObjectMapper()
        objectMapper.registerKotlinModule()
        objectMapper.registerModule(JavaTimeModule())
        return objectMapper
    }
}

 

위와 같은 방법으로 하니 예외가 발생하지 않고 문제를 해결할 수 있었습니다.

 

그렇다면 의존성을 추가했을 때는 문제가 해결되지 않았는데 두 번째 방법을 하였을 때 해결된 이유가 무엇인지에 대해 알아보겠습니다.

 

1.  registerKotlinModule

Kotlin을 사용하는 경우 Jackson과 Kotlin 간의 상호 작용을 개선하기 위해 Kotlin 모듈을 등록해야 합니다. 해당 모듈은 Kotlin의 특정 기능 및 표준 라이브러리와의 상호 작용을 지원하여 Kotlin 클래스의 직렬화 및 역직렬화를 더 편리하게 처리할 수 있도록 도와줍니다.

 

2.  registerModule(JavaTimeModule())

해당 모듈은 JSR-310 (Java 8의 날짜 및 시간 API)을 Jackson에 등록을 합니다. Java 8 이후에는 java.time 패키지의 LocalDateTime, LocalTime, LocalDate 외에도 날짜 및 시간 유형이 많이 사용됩니다. 이 모듈을 등록하면 Jackson은 LocalDateTime과 같은 JSR-310 날짜 및 시간 유형을 올바르게 직렬화 및 역직렬화할 수 있게 됩니다.