Contents
see List개요
Spring Boot 3.5는 2024년 11월에 릴리스된 최신 메이저 업데이트로, Virtual Threads 안정화, Observability 강화, Native Image 성능 개선 등 다양한 혁신적 기능을 제공합니다. 이 문서에서는 Spring Boot 3.5의 핵심 신기능들을 실전 예제와 함께 살펴봅니다.
Virtual Threads 완전 지원
Spring Boot 3.5는 JDK 21의 Virtual Threads를 프로덕션 레벨로 지원합니다. 기존 Platform Threads 대비 수천 배 많은 동시 요청을 처리할 수 있으며, 설정만으로 활성화할 수 있습니다.
# application.yml
spring:
threads:
virtual:
enabled: true@RestController
public class VirtualThreadController {
@GetMapping("/blocking-io")
public String handleBlockingIO() throws InterruptedException {
// Virtual Thread에서 자동 실행
Thread.sleep(1000);
return "Handled by: " + Thread.currentThread();
}
@Async
@GetMapping("/async-task")
public CompletableFuture<String> asyncTask() {
// Virtual Thread Pool에서 실행
return CompletableFuture.supplyAsync(() -> {
return "Thread: " + Thread.currentThread().isVirtual();
});
}
}Observability 강화
Spring Boot 3.5는 Micrometer 1.13과 통합되어 자동 메트릭 수집, 분산 추적, 로깅이 더욱 강화되었습니다. Actuator와 함께 사용하면 프로덕션 모니터링이 즉시 가능합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>@Configuration
public class ObservabilityConfig {
@Bean
public ObservationRegistryCustomizer<ObservationRegistry> observationConfig() {
return registry -> {
registry.observationConfig()
.observationPredicate((name, context) -> {
// 특정 관찰 필터링
return !name.startsWith("internal.");
});
};
}
}RestClient 개선
기존 RestTemplate과 WebClient의 장점을 결합한 RestClient가 대폭 개선되었습니다. 동기/비동기 호출을 직관적으로 작성할 수 있습니다.
@Configuration
public class RestClientConfig {
@Bean
public RestClient restClient(RestClient.Builder builder) {
return builder
.baseUrl("https://api.example.com")
.defaultHeader("Authorization", "Bearer {token}")
.requestInterceptor((request, body, execution) -> {
// 요청 인터셉터
log.info("Request: {} {}", request.getMethod(), request.getURI());
return execution.execute(request, body);
})
.build();
}
}
@Service
public class ApiService {
private final RestClient restClient;
public UserDto getUser(Long id) {
return restClient.get()
.uri("/users/{id}", id)
.retrieve()
.body(UserDto.class);
}
public UserDto createUser(UserDto user) {
return restClient.post()
.uri("/users")
.contentType(MediaType.APPLICATION_JSON)
.body(user)
.retrieve()
.onStatus(HttpStatusCode::is4xxClientError, (request, response) -> {
throw new ApiException("Client error: " + response.getStatusCode());
})
.body(UserDto.class);
}
}Data JPA 쿼리 성능 개선
Spring Data JPA 3.3은 쿼리 힌트, Batch Fetching, 동적 프로젝션 등의 성능 최적화 기능이 추가되었습니다.
public interface UserRepository extends JpaRepository<User, Long> {
@QueryHints(@QueryHint(name = "org.hibernate.readOnly", value = "true"))
@Query("SELECT u FROM User u WHERE u.status = :status")
List<User> findActiveUsers(@Param("status") String status);
// 동적 프로젝션
<T> List<T> findByEmailContaining(String email, Class<T> type);
}
// 사용 예제
public interface UserSummary {
String getName();
String getEmail();
}
List<UserSummary> summaries = userRepository
.findByEmailContaining("@example.com", UserSummary.class);활용 팁
- Virtual Threads 마이그레이션: 기존 Thread Pool 설정을 제거하고 spring.threads.virtual.enabled=true만 추가하면 즉시 전환됩니다.
- Observability 통합: Actuator + Micrometer + Prometheus 조합으로 Grafana 대시보드를 10분 안에 구축할 수 있습니다.
- RestClient 전환: RestTemplate 코드는 대부분 1:1 매핑이 가능하며, 더 간결한 API를 제공합니다.
- Native Image: GraalVM Native Image 빌드 시간이 30% 단축되었고, 메모리 사용량이 40% 감소했습니다.
- 보안 업데이트: Spring Security 6.3과 함께 사용 시 OAuth 2.1과 JWT 처리가 더욱 강화되었습니다.
마무리
Spring Boot 3.5는 Virtual Threads와 Observability를 중심으로 현대적 클라우드 네이티브 애플리케이션 개발을 위한 필수 기능들을 제공합니다. 기존 Spring Boot 3.x 프로젝트에서 마이그레이션이 매우 쉬우며, 성능과 모니터링 측면에서 즉시 효과를 체감할 수 있습니다. 특히 Virtual Threads는 높은 동시성이 요구되는 API 서버에서 인프라 비용을 크게 절감할 수 있는 게임 체인저입니다.