Back-End/Spring Boot

Spring Boot | ObjectMapper Bean 성능 개선 (ex.LocalDateTime Response)

개발자티포 2025. 3. 26. 09:55
728x90
반응형

Client에 Response 되는 객체를 전역적으로 관리하여 성능을 개선할 수 있는 방법이 있다.

 

다만, 전역으로 적용되기 때문에 필요한 경우에만 잘 판단하여 사용하도록 하자.

사용 방법은 먼저 아래와 같은 Bean을 생성해주면 된다.

@Configuration
public class MapperConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateFormatter));
        objectMapper.registerModule(javaTimeModule);

        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
        objectMapper.disable(SerializationFeature.INDENT_OUTPUT);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        return objectMapper;
    }
}

 

1. LocalDateTime 형식 전역 지정

        JavaTimeModule javaTimeModule = new JavaTimeModule();
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        javaTimeModule.addSerializer(LocalDateTime.class,
            new LocalDateTimeSerializer(dateFormatter));
        objectMapper.registerModule(javaTimeModule);
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

기본적으로 LocalDateTime은 ISO8601(yyyy-MM-dd'T'HH:mm:ss.SSSSSS로 직렬화된다.

Client에서 Nano Second를 사용하지 않는다는 전제 하에 형식을 지정하여 JSON 파싱 속도를 높일 수 있다.

 

2. 불필요한 Null 값 제거

        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

기본적으로 null 값이 포함된 필드는 JSON 응답에도 포함된다. 

이런 필드를 제외하여 응답 크기를 줄일 수 있다.

 

3. 빈 값(Empty) 제거

        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

컬렉션(List, Map)이나 String이 비어 있으면 응답에 포함하지 않는다.

 

4. BigDecimal 소수점 길이 제한

        objectMapper.enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN);

 

BigDecimal을 JSON으로 변환할 때 불필요한 지수 표기법을 방지하여 가독성을 개선할 수 있다.

 

5. Pretty Print 비활성화

        objectMapper.disable(SerializationFeature.INDENT_OUTPUT);

개발 환경에서는 INDENT_OUTPUT을 활성화하면 보기 좋지만, 운영 환경에서는 비활성화 하여

데이터 크기를 줄이는 것이 좋다.

 

6. 불필요한 Type 예외 중지

        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

클라이언트가 보내는 JSON에 불필요한 필드가 포함되면 Jackson이 예외를 발생시킬 수 있다.

이를 방지하여 불필요한 JSON 파싱 오류를 줄일 수 있다. 다만 예외처리는 신중하게 하자.

 

7. 직렬화 시 FAIL_ON_EMPTY_BEANS 방지

        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

Jackson에서 빈 객체가 있을 때 예외를 발생시킬 가능성이 있다.

이를 방지하여 직렬화에 예외 발생을 줄일 수 있다. 다만 예외처리는 신중하게 하자.

728x90
반응형