일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- boj
- 프로그래머스
- greedy
- 네트워크
- DynamicProgramming
- DP
- 이분탐색
- 깊이우선탐색
- dynamic programming
- Spring
- ReactiveProgramming
- 그리디
- BFS
- 구현
- 너비우선탐색
- Backtracking
- 부분수열의합
- 스프링
- 해시
- Network
- HashMap
- 동적계획법
- 브루트포스
- 알고리즘
- DFS
- 해시맵
- Algorithm
- 백준
- programmers
- 백트래킹
- Today
- Total
옌의 로그
[Reactive Programming] 리액티브 프로그래밍 & 리액티브 스트림즈 본문
본 포스팅은 스프링으로 시작하는 리액티브 프로그래밍
책을 참고하여 작성하였습니다. ( _ _)
리액티브 프로그래밍(Reactive Programming) 이란?
리액티브 프로그래밍은 리액티브 시스템을 구축하는 데 필요한 프로그래밍 모델이다.
그렇다면 리액티브 시스템이란 무엇일까?
reactive라는 단어의 사전적 의미가 '반응을 하는' 인 만큼, 리액티브 시스템이란 반응을 잘하는 시스템을 의미한다. 즉, 클라이언트의 요청에 머뭇거리지 않고 반응을 잘해서 즉시 응답해 주는 것을 의미한다.
리액티브 시스템의 설계
- 비동기 메세지 기반 통신으로 동작해야 한다
- 탄력적이고 회복성을 지녀야 한다
- 높은 응답성을 지녀야 한다
- 유지보수와 확장이 용이해야 한다
리액티브 시스템에서 탄력성(Elastic)이란 시스템의 작업량이 변화하더라도 일정한 응답을 유지하는 것을 의미한다. 즉, 시스템으로 유입되는 입력이 많든 적든 간에 시스템에서 요구하는 응답성을 일정하게 유지하는 것!
리액티브 시스템에서 회복성(Resilient)이란 시스템에 장애가 발생하더라도 응답성을 유지하는 것을 의마한다. 회복성이 없다면 장애 발생 시 시스템이 응답하지 못하는 심각한 문제에 직면하기 때문에.. 이를 방지하기 위해 회복성은 리액티브 시스템의 중요한 설계 원칙이다.
리액티브 프로그래밍의 특징
- 리액티브 프로그래밍은 선언형 프로그래밍 방식이다
> 그렇기 때문에 실행할 동작을 구체적으로 명시하지 않고 목표만 선언한다 - 데이터 소스의 변경이 있을 때마다 데이터를 전파한다
- 리액티브 프로그래밍 코드는 코드의 간결함과 가독성에 유리한 메서드 체인의 형태로 표현된다
- 리액티브 프로그래밍 코드에서 파라미터를 가지는 메서드는 함수형 프로그래밍 방식의 코드 형태의 파라미터를 가진다
명령형 프로그래밍 vs. 선언형 프로그래밍
명령형 프로그래밍 방식은 어떤 작업을 처리하기 위해 실행할 동작을 코드에 구체적으로 명시하는 방식이고,
선언형 프로그래밍 방식은 실행할 동작을 구체적으로 명시하지 않고 목표만 선언하는 방식이다.
(명령형 프로그래밍)
package com.itvillage;
import java.util.Arrays;
import java.util.List;
public class Example1_1 {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 3, 21, 10, 8, 11);
int sum = 0;
for(int number : numbers){
if(number > 6 && (number % 2 != 0)){
sum += number;
}
}
System.out.println("합계: " + sum);
}
}
(선언형 프로그래밍)
package com.itvillage;
import java.util.Arrays;
import java.util.List;
public class Example1_2 {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 3, 21, 10, 8, 11);
int sum = numbers.stream()
.filter(number -> number > 6 && (number % 2 != 0))
.mapToInt(number -> number)
.sum();
System.out.println("합계: " + sum);
}
}
리액티브 프로그래밍 코드의 구성요소
- Publisher
: 입력으로 들어오는 데이터를 Subscriber에 제공하는 역할 - Subscriber
: Publisher로부터 전달받은 데이터를 사용하는 역할을 한다 - Data Source
: Publisher의 입력으로 전달되는 데이터 - Operator
: Publisher와 Subscriber 중간에서 데이터를 가공하는 역할
리액티브 스트림즈(Reactive Streams)란?
개발자가 리액티브한 코드를 작성하기 위해서는 이러한 코드 구성을 용이하게 해 주는 리액티브 라이브러리가 있어야 한다.
이 리액티브 라이브러리를 어떻게 구현할지 정의해 놓은 별도의 표준 사양이 있는데, 이것을 바로 리액티브 스트림즈라 부른다.
즉, 데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양을 말한다.
리액티브 스트림즈 컴포넌트
컴포넌트 | 설명 |
Publisher | 데이터를 생성하고 통지(발생, 게시, 방출) onSubscribe, onNext, onError, onComplete 이벤트를 방출 |
Subscriber | 구독한 Publisher로부터 통지된 데이터를 전달받아 처리 Publisher로부터 Subscription을 받아 request(n) 으로 데이터 양을 제어 |
Subscription | Publisher에 요청할 데이터 개수를 지정하고, 데이터의 구독을 취소하는 역할
|
Processor | Publisher와 Subscriber의 기능을 모두 가지고 있다. → 중간에서 데이터를 가공·변환·필터링하는 역할. (ex. map, filter) |
(동작 흐름)
- Subscriber가 Publisher에 구독 요청(subscribe)을 한다.
- Publisher는 Subscription을 생성하여 Subscriber에게 전달한다.
- Subscriber는 Subscription을 통해 데이터 요청(request(n))을 한다.
- Publisher는 요청된 개수만큼 데이터를 방출하고, 완료되면 onComplete, 오류 시 onError 신호를 보낸다.
import org.reactivestreams.*;
import reactor.core.publisher.Flux;
public class ReactiveStreamsExample {
public static void main(String[] args) {
Flux<Integer> flux = Flux.range(1, 10);
flux.subscribe(
data -> System.out.println("onNext: " + data), // 데이터 소비
error -> System.err.println("onError: " + error),
() -> System.out.println("onComplete") // 완료 시그널
);
}
}
- Publisher 👉 Flux.range(1, 10)
- 데이터를 발행(emit) 하는 쪽. 여기서는 1부터 10까지의 정수를 순서대로 방출하는 Publisher.
- Subscriber 👉 flux.subscribe(...) 안에서 정의된 람다(콜백들)
- 발행된 데이터를 받아서 System.out.println()으로 출력하는 소비자 역할.
- onNext, onError, onComplete 각각 Subscriber의 이벤트 핸들러에 해당
- Subscription 👉 내부적으로 subscribe() 호출 시 생성됨
- Publisher ↔ Subscriber 사이의 연결고리. 위 코드에서는 개발자가 직접 건드리진 않았지만, Reactor가 자동으로 만들어 관리
++리액티브 스트림즈 명세는 인터페이스와 규약만 정의. 실제 동작은 구현체가 맡는다.
- Project Reactor (Spring WebFlux에서 사용)
- RxJava
- Akka Streams
- Vert.x
- JDK 9+ 의 Flow API (리액티브 스트림즈와 호환)
'스터디 > 기타' 카테고리의 다른 글
단축 URL 생성기 (민감정보 노출 방지를 곁들인,,) (1) | 2025.09.27 |
---|---|
[Reactive Programming] Blocking I/O와 Non-Blockin I/O (1) | 2025.09.25 |
ENUM과 DB 매핑 전략 (feat. Enum Converter,, 코드 테이블,,) (1) | 2025.08.28 |
(충격) 지금까지 배치 서버를 써본 줄 알았는데… 아니었음 (3) | 2025.08.26 |
DDD와 Hexagonal Architecture, 상품관리 시스템에 적용해보기 (4) | 2025.08.08 |