티스토리 뷰

728x90
반응형

목차

     

    리액티브 프로그래밍(Reactive Programming)이란

     

    논 블로킹, 비동기 데이터 흐름 및 새로운 정보의 가용성에 기반을 둔 선언형 개발 패러다임이다.

     

    또는 리액티브 시스템을 구현하는 방법이자 하위 개념이라고 볼 수도 있다.

     

    정의에 사용된 단어에 대한 뜻은 잠시 후에 알아보기로 하고,

     

    우선 리액티브 시스템이 무엇인지 정리하고 가자.

     

    Reactive System

     

    리액티브 시스템이란 '반응이 좋은, 민감한' 시스템이란 뜻이다.

     

    이렇게 말해선 잘 와닿지 않을 수도 있으니, 조금 더 직관적으로 말하자면

     

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

     

    이는 웹 앱에서 굉장히 중요한 원칙인데, 고객들이 대체로 느린 반응속도를 기다려주지 않기 때문이다.

     

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

     

    여기서 빠른 반응속도란 앱 내의 개별 컴포넌트의 반응속도뿐 아니라 그 사이의 상호작용

     

    확장, 축소, 균형 조정 등의 속도를 포함한다.

     

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

     

    요약하면 아래와 같다.

     

    VALUE Responsive 요청에 대한 즉각적이고 예상 가능한 반응속도 제공
    Maintainable 요청에 대해 지속 가능한 응답 제공
    Extensible 요청에 대한 처리량 자동 확장 및 축소 가능
    FORM Elastic 서버 부하에 따른 탄력적 자원 할당 및 그에 따른 일정한 응답
    Resillient 장애 발생에 대한 회복성 및 시스템의 반응 지속. 컴포넌트의 분리 및 비동기 위임 처리
    MEANS Message Driven FORM 지원을 위한 느슨한 결합과 고립, 비동기적 메시지로 컴포넌트 통신

     

    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 - 반환을 기다리며 대기열에 머무는 것이 필수

    라는 차이점이 존재한다.

     

    추가로 리액티브 프로그래밍은 비동기 논 블로킹 방식으로 진행되기 때문에

     

    위 그림에서 두 가지를 합친 식으로 흘러가게 된다.

     

     

    Propagation of Change(-d Data)

     

    새로운 정보에 대한 가용성이라 함은 데이터의 추가, 변경을 이벤트로 간주하는 것을 가리킨다.

     

    지속적인 이벤트의 발생을 데이터 플로우로 인식해 자동으로 전달 및 업데이트 하는 것을 뜻하기도 한다.

     

    Declarative Programming Paradigm

     

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

     

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

     

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

     

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

     

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

     

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

     

    사용법과 설명은 다른 글에 해 두었다.

     

    2022.07.20 - [Development/Java] - [Java]람다(Lambda), 함수형 인터페이스(Functional Interface), 메서드 레퍼런스(Method Reference)

    2022.07.20 - [Development/Java] - [Java]스트림(Stream)

    2022.07.20 - [Development/Java] - [Java]스트림 생성, 중간 연산, 최종 연산

     

    [Java]스트림 생성, 중간 연산, 최종 연산

    지난번 글에서 스트림은 크게 세 가지 과정으로 나뉜다고 했다. 스트림 생성하기 중간 연산 - 데이터의 가공 최종 연산 - 결과 만들기 또한 스트림을 사용할 때 주의해야 할 점도 있었는데, 스트

    gnidinger.tistory.com

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/11   »
    1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    글 보관함