유데미 부트캠프 3기 백앤드 8주차 - Functional & Reactive programming

박종현·2023년 1월 15일
0
post-thumbnail

Functional & Reactive programming

  • 리액티브 프로그래밍(Reactive Programming)이란 논 블로킹, 비동기 데이터 흐름 및 새로운 정보의 가용성에 기반을 둔 선언형 개발 패러다임
  • 리액티브 시스템을 구현하는 방법이자 하위 개념이라고 볼 수도 있다.

Reactive System

리액티브입력이 발생했을 때 최대한 빠른 시간에 응답하도록 하는 설계 원칙이라고 할 수 있다.

즉 리액티브 시스템이란 바로 빠른 반응속도를 갖는 시스템을 말한다고 보면 된다.

여기서 빠른 반응속도란 앱 내의 개별 컴포넌트의 반응속도뿐 아니라 그 사이의 상호작용 및 확장, 축소, 균형 조정 등의 속도를 포함한다.

이런 핵심 가치를 잘 나타내고 있는 것이 2014년 발표된 리액티브 선언문(Reactive Manifesto)

  • Value
    • Responsive : 요청에 대한 즉각적이고 예상 가능한 반응속도 제공
    • Maintainable : 요청에 대해 지속 가능한 응답 제공
    • Extensible : 요청에 대한 처리량 자동 확장 및 축소 가능
  • Form
    • Elastic : 시스템 부하에 따른 탄력적 자원 할당 및 그에 따른 일정한 응답
    • Resillient : 장애 발생에 대한 회복성 및 시스템의 반응 지속. 컴포넌트의 분리 및 비동기 위임 처리
    • ex) 결제모듈이 실패하더라도, 주문을 일단 접수하고 자동으로 재시도
  • Means
    • Message Driven : 분산 시스템에서 컴포넌트를 연결하는 방법으로, 느슨한 결합, 시스템 격리 및 확장성 유지를 동시에 달성

Reactive Programming

리액티브 시스템 이라는 설계 원칙을 구현하는 리액티브 프로그래밍에 대해 알아보자.

앞서 언급했듯이 리액티브 프로그래밍이란 논 블로킹, 비동기 데이터 흐름 및 새로운 정보의 가용성에 기반을 둔 선언형 개발 패러다임이다.

각각의 개념은 리액티브 시스템이라는 원칙을 떠받치고 있는데, 간략하게 알아보자.

Non-Blocking

  • 블로킹과 논 블로킹은 간단하게 말하면 호출된 함수가 제어권을 바로 리턴하느냐 아니냐의 차이
  • Blocking : 호출된 함수 B가 작업이 끝날 때까지 제어권을 넘겨주지 않아 A는 대기상태(다른 작업 불가, Blocked)
  • Non-Blocking : 호출된 함수 B가 거의 즉시 제어권을 넘겨줘 A는 다른 작업 가능(Non-Blocked)

사용자의 관점에서 보면 하나의 작업이 진행되는 동안 앱이 멈춘 것처럼 느껴지는 것이 블로킹의 단점이라 할 수 있다.

반면 논 블로킹의 경우 멈추지 않고 계속해서 다른 작업을 진행할 수 있으며,

문제를 여러 개의 단계로 나누어 실행함으로써 멀티코어 CPU의 능력을 극대화할 수 있다.

Asynchronous

  • 동기와 비동기는 호출된 함수의 결과를 어느 쪽에서 처리하느냐에 차이,  사용자의 요청 순서가 지켜지느냐(Sync) 지켜지지 않느냐(Async) 하는 차이라고 보면 된다.

호출된 함수의 결과는 당연히 호출된 쪽에서 신경 써야 할 것 같지만, 좀 더 알아보면 아래와 같다.

  • Synchronous호출된 함수 B의 결과를 A가 처리하는 것. 리턴을 기다리거나 작업 완료 여부를 A가 처리 ⇒ 여러 작업 실행시 작업의 완료 순서를 A가 알 수 있다.
  • Asynchronous호출시 Callback을 전달해 B의 작업 완료시 Callback을 실행하는 구조. A는 작업 완료 여부를 신경쓰지 않는다. ⇒ 여러 작업 실행시 작업의 완료 순서를 A가 알 수 없다.

동기와 블로킹이 비슷해 보일 수 있는데, 호출된 함수의 반환을 기다린다는 점에선 같지만

  • Synchronous 반환을 기다리며 대기열에 머무는 것이 필수가 아님
  • Blocking - 반환을 기다리며 대기열에 머무는 것이 필수
    라는 차이점이 존재

추가로 리액티브 프로그래밍은 비동기 논 블로킹 방식으로 진행되기 때문에 위 그림에서 두 가지를 합친 식으로 흘러가게 된다.

Declarative Programming Paradigm

  • 프로그래밍 패러다임이란 쉽게 말하면 프로그램을 무엇으로 볼 것인가, 즉 관점에 대한 답이다.

  • 객체지향 프로그래밍의 패러다임 : '프로그램은 상호작용하는 객체의 집합이다.'라는 관점

  • 함수형 프로그래밍의 패러다임 : '프로그램은 연속된 함수의 집합이다.'라는 관점

계속해서 여기서 '선언형 프로그래밍'이란 '명령형 프로그래밍'과 대비되는 개념이며

목표를 선언하고 알고리즘을 감추는, 함수형 프로그래밍과 논리형 프로그래밍 등을 가리키는 용어이다.

자바에서 함수형 프로그래밍 기법은 람다식과 스트림으로 지원한다.

0개의 댓글