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
반응형