2025-09-04
1일 1아티클
한글과컴퓨터 테크
WebFlux & Project Reactor (2)
Spring WebFlux
Spring MVC
를 두고 새로운 리액티브 웹 프레임워크 개발- 완전한 논블로킹 스택 필요 : 대부분의 Sublet API는 동기적, 블로킹 방식 동작
- 함수형 프로그래밍 부상 : Java 8
Lambda
도입 → 비동기 로직 선언 가능한 함수형 API
WebFlux의 프로그래밍 모델
- 2가지 선택지, 혼용 가능
- 어노테이션 기반 컨트롤러 :
Spring MVC
와 유사한 어노테이션(@Controller
,@GetMapping
) 사용 - 함수형 엔드포인트 : 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를 연결하는 라이브러리
- LoopResources (이벤트 루프 설정) : Worker Thread 수를 {CPU 코어 수, 4} 중 더 큰 값으로 설정
- NioEventLoopGroup (객체 생성 및 그룹화) : NioEventLoop 객체 생성, 실제 스레드 시작 X
- SingleThreadEventExecutor (싱글 스레드 바인딩) : 새로 스레드 생성 및 등록(바인딩), 무한 루프인 run() 실행 → NioEventLoop 는 자신만의 싱글 스레드 확보되어 스레드 안전성 보장
- NioEventLoop.run() (비동기 처리 루프) : 무한 루프 안에서 싱글 스레드는 Selector를 이용한 I/O 처리, Task Queue의 일반 작업 처리 임무를 빠르게 번갈아 수행 → 논블로킹 동작 완성
오늘 배운 것
- 알고리즘
- swea 5648 원자 소멸 시뮬레이션
- 시뮬레이션
내일 할 일
- 인프런 대규모 트래픽 이론 공부