본문 바로가기

Spring

Spring Boot 4에서 도입되는 Jackson 3 지원 완벽 정리

728x90
반응형
728x170

Spring Boot 4와 Spring Framework 7의 등장과 함께 JSON 직렬화/역직렬화의 핵심 역할을 담당하는 Jackson이 드디어 3.x 버전으로 업그레이드되었다. 이번 변화는 단순한 버전 업데이트가 아니라 패키지 구조, 기본 설정, 주요 API, Spring 생태계 전반의 적용 방식까지 모두 달라지는 큰 전환점이다.
기존 프로젝트를 Spring Boot 4로 올리려는 개발자라면 Jackson 3는 피할 수 없는 변화다. 이 글에서는 Jackson 3의 주요 특징과 Spring Boot 4에서의 적용 방식, 마이그레이션 전략, 모듈별 변화까지 전체 흐름을 하나로 정리했다.

반응형

Jackson 3는 무엇이며 왜 Spring에 도입되었는가

Jackson은 JVM 환경에서 가장 널리 사용되는 JSON 라이브러리다. 이번 Jackson 3 도입은 단순히 최신 버전에 맞추기 위한 것이 아니라, 성능, 안정성, API 정합성 개선을 위해 Spring과 Jackson 간의 긴밀한 협업을 통해 이루어졌다.

이 과정에서 다음과 같은 개선점이 반영되었다.

  • Jackson 2와 Jackson 3를 동시에 사용할 수 있도록 개선
  • JDK 17을 기준으로 정리
  • Spring의 JSON View 기본 동작과 Jackson을 일관되게 맞춤
  • 논블로킹 파서 개선
  • JsonNode API에서 null-safety 정교화
  • JsonWriteFeature 기본값 재조정
  • @JsonCreator 사용 필요성이 증가한 문제 개선
  • 공식 Jackson 3 마이그레이션 가이드 제공

Spring 팀은 Jackson 팀과의 협업을 통해 생태계 전체에 영향을 줄 수 있는 부분까지 세심하게 조율했다.


Spring Boot 4에서의 Jackson 3 지원 현황

Spring Boot 4와 Spring Framework 7은 다음과 같은 원칙으로 Jackson 3를 도입한다.

  • Jackson 3 공식 지원 시작
  • Jackson 2는 deprecated 처리
  • Spring Boot 기본 Jackson 버전은 Jackson 3로 전환

단, Spring AI는 2026년 상반기 출시 예정인 2.0 버전부터 Jackson 3를 도입할 예정이다.

Spring Boot 4.0의 구체적인 변화는 다음과 같다.

  • Jackson 2와 3에 대한 의존성 관리 제공
  • Jackson 3 기반 자동 설정 제공
  • Jackson 2 자동 설정은 deprecated
  • spring-boot-starter-json, starter-jackson은 Jackson 3를 기본 포함

Spring Boot 4 업그레이드 시 권장 순서

  1. Jackson 3로 완전히 마이그레이션
  2. Jackson 3를 사용하되 spring.jackson.use-jackson2-defaults=true 설정
  3. 일시적으로 Jackson 2를 유지하며 점진적으로 이전

Jackson 3 마이그레이션 시 꼭 알아야 할 주요 변경점

1. 패키지 변경

가장 먼저 마주칠 깨짐 포인트는 아래의 패키지 변경이다.

  • 기존: com.fasterxml.jackson
  • 변경: tools.jackson

단, jackson-annotations는 호환성을 위해 기존 패키지를 유지한다.

2. 기본 설정 변경

Jackson 3의 기본값은 Jackson 2와 다르다.

  • 속성 정렬 기본값: MapperFeature.SORT_PROPERTIES_ALPHABETICALLY → true
  • 날짜 직렬화: DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS → false(ISO-8601 문자열로 출력됨)

기존 테스트 코드에서 문자열 비교를 하는 경우 깨질 가능성이 높다.

가능한 경우 새로운 기본값을 수용하되, 초기에는 아래 속성을 적용하여 기존 Jackson 2 방식에 가깝게 유지할 수 있다.

spring.jackson.use-jackson2-defaults=true

3. Jackson 모듈 처리 방식 변화

기존 Jackson 2의 여러 모듈(parameter-names, datatype-jsr310 등)이 Jackson 3에 기본 포함되었다.
또한 Spring은 이제 JDK Service Loader 기반으로 모듈을 자동 탐색한다.

필요한 경우 JsonMapper.Builder를 통해 직접 설정할 수 있다.

4. ObjectMapper → JsonMapper

Jackson 3의 핵심 변화 중 하나는 불변 기반 API이다.

  • Jackson 2: mutable ObjectMapper
  • Jackson 3: immutable JsonMapper (ObjectMapper 상속)

Spring도 JsonMapper 사용을 기본으로 전환했다.

Spring Boot 3에서 사용하던 커스터마이징 방식은 아래와 같다.

@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
    return builder -> builder.indentOutput(true);
}

Spring Boot 4 + Jackson 3에서는 다음과 같이 변경된다.

@Bean
JsonMapperBuilderCustomizer jacksonCustomizer() {
    return builder -> builder.enable(SerializationFeature.INDENT_OUTPUT);
}

Jackson 3 방식의 대표적인 예시: JsonView 사용 변화

Jackson 2와 Spring Framework 6에서는 JsonView를 사용하기 위해 MappingJacksonValue를 감싸야 했다.

예시:

var jacksonValue = new MappingJacksonValue(user);
jacksonValue.setSerializationView(Summary.class);

Spring 7에서는 JacksonJsonHttpMessageConverter가 SmartHttpMessageConverter를 구현하여 힌트 기반 처리 방식을 지원한다. 더 이상 MappingJacksonValue가 필요 없다.

변경된 방식:

var response = this.restClient.post().uri("http://localhost:8080/create")
    .hint(JsonView.class.getName(), Summary.class).body(user)
    .retrieve().body(String.class);

이제 힌트만 전달하면 JsonView가 동작한다.


Jackson 2를 잠시 계속 사용하는 방법

Jackson 3로 완전히 전환하지 못하는 경우에도 Jackson 2를 계속 사용할 수 있다.

방법은 다음과 같다.

  • spring-boot-starter-jackson, starter-json에서 jackson 3 의존성 제외
  • spring-boot-jackson2 의존성으로 대체
  • 구성 속성은 spring.jackson 대신 spring.jackson2를 사용

Spring은 일정 기간 동안 Jackson 2 자동 설정을 유지하지만, 결국 제거될 예정이다.


Spring Security 7의 Jackson 3 지원

Spring Security 7.0은 Jackson 3 기반으로 전환되었으며 Jackson 2 지원은 deprecated 상태다.

또한 기본 타입 검증을 강화하여 보안성을 높였다.
PolymorphicTypeValidator 기반으로 Spring Security 타입만 기본 허용되며, 필요 시 커스텀 타입을 추가할 수 있다.

BasicPolymorphicTypeValidator.Builder typeValidatorBuilder =
    BasicPolymorphicTypeValidator.builder()
        .allowIfSubType(CustomGrantedAuthority.class);

JsonMapper mapper = JsonMapper.builder()
    .addModules(SecurityJacksonModules.getModules(loader, typeValidatorBuilder))
    .build();

Jackson 2로 직렬화된 객체는 Jackson 3에서도 역직렬화가 가능하여 호환성이 유지된다.


Spring Data 4에서의 Jackson 3 지원

Spring Data 4는 핵심 모듈 전반에서 Jackson 3를 지원한다.
다만 생태계 규모가 큰 만큼 모듈별 변화 사항도 확인할 필요가 있다.

Spring Data Commons

  • Jackson 3 기본 사용, Jackson 2는 클래스패스 감지 시 폴백
  • JacksonResourceReader, JacksonRepositoryPopulatorFactoryBean 추가
  • XML namespace 기반 Jackson 2 사용 시 Java Config로 대체 필요

Spring Data Redis

  • JacksonHashMapper, JacksonJsonRedisSerializer 등 Jackson 3 기반 버전 제공
  • 기존 Jackson2ObjectReader/Writer는 명칭 정리 필요

Spring Data REST

  • Jackson 2 모드 지원 제거
  • Spring HATEOAS도 동일하게 Jackson 3 필수

Spring Data Couchbase, Elasticsearch, Drivers

  • 내부적으로 Jackson 2를 쓰는 경우가 있으나 엔티티 직렬화에는 영향 없음

728x90

Jackson 3는 필수적인 변화이며 준비할 가치가 있다

Jackson 3는 더 나은 보안성, 향상된 기본 설정, 정교해진 API, 그리고 Spring과의 높은 일관성을 제공한다.
물론 패키지 변경, 기본값 차이, JsonMapper 도입 등 초기 마이그레이션 비용은 존재하지만, Spring 팀은 이를 부드럽게 넘어갈 수 있도록 다양한 지원책을 제공하고 있다.

  • 점진적 적용(동시 사용 가능)
  • Jackson 2 기본값 유지 옵션 제공
  • Spring Security, Spring Data 등 모듈별 상세 가이드
  • 확장된 지원 기간

Spring Boot 4와 Spring Framework 7로 올라가는 길목에서 Jackson 3는 피할 수 없는 변화다.
하지만 그만큼 안정적이고 미래 지향적인 JSON 처리 환경을 제공하며, 장기적으로는 프로젝트 유지보수성이 크게 향상될 것이다.

이번 글이 Jackson 3 도입을 준비하는 데 도움이 되었기를 바란다.

300x250

https://spring.io/blog/2025/10/07/introducing-jackson-3-support-in-spring?fbclid=IwY2xjawOeEgBleHRuA2FlbQIxMQBzcnRjBmFwcF9pZBAyMjIwMzkxNzg4MjAwODkyAAEeRm2MBM8DxrZxGiOMlte7CYUz4wusXCAXEoXP1EL7xya5iNBErg-0--9lS1c_aem_iYRbJc59xTGZDVuv4RfoPQ#close-collaboration-between-spring-and-jackson-teams

 

Introducing Jackson 3 support in Spring

This is a new blog post in the Road to GA series, this time sharing more details on the new Jackson 3 support, just a few days after Jackson 3.0.0 GA release, about to be introduced in Spring Boot 4 and related Spring portfolio projects. Jackson is by far

spring.io

728x90
반응형
그리드형