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 포맷 조절이 가능하다.