티스토리 뷰
목차
리액티브 프로그래밍(Reactive Programming)이란
논 블로킹, 비동기 데이터 흐름 및 새로운 정보의 가용성에 기반을 둔 선언형 개발 패러다임이다.
또는 리액티브 시스템을 구현하는 방법이자 하위 개념이라고 볼 수도 있다.
정의에 사용된 단어에 대한 뜻은 잠시 후에 알아보기로 하고,
우선 리액티브 시스템이 무엇인지 정리하고 가자.
Reactive System
리액티브 시스템이란 '반응이 좋은, 민감한' 시스템이란 뜻이다.
이렇게 말해선 잘 와닿지 않을 수도 있으니, 조금 더 직관적으로 말하자면
리액티브란 한 마디로 입력이 발생했을 때 최대한 빠른 시간에 응답하도록 하는 설계 원칙이라고 할 수 있다.
이는 웹 앱에서 굉장히 중요한 원칙인데, 고객들이 대체로 느린 반응속도를 기다려주지 않기 때문이다.
즉 리액티브 시스템이란 바로 빠른 반응속도를 갖는 시스템을 말한다고 보면 된다.
여기서 빠른 반응속도란 앱 내의 개별 컴포넌트의 반응속도뿐 아니라 그 사이의 상호작용 및
확장, 축소, 균형 조정 등의 속도를 포함한다.
이런 핵심 가치를 잘 나타내고 있는 것이 2014년 발표된 리액티브 선언문(Reactive Manifesto)인데,
요약하면 아래와 같다.
VALUE | Responsive | 요청에 대한 즉각적이고 예상 가능한 반응속도 제공 |
Maintainable | 요청에 대해 지속 가능한 응답 제공 | |
Extensible | 요청에 대한 처리량 자동 확장 및 축소 가능 | |
FORM | Elastic | 서버 부하에 따른 탄력적 자원 할당 및 그에 따른 일정한 응답 |
Resillient | 장애 발생에 대한 회복성 및 시스템의 반응 지속. 컴포넌트의 분리 및 비동기 위임 처리 | |
MEANS | Message Driven | FORM 지원을 위한 느슨한 결합과 고립, 비동기적 메시지로 컴포넌트 통신 |
Reactive Programming
계속해서 리액티브 프로그래밍이라는 설계 원칙을 구현하는 리액티브 프로그래밍에 대해 알아보자.
앞서 언급했듯이 리액티브 프로그래밍이란
논 블로킹, 비동기 데이터 흐름 및 새로운 정보의 가용성에 기반을 둔 선언형 개발 패러다임이다.
각각의 개념은 리액티브 시스템이라는 원칙을 떠받치고 있는데, 간략하게 알아보자.
Non-Blocking
블로킹과 논 블로킹은 간단하게 말하면 호출된 함수가 제어권을 바로 리턴하느냐 아니냐의 차이다.
조금 더 구체적으로 표현하면 아래와 같다.
Blocking | 호출된 함수 B가 작업이 끝날 때까지 제어권을 넘겨주지 않아 A는 대기상태(다른 작업 불가, Blocked) |
Non-Blocking | 호출된 함수 B가 거의 즉시 제어권을 넘겨줘 A는 다른 작업 가능(Non-Blocked) |
사용자의 관점에서 보면 하나의 작업이 진행되는 동안 앱이 멈춘 것처럼 느껴지는 것이 블로킹의 단점이라 할 수 있다.
반면 논 블로킹의 경우 멈추지 않고 계속해서 다른 작업을 진행할 수 있으며,
문제를 여러 개의 단계로 나누어 실행함으로써 멀티코어 CPU의 능력을 극대화할 수 있다.
Asynchronous
동기와 비동기는 호출된 함수의 결과를 어느 쪽에서 처리하느냐에 차이가 있다.
더 직관적으로는 사용자의 요청 순서가 지켜지느냐(Sync) 지켜지지 않느냐(Async) 하는 차이라고 보면 된다.
호출된 함수의 결과는 당연히 호출된 쪽에서 신경 써야 할 것 같지만, 좀 더 알아보면 아래와 같다.
Synchronous | 호출된 함수 B의 결과를 A가 처리하는 것. 리턴을 기다리거나 작업 완료 여부를 A가 처리 여러 작업 실행시 작업의 완료 순서를 A가 알 수 있다. |
Asynchronous | 호출시 Callback을 전달해 B의 작업 완료시 Callback을 실행하는 구조. A는 작업 완료 여부를 신경쓰지 않는다. 여러 작업 실행시 작업의 완료 순서를 A가 알 수 없다. |
동기와 블로킹이 비슷해 보일 수 있는데, 호출된 함수의 반환을 기다린다는 점에선 같지만
- Synchronous - 반환을 기다리며 대기열에 머무는 것이 필수가 아님
- Blocking - 반환을 기다리며 대기열에 머무는 것이 필수
라는 차이점이 존재한다.
추가로 리액티브 프로그래밍은 비동기 논 블로킹 방식으로 진행되기 때문에
위 그림에서 두 가지를 합친 식으로 흘러가게 된다.
Propagation of Change(-d Data)
새로운 정보에 대한 가용성이라 함은 데이터의 추가, 변경을 이벤트로 간주하는 것을 가리킨다.
지속적인 이벤트의 발생을 데이터 플로우로 인식해 자동으로 전달 및 업데이트 하는 것을 뜻하기도 한다.
Declarative Programming Paradigm
프로그래밍 패러다임이란 쉽게 말하면 프로그램을 무엇으로 볼 것인가, 즉 관점에 대한 답이다.
예를 들어 '프로그램은 상호작용하는 객체의 집합이다.'라는 관점은 객체지향 프로그래밍의 패러다임이며
'프로그램은 연속된 함수의 집합이다.'라는 관점은 함수형 프로그래밍의 패러다임이라 할 수 있다.
계속해서 여기서 '선언형 프로그래밍'이란 '명령형 프로그래밍'과 대비되는 개념이며
목표를 선언하고 알고리즘을 감추는, 함수형 프로그래밍과 논리형 프로그래밍 등을 가리키는 용어이다.
자바에서 함수형 프로그래밍 기법은 람다식과 스트림으로 지원하는데,
사용법과 설명은 다른 글에 해 두었다.
2022.07.20 - [Development/Java] - [Java]스트림(Stream)
2022.07.20 - [Development/Java] - [Java]스트림 생성, 중간 연산, 최종 연산
'Java+Spring > WebFlux' 카테고리의 다른 글
[WebFlux]리액티브 스트림(Reactive Streams) (2) | 2023.03.25 |
---|---|
[WebFlux]이벤트 루프, Netty, 그리고 (2) | 2023.03.25 |
[WebFlux]Reactive Manifesto (1) | 2023.03.20 |
[Spring]프로젝트 리액터(Project Reactor) 튜토리얼 (3) | 2022.10.14 |
[Spring]리액티브 프로그래밍 시작하기, 용어 정리 (2) | 2022.10.13 |
[Spring]리액티브 스트림즈(Reactive Streams) (2) | 2022.10.12 |
- Total
- Today
- Yesterday
- 동적계획법
- 스트림
- 백준
- 세계여행
- Python
- 야경
- 맛집
- 알고리즘
- 유럽여행
- 기술면접
- 유럽
- 세모
- BOJ
- 여행
- 지지
- RX100M5
- a6000
- 면접 준비
- 스프링
- 중남미
- 파이썬
- java
- 자바
- 세계일주
- 리스트
- 칼이사
- spring
- 남미
- Backjoon
- Algorithm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |