리액티브 프로그래밍-정리중

Published: by Creative Commons Licence

리액티브 프로그래밍에 대해서 학습중이다.

1. 리액티브 프로그래밍(Reactive Programming)이란?

리액티브 프로그래밍은 리액티브 시스템을 구축하는 데 필요한 프로그래밍 모델입니다. '리액티브 시스템은 비동기 메시지 통신을 기반으로 한다'고 설명한 것 처럼, 리액티브 시스템에서의 비동기 메시지 통신은 Blocking I/O 방식이 아닌 Non-Blocking I/O 방식의 통신입니다. Blocking I/O 방식의 통신에서는 해당 스레드가 작업을 처리할 때까지 남아 있는 작업들은 해당 작업이 끝날 때까지 차단되어 대기합니다. 그렇기 때문에 뒤에 남아 있는 작업들을 대기 없이 처리하려면 별도의 추가 스레드를 할당해야 해서 그만큼의 비용이 더 들게 됩니다. Non Blocking I/O 방식의 통신에서는 말 그대로 스레드가 차단되지 않습니다.

2. 리액티브 프로그래밍의 특징

아래는 위키피디아에 나와 있는 리액티브 프로그래밍에 대한 내용입니다.

In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change.

2-1. declarative programming

declarative programming은 선언형 프로그래밍이라는 것입니다. 명령형 프로그래밍 방식은 실행할 동작을 구체적으로 명시하는 프로그래밍 코드 형태라고 볼 수 있습니다. 선언형 프로그래밍 방식은 명령형 프로그래밍 방식과 달리 실행할 동작을 구체적으로 명시하지 않고 이러이러한 동작을 하겠다는 목표만 선언합니다.

아래 두 방식으로 짠 예제 코드를 간단히 살펴보겠습니다.

2-1-1. 명령형 프로그래밍

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);
    }
}

2-1-2. 선언형 프로그래밍

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);
    }
}

2-2. data streams 와 the propagation of change

data streams 라는 것은 데이터 흐름, 즉 데이터가 지속적으로 발생한다는 의미이고, the propagation of change는 지속적으로 데이터가 발생할 때마다 이것을 변화하는 이벤트로 보고, 이 이벤트를 발생시키면서 데이터를 계속적으로 전달하는 것을 의미합니다.

3. 리액티브 프로그래밍 코드 구성

우리가 실제로 작성하는 리액티브 프로그래밍 코드는 크게 Publisher, Subscriber, Data Source, Operator 등으로 구성됩니다.

  • Publisher
    Publisher는 발행인, 발행자 정도로 해석될 수 있습니다. 입력으로 들어오는 데이터를 제공하는 역할을 합니다.
  • Subscriber
    Publisher가 데이터를 제공하는 역할을 한다면, Subscriber는 Publisher가 제공한 데이터를 전달받아서 사용하는 주체라고 할 수 있습니다.
  • Data Source(Data Stream) Data Source는 Publisher의 입력으로 들어오는 데이터를 대표하는 용어인데, 이 Data Source를 리액티브 프로그래밍에서는 Data Stream이라고 표현합니다.
  • Operator
    Publisher로 부터 전달된 데이터가 순수하게 아무런 처리를 거치지 않고 Subscriber에 전달되는 경우는 거의 없습니다. 애플리케이션의 요구사항에 맞게 Publisher와 Subscriber 사이에서 적절한 가공 처리가 이루어지는데, 이 가공 처리를 담당하는 것이 Operator입니다.