Programming/Spring Framework

🌊 Spring WebFlux, 도대체 뭐길래?

철부지개발자 2025. 3. 2. 12:24
반응형

비동기 & 논블로킹! 더 빠른 웹 서비스 만들기 🚀

자바 개발하면서 "웹 서비스 속도 좀 더 빠르게 할 방법 없을까?"에 대해 고민해보신적 있나요?


특히 요청이 많거나, 비동기 처리가 필요한 경우 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 관련해서 더 궁금한 점 있으시면 댓글 남겨주세요! 🚀

반응형