서론
링크드인을 살펴보다가 2025년 10월 24일에 Spring Boot 버전이 메이저로 올라간 사실을 알게됐다. 정확히는 Spring Boot 4.0.0‑RC1이 릴리즈 되었다는 소식이었고, LTS(장기지원) 버전은 아니지만 메이저 버전 변경이라는 점에서 관심을 가지고 찾아보게 되었다. 이번 포스팅은 버전 4.0에서 주목할 만한 몇 가지 변경사항을 추려보고 앞으로 프로젝트 진행 시 참고할 만한 기능이 있는지, 그리고 Spring Boot가 어떤 방향으로 나아갈거같은지, 공유하고자 작성하게 되었다. (물론 RC 버전이라 확정이 아님을 감안해주면 좋을거같다

본론
2025년 10월 23일(미국 기준)에 Spring 공식 블로그에는 “Spring Boot 4.0.0‑RC1 available now”라는 글이 올라왔고, 해당 버전이 Maven Central에 등록되었다는 안내가 있었다.
https://spring.io/blog/2025/10/23/spring-boot-4-0-0-RC1-available-now?utm_source=chatgpt.com
Spring Boot 4.0.0-RC1 available now
spring.io
이 릴리즈에는 176건의 기능 향상, 문서 개선, 의존성 업그레이드, 버그 수정 등이 포함되어 있다고 밝히면서, “현재까지의 관행을 바꾸겠다”, 혹은 “새로운 표준을 정하겠다” 정도의 의지가 담겨 있다고 많은 사람들이 해석하고 있다.
주요 변경 사항
이제 구체적인 예시 코드들을 보면서 함께, 4.0 버전부터 바뀌는 주요 업데이트 내용을 알아보자
RestClientTest 추가
import org.springframework.boot.test.autoconfigure.web.client.RestTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.Test;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class UserControllerTest {
@Autowired
private RestTestClient restTestClient;
@Test
void getUser_returnsUser() {
restTestClient.get()
.uri("/api/users")
.exchange()
.expectStatus().isOk()
.expectBody()
.jsonPath("$.id").isEqualTo(1)
.jsonPath("$.name").isEqualTo("jihun");
}
}
먼저 기존 버전(3.x 등)에서는 WebTestClient(주로 WebFlux 환경)나 RestTemplate 등을 이용해 컨트롤러/서비스 테스트를 작성하곤 했고, 또 MockMvc 등 MVC 환경용 테스트 도구가 존재했었다.
이번 4.0 RC1에서는 RestTestClient 라는 테스트 도구가 새롭게 소개되어, MVC와 WebFlux 양쪽 프레임워크 모두에서 통합 테스트를 보다 수월하게 진행할 수 있게 되었다.
해당 업데이트가 시사하는 바로는, 이제 프레임워크 종류에 따라 테스트 도구를 나누지 않아도 되며, 하나의 테스트 클라이언트 API로 통합 가능하다는 점이 흥미로웠다. “컨트롤러와 서비스 사이 통신 흐름을 통합적으로 검증하고 싶을 때”, 아니면 “MVC → WebFlux 마이그레이션 중인 프로젝트”같은 경우에 특히 유용할 수 있겠다는 개인적인 생각도 들었다.
신규 어노테이션 @ObservationKeyValue
@Service
public class OrderCreateService {
@ObservationKeyValue(key = "order.created", value = "true")
public Order createOrder(Customer customer, Item item) {
Order order = new Order(customer, item);
return order;
}
}
해당 내용은 본론을 시작하며 위에서 첨부했던 스프링 공식문서에도 담겨있었던 내용으로, 관측성(Observability) 에 대한 변화에 집중하겠다는걸 보여준 예시이기도 한거같다. @ObservationKeyValue 어노테이션을 통해 메트릭에 대한 키‑값을 보다 직관적으로 정의할 수 있게 되었다.
물론 리서치 해본 결과, key와 value가 반대로 들어간다든지, 내부 fallback 처리로 메서드 반환값이 value에 들어간다든지 하는 현상이 있다는 버그가 있다는 점은 참고하고, 정식 버전이 아니라는 점도 감안해주어야 할거같다.
여기서 개인적으로 재밌었던 점은, Spring Boot 3.x 버전에서도 메서드 파라미터를 기반으로 메트릭에 동적 태그를 추가하는 기능으로, @Timed나 @Counted 어노테이션과 함께 메서드 파라미터에 @MeterTag를 사용하여 동적으로 태그를 추가하는게 이미 존재했었다는 점이다.
그럼에도 @ObservationKeyValue 어노테이션이 나온 이유는, @Observed 어노테이션과 함께 사용할 수 있어, 메트릭과 트레이싱 모두에 동적 태그를 일관되게 추가할 수 있기때문이 아닐까라는 개인적인 생각인 생각이 들었다. 마찬가지로 "관측성" 측면에 집중한 업데이트 같았다.
// Spring Boot 3.x의 복잡한 방식
@Observed(name = "order.created")
public Order createOrder(String orderId) {
Observation observation = registry.getCurrentObservation();
if (observation != null) {
observation.highCardinalityKeyValue("orderId", orderId);
}
}
그리고 첫번째 첨부한 예시 코드랑 비교했을때, 두번째 첨부한 바로 위의 코드가 가독성도 조금 떨어진다고 생각하기에, 개인적으로 좋다고 생각하는 업데이트이다.
관측성 측면에서는 또 Micrometer나 Micrometer Tracing 등과의 연계, 분산 추적(Distributed Tracing) 기본 내장 등이 강화된 것으로 보이는데, 릴리즈 노트에서는 “Redis 관측성 개선(Redis observability improvements)” 등의 항목이 나와있어서 추후에 발표되는 내용들을 주의깊게 봐봐야할거같다.
직렬화/역직렬화 및 라이브러리 변화: Jackson 3 검토
추가로 Jackson 버전 3 도입 검토가 진행 중이라고 한다. 현재 Spring Boot는 Jackson 2.x 계열을 사용하고 있고, 이를 Jackson 3로 업그레이드하는 작업이 내부적으로 검토되고 있다고 한다. “Record 타입 직렬화/역직렬화”을 기대하셨는데, 실제로 Preview 분석 글에서도 Java Record 지원 강화가 언급되어 있다.
또한 4.0.0‑M1 릴리즈 노트에서는 의존성 업그레이드 항목으로 Jackson 3 미리보기 버전 가능성이 언급되어 있어서, 해당 부분도 참고해주면 좋을거같다
개인적으로도 불변 객체(Immutable Object), Record 타입을 많이 쓰시는 경험이 있었어서 이 변화가 반갑기도 했었다. 앞으로 클래스 + Lombok 방식 대신 Record 방식 + 제대로 된 직렬화/역직렬화 지원이 가능해지면 구조 설계 측면에서도 선택지가 넓어질 것 같다는 생각도 들었었다.
마치며
개인적으로 굳이 불변성을 지닌 객체에 대해서는 Lombok을 적용하는 것을 선호하지는 않았어서, 최대한 Lombok 적용을 고민해 보는편이였다. 그래서 Java Record의 개념은 앞서 얘기했듯이 내가 좋아하고 애용도 많이하지만, ObjectMapper가 직렬화/역직렬화를 제대로 지원하지 않아 Class로 변경하고 Lombok을 사용했던 경험도 있었다.
마찬가지로 RestTestClient도 RestClient는 도입해봤던 경험이 많지만, 결국 테스트는 WebTestClient나 RestTemplate을 사용하여 진행하였는데 이를 통합한 테스트 객체가 생겨서 너무 좋다고도 생각했다.
또한, 글에는 설명하지 않았지만 Virtual Threads 동시성 처리 개선,AOT 컴파일 최적화로 시작 속도 향상, 분산 추적 기본 내장와 같은 보완된 내용들이 있으니 참고하면 좋을 것 같다.
'Spring > CS 개념' 카테고리의 다른 글
| HTTP 통신에서 클라이언트와 서버의 역할 (Spring) (0) | 2025.04.16 |
|---|---|
| RESTful한 설계란 ? (Spring) (0) | 2025.04.16 |
| IoC와 DI, 그리고 Spring에서의 동작방식 (Spring) (0) | 2025.04.15 |
| 웹 애플리케이션의 구조와 계층형 패키지 (Spring) (1) | 2025.04.09 |