0. 개요와 이모저모
개요
- Spring Webflux 에 대한 리마인드 및 심화적인 공부를 하기 위함
- 아래와 같은 목차를 통해 Webflux를 설명하기로 계획함
목차
- 패러다임의 전환 (왜 쓰는가?)
- Project Reactor (핵심 엔진)
- WebFlux 프로그래밍 모델
- 데이터 액세스 및 외부 연동
- 예외 처리 및 테스트
- 심화 및 성능 최적화 (선택적)
목차
1단계: 패러다임의 전환 (왜 쓰는가?)
가장 먼저 'Thread per Request' 모델(MVC)과 'Event Loop' 모델(WebFlux)의 차이를 이해해야 합니다. 이 개념이 흔들리면 코드 전체가 이해되지 않습니다.
-
Blocking vs Non-Blocking I/O 개념 정리
-
Spring MVC vs Spring WebFlux 구조 비교
-
Reactive Streams 표준: Publisher, Subscriber, Subscription, Processor의 관계
2단계: Project Reactor (핵심 엔진)
WebFlux는 Project Reactor라는 라이브러리 위에서 동작합니다. 사실상 WebFlux 공부의 70%는 이 라이브러리 학습입니다.
-
Mono와 Flux: 0~1개의 데이터와 N개의 데이터를 다루는 법
-
마블 다이어그램(Marble Diagram): 연산자의 흐름 시각적으로 이해하기
-
자주 쓰는 Operator:
-
생성:
just,fromIterable,defer -
변환:
map,flatMap,concatMap,switchMap -
결합:
zip,merge,concat -
기타:
filter,distinct,reduce
-
-
Cold Publisher vs Hot Publisher 차이점
3단계: WebFlux 프로그래밍 모델
MVC와 비슷한 방식과 WebFlux 전용 방식 두 가지를 모두 알아야 합니다.
-
Annotated Controllers: 기존
@RestController,@GetMapping방식 (친숙함) -
Functional Endpoints:
HandlerFunction과RouterFunction을 사용하는 방식 (함수형) -
ServerHttpRequest / ServerHttpResponse 다루기
4단계: 데이터 액세스 및 외부 연동
WebFlux의 장점을 살리려면 DB와 외부 API 호출도 논블로킹이어야 합니다.
-
WebClient:
RestTemplate을 대체하는 강력한 논블로킹 클라이언트 (필수!) -
Spring Data R2DBC: 관계형 데이터베이스(MySQL, PostgreSQL 등)를 리액티브하게 다루는 법
-
Reactive Redis / MongoDB: NoSQL 연동
5단계: 예외 처리 및 테스트
비동기 환경에서는 Stack Trace가 끊기기 때문에 테스트와 디버깅이 어렵습니다. 전용 도구를 배워야 합니다.
-
Error Handling:
onErrorResume,onErrorReturn,WebExceptionHandler -
StepVerifier: Reactor 코드를 검증하는 필수 테스트 도구
-
WebTestClient: 엔드포인트 통합 테스트
6단계: 심화 및 성능 최적화 (선택적)
-
Schedulers: 실행 스레드 풀 제어 (
publishOn,subscribeOn) -
Backpressure (배압): 소비자가 감당 못 할 만큼의 데이터를 생산자가 보낼 때 제어하는 전략
-
Context: 리액티브 흐름 내에서 로컬 변수처럼 데이터를 공유하는 법 (ThreadLocal 대용)
Appendix
-
flatMap정복: WebFlux에서 가장 많이 쓰이면서도 헷갈리는 연산자입니다. 비동기 작업의 순서를 보장하거나 병렬로 처리할 때 핵심입니다. -
로그 확인:
log()연산자를 중간에 끼워 넣어 어떤 스레드에서 어떤 데이터가 흐르는지 관찰하는 것이 실력 향상에 큰 도움이 됩니다. -
Blocking 코드 주의: 리액티브 파이프라인 중간에 JDBC나
Thread.sleep같은 블로킹 코드가 하나라도 섞이면 전체 성능이 급격히 저하됩니다. (BlockHound 같은 도구로 감지 가능)