2025-09-04

1일 1아티클

한글과컴퓨터 테크

WebFlux & Project Reactor (2)

Spring WebFlux

  • Spring MVC를 두고 새로운 리액티브 웹 프레임워크 개발
  • 완전한 논블로킹 스택 필요 : 대부분의 Sublet API는 동기적, 블로킹 방식 동작
  • 함수형 프로그래밍 부상 : Java 8 Lambda 도입 → 비동기 로직 선언 가능한 함수형 API

WebFlux의 프로그래밍 모델

  • 2가지 선택지, 혼용 가능
    1. 어노테이션 기반 컨트롤러 : Spring MVC와 유사한 어노테이션(@Controller, @GetMapping) 사용
    2. 함수형 엔드포인트 : Lambda 기반, 요청의 라우팅 ~ 처리의 전 과정 직접 제어, 요구사항이 단순한 MSA에 적합

도입 기준

  • 기존 Spring MVC 애플리케이션으로 충분히 동작 → MVC
  • JPA, JDBC 등 블로킹 방식의 라이브러리 사용 → MVC
  • 기존 MVC에서 외부 서비스의 비동기적 호출 필요 → 리액티브 WebClient 점진적 도입
  • 논블로킹 웹 스택(ex. MSA에서 높은 트래픽의 효율적 처리) 필요 → WebFlux 도입

MVC와 WebFlux의 차이점

  • MVC
    • thread-per-request 모델 사용하여 요청마다 스레드 할당
    • I/O 작업 시 스레드가 블로킹될 때를 대비해 Thread Pool 사용
  • WebFlux
    • Event Loop 방식 동작, CPU 코어 수만큼의 적은 Thread로 요청 처리
    • Thread가 절대 블로킹되지 않으므로, 적은 자원으로도 예측 가능한 확장 가능
    • 따라서 대규모 트래픽의 효율적 대응에 이점

Event Loop

  • WebFlux의 기본 서버 : Netty (논블로킹 성능에 강점)
  • Reactor-Netty : WebFlux와 Netty를 연결하는 라이브러리
    1. LoopResources (이벤트 루프 설정) : Worker Thread 수를 {CPU 코어 수, 4} 중 더 큰 값으로 설정
    2. NioEventLoopGroup (객체 생성 및 그룹화) : NioEventLoop 객체 생성, 실제 스레드 시작 X
    3. SingleThreadEventExecutor (싱글 스레드 바인딩) : 새로 스레드 생성 및 등록(바인딩), 무한 루프인 run() 실행 → NioEventLoop 는 자신만의 싱글 스레드 확보되어 스레드 안전성 보장
    4. NioEventLoop.run() (비동기 처리 루프) : 무한 루프 안에서 싱글 스레드는 Selector를 이용한 I/O 처리, Task Queue의 일반 작업 처리 임무를 빠르게 번갈아 수행 → 논블로킹 동작 완성

오늘 배운 것

  1. 알고리즘
    • swea 5648 원자 소멸 시뮬레이션
    • 시뮬레이션

내일 할 일

  1. 인프런 대규모 트래픽 이론 공부

참고자료

results matching ""

    No results matching ""