더 많은 도움을 드리기 위해

열심히 포스팅 중입니다!


지나가다 📢 광고 한 번 눌러주시면

더 좋은 글로 보답하겠습니다. 🥰

기술 면접 준비

Reactive Programming과 Spring WebFlux - 기술 면접 준비

평비 - 개취비 2025. 6. 9. 02:35

 

👋 

안녕하세요~ 평비입니다!

🤔 Spring WebFlux라는 게 대용량 트래픽 처리에 좋다더라~ 요즘은 WebFlux 많이 쓴다더라~ 이런 이야기를 들었습니다. 그래서, 이 WebFlux라는 게 무엇일지? 알아봤습니다.

 

1. Spring WebFlux

Spring MVC가 전통적인 웹 애플리케이션의 강자라면, Spring WebFlux는 현대 웹의 요구사항, 즉 고성능, 확장성, 그리고 실시간 데이터 처리에 대응하기 위해 등장한 강력한 대안입니다. 이는 Reactive Programming(반응형 프로그래밍) 패러다임을 기반으로 구축됩니다. Spring MVC와 같은 블로킹 방식과는 완전히 다른 접근 방식이라고 보시면 됩니다.

 

Spring WebFlux를 더 알아보기에 앞서, Reactive Programming에 대해서 알아보겠습니다.

 

여러분들이 잘 아시는 그 React.js와는 아무런 관계가 없습니다. 😅

 

 

2. Reactive Programming?

인터넷이 태동하고 약 15년의 총 유저와 약 5년의 Facebook 유저가 비슷하다...

 

불과 몇 년 전만 해도 대규모 애플리케이션은 수십 대의 서버, 몇 초의 응답 시간, 몇 시간의 오프라인 유지 관리, 그리고 기가바이트급 데이터를 필요로 했습니다. 오늘날 애플리케이션은 모바일 기기부터 수천 개의 멀티코어 프로세서를 구동하는 클라우드 기반 클러스터에 이르기까지 모든 환경에 배포됩니다. 사용자는 ms(밀리초) 단위의 응답 시간과 100% 가동 시간을 기대하며, 데이터는 페타바이트 단위로 측정됩니다. 오늘날의 요구 사항은 과거의 소프트웨어 아키텍처로는 충족할 수 없습니다.
- The Reactive Manifesto (2014.09.16)


https://reactivemanifesto.org/

 

The Reactive Manifesto

Responsive: The system responds in a timely manner if at all possible. Responsiveness is the cornerstone of usability and utility, but more than that, responsiveness means that problems may be detected quickly and dealt with effectively. Responsive systems

reactivemanifesto.org

 

 

반응형 프로그래밍 패러다임은 위와 같은 문제 의식으로 만들어졌습니다. 리액티브 시스템의 특징은 아래와 같습니다.

  • 유연한 시스템 - 개발이 쉽고 변경에 유연함
  • 비동기 메시지 기반 시스템 - 느슨한 결합으로 장애 격리, 높은 확장성 확보
  • 경합 지점이나 중앙 병목 현상이 없는 설계 - 리소스 효율성, 높은 처리량
  • 실시간 반응성 - 사용자에게 빠르고 일관된 응답 시간 및 피드백을 제공
  • 선언형 프로그래밍 패러다임
  • 함수형 프로그래밍 기법 사용

 

🔍 선언형 프로그래밍

List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 8, 13, 21);

int sum = numbers.stream()
        .filter(number -> number > 6 && number % 2 != 0)
        .mapToInt(number -> number)
        .sum();

기존의 명령형 프로그래밍이 가령, for 문 돌리면서 명령을 하나씩 수행하도록 프로그래밍하는 것이라면, 선언형 프로그래밍은 위와 같이 filter, mapToInt 와 같이 선언을 하고 수행하도록 프로그래밍하는 방식을 뜻합니다.

 

 

3. Reactive Streams

Reactive Programming을 표준화한 명세입니다. 구성요소는 다음과 같습니다.

  • Publisher - 데이터를 통지하는 주체
  • Subscriber - Publisher가 통지한 데이터를 구독하는 객체
  • Subscription - 구독 자체
  • Processor - Publisher / Subscriber 역할을 동시에 할 수 있는 인터페이스

 

Reactive Streams를 구현한 구현체들은 다음과 같습니다.

  • Reactor - Spring WebFlux의 Reactive Streams 구현체
  • Java 9 Flow API
  • Akka Streams
  • RxJava

 

4. Spring WebFlux의 아키텍처, 동작 방식

Spring WebFlux의 핵심은 이벤트 루프 스레드입니다. 이는 논블로킹 방식으로 I/O를 처리하는 OS 커널 스레드입니다. 이벤트 루프 스레드에는 요청 핸들러와 이벤트 루프가 있습니다. 요청을 처리하는 동작 방식은 다음과 같습니다.

Spring WebFlux의 동작 방식

  1. 클라이언트가 서버로 요청을 전송합니다.
  2. 요청 핸들러가 해당 요청을 받아서 이벤트 큐이벤트를 푸시합니다.
  3. 이벤트 루프이벤트 큐에 쌓인 이벤트를 순서대로 처리합니다. Intensive Operation (집중 작업)이 필요하면, 이벤트 루프 스레드가 직접 수행하는 것이 아니라 외부 스레드(OS 커널 I/O 스레드 등과 같은 별도의 워커 스레드)에 전달하고 콜백을 등록합니다. 그리고 이벤트 루프 스레드는 즉시 다음 이벤트를 처리합니다. (논블로킹)
  4. 집중 작업은 네트워크 통신, DB 접근 등과 같이 시간이 오래 걸리거나 외부 리소스에 의존하는 작업들입니다. 이런 작업들은 백그라운드에서 비동기적으로 수행됩니다.
  5. 집중 작업이 완료되면, 완료 이벤트를 이벤트 큐에 푸시합니다.
  6. 이벤트 루프가 이벤트 큐에 들어온 완료 이벤트를 확인하고, 이전에 등록해둔 콜백 함수를 호출하여 클라이언트에 응답합니다.

이러한 동작 방식으로 인해, 적은 수의 스레드로도 많은 요청을 처리할 수 있게 됩니다.

 

 

5. Spring WebFlux는 언제 선택하면 좋을까?

대규모, 실시간, 수많은 동시 요청, 대량의 I/O bound, 스트리밍 사례

  • 높은 동시성 및 처리량이 요구되는 애플리케이션 - 대규모 사용자 서비스, 실시간 채팅 애플리케이션, 온라인 게임 백엔드, 대량의 알림 시스템 등 수많은 동시 요청을 효율적으로 처리해야 하는 경우
  • I/O-bound 작업이 많은 애플리케이션 - 외부 API 호출, 원격 서비스 통신(MSA), 대용량 데이터베이스 조회 등 I/O 작업으로 인해 대기 시간이 긴 애플리케이션의 경우
  • 마이크로서비스 아키텍처 및 이벤트 기반 시스템 구축 - 마이크로서비스 간의 비동기 통신(예: 메시지 큐, 이벤트 스트리밍)이 중요한 경우
  • 스트리밍 데이터를 처리해야 할 때 - SSE(Server-Sent Events)를 이용한 실시간 알림, 웹소켓을 통한 양방향 통신, 대용량 파일 스트리밍 등 연속적인 데이터 흐름을 처리해야 할 경우

 

 
 

👏

 

자, 이렇게 대규모 트래픽 처리에 사용되는 Spring WebFlux에 대해서 다뤄봤습니다!
저도 최근에 처음 접했고, 이 포스팅을 작성하면서 좀 더 상세하게 공부를 하게 된 것 같은데요...!
 
평비의 이 평범한 글이 여러분에게 비범한 도움이 되었으면 좋겠습니다 👍

 

 

참고

[10분 테코톡] 🐅호돌의 Spring Webflux

What is Reactive Programming

Kevin의 리액티브 프로그래밍