✅ Reactive Programming은 왜 선언적 프로그래밍인가?
리액티브 프로그래밍은 데이터 스트림과 변경 사항 전파를 중심으로하는 비동기 프로그래밍이다. 정적 또는 동적인 데이터 흐름을 쉽게 표현할 수 있어야 하며, 데이터 흐름을 통해 하부 실행 모델이 자동으로 변화를 전파할 수 있는 것을 의미하고 있다.
리액티브 프로그래밍은 비동기적 및 이벤트 기반 작업을 다루는 방식으로, 전통적인 명령형 프로그래밍과 비교하여 더 선언적(declarative)인 성격을 가지고 있다. 선언적 프로그래밍과 명령형 프로그래밍은 무엇일까?
- 명령형 프로그래밍(Imperative Programming)
명령형 프로그래밍은 "어떻게(How)" 작업을 수행할 것인지를 명시적으로 지정하는 방식으로 코드를 작성한다. 개발자는 단계별로 코드를 작성하고 실행 흐름을 제어한다. 우리가 자주 사용하는 아주 익숙한 방식이다.
import java.util.Arrays; import java.util.List; public class ImperativeExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 명령형으로 제곱값의 합을 얻습니다. int sumOfSquares = 0; for (int x : numbers) { int square = x * x; sumOfSquares += square; } System.out.println("Sum of squares: " + sumOfSquares); } }
명령형 프로그래밍은 “어떻게” 작업을 수행할 것인지에 중점을 둔다. 코드는 세부적이며 실행 흐름이 명확하지만, 코드가 길고 복잡해지며 오류가 발생하기 쉬울 수 있다.
- 선언적 프로그래밍(Declarative Programming)
선언적 프로그래밍은 “무엇(What)”을 어떻게 얻을 것인지에 대해 코드를 작성한다. 개발자는 명령어의 단계나 실행 순서를 명시적으로 지정하지 않고, 원하는 결과물에 대해서만 정의한다. 시스템은 그 결과를 얻기 위해 어떻게 처리할지 알아서 결정하게 된다.
import java.util.Arrays; import java.util.List; public class DeclarativeExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 선언적으로 제곱값의 합을 얻습니다. int sumOfSquares = numbers.stream() .map(x -> x * x) .reduce(0, Integer::sum); System.out.println("Sum of squares: " + sumOfSquares); } }
선언적 프로그래밍은 “무엇”을 얻을 것인지에 중점을 둔다. 함수형 프로그래밍을 많이 사용한다. 실행 흐름이 명확하지 않기에 디버깅이 어렵다는 단점이 있다.
리액티브 프로그래밍(RP)과 명령형 프로그래밍의 주요 차이점은 프로그램 로직을 어떻게 표현하는지에 있다. 명령형 프로그래밍에서는 '어떻게' 작업을 단계별로 명시적으로 정의하며 제어 흐름에 집중한다. 그에 반해, 리액티브 프로그래밍은 '무엇'을 달성하려는지를 강조하고 '어떻게'를 명시하지 않는다. 그렇기 때문에 선언적 프로그래밍이라고 할 수 있다.
특징 | 리액티브 프로그래밍 | 명령형 프로그래밍 |
---|---|---|
프로그래밍 패러다임 | 선언적으로도 사용 | 명령형 프로그래밍에 기반 |
비동기성 처리 | 이벤트 기반 및 비동기 처리에 적합 | 명령형에서는 명시적인 비동기 코드 및 콜백을 사용 |
데이터 흐름 | 데이터의 흐름을 중시하며, 변화에 반응하여 처리 | 명령형에서는 주로 명령어 순서에 따라 코드가 실행 |
상태 변경 | 상태가 변경되면 시스템은 자동으로 업데이트 | 명령형에서는 명시적으로 상태를 변경해야 하며, 이에 따라 코드가 실행 |
가독성 및 유지보수 | 코드가 높은 추상화 수준에서 작성되어 가독성이 높다, 디버그가 어려운 단점이 있다 | 세부 사항이 더 명시적이기 때문에 유지보수가 어려울 수도 있다 |
예시 프로그래밍 언어 및 라이브러리 | RxJava, Reactor, RxJS 등 | 일반적인 명령형 언어 및 라이브러리 (Java, C#, JavaScript 등) |
Uploaded by N2T