-
[스프링 인 액션] Chapter 10 - 리액터 개요 :: 리액터 시작하기개발서적읽기/Spring in Action 제 5판 2020. 10. 3. 22:20
리액티브 프로그래밍은 명령형 프로그래밍과 매우 다른 다른 방식으로 접근해야 한다. 즉,
일련의 작업 단계를 기술하는 것이 아니라 데이터가 전달될 파이프라인을 구성하는 것이다.
그리고 이 파이프라인을 통해 데이터가 전달되는 동안 어떤 형태로든 변경 또는 사용될 수 있다.
예를 들어, 사람의 이름을 가져와서 모두 대문자로 변경한 후 이것으로 인사말 메시지를 만들어
출력한다고 해보자. 아래는 명령형 프로그래밍 코드이다.
String name = "name";
String capitalName = name.toUpperCase();
String greeting = "Hello, " + capitalName + "!";
System.out.println(greeting);이 경우느 각 줄의 코드가 같은 스레드에서 한 단계씩 차례대로 실행된다. 그리고 각 단계가
완료될 때까지 다음 단계로 이동하지 못하게 실행 중인 스레드를 막는다.
이와는 다르게 리액티브 코드에서는 다음과 같이 할 수 있다.
Mono.just("name")
.map(n -> n.toUpperCase())
.map(cn -> "Hello, " + cn + "!")
.subscribe(System.out::println)이 예의 리액티브 코드가 단계별로 실행되는 것처럼 보이겠지만, 실제로는 데이터가 전달되는
파이프라인을 구성하는 것이다. 그리고 파이프라인의 각 단계에서는 어떻게 하든 데이터가
변경된다. 또한 각 오퍼레이션은 같은 스레드로 실행되거나 다른 스레드로 실행될 수 있다.
이 예의 Mono는 리액터의 두 가지 핵심 타입 중 하나이며, 다른 하나로는 Flux가 있다.
두 개 모두 리액티브 스트림의 Publisher 인터페이스를 구현한 것이다. Flux는 0, 1 또는 다수의
데이터를 갖는 파이프라인을 나타낸다. 반면에 Mono는 하나의 데이터 항목만 갖는 데이터셋에
최적화된 리액티브 타입이다.
리액터 vs RxJava(ReactvieX)
RxJava나 ReactiveX를 잘 알고 있다면 Mono, Flux가 Observable, Single과 매우 비슷하다고
생각할 것이다. 실제로 이것들은 개념적으로 거의 같으며 여러 동일한 오퍼레이션들을
제공한다. 이 책에서는 리액터에 초점을 두지만, 리액터와 RxJava 간의 타입 변환이
가능하다는 것을 알아 두면 좋을 것이다. 그리고 이후의 다른 장에서 알게 되겠지만
스프링은 RxJava 타입도 사용할 수 있다.
앞의 예에는 세 개의 Mono가 있으며 just() 오퍼레이션은 첫 번째 것을 생성한다. 그리고 첫 번째
Mono가 값을 방출하면 이 값이 첫 번째 map() 오퍼레이션에 전달되어 대문자로 변경되고 다른
Mono를 생성하는 데 사용된다. 이렇게 생성된 두 번째 Mono가 데이터를 방출하면 이 데이터가
두 번째 map() 오퍼레이션에 전달되어 문자열 결합이 수행되며, 이 결과는 세 번째 Mono를
생성하는 데 사용된다. 그리고 끝으로 subscribe() 호출에서는 세 번째 Mono를 구독하여
데이터를 수신하고 출력한다.
■리액티브 플로우의 다이어그램
리액티브 플로우는 마블 다이어그램으로 나타내곤 한다.
(그림에는 Flux만 나와있다. Mono는 1만 존재하는 상황이라고 생각하면 된다.)
마블 다이어그램의 제일 위에는 Flux나 Mono를 통해 전달되는 데이터의 타임라인을
나타낸다. 중앙에너느 오퍼레이션을, 제일 밑에는 결과로 생성되는 Flux나 Mono의
타임라인을 나타낸다. 이 그림을 보면 알 수 있듯이, 원래의 Flux를 통해 데이터가 지나가는
동안 오퍼레이션을 통해 처리되어 새로운 Flux가 생성된다.
■리액터 의존성 추가하기
리액터를 시작하기 위해 다음 의존성을 프로젝트 빌드에 추가하자.
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
</dependency>또한 리액터 코드의 테스트를 위해 다음 의존성도 빌드에 추가하자.
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>스프링 부트는 의존성 관리를 자동으로 해주므로 해당 의존성에 <version> 요소를 지정할
필요가 없다. 그러나 스프링 부트가 아닌 프로젝트에 리액터를 사용하는 경우에는 리액터의
명세를 빌드에 설정해야 한다.
'개발서적읽기 > Spring in Action 제 5판' 카테고리의 다른 글
[스프링 인 액션] Chapter 12 - 리액티브 데이터 퍼시스턴스 :: 스프링 데이터의 리액티브 개념 이해하기 (0) 2020.10.09 [스프링 인 액션] Chapter 10 - 리액터 개요 :: 리액티브 오퍼레이션 적용하기 (0) 2020.10.04 [스프링 인 액션] Chapter 10 - 리액터 개요 :: 리액티브 프로그래밍 이해하기 (0) 2020.09.27 [스프링 인 액션] Chapter 9 - 스프링 통합하기 :: 스프링 통합의 컴포넌트 살펴보기 (0) 2020.09.27 [스프링 인 액션] Chapter 9 - 스프링 통합하기 :: 간단한 통합 플로우 선언하기 (0) 2020.09.26 댓글