1. 리액티브 시스템과 리액티브 프로그래밍
1.1 리액티브 시스템이란?
리액티브: 클라이언트의 요청에 즉각적으로 응답함으로써 지연 시간 최소화
1.2 리액티브 선언문으로 리액티브 시스템 이해하기
리액티브 선언문은 일종의 설계 원칙이자 리액티브 시스템의 특징이니 한 번 훑어보자..
- MEANS: 주요 통신 수단, 메시지 기반 통신을 통해 느슨한 결합, 격리성, 위치 투명성 보장
- FORM: 메시지 기반 통신을 시스템이 형성되는 형태
- 위 그림에서는 탄력성(= 작업량 변화해도 일정 응답 유지), 회복성(= 장애가 발생해도 응답 유지)
- VALUE: 위 두가지를 통해 즉각적으로 응답 가능한 시스템을 구축할 수 있음을 의미
=> 빠른 응답성을 바탕으로 유지보수와 확장이 용이한 시스템 구축하는 데 활용
1.3 리액티브 프로그래밍이란?
리액티브 프로그래밍: 리액티브 시스템을 구축하는 데 필요한 프로그래밍 모델, Non Blocking I/O 방식의 통신
- Blocking I/O: 해당 스레드가 작업을 처리할 때까지 남아 있는 작업들은 해당 작업이 끝날 때까지 차단되어 대기
- Non Blocking I/O: 스레드가 차단되지 않는 것
1.4 리액티브 프로그래밍 특징
- 선언형 프로그래밍
- 명령형 프로그래밍: 실행할 동작을 구체적으로 명시하는 프로그래밍 코드형태
- 선언형 프로그래밍: 어떠한 동작을 하겠다는 목표 선언
- data streams and the propagation of change
- 데이터가 지속적으로 발생하며, 이 데이터 발생을 변화하는 이벤트로 보고 이 이벤트를 발생시키면서 데이터를 계속 전달하는 것
1.5 코드로 보는 명령형 프로그래밍 vs 선언형 프로그래밍
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);
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);
선언형 프로그래밍 특징은 다음과 같다.
- 동작을 구체적으로 명시하지 않고 목표만 선언한다.
- for문을 직접 사용하기 보단 스트림이 내부에서 해주거나 if 대신 sum, filter 메서드를 사용하고 있다.
- 여러 가지 동작을 각각 별도의 코드로 분리하지않고 메서드 체인을 형성해 한 문장으로 나타낸다.
- 함수형 프로그래밍으로 구성된다.
1.6 리액티브 프로그래밍 코드 구성
- Publisher: 입력으로 들어오는 데이터를 제공하는 역할
- Subscriber: Publisher가 제공한 데이터를 전달받아 사용
- Data Source: Publisher의 입력으로 들어오는 데이터
- Operator: Publisher, Subscriber 사이에서 적절한 가공 처리
리액티브 프로그래밍은 operator로 시작해 operator로 끝난다고 해도 과언이 아니라고 한다!
Ref.
LGTM