비동기 & 논블로킹! 더 빠른 웹 서비스 만들기 🚀
자바 개발하면서 "웹 서비스 속도 좀 더 빠르게 할 방법 없을까?"에 대해 고민해보신적 있나요?
특히 요청이 많거나, 비동기 처리가 필요한 경우 Spring MVC는 한계가 있을 수 있어요.
그래서 등장한 게 바로 Spring WebFlux!
💡 "비동기(Async) + 논블로킹(Non-blocking)" 방식으로 동작하는 리액티브 웹 프레임워크입니다.
오늘은 WebFlux가 무엇인지, 왜 필요한지, 어떻게 쓰는지 차근차근 알려드릴게요!
예제 코드까지 있으니 따라 해보면서 이해해보세요! 🎯
📌 Spring WebFlux란? 🤔
Spring WebFlux는 Spring 5에서 추가된 비동기 논블로킹 웹 프레임워크입니다.
Spring MVC와 달리 Servlet 기반이 아니라, Netty 같은 논블로킹 서버를 사용합니다.
✔️ 비동기(Async) & 논블로킹(Non-blocking)
✔️ Servlet이 아닌 Netty, Undertow 같은 서버 지원
✔️ Reactive Streams(리액티브 스트림) 기반
✔️ 대량의 요청을 처리할 때 성능이 뛰어남
😎 쉽게 말하면?
"동시에 많은 요청을 처리해야 하는 시스템에서 훨씬 빠르다!" 는 겁니다.
📌 Spring MVC vs WebFlux, 뭐가 다를까?
특징 | Spring MVC | Spring WebFlux |
---|---|---|
실행 방식 | 동기(블로킹) | 비동기(논블로킹) |
스레드 모델 | 요청마다 새로운 스레드 사용 | 적은 스레드로 효율적 처리 |
서버 지원 | Tomcat, Jetty 등 | Netty, Undertow 등 |
데이터 처리 | 일반적인 REST API 방식 | 리액티브 스트림 기반 |
장점 | 코드가 익숙하고 사용하기 쉬움 | 대량의 요청을 빠르게 처리 가능 |
💡 즉, WebFlux는 고성능이 필요한 대규모 시스템에서 강점을 발휘합니다!
📌 WebFlux 기본 사용법, 코드로 이해해보자!
✅ 1. 프로젝트 설정 (pom.xml)
WebFlux를 사용하려면, Spring Boot + WebFlux 의존성을 추가해야 합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
(🔥 Spring MVC가 아니라 webflux 인 거 확인하세요!)
✅ 2. 기본 컨트롤러 예제
Spring MVC에서 쓰던 @RestController 그대로 사용 가능합니다! 😎
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/webflux")
public class WebFluxController {
@GetMapping("/hello")
public Mono<String> sayHello() {
return Mono.just("안녕하세요! WebFlux입니다. 🚀");
}
}
💡 실행 결과 (GET /webflux/hello)
안녕하세요! WebFlux입니다. 🚀
🎯 Mono 사용한 게 보이시죠?
WebFlux는 데이터를 Mono(단일 데이터) 또는 Flux(다중 데이터) 로 반환합니다.
✅ 3. 여러 개의 데이터를 리턴하는 경우 (Flux 사용)
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import java.time.Duration;
@RestController
@RequestMapping("/webflux")
public class WebFluxController {
@GetMapping("/numbers")
public Flux<Integer> getNumbers() {
return Flux.range(1, 5) // 1부터 5까지 숫자 생성
.delayElements(Duration.ofSeconds(1)); // 1초 간격으로 반환
}
}
💡 실행 결과 (GET /webflux/numbers)
1초 간격으로
1
2
3
4
5
😎 Flux는 여러 개의 데이터를 스트리밍처럼 처리하는 방식입니다!
✅ 4. 비동기 서비스 만들기 (Mono 활용)
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@Service
public class UserService {
public Mono<String> getUserById(String id) {
return Mono.just("User ID: " + id)
.delayElement(Duration.ofSeconds(2)); // 2초 후 반환
}
}
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/webflux")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/user/{id}")
public Mono<String> getUser(@PathVariable String id) {
return userService.getUserById(id);
}
}
💡 실행 결과 (GET /webflux/user/123)
2초 후에 응답
User ID: 123
🎯 delayElement(Duration.ofSeconds(2)) 덕분에 2초 후 응답이 옵니다.
하지만 요청을 여러 개 보내도 블로킹 없이 동시 처리됩니다! 🚀
📌 언제 WebFlux를 써야 할까?
✅ API 호출이 많고, 동시 요청을 많이 처리해야 하는 경우
✅ 데이터 스트리밍이 필요한 경우 (예: 실시간 채팅, 주식 데이터)
✅ 마이크로서비스 환경에서 이벤트 기반 통신을 해야 하는 경우
❌ 단순 CRUD 웹 애플리케이션에서는 Spring MVC가 더 쉬울 수도 있음!
🔥 Spring WebFlux 핵심 정리 🎯
✅ 비동기 & 논블로킹 방식으로 동작하는 웹 프레임워크
✅ Mono(단일 데이터) & Flux(다중 데이터) 로 데이터 처리
✅ Netty 같은 서버 지원 (Servlet 기반 아님)
✅ 대량의 요청을 빠르게 처리 가능 (고성능 서비스에 적합!)
✅ Spring MVC와는 다른 실행 방식이므로 필요에 따라 선택!
🎯 "고성능 웹 서비스가 필요하다!" → WebFlux 추천!
🎯 "일반적인 REST API면 된다!" → Spring MVC 사용해도 충분!
📌 WebFlux, 한번 써보시겠어요? 😆
오늘 WebFlux 개념부터 예제 코드까지 쭉 정리해봤는데요!
조금 감이 잡히셨나요? 😎
WebFlux는 확실히 대량의 요청을 빠르게 처리하는 데 강력한 무기입니다.
하지만 Spring MVC와는 패러다임이 다르므로 필요한 곳에 적절히 사용하는 게 중요합니다.
혹시 WebFlux 관련해서 더 궁금한 점 있으시면 댓글 남겨주세요! 🚀
'Programming > Spring Framework' 카테고리의 다른 글
🤔 스프링 Component-Scan, 몰라도 될까? 진짜 중요함! (0) | 2025.03.02 |
---|