Reactor

jjunhwan.kim·2023년 12월 15일
0

스프링

목록 보기
8/10
post-thumbnail

개요

  • Reactor 프로젝트에 대해 알아봅니다.

Reactor란?

  • Reactor는 스프링 프레임워크 팀의 주도하에 개발된 리액티브 스트림즈의 구현체입니다.
  • 리액티브 스트림즈는 '데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양' 입니다.
  • Reactor는 스프링 WebFlux 기반의 리액티브 애플리케이션을 만들기 위한 핵심 역할을 담당합니다.

Reactor의 특징

Reactor 공식 사이트인 https://projectreactor.io 에 있는 Reactor의 여러 특징을 보면 아래와 같이 요약할 수 있습니다.

  • Reactive streams: Reactor는 리액티브 스트림즈라는 표준 사양을 구현한 리액티브 라이브러리입니다.
  • Non-Blcking: Reactor는 JVM 위에서 동작하는 Non-Blocking 애플리케이션을 제작하기 위한 라이브러리입니다.
  • Java's functional API: Reactor에서 Publisher와 Subscriber간의 상호작용은 Java 함수형 프로그래밍 API를 통해서 이루어집니다.
  • Flux[N]: Reactor의 Publisher 타입은 Flux와 Mono 두 가지 입니다. Flux[N]은 N개의 데이터를 emit 한다는 의미입니다. 0부터 N개의 데이터를 emit 할 수 있습니다.
  • Mono[0|1]: Mono는 데이터를 한 건도 emit하지 않거나 단 한 건만 emit합니다.
  • Well-suited for microservies: 마이크로서비스 기반 시스템은 서비스들 간에 많은 수의 I/O가 지속적으로 발생합니다. 서비스들 간의 통신에서 Blocking으로 응답 지연이 발생하게 된다면 다른 서비스들에도 영향을 미칠 가능성이 높습니다. 따라서 Non-Blocking I/O로 동작하는 Reactor는 마이크로서비스에 적합합니다.
  • Backpressure-ready network: Backpressure는 배압이라고 하는데 배관으로 유입되는 가스나 액체 등의 흐름을 제어하기 위해 역으로 가해지는 압력을 의미합니다. 리액티브 프로그래밍에서 Backpressure도 비슷한 의미입니다. 즉 Publisher로 부터 전달되는 대량의 데이터를 Subscriber가 처리하는데 과부하기 걸리지 않도록 제어하는 것을 말합니다. Reactor는 Backpressure를 위한 다양한 전략을 제공합니다.

Hello Reactor 프로젝트

Hello Reactor 프로젝트를 만들어보겠습니다. 먼저 https://start.spring.io 에서 Spring Reactive Web, Lombok 의존성을 추가하여 애플리케이션을 생성합니다. Spring Reactive Web을 추가하면 build.gradle 파일에 org.springframework.boot:spring-boot-starter-webflux 의존성이 추가됩니다. WebFlux를 통해 Reactor를 직접 추가하지 않고 사용할 수 있습니다.

아래는 Hello Reactor 테스트 코드입니다. 테스트 코드를 통해 Reacotr의 핵심 요소를 살펴보겠습니다.

  • Flux: Flux는 Reactor에서 Publisher 역할을 합니다. Publisher는 데이터를 제공하는 역할을 합니다. Flux의 just 메서드의 파라미터로 들어온 "Hello", "Reactor"는 데이터 소스가 됩니다.
  • Flux와 Mono: 데이터 소스의 데이터 개수가 0개 또는 1개 일 경우 Mono를 사용하고 0 ~ N개 일 경우 Flux를 사용합니다.
  • Subscriber: subscribe 메서드의 파라미터로 전달된 람다 표현식인 data -> System.out.println(data) 는 Subscriber 역할을 합니다. subscribe 메서드는 함수형 인터페이스인 Consumer 인터페이스 타입의 파라미터를 받습니다.
  • just, map 메서드는 Reactor에서 제공하는 Operator 메서드입니다. just Operator는 데이터를 생성해서 제공하는 역할을 합니다. map Operator는 데이터를 가공하는 역할을 합니다. 위의 코드에서는 입력 문자열을 소문자로 변경하는 람다 표현식을 map Operator의 파라미터로 전달하였습니다.
  • Reactor의 각 Operator는 리턴 값으로 Flux 또는 Mono를 리턴하므로 Operator를 연속적으로 호출하여 작성할 수 있습니다.

0개의 댓글