Spring/문법

JSON 포맷 변경하기: Jackson 설정 커스터마이징

가지코딩 2025. 5. 23. 14:31

1. Jackson이란?

  • Java 객체와 JSON 간 변환(직렬화/역직렬화)을 담당하는 라이브러리
  • Spring Boot 기본 JSON 처리 라이브러리로 자동 설정 제공

2. JSON 포맷 변경이 필요한 이유

  • API 응답 형식 일관성 유지
  • 날짜/시간 포맷 표준화
  • null 값 처리 방식 조절
  • 필드 네이밍 전략 변경 (camelCase ↔ snake_case)
  • 가독성 향상을 위한 pretty print 적용 등

3. Jackson 설정 커스터마이징하는 방법

 

ObjectMapper 직접 설정

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();

        // Java 8 날짜/시간 모듈 등록
        mapper.registerModule(new JavaTimeModule());

        // 날짜를 ISO-8601 형식 문자열로 직렬화 (timestamp 대신)
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        // null 값 필드 제외
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // snake_case 네이밍 전략 적용
        mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

        // JSON Pretty Print 활성화
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        return mapper;
    }
}

 

 

 

 

Jackson2ObjectMapperBuilderCustomizer 활용

  • Spring Boot 권장 방식
  • Spring Boot에서 기본 제공하는 Jackson2ObjectMapperBuilder를 커스터마이징하여, ObjectMapper를 직접 생성하지 않아도 된다.
  • 설정이 깔끔하다 !
@Configuration
public class JacksonConfig {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
        return builder -> builder
                .serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
                .deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .serializationInclusion(JsonInclude.Include.NON_NULL)
                .propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
                .indentOutput(true);
    }
}

 

 

어노테이션으로 제어

  • 특정 필드 단위로 JSON 포맷 조절 가능
public class SampleDto {

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    @JsonIgnore
    private String internalCode;

    @JsonProperty("user_name")
    private String username;

    // getter, setter ...
}

4. 자주 쓰는 설정 정리

설정 항목 설정 방법 및 효과
날짜 포맷 변경 LocalDateTimeSerializer + @JsonFormat 사용
null 값 제외 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)
네이밍 전략 변경 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
출력 JSON 들여쓰기 (pretty) mapper.enable(SerializationFeature.INDENT_OUTPUT) 또는 indentOutput(true)
특정 필드 직렬화 제외 @JsonIgnore

 


5. 주의사항 및 팁

  • ObjectMapper 를 직접 생성하면 Spring Boot 자동 설정과 충돌할 수 있으므로, 가능하면 Jackson2ObjectMapperBuilderCustomize 를 활용하는 것이 권장된다.
  • 어노테이션과 전역 설정을 적절히 조합하면 유연한 JSON 포맷 조절이 가능하다.