
@RestController
class UserController {
private final WebClient webClient;
public UserController(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://example.com").build();
}
@GetMapping("/user")
public Mono<ResponseEntity<User>> getUser() {
return webClient.get()
.uri("/user")
.retrieve()
.bodyToMono(User.class)
.map(ResponseEntity::ok);
}
}
@RestController
class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/user")
public ResponseEntity<User> getUser() {
User user = userService.getUser(); // 블로킹 호출
return ResponseEntity.ok(user);
}
}
@RestController
class UserController(private val userService: UserService) {
@GetMapping("/user")
suspend fun getUser(): ResponseEntity<User> {
val user = userService.getUser() // Suspend function
return ResponseEntity.ok(user)
}
}
// Spring Boot 애플리케이션의 기본 설정 (application.properties)
spring.threads.virtual.enabled=true
@RestController
public class UserController {
@GetMapping("/user")
public CompletableFuture<ResponseEntity<User>> getUser() {
return CompletableFuture.supplyAsync(() -> {
User user = userService.getUser(); // I/O 바운드 작업
return ResponseEntity.ok(user);
});
}
}
@Configuration
public class VirtualThreadConfig {
@Bean
public Executor virtualThreadExecutor() {
return Executors.newVirtualThreadPerTaskExecutor();
}
}
@RestController
class UserController {
private final Executor executor;
public UserController(Executor executor) {
this.executor = executor;
}
@GetMapping("/user")
public CompletableFuture<ResponseEntity<User>> getUser() {
return CompletableFuture.supplyAsync(() -> {
User user = userService.getUser(); // 블로킹 작업
return ResponseEntity.ok(user);
}, executor);
}
}
Reactive Spring Boot With Kotlin Coroutines: Adding Virtual Threads