본문 바로가기
Java/Spring

SpringBoot 4.0 RC 변경사항 확인하기

by ms727 2025. 10. 25.

2025년 10월 24일 SpringBoot 4.0 RC 버전이 깃허브에 올라왔습니다.

 

https://github.com/spring-projects/spring-boot/releases/tag/v4.0.0-RC1

 

Release v4.0.0-RC1 · spring-projects/spring-boot

⭐ New Features Revisit metrics and tracing test properties #47776 Downgrade to GraphQL Java 24.3 #47752 Configure devtools to set trace probability to 100% by default #47721 Remove "public" from r...

github.com

 

주로 어떤점이 변경되는지 확인하는 과정을 통해, 앞으로 프로젝트를 진행하면서 참고할만한 기능이 있는지 / 어떤 방향으로 SpringBoot가 나아가려하는지 파악하면 될 것 같습니다.

 

1. RestClientTest 등장

 

기존 Spring Boot 3.x버전에 RestClient는 있었지만 이를 테스트할 수 있는 도구는 없었습니다. 4.0 버전에서는 이를 테스트할 수 있는 RestClientTest가 등장할 예정입니다.

 

 

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RestTestIntegration {


    @LocalServerPort
    private int port;

    private RestTestClient client;

    @BeforeEach
    void setUp() {
        this.client = RestTestClient.bindToServer()
                .baseUrl("http://localhost:" + port)
                .build();
    }

    @Test
    void getUser_shouldReturnUserDto() {
        client.get()
                .uri("/api/users/{id}", 1)
                .accept(MediaType.APPLICATION_JSON)
                .exchange()
                .expectStatus().isOk()
                .expectBody(UserDto.class)
                .consumeWith(result -> {
                    UserDto dto = result.getResponseBody();
                    assertThat(dto).isNotNull();
                    assertThat(dto.id()).isEqualTo(1L);
                    assertThat(dto.name()).isEqualTo("user1");
                });
    }
}

 

UserController나 Service가 어떻게 생겼는지 파악한다기보다 RestTestClient가 어떤식으로 쓰일 수 있는지 확인하면 좋을 것 같습니다.

RestTestClient는 기존 RestTemplate에서 RestClient로 업그레이드된 내용처럼 기존WebTestClient의 아쉬운점을 업그레이드해서 옮겼다고 생각하면 될 것 같습니다.

 

보다 세련되고 직관적인 플루언트 API를 통해 웹 통합 테스트를 수행할 수 있습니다.

그리고 WebFlux만 지원하는 WebTestClient도 RestTestClient로 대체하고 사용할 수 있어서, MVC프로젝트 및 WebFlux프로젝트 둘 다 동일하게 테스트 환경을 구축할 수 있습니다.

 

 

https://github.com/spring-projects/spring-boot/issues/47335

 

Add support for RestTestClient · Issue #47335 · spring-projects/spring-boot

RestTestClient provides similar features as WebTestClient for imperative scenarios using RestClient. We should update our test configuration so that: It can be bound to MockMvc in a mocked environm...

github.com

 

 

2. @ObservationKeyValue 등장

 

@ObservationKeyValue가 등장하였습니다. 이 애노테이션을 통해 좀 더 쉽게 메트릭에 대한 키 값을 적용할 수 있습니다.

 

현재 key와 value가 반대로 들어가는 버그가 있는 것 같습니다.

 

management.observations.annotations.enabled=true



@Service
@Slf4j
public class PaymentService {

    @Observed(name = "payment.process")
    @ObservationKeyValue(key = "payment.type", value = "card")
    @ObservationKeyValue(key = "payment.method", value = "online")
    public String processPayment(String paymentId) {
        log.info("Processing payment: {}", paymentId);
        return "processed:" + paymentId;
    }
...


//테스트 코드 일부


String result = paymentService.processPayment("test-123");

// then
assertThat(observationHandler.getCapturedContexts()).isNotEmpty();
var context = observationHandler.getCapturedContexts().get(0);
assertThat(context.getName()).isEqualTo("payment.process");

var keyValues = context.getAllKeyValues();
System.out.println("Captured KeyValues: " + keyValues);

 

 

Captured KeyValues: [keyValue(card=processed:test-123),keyValue(class=com.my.springboot4demo.microTest.PaymentService),keyValue(method=processPayment),keyValue(online=processed:test-123)]

 

하단에 테스트 한 환경 링크를 달아둘테니, 궁금하신 분은 확인 해주시면 될 것 같습니다.

 

기존에는 수동으로 키-값을 등록해야 했지만, 이제는 애노테이션을 사용해 보다 직관적이고 가독성 높은 코드를 작성할 수 있습니다.

 

//Spring Boot 3.x 기존 코드
@Component
public class PaymentService {
    private final ObservationRegistry registry;
    
    public String process(String id) {
        return Observation.createNotStarted("payment", registry)
            .lowCardinalityKeyValue("type", "card")
            .observe(() -> doProcess(id));
    }
}

 

 

3. Jackson3 지원 검토

 

현재 Spring Boot는 Jackson2.x 버전을 사용하고 있습니다. 이를 업그레이드한 3버전 사용을 검토 진행하고 있습니다.

 

무엇이 달라질 것인지 확인해보겠습니다. 기본적인 직렬화/역직렬화 성능 향상도 있겠지만 Java Record 타입 직렬화/역직렬화 완벽 지원이 가장 큰 장점이지 않을까 싶습니다.

 

@Test
void testJackson3Features() throws Exception {
    // Jackson Version확인
    System.out.println("Jackson version: " + objectMapper.version());
    assertThat(objectMapper.version().getMajorVersion()).isEqualTo(2);

    // Record 직렬화 테스트
    PaymentRecord payment = new PaymentRecord("test-123", "CARD", 1000);
    String json = objectMapper.writeValueAsString(payment);
    PaymentRecord deserialized = objectMapper.readValue(json, PaymentRecord.class);

    assertThat(deserialized).isEqualTo(payment);
    System.out.println("Record serialization: " + json);
}

//결과
//Jackson version: 2.8.8
//No serializer found for class ......PaymentRecord and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)...

 

결과를 보면 Jackson이 Record타입에 대한 지원을 완벽히 하고 있지 않음을 확인할 수 있습니다.

 

다음은 SpringBoot 4.0 RC에서 사용하려는 Jackson3버전에 대한 테스트 내용입니다.

 

 

 

일부러 스크린샷으로 찍었습니다. 결과를 보면 Jackson 버전은 3버전이고, 레코드도 무리없이 변환된 것을 확인할 수 있습니다.

 


 

개인적으로 1번과 3번의 경우 개인적으로 불편함을 느끼고 있었는데 개선을 해줘서 너무 좋은 것 같습니다.

 

Java Record의 개념은 제가 좋아하고 애용도 많이하는데 결국 ObjectMapper가 직렬화/역직렬화를 제대로 지원하지 않아, 결국 Class로 변경하고 Lombok을 사용했던 경험이 있습니다.

 

RestTestClient도 RestClient는 도입하였지만 결국 테스트는 WebTestClient나 RestTemplate을 사용하여 진행하였는데 이를 통합한 테스트 객체가 생겨서 너무 좋은 것 같습니다.

 

ObservationKeyValue 같은 경우, 사용방식을 처음보지만 수동으로 키-밸류를 작성해주는 방식보다는 보기에도 훨씬 편해보입니다. 앞으로 적용할 일이 있다면 충분히 고려해볼법합니다.

 

SpringBoot 4.0 RC 릴리즈 노트를 보면 불필요한 기능도 대거 제거하였고, 관측성 및 테스트 관련 용이성을 증대시킨 것을 확인할 수 있습니다.

또한, 글에는 설명하지 않았지만 Virtual Threads 동시성 처리 개선,AOT 컴파일 최적화로 시작 속도 향상, 분산 추적 기본 내장와 같은 보완된 내용들이 있으니 참고하면 좋을 것 같습니다.

 

 

 

테스트 레포지토리: https://github.com/kkminseok/My-Spring-Test/tree/main/Spring-test/SpringBoot4Demo

 

My-Spring-Test/Spring-test/SpringBoot4Demo at main · kkminseok/My-Spring-Test

baeldung-test + 내가 공부하는 것들 테스트. Contribute to kkminseok/My-Spring-Test development by creating an account on GitHub.

github.com

 

 

 

 

'Java > Spring' 카테고리의 다른 글

Spring Batch 테스트 환경 구축 후기(With Redis)  (0) 2025.01.17