[Spring] ObjectMapper LocalDateTime 오류

hyng·2022년 1월 5일
0

문제 상황

컨트롤러의 테스트 코드에서 ObjectMapper를 재정의해서 사용하였는데, jsr-310모듈을 추가하라는 예외가 발생했다.

해결

Jackson 라이브러리를 사용하면 직렬화(자바 객체 -> 다른 데이터 형식 변환), 역직렬화(다른 데이터 형식 -> 자바 객체)가 가능한데, 이때 LocalDateTime 타입으로 직렬화 역직렬화 할때 다음과 같은 예외가 발생한다.

Java 8 date/time type java.time.LocalDateTime not supported by default: add Module “com.fasterxml.jackson.datatype:jackson-datatype-jsr310”

예외 메시지는 jsr-310 모듈을 추가하라고 하는데, spring-boot-starter-json이 가지는 의존성에 의해 jsr-310이 이미 추가되어 있어서 다른 방법을 사용했다.

스프링 부트에서는 ObjectMapper를 기본 빈으로 등록해 주는데,

해당 빈을 주입받아서 LocalDateTime의 직렬화, 역직렬화에 사용할 때는 문제가 없다.

근데 아래 경우처럼 등록된 빈을 사용하는 게 아니라 직접 ObjectMapper를 재정의해서 사용하는 경우 default는 자바 8의 LocalDateTime을 지원하지 않기 때문에 예외가 발생한다.


public class ChatRoomControllerTest {
    private ObjectMapper mapper = new ObjectMapper();
    }
}

따라서, 해결 방법은

1) 스프링 부트가 등록해 준 ObjectMapper의 빈을 사용한다.

2) 아래처럼 JavaTimeModule을 추가하는 설정을 해준다.

나의 경우는 단위 테스트를 SpringMockMovc with standalone mode로 spring context를 로드 하지 않는 방법으로 작성했기 때문에 두 번째 방법을 사용했다.

@BeforeEach
    void setup(){

        mapper.registerModule(new JavaTimeModule());
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        //MockMvc standalone approach
        mvc = MockMvcBuilders.standaloneSetup(chatRoomController)
                .build();
    }

참고

https://umanking.github.io/2021/07/24/jackson-localdatetime-serialization/

profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글