일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 힙
- 낙관적락
- JPQL
- CHECK OPTION
- fetch
- 동적sql
- 즉시로딩
- dfs
- SQL프로그래밍
- 다대다
- querydsl
- 백트래킹
- 일대다
- 연관관계
- FetchType
- 다대일
- 데코레이터
- PS
- 유니크제약조건
- 스토어드 프로시저
- BOJ
- 이진탐색
- 비관적락
- 스프링 폼
- 지연로딩
- exclusive lock
- eager
- 연결리스트
- shared lock
- execute
- Today
- Total
흰 스타렉스에서 내가 내리지
Spring WebFlux 본문
Spring WebFlux는 Spring 5에서 도입된 비동기 논블로킹 리액티브 웹 프레임워크입니다.
이는 전통적인 Spring MVC와 달리 리액티브 스트림을 사용하여 비동기적이며 논블로킹 방식으로 데이터 흐름을 관리합니다.
1. 리액티브 프로그래밍 모델:
* 리액티브 스트림(Publisher, Subscriber, Subscription, Processor)을 기반으로 하며, Mono와 Flux 타입을 사용하여 비동기 스트림을 처리합니다.
* Mono는 0 또는 1개의 결과를 나타내고, Flux는 0부터 N개의 결과를 나타냅니다.
2. 비동기 및 논블로킹:
* 요청 및 응답을 비동기적으로 처리하며, 블로킹 호출 없이 리액티브 스트림을 통해 데이터 흐름을 제어합니다.
* 높은 동시성을 지원하며, CPU와 I/O 리소스를 더 효율적으로 사용합니다.
3. 적합한 사용 사례:
* 대규모 데이터 스트리밍, 실시간 데이터 처리, 웹 애플리케이션에서 동시성 요구가 높은 상황에서 유리합니다.
4. Netty, Undertow 및 Servlet 3.1+ 기반:
* Netty와 Undertow 같은 비동기 I/O 기반의 서버를 지원하며, Servlet 3.1+의 비동기 기능을 활용할 수도 있습니다.
Spring WebFlux를 사용하는 것이 성능 측면에서 항상 좋은 것은 아니며, 그 선택은 특정 애플리케이션의 요구사항과 상황에 따라 달라집니다.
WebFlux는 비동기적 및 논블로킹 처리 방식으로 높은 동시성과 효율성을 제공하지만, 모든 상황에서 최적의 선택은 아닙니다.
WebFlux의 장점
1. 높은 동시성:
비동기적 I/O: WebFlux는 비동기적 I/O를 사용하여 많은 동시 요청을 효율적으로 처리할 수 있습니다. 이는 특히 I/O 바운드 작업이 많은 환경에서 효과적입니다.
적은 스레드 사용: 스레드를 효율적으로 사용하여 리소스 소비를 최소화하면서도 높은 동시성을 유지할 수 있습니다.
2.효율적인 리소스 사용:
블로킹 없음: 블로킹 작업이 없기 때문에 CPU와 메모리 사용이 최적화됩니다. 스레드가 I/O 작업을 기다리면서 유휴 상태가 되지 않으므로 리소스 효율성이 높습니다.
적은 컨텍스트 스위칭: 스레드 수가 적기 때문에 컨텍스트 스위칭 오버헤드가 줄어듭니다.
3.리액티브 프로그래밍:
리액티브 스트림: Mono와 Flux를 사용하여 복잡한 비동기 데이터 흐름을 명확하게 정의하고, 데이터 스트리밍이나 실시간 처리를 쉽게 구현할 수 있습니다.
백프레셔 관리: 데이터 생산 속도와 소비 속도의 차이를 관리하여 안정성을 높일 수 있습니다.
WebFlux의 단점
1. 복잡도 증가:
리액티브 프로그래밍의 학습 곡선: 리액티브 프로그래밍 모델과 비동기 데이터 흐름을 이해하고 효과적으로 사용하는 데는 학습이 필요합니다. 개발자들이 새로운 패러다임에 익숙해지기까지 시간이 걸릴 수 있습니다.
디버깅 및 모니터링 어려움: 비동기적으로 흐르는 데이터와 콜백을 따라가며 디버깅하는 것은 동기적 코드보다 복잡합니다. 성능 모니터링도 복잡할 수 있습니다.
2. 추가적인 오버헤드:
리액터 라이브러리 사용: 리액티브 스트림을 처리하기 위한 추가적인 오버헤드가 발생할 수 있습니다. 간단한 애플리케이션에서는 이 오버헤드가 성능상의 이점을 상쇄할 수 있습니다.
3. CPU 바운드 작업에 비효율적:
CPU 집중 작업에 부적합: WebFlux는 주로 I/O 바운드 작업에 최적화되어 있으며, CPU 집약적인 작업에서는 큰 이점을 제공하지 못할 수 있습니다. 이 경우 전통적인 동기적 접근이 더 적합할 수 있습니다.
4. 호환성 문제:
레거시 라이브러리와의 호환성: 기존의 동기적 라이브러리나 레거시 시스템과 통합하는 것이 어려울 수 있습니다. 모든 라이브러리가 비동기적 호출을 지원하는 것은 아닙니다.
언제 WebFlux가 좋은 선택인가?
1. 높은 동시 요청을 처리해야 하는 경우:
예: 실시간 메시징 시스템, 실시간 대시보드, 대규모 사용자 트래픽을 처리하는 웹 애플리케이션.
2. I/O 바운드 작업이 많은 경우:
예: 데이터베이스 호출, 외부 서비스 API 호출, 파일 시스템 접근 등.
3. 실시간 데이터 스트리밍:
예: 금융 거래 시스템의 실시간 데이터 스트리밍, 라이브 데이터 피드, 주식 시세 스트리밍.
4. 리소스가 제한된 환경:
예: 클라우드 기반의 서버리스 애플리케이션, 제한된 리소스를 사용하는 IoT 시스템.
언제 전통적인 동기적 모델이 더 나은 선택인가?
1. 간단한 애플리케이션:
예: CRUD 애플리케이션, 관리 시스템, 기본적인 웹 애플리케이션. 동시 요청 수가 많지 않고 복잡한 비동기 처리가 필요하지 않은 경우.
2. CPU 바운드 작업이 많은 경우:
예: 이미지 처리, 데이터 분석, 머신 러닝 작업 등 CPU 집약적인 작업.
- 웹 애플리케이션 백엔드 서버로 Spring boot 를 사용할 떈 이런 일 할 일이 많이 없지 않은가.
3. 기존 동기적 라이브러리와 통합:
예: 동기적 라이브러리나 레거시 시스템과 통합해야 하는 경우, 리액티브 모델로 변환하는 것이 비효율적일 수 있습니다.
요약
WebFlux의 비동기적, 논블로킹 처리 방식은 높은 동시성을 요구하는 I/O 바운드 애플리케이션에 적합합니다.
전통적인 동기적 처리 방식은 상대적으로 간단한 애플리케이션이나 CPU 집약적 작업에 적합하며, 기존의 동기적 라이브러리와 쉽게 통합할 수 있습니다.
선택의 기준은 애플리케이션의 성격, 요구되는 동시성, 리소스 사용 패턴, 그리고 개발 팀의 경험과 기술 수준에 따라 달라집니다.
'Spring' 카테고리의 다른 글
프록시 동등성 비교 - equals() 와 hashCode() 오버라이딩 (0) | 2024.04.28 |
---|---|
메서드 호출 결과를 캐시에 저장하는 @Cacheable 과 @CacheEvict (0) | 2024.03.28 |
Redis 를 사용하여 Refresh Token 구현하기 (0) | 2024.03.28 |
JPQL 로 ORDER BY RAND() LIMIT N 사용하기 (0) | 2024.03.12 |
쿼리를 5,000번 날리는 API가 있다?😬 쿼리 줄이기 8시간 삽질 후기 (0) | 2024.02.15 |