WebFlux란?

break 없는 while loop·2024년 12월 29일
post-thumbnail

1. WebFlux란?

Spring Framework에서 제공하는 비동기(Asynchronous) 및 논블로킹(Non-blocking) 방식의 웹 애플리케이션 개발을 지원하는 웹 프레임워크이다. 이는 특히 높은 동시성(Concurrency) 요구 사항을 처리하거나 Reactive Programming(반응형 프로그래밍) 모델을 사용하는 애플리케이션에 적합하다.

2. WebFlux의 주요 개념

  1. Reactive Stremas 기반
    • WebFlux는 Reactive Streams 스펙을 기반으로 한다.
    • 데이터를 요청(request), 응답(response)할 때, 논블로킹 방식으로 스트림 형태로 데이터를 처리한다.
    • 주요 인터페이스:
      • Publisher: 데이터를 제공하는 주체
      • Subscriber: 데이터를 소비하는 주체
      • Flux: 0개 이상의 데이터 스트림 (다중 값)
      • Mono: 0개 또는 1개의 데이터 스트림(단일 값)

논블로킹 방식은 작업을 요청한 쓰레드가 실행 결과를 기다리지 않고, 다른 작업을 계속 수행할 수 있는 방식이다. 요청한 작업이 완료되면 나중에 그 결과를 처리한다. 이는 일반적인 블로킹 방식과는 반대로, 요청에 대해 즉시 제어권을 반환하며, 작업의 완료 여부와 관계없이 쓰레드가 다른 일을 할 수 있도록 허용한다.

  1. 논블로킹 I/O

    • WebFlux는 Netty 또는 Undertow와 같은 논블로킹 I/O 기반 서버를 지원하며, 요청 및 응답 처리가 블로킹 없이 진행된다.
    • 블로킹 서버(예: Tomcat)에서도 작동하지만, 효율성을 극대화하려면 논블로킹 서버를 사용하는 것이 권장된다.
  2. Reactive Programming 패러다임

    • 데이터 스트림을 처리하면서 발생하는 이벤트에 반응한다.
    • 함수형 프로그래밍 스타일로 작성되며, map, flatMap, filter 등과 같은 연산자를 사용해 데이터를 변환하고 처리한다.
  3. 서버와 클라이언트

    • WebFlux는 REST API 서버 뿐만 아니라 WebFlux 기반 클라이언트(WebClient)를 제공한다.
    • RestTemplate의 대안으로, 비동기 방식으로 HTTP 요청을 수행한다.

3. WebFlux와 MVC의 차이점

특징Spring MVCSpring WebFlux
요청 처리 모델동기(Blocking)비동기(Non-blocking)
기반 서버Servlet 기반 (Tomcat 등)Netty, Undertow, Servlet 기반
Concurrency스레드 수 제한이벤트 루프(Event Loop) 기반 처리
Reactive 지원지원하지 않음Reactive Streams 및 Project Reactor
적합한 애플리케이션일반적인 웹 애플리케이션높은 동시성을 요구하는 애플리케이션

4. WebFlux 주요 구성 요소

  1. HandlerFunction & RouterFunction

    • 컨트롤러를 대체할 수 있는 함수형 스타일의 라우팅 및 요청 처리 방식
    RouterFunction<ServerResponse> route = RouterFunctions
    .route(RequestPredicates.GET("/hello"), request -> ServerResponse.ok().bodyValue("Hello, WebFlux!"));
  2. Reactive Data Types

    • Mono: 1개의 데이터 또는 에러를 비동기적으로 반환
    • Flux: 0개 이상의 데이터를 스트림 형태로 반환
    public Mono<String> getMessage() {
    	return Mono.just("Hello, WebFlux!");
    }
    
    public Flux<Integer> getNumbers() {
    	return Flux.just(1, 2, 3, 4, 5);
    }
  3. WebClient

    • 비동기 HTTP 클라이언트로, RESTful 서비스를 호출할 때 사용
    WebClient webClient = WebClient.create();
    Mono<String> result = webClient.get()
                                   .uri("https://api.example.com/data")
                                   .retrieve()
                                   .bodyToMono(String.class);

5. WebFlux를 사용하는 이유

  1. 높은 동시성 처리
    • 적은 리소스로 대규모 요청을 처리할 수 있어 효율적
    • 예: 채팅, 실시간 알림, 데이터 스트리밍 같은 애플리케이션
  2. Reactive Programming의 이점
    • 선언적이고 비동기적인 코드 작성 가능
    • 데이터 흐름 및 이벤트 중심 로직을 간단히 처리
  3. 성능 최적화
    • 블로킹 방식에서는 요청 처리 중 스레드가 대기 상태로 유지되지만, WebFlux는 논블로킹 방식으로 쓰레드 대기를 최소화하여 더 많은 요청을 처리할 수 있음

6. WebFlux를 사용할 때 적합한 시나리오

  • 고성능 실시간 애플리케이션
    • 채팅 애플리케이션, 실시간 알림 시스템
  • 대규모 데이터 스트리밍
    • 로그 수집 시스템, IoT 데이터 처리
  • API Gateway
    • 요청 라우팅 및 비동기 호출 최적화
profile
프로그래밍 지식 아카이브용

0개의 댓글