이전 프로젝트에서 개발 초창기에 문제가 되었던 것이 서버 통신간 Serialize
, Deserialize
문제 였다.
Spring Boot
에서는 기본적으로 Jackson
을 사용하고 있었고 개발자들은 자기가 익숙한 라이브러리(Jackson
, Gson
, json-simple
)를 사용했으며 포멧의 표준도 없어서 대혼돈의 시기가 있었다.
이번 프로젝트에서는 이전 프로젝트와 같이 대혼돈의 시기를 겪지 않기 위해 빠른게 라이브러리와 표준 포멧 선정을 요청하였고 빠르게 선정이 이루어졌다.
라이브러리는 Spring Boot
의 기본 적용되는 Jackson
을 사용하기로 하였으며 문자열 또는 숫자에 대한 포멧은 기본 Jackson
으로 포멧을 따르며 Date
타입에 대해서만 표준 포멧을 지정하기로 하였다.
우선 스프링 부트 공식 문서를 참고하면 여러가지 방식으로 ObejctMapper
를 정의하는 방법이 제시되어 있으며 크게 설명이 필요한 소스가 존재하지 않는다.
@Configuration
public class ObjectMapperConfig {
public static final DateTimeFormatter LOCAL_DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static final DateTimeFormatter LOCAL_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Primary
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
mapper.registerModule(javaTimeModule);
return mapper;
}
private static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException, IOException {
gen.writeString(value.format(LOCAL_DATE_TIME_FORMAT));
}
}
private static class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return LocalDateTime.parse(p.getValueAsString(), LOCAL_DATE_TIME_FORMAT);
}
}
private static class LocalDateSerializer extends JsonSerializer<LocalDate> {
@Override
public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException, IOException {
gen.writeString(value.format(LOCAL_DATE_FORMAT));
}
}
private static class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
@Override
public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return LocalDate.parse(p.getValueAsString(), LOCAL_DATE_FORMAT);
}
}
}
위의 설정은 LocalDateTime
과 LocalDate
에 대한 Serialize
, Deserialize
에 대한 설정만 한 것이며 추가적인 Class
또는 ObjectMapper
에 대한 설정이 필요하다면 추가하여 적용하면 된다.