컨트롤러의 테스트 코드에서 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/