선언형 프로그래밍(Declarative Programming)

선언은 사전적 의미로는 ‘널리 펴서 말함, 또는 그런 내용’이다. 그렇다면 선언형 프로그래밍은 무엇일까? 선언형 프로그래밍이란 원하는 결과를 위해서 무엇을(What) 할 것인지를 묘사하는 방식으로 코드를 작성하는 프로그래밍 패러다임이다.

명령형 프로그래밍 방식에서는 원하는 결과를 위해서 어떻게(How) 할 것인지를 지시하는 방식으로 코드를 작성했다. 이렇게 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);
	}
}

리액티브 시스템의 설계

리액티브 스트림즈(Reactive Streams)

리액티브 라이브러리를 어떻게 구현할지 정의해 놓은 별도의 표준 사양을 말한다.

데이터 스트림(Stream)을 Non-Blocking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양이라고 표현할 수 있다.

Pub/Sub 구조를 가진다. Kafka의 Pub/Sub 구조와는 다르다. Kafka의 경우, Pub이 특정한 Topic으로 Message를 브로커(Broker)에 발행한다. 발행된 메세지를 Sub가 Pulling하는 방식으로 소비한다.

하지만, 리액티브는 Pub이 발행한 데이터를 Sub에게 데이터를 직접 Push 하는 방식이다. 이것을 리액티브에서는 Emit이라고 표현한다. 그래서 우리는 Pub이 발행한 데이터를 Sub의 onNext 메서드를 이용해서 데이터를 처리하는 것을 줄여서 “데이터를 emit한다”라고 표현한다.

리액티브 스트림즈 프로세스

Project Reactor Streams - Subscribe UML                                                                                @ copyright: AJ’s F

Project Reactor Streams - Subscribe UML @ copyright: AJ’s F

데이터를 생성해서 제공하고(1단계) - Publisher