본문 바로가기
Back-End/Spring WebFlux

Hello, Reactive | 명령형 프로그래밍과 선언형 프로그래밍

by 달의 조각 2022. 10. 12.

명령형 프로그래밍 vs 선언형 프로그래밍

 

  코드가 어떤 식으로 실행되어야 하는지에 대한 구체적인 로직이 코드 안에 그대로 드러나는 명령형 프로그래밍 방식과는 달리 선언형 프로그래밍의 경우는 코드 상에 보이지 않는 내부 반복자가 존재한다.

// 명령형
for(int number : numbers){
    if(number > 4 && (number % 2 == 0)){
        sum += number;
    }
}
// 선언형
int sum =
        numbers.stream()
                .filter(number -> number > 4 && (number % 2 == 0))
                .mapToInt(number -> number)
                .sum();

Java의 Stream API를 떠올려 보면 메서드 체인(중간 연산)에서는 선언하는 람다 표현식을 넘기고, 최종 연산이 호출될 때 전달받은 람다 표현식을 기반으로 동작을 수행한다. (Stream API는 리액티브 프로그래밍과 선언형 방식으로 구성된다는 공통점이 있지만 많은 차이점이 존재하고 용도가 다르다.)

하나하나 로직을 작성하지 않고 필요한 동작을 정의만 하여 동작 수행을 연산 메서드 체인에 위임한다.

 

 

리액티브 프로그래밍의 구조

 

// Publicsher의 역할
Mono<String> mono = Mono.just("Hello, Reactive");

// Subscriber의 역할
mono.subscribe(message -> System.out.println(message));
Mono
        .just("Hello, Reactive")
        .subscribe(message -> System.out.println(message));
Flux // Publishere
        .fromIterable(List.of(1, 3, 6, 7, 8, 11))
        .filter(number -> number > 4 && (number % 2 == 0))
        .reduce((n1, n2) -> n1 + n2)
        .subscribe(System.out::println);

 

🪴 Publishere

데이터를 내보내는 주체

 

🪴 Emit

Publishere가 데이터를 내보내는 것

 

🪴 Subscriber

Publishere가 emit 한 데이터를 전달받아서 소비하는 주체 System.out::println

 

🪴 Subscribe

구독

 

🪴 Signal

Publisher가 발행시키는 이벤트
subscribe 호출 시 Publisher인 Flux는 숫자 하나하나를 emit 한다 = 이벤트 발생! > 다른 컴포넌트에게 전달

 

🪴 Operator

어떤 동작을 수행하는 메서드 fromlterable() filter() reduce()

 

🪴 Sequence

Operator 체인으로 작성된 코드 자체

 

🪴 Upstream / Downstream

Sequence의 특정 Operator를 기준으로 위아래를 뜻함

'Back-End > Spring WebFlux' 카테고리의 다른 글

리액티브 프로그래밍  (0) 2022.10.12

댓글