SEB_BE 68일차 - 리액티브 프로그래밍

subimm_·2022년 12월 1일
0

코드스테이츠

목록 보기
68/83

💡 오늘의 학습목표

  • 리액티브 프로그래밍
  • Hello, Reactive

📔 리액티브 프로그래밍?

  • 선언형 프로그래밍 방식
  • 클라이언트의 요청에 반응을 잘하는 시스템
  • 클라이언트의 요청에 대한 응답 대기 시간을 최소화 할 수 있도록 요청 쓰레드가 차단되지 않게 함으로써 (Non-Blocking) 클라이언트에게 즉각적으로 반응하도록 구성된 시스템

✔ 리액티브 시스템의 특징

  • MEANS
    리액티브 시스템에서 사용하는 커뮤니케이션 수단
    • Message Driven
      리액티브 시스템에서는 메시지 기반 통신을 통해 여러 시스템간에 느슨한 결합을 유지
  • FORM
    메시지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지 의미
    • Elastic
      시스템으로 들어오는 요청량이 적거나 많거나 상관없이 일정한 응답성 유지하는것을 의미
    • Resillient
      시스템 일부분에 장애가 발생하더라도 응답성 유지하는 것을 의미
  • VALUE
    리액티브 시스템의 핵심 가치가 무엇인지를 표현하는 영역
    • Responsive
      리액티브 시스템은 클라이언트의 요청에 즉각적으로 응답할 수 있어야 함을 의미
    • Maintainable
      클라이언트의 요청에 대한 즉각적인 응답이 지속가능해야 함을 의미
    • Extensible
      클라이언트의 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 함을 의미

📖 리액티브 프로그래밍 ?

  • 리액티브 시스템에서 사용되는 프로그래밍 모델
  • 리액티브 프로그래밍은 Non-Blocking 통신을 위한 프로그래밍 모델

✔ 리액티브 프로그래밍 특징

  • declarative programming paradigm
    • 선언형 프로그래밍 방식을 사용하는 대표적인 프로그래밍 모델
  • data streams and the propagation of change
    • 지속적으로 데이터가 입력으로 들어올 수 있음을 의미, 데이터가 지속적으로 발생하는 것 자체를 데이터에 어떤 변경이 발생함을 의미, 이 변경을 이벤트로 간주하고, 이벤트가 발생할 때 마다 데이터를 계속해서 전달
  • automatic propagation of the changed data flow
    • 지속적으로 발생하는 데이터를 하나의 데이터 플로우로 보고 데이터를 자동으로 전달

📖 리액티브 스트림즈 ?

  • 리액티브 프로그래밍을 위한 표준 사양 (또는 명세)
  • Java에서는 어떤 기술의 표준 사양을 코드로 정의할 경우 일반적으로 Java의 인터페이스로 정의

✔ 리액티브 스트림즈 컴포넌트

  • Publisher
public interface Publisher<T> {
	public void subscribe(Subscriber<? super T> s);
}
  • 데이터 소스로부터 데이터를 내보내는 (emit) 역할
  • subscribe() 의 파라미터로 전달되는 Subscriber가 Publisher로부터 내보내진 데이터를 소비하는 역할
  • subscriber() 퍼블리셔가 내보내는 데이터를 수실할 지 여부를 경정하는 구독의 의미
    메서드가 호출되지 않으면 퍼블리셔가 데이터를 내보내는 프로세스는 시작되지 않는다.
  • Subscriber
public interface Subscriber<T> {
    public void onSubscribe(Subscription s);
    public void onNext(T t);
    public void onError(Throwable t);
    public void onComplete();
}
  • 퍼블리셔로부터 내보내진 데이터를 소비하는 역할
    • onSubscribe(Subscription s)
      • 구독이 시작되는 시점에 호출, 퍼블리셔에게 요청할 데이터의 개수를 지정하거나 구독 해지 처리
    • onNext(T t)
      • 퍼블리셔가 데이터를 emit할 때 호출되며, emit된 데이터를 전달 받아서 소비할 수 있다.
    • `onError(Throwable t)
      • 퍼블리셔로부터 emit된 데이터가 Subscriber에게 전달되는 과정에서 에러가 발생할 경우 호출
    • onComplete()
      • 퍼블리셔가 데이터를 emit 하는 과정이 종료될 경우 호출, 데이터의 emit이 정상적으로 완료된 후, 처리해야 될 작업이 있다면 메서드 내에서 수행 가능
  • Subscription
public interface Subscription {
	public void request(long n);
    public void cancel();
}
  • Subscriber의 구독 자체를 표현한 인터페이스
    • request(long n)
      • 퍼블리셔가 emit하는 데이터의 개수를 요청
    • cancel()
      • 구독을 해지하는 역할, 구독 해지가 발생하면 퍼블리셔는 더이상 데이터를 emit하지 않음.
  • Processor
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
  • Publisher와 Subcriber의 역할을 동시에 할 수 있는 특징.

📖 리액티브 스트림즈의 구현체

  • Project Reactor
    • 대표적인 구현체, Spring과 궁합이 가장 잘 맞음.
      Spring 5의 리액티브 스택에 포함되어 있으며, Spring Reactive Application 구현에 있어 핵심적인 역할 담당
  • Rx.java
    • .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java 언어로 포팅한 JVM 기반의 리액티브 확장 라이브러리
  • Java Flow API
    • 리액티브 스트림즈를 구현한 구현체가 아니라 리액티브 스트림즈 표준 사양을 Java안에 포함 시킨 구조

📔 Hello, Reactive로 알아보는 리액티브 프로그래밍 구조

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

  • 명령형 : for문 이용, if문 이용 코드가 어떤식으로 실행되어야 하는지에 대한 구체적인 로직이 코드 안에 그대로 드러난다.
  • 선언형 : 대표적으로 Stream API , 최종 연산을 수행하는 메서드를 호출하지 않으면 앞에 작성한 메서드 체인들이 실행되지 않음.
    메서드 체인에는 이러한 작업을 해달라고 선언(요청) 하는 람다 표현식만 넘겨주고, 최종 연산이 호출될 때 비로소 전달 받은 람다 표현식을 기반으로 동작 수행

📖 Hello, Reactive 샘플 코드

  • 퍼블리셔는 데이터를 emit하는 역할, Subscriber는 Publisher가 emit한 데이터를 전달 받아서 소비하는 역할
  • 퍼블리셔의 역할을 하는 것이 Mono
  • Subscriber의 역할을 하는 것이 subscribe() 메서드 내부에 정의된 람다 표현식

  • 하나의 메서드 체인 형태로 표현

📖 리액티브 프로그래밍에서 사용되는 용어 정리

  • Publisher
    데이터를 내보내는 주체를 의미 / 위 코드에서는 Flux가 퍼블리셔
  • Emit
    퍼블리셔가 데이터를 내보내는 것
  • Subscriber
    퍼블리셔가 emit한 데이터를 전달 받아서 소비하는 주체
    • 위 코드에서는 System.out::println 가 Subscriber에 해당된다. 람다 표현식을 메서드 레퍼런스로 축약하지 않았다면 람다 표현식 자체가 해당됨.
  • Subscribe
    구독을 의미 / subscribe() 메서드를 호출하면 구독을 하는 것
  • Signal
    퍼블리셔가 발생시키는 이벤트를 의미
    • 위 코드에서 subscribe() 메서드가 호출되면 퍼블리셔인 Flux는 숫자 데이터를 하나씩 하나씩 emit 한다.
      이 때 숫자 데이터를 하나씩 emit 하는 자체를 리액티브 프로그래밍에서는 이벤트가 발생하는 것으로 간주 , 이 이벤트 발생을 다른 컴포넌트에게 전달하는 것을 Signal을 전송한다 라고 함.
  • Operator
    어떤 동작을 수행하는 메서드를 의미
    fromIterable(), filter(), reduce() 등 메서드 하나하나를 말함.
  • Sequence
    Operator 체인으로 표현되는 데이터의 흐름을 의미
    위 코드에서 Operator 체인으로 작성된 코드 자체를 하나의 시퀀스라고 이해하면 됨.
  • UpStream / DownStream
    시퀀스 상의 특정 Operator를 기준으로 위쪽의 Sequence 일부를 Upstream, 아래쪽 시퀀스 일부를 Downstream이라고 표현한다.
profile
코린이의 공부 일지

0개의 댓글