스프링 프레임워크 쿡북
“한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

- 원제 : Spring 6 Recipes : A Problem-Solution Approach to Spring Framework
- 저자 : Marten Deinum, Daniel Rubio, Josh Long
- 출판 : 한빛미디어, 2025 / Apress, 2023
3년을 서평 활동을 하면서 한번도 스프링이 메인 주제가 되는 책을 다룰 일이 없었는데 이번에 좋은 기회로 하게 되었다. 나에게 스프링 프레임워크란, 밥 벌어먹고 살게 해주는 고마운 도구이자 3년 조금 넘게 써먹고 있으면서도 아직도 완전히 정복이 안된 멀고도 가까운 사이다. 스프링은 다른 인기 언어들에서 비슷한 MVC 구조를 가지는 프레임워크가 등장할때마다 위기론이 팽배했다. 그러나 망할것이라는 우려와 다르게 스프링 프레임워크 역시 경쟁 프레임워크 또는 언어들의 장점을 발빠르게 차용하며 기존에 갖고있던 견고함과 대규모 어플리케이션 프레임워크에 적합한 도구라는것을 상기시키며 아직도 한국에서는 가장 많이 사용하는 백엔드 프레임워크다.
이제는 스프링 프레임워크 6버전도 꽤 자리를 잡은지 오래되었다. 기존 Tomcat 베이스의 MVC 외에 Netty기반의 WebFlux, WebClient 추가, AOT컴파일 같이 새로운 개념들이 도입된것은 물론, JPA 네임스페이스 변경, 스프링 시큐리티/스프링 배치 대규모 변경, RMI 제거 등 코드를 작성하는 입장에서도 알아야할게 많다.
이 책의 분량은 980페이지다. 모든 내용을 짧은 시간내에 읽는것은 불가능한 일이므로 스프링6와 관련있는 핵심 챕터들 위주로 소개하겠다. 특히 스프링 코어, 웹플럭스, 시큐리티, 데이터 액세스, 자바 엔터프라이즈 서비스, 테스트 등 실무에서 자주 마주치는 영역들을 중점적으로 다뤄보겠다.
의존성 주입의 진화
스프링의 핵심은 역시 IoC 컨테이너와 의존성 주입이다. 이 챕터에서는 스프링 6에서 달라진 점들을 중심으로 다룬다. 가장 눈에 띄는 변화는 Java 17을 기본으로 하면서 레코드 타입과 패턴 매칭 같은 모던 자바 기능들을 적극 활용한다는 점이다.

특히 인상깊었던 부분은 @Configuration
클래스에서 레코드를 활용한 설정 방법이다. 기존에는 프로퍼티 클래스를 만들 때 getter/setter를 일일이 작성해야 했지만, 이제는 레코드로 간결하게 표현할 수 있다. 또한 @Bean
메서드에서 람다 표현식을 활용한 빈 정의 방법도 소개하는데, 코드가 훨씬 읽기 쉬워진다. AOT(Ahead-of-Time) 컴파일 지원도 중요한 변화다. 네이티브 이미지 생성을 위한 GraalVM 지원이 강화되면서, 스프링 애플리케이션의 시작 시간과 메모리 사용량을 크게 줄일 수 있게 되었다. 다만 리플렉션을 많이 사용하는 기존 코드들은 AOT 컴파일 시 주의가 필요하다는 점도 함께 언급한다.
리액티브 프로그래밍의 실제
웹플럭스는 스프링 5에서 도입되었지만, 여전히 많은 개발자들이 어려워하는 영역이다. 이 챕터에서는 리액티브 프로그래밍의 개념부터 실제 구현까지 단계별로 설명한다. 개인적으로 가장 유용했던 부분은 기존 MVC와 WebFlux의 성능 비교 시나리오다. 단순히 “WebFlux가 빠르다”는 식의 설명이 아니라, 어떤 상황에서 WebFlux가 유리하고 언제 기존 MVC를 사용하는 것이 나은지 구체적인 기준을 제시한다. 특히 I/O 집약적인 작업이 많고 동시 사용자가 많은 환경에서 WebFlux의 장점이 두드러진다는 점을 실제 벤치마크 결과와 함께 보여준다.
Mono와 Flux의 차이점, 백프레셔(backpressure) 처리 방법, 에러 핸들링 전략 등 실무에서 자주 마주치는 문제들에 대한 해결책도 풍부하게 제공한다. 다만 기존 블로킹 코드와의 통합 시 주의사항들도 충분히 다루고 있어서, 무작정 WebFlux로 전환하기보다는 신중한 검토가 필요하다는 점을 강조한다.
스프링 시큐리티 대격변
스프링 시큐리티 6의 변화는 상당히 파격적이다. 기존의 WebSecurityConfigurerAdapter가 deprecated되면서 완전히 새로운 설정 방식을 도입했다. 이 챕터에서는 이러한 변화에 대응하는 방법을 상세히 다룬다. 가장 큰 변화는 람다 DSL을 활용한 설정 방식이다. 기존의 메서드 체이닝 방식보다 훨씬 직관적이고 읽기 쉬워졌다. JWT 토큰 기반 인증, OAuth2 통합, CSRF 보호 등 현대적인 웹 애플리케이션에서 필수적인 보안 기능들을 실제 코드와 함께 설명한다.
특히 마이크로서비스 환경에서의 보안 구현 방법이 인상깊었다. 서비스 간 통신에서의 토큰 전달, 게이트웨이에서의 인증 처리, 분산 세션 관리 등 실무에서 고민되는 부분들에 대한 구체적인 해결책을 제시한다. 다만 보안은 트레이드오프가 많은 영역이라, 편의성과 보안성 사이의 균형을 어떻게 맞출지에 대한 고민도 함께 다룬다.
스프링 자바 엔터프라이즈 서비스와 원격 기술
엔터프라이즈 환경에서는 다양한 시스템 간의 통합이 필수적이다. 이 챕터에서는 REST 클라이언트, 메시징, 스케줄링 등 시스템 통합에 필요한 기술들을 다룬다.
가장 주목할 만한 변화는 RestTemplate이 deprecated되고 WebClient가 권장되는 것이다. WebClient는 동기/비동기 모두 지원하며, 리액티브 스트림과의 통합도 자연스럽다. HTTP 클라이언트 설정, 에러 핸들링, 타임아웃 처리 등 실무에서 중요한 부분들을 상세히 다룬다. 스케줄링 부분에서는 @Scheduled
어노테이션의 고급 사용법과 함께 분산 환경에서의 스케줄링 처리 방법도 소개한다. 특히 여러 인스턴스가 동시에 실행되는 환경에서 중복 실행을 방지하는 방법들이 실용적이다.

또한 프로메테우스 같은 도구들과 연계하여 어플리케이션의 관측성을 제공하는 방법인 마이크로미터를 소개한다. 스프링은 마이크로미터 API용 지원을 내장하면서 이러한 기능을 제공한다
테스트 컨테이너
테스트는 애플리케이션의 품질을 보장하는 핵심 요소다. 이 챕터에서는 스프링 부트 테스트의 다양한 기능들과 함께 효과적인 테스트 전략을 제시한다. @SpringBootTest
, @WebMvcTest
, @DataJpaTest
등 다양한 테스트 슬라이스의 특징과 사용법을 상세히 설명한다. 특히 각 어노테이션이 어떤 빈들을 로드하고 어떤 설정을 적용하는지 명확히 구분해서 설명하는 점이 유용하다.
Testcontainers를 활용한 통합 테스트 방법도 인상깊었다. 실제 데이터베이스나 메시지 큐를 Docker 컨테이너로 띄워서 테스트하는 방법은 테스트의 신뢰성을 크게 높여준다. 다만 테스트 실행 시간이 길어질 수 있다는 트레이드오프도 함께 언급한다.
실무에 바로 적용할 수 있는 레시피북
이 책의 가장 큰 장점은 ‘문제-해결’ 접근 방식이다. 각 챕터마다 실무에서 자주 마주치는 문제 상황을 제시하고, 그에 대한 구체적인 해결책을 코드와 함께 제공한다. 단순한 API 레퍼런스가 아니라 실제 프로젝트에서 바로 활용할 수 있는 패턴들을 담고 있다. 특히 스프링 6의 새로운 기능들을 기존 코드와 비교해서 설명하는 부분이 마음에 들었다. 기존 방식의 한계점과 새로운 방식의 장점을 명확히 구분해서 설명하니, 왜 이런 변화가 필요했는지 이해하기 쉬웠다.
“한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”