TIL(사전캠프)

리액티브 시스템 (2024-06-24)

note994 2024. 6. 24. 18:46

1. 리액티브 시스템이란?

1. 리액티브 시스템은 반응을 잘하는 시스템이다.

 

2. 리액티브 시스템에서 반응을 잘한다는 것은 클라이언트의 요청에 즉각적으로 응답함으로써 지연 시간을 최소화한다는 것이다.


2. 리액티브 선언문으로 리액티브 시스템 이해하기

1. 리액티브 선언문은 리액티브 시스템 구축을 위한 일종의 설계 원칙이자 리액티브 시스템의 특징이다.

 

MEANS : 리액티브 시스템에서 주요 통신 수단으로 무엇을 사용할 것인지 표현한 것이다. 그림에 나와 있는 비동이 메시지 기반의 통신을 통해 구성요소들 간의 느슨한 결합, 격리성, 위치 투명성을 보장한다.

 

FROM : 메시지 기반 통신을 통해서 어떠한 형태를 지니는 시스템으로 형성되는지를 나타낸다. 그림에서는 리액티브 시스템이 비동기 메시지 통신기반하에 탄력성과 회복성을 가지는 시스템이어야 함을 보여주고 있다.

 

탄력성 : 리액티브 시스템에서 탄력성이란 시스템의 작업량이 변화하더라도 일정한 응답을 유지하는 것을 말한다. 즉, 시스템으로 유입되는 입력이 많든 적든 시스템에서 요구하는 응답성을 일정하게 유지하는 것을 말한다.

 

회복성 :  시스템에 장애가 발생하더라도 응답성을 유지하는 것을 말한다. 회복성이 없다면 장애 발생 시 시스템이 응답하지 못하는 심각한 문제에 직면하기 때문에 회복성은 리액티브 시스템의 중요한 설계 원칙이라고 볼 수 있다. 이러한 회복성을 위해서 리액티브 시스템의 구성요소들은 비동기 메시지 기반 통신을 통해 느슨한 결합과 격리성을 보장한다. 시스템의 구성요소들이 독립적으로 분리되기 때문에 장애가 발생하더라도 전체 시스템은 여전히 응답 가능하고 장애가 발생한 부분만 복구하면 된다는 의미이다.

 

VALUE : 비동기 메시지 기반 통신을 바탕으로 한 회복성과 예측 가능한 규모 확장 알고리즘을 통해 시스템의 처리량을 자동으로 확장하고 축소하는 탄력성을 확보함으로써 즉각적으로 응답 가능한 시스템을 구축할 수 있음을 의미한다. VALUE는 리액티브 시스템의 핵심 가치를 보여 준다고 볼 수 있다.


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

1. declarative programming

declarative programming은 선언형 프로그래밍이라는 의미이다. 우리가 흔히 사용하는 프로그래밍 방식은 명령형 프로그래밍 방식이다. 명령형 프로그래밍 방식이란 실행할 동작을 구체적으로 명시하는 프로그래밍 코드 형태라고 볼 수 있다.

 

반면에 선언형 프로그래밍 박식은 명령형 프로그래밍 방식과 달리 실행할 동작을 구체적으로 명시하지 않고 이러이러한 동작을 하겠다는 목표만 선언한다. 

 

2. data streams

데이터 흐름, 즉 데이터가 지속적으로 발생한다는 의미이다.

 

3. the propagation of change

지속적으로 데이터가 발생할 때마다 이것을 변화하는 이벤트로 보고, 이 이벤트를 발생시키면서 데이터를 계속적으로 전달하는 것을 의미한다.


4. 코드로 보는 명령형 프로그래밍 vs 선언형 프로그래밍

명령형 프로그램 방식은 어떤 작업을 처리하기 위해 실행할 동작을 코드에 구체적으로 명시하는 방식이고, 선언형 프로그래밍 방식은 실행할 동작을 구체적으로 명식하지 않고 목표만 선언하는 방식이다.

 

두 가지 간단한 예제 코드를 비교해보자 

코드1-1 명령형 프로그래밍

명령형 프로그래밍 방식은 어떤 작업을 처리하기 위해 실행할 동작을 코드에 구체적으로 명시한다. 이 코드에서 처리해야 할 작업은 numbers라는 List에 포함된 숫자들 중에서 6보다 더 크고 홀수인 숫자들의 합계를 구하는 것이다. 이를 처리하기 위해 여러 개의 동작을 코드에 명시한다.

 

1. 먼저 for문을 돌아서 numbers의 각각의 숫자들에 접근하는 동작을 한다. (5번 라인)

2. if문을 사용해서 6보다 큰 숫자이면서 나머지가 0이 아닌, 즉 홀수인 숫자만 선택하기 위한 동작을 한다 (6번 라인)

3. 마지막으로 이렇게 조건문으로 선택된 숫자들을 sum이라는 변수에 차례차례 더하는 동작을 한다 (7번 라인)

 

 

 

코드1-2 선언형 프로그래밍

이 코드는 리액티브 프로그래밍은 아니지만 선언형 프로그래밍 방식의 예시이다. 

 

가장 먼저 눈에 띄는것은 numbers List의 각 숫자에 접근하는 for문이 사라진 것이다. for문에서 하는 구체적인 동작을 Java의 스트림이 내부에서 직접 해주기 때문에 사라졌다.

 

마치 'for문을 돌면서 numbers List에 포함된 숫자들에 하나씩 접근하겠다' 라고 내가 할 동작을 직접 설명하기 보다는 'numbers List에 포함된 숫자들에 접근을 좀 해줘' 라고 내가 아닌 다른 누군가에게 부탁하는 것과 비슷하다.

 

코드 1-1에서는 if문을 사용한 반면, 코드 1-2에서는 if문 대신 filter 메서드를 사용해서 조건에 맞는 데이터를 필터링하며(5번라인), sum 메서드를 사용하여 filter 메서드에서 필터링된 숫자들의 합계를 구한다(7번라인)

 

코드 1-1에서는 조건에 맞는 숫자들을 sum변수에  하나씩 더하는 동작을 직접 했지만, 코드 1-2에서는 sum이라는 메서드를 선언만 했지 구체적인 숫자를 더하는 동작은 스트림 내부에서 대신 처리해 주는 모습을 볼 수 있다.

 

정리하자면 선언형 프로그래밍 방식의 특징은 다음과 같다.

 

1. 선언형 프로그래밍 방식에서는 동작을 구체적으로 명시하지 않고 목표만 선언한다.

 

2. 선언형 프로그래밍에서는 여러 가지 동작을 별도의 코드로 분리하지 않고 각 동작에 대해서 메서드 체인을 형성해서 한 문장으로 된 코드로 구성한다. 코드 1-2에서 ' . '을 기준으로 stream(), filter(), mapToInt(), sum()이 하나의 체인처럼 연결된 것을 볼 수 있다. 이렇게 연결하면 입력 데이터를 어떤 식으로 처리할지 한눈에 알아볼 수 있기 때문에 코드가 간결해지고 가독성도 좋아진다.

 

3. 선언형 프로그래밍 방식은 함수형 프로그래밍으로 구성된다. 선언형 프로그래밍 방식으로 짜인 코드의 메서드 파라미터들이 바로 함수형 프로그래밍 방식으로 구성되었다. 코드 1-2의 5번 라인의 filter(number -> number > 6 && (number % 2 != 0))에서 filter 메서드의 파라미터가 바로 함수형 프로그래밍 방식의 코드라고 보면 된다.