Spring Boot ObjectMapper Custom

YouMakeMeSmile·2021년 8월 14일
1

이전 프로젝트에서 개발 초창기에 문제가 되었던 것이 서버 통신간 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);
        }
    }
}

위의 설정은 LocalDateTimeLocalDate에 대한 Serialize, Deserialize에 대한 설정만 한 것이며 추가적인 Class 또는 ObjectMapper에 대한 설정이 필요하다면 추가하여 적용하면 된다.

profile
알고싶고 하고싶은게 많은 주니어 개발자 입니다.

0개의 댓글