Project Reactor

2023. 4. 4. 13:17·📘 Backend/Spring
목차
  1. 📘 Project Reactor
  2. 📘 Marble Diagram
  3. Reactor의 데이터 타입 중 하나인 Mono 마블 다이어 그램
  4. Reactor의 데이터 타입 중 하나인 Flux 마블 다이어 그램
  5. 📘 Scheduler
  6. Scheduler 전용 Operator
  7. 📘 Operators
  8. 새로운 Sequence를 생성(Creating)하고자 할 경우
  9. 기존 Sequence에서 변환 작업(Transforming)이 필요한 경우
  10. Sequence 내부의 동작을 확인(Peeking)하고자 할 경우
  11. Sequence에서 데이터 필터링(Filtering)이 필요한 경우
  12. 에러를 처리(Handling errors)하고자 할 경우

📘 Project Reactor

완전한 Non-Blocking 통신 지원
Publisher 타입으로 Mono[0|1] , Flux[N] 존재, 숫자는 가능한 데이터 emit의 수
MSA 기반 Application에 적합한 Library
BackPresure 전략 사용


BackPresure 전략이란?
Subscriber의 emit 데이터 처리 속도가 Publisher의 emit 속도를 따라가지 못할때 제어하는 전략


📘 Marble Diagram

Reactor의 데이터 타입 중 하나인 Mono 마블 다이어 그램

  • (1) 원본 Mono에서 시작되는 Sequence를 타임라인으로 표현
  • (2) Sequence에서 구슬 1개가 생기는걸 데이터 Emit으로 표현
  • (3) 수직 막대바( | ) -> Sequence 정상 종료를 의미
  • (4) Operator에서의 데이터 가공 처리를 의미
  • (5) 가공 데이터가 DownStream으로 전달될때를 의미
  • (6) 'X' 의미 -> 에러 인한 비정상 종료

img


Reactor의 데이터 타입 중 하나인 Flux 마블 다이어 그램

  • 위의 Mono와 동일하지만 유일하게 다른점은 Flux[N] 이므로 여러개의 Emit 데이터 표현

img


📘 Scheduler

쓰레드 관리자
Non-Blocking - Async
복잡한 멀티쓰레딩 프로세스의 단순화


Scheduler 전용 Operator

  • subscribeOn()
    • 구독 직 후 실행되는 Operator 체인의 실행 쓰레드를 Scheduler로 지정한 쓰레드로 변경
    • ex) Schedulers.boundedElastic()
  • publishOn()
    • 데이터를 emit 하는 Publisher의 실행 쓰레드 지정
    • 데이터를 가공하는 Operator 앞에 추가해서 실행 쓰레드를 별도로 추가함
    • ex) Schedulers.parallel()

📘 Operators

Opterator의 수가 너무 많으므로 상황별, 자주쓰는 Operator 정리


새로운 Sequence를 생성(Creating)하고자 할 경우

  • just()
  • ⭐ fromStream() - Stream을 입력으로 받아 emit
  • ⭐ fromIterable() - Iterable을 입력으로 받아 emit
  • fromArray()
  • range()
  • interval()
  • empty()
  • never()
  • defer()
  • using()
  • generate()
  • ⭐ create() - 프로그래밍 방식으로 Signal 이벤트(Publisher가 발생시키는 이벤트)를 발생시킴
    • 한번에 여러 개의 데이터를 async적으로 emit

기존 Sequence에서 변환 작업(Transforming)이 필요한 경우

  • ⭐ map()
  • ⭐ flatMap() - 내부로 들어오는 데이터 1개당 하나의 Sequence 생성
  • ⭐ concat() - Publisher의 Sequence를 연결해서 순서대로 데이터 emit
  • collectList()
  • collectMap()
  • merge()
  • ⭐ zip() - emit 데이터 결합 = emit 데이터를 하나씩 받아서 Downstream으로 전달
  • then()
  • switchIfEmpty()
  • and()
  • when()

Sequence 내부의 동작을 확인(Peeking)하고자 할 경우

  • doOnSubscribe
  • ⭐doOnNext() - 데이터 emit 시 트리거되어 side-effect를 추가
  • doOnError()
  • doOnCancel()
  • doFirst()
  • doOnRequest()
  • doOnTerminate()
  • doAfterTerminate()
  • doOnEach()
  • doFinally()
  • ⭐log() - Publisher 에서 발생하는 Signal 이벤트 로그 출력

Sequence에서 데이터 필터링(Filtering)이 필요한 경우

  • ⭐filter()
  • ignoreElements()
  • distinct()
  • ⭐take()
  • next()
  • skip()
  • sample()
  • single()

에러를 처리(Handling errors)하고자 할 경우

  • ⭐error() - 의도적인 onError Signal 이벤트 발생시킴
  • ⭐timeout() - 입력으로 얻은 시간동안 emit 데이터가 없으면 onError 이벤트 발생시킴
  • onErrorReturn()
  • onErrorResume()
  • onErrorMap()
  • doFinally()
  • ⭐retry() - Sequence상 에러 발생할 경우, 입력값 만큼 재구독해서 Sequence 재시작
저작자표시 (새창열림)

'📘 Backend > Spring' 카테고리의 다른 글

Proxy & Fetch & Cascade & Orphan  (0) 2023.04.04
Relation Mapping & Mapped Super Class  (0) 2023.04.04
Spring - Reactive Streams  (0) 2023.04.04
OAuth2 (Google API)  (0) 2023.04.04
Implements JWT Login  (0) 2023.04.04
  1. 📘 Project Reactor
  2. 📘 Marble Diagram
  3. Reactor의 데이터 타입 중 하나인 Mono 마블 다이어 그램
  4. Reactor의 데이터 타입 중 하나인 Flux 마블 다이어 그램
  5. 📘 Scheduler
  6. Scheduler 전용 Operator
  7. 📘 Operators
  8. 새로운 Sequence를 생성(Creating)하고자 할 경우
  9. 기존 Sequence에서 변환 작업(Transforming)이 필요한 경우
  10. Sequence 내부의 동작을 확인(Peeking)하고자 할 경우
  11. Sequence에서 데이터 필터링(Filtering)이 필요한 경우
  12. 에러를 처리(Handling errors)하고자 할 경우
'📘 Backend/Spring' 카테고리의 다른 글
  • Proxy & Fetch & Cascade & Orphan
  • Relation Mapping & Mapped Super Class
  • Spring - Reactive Streams
  • OAuth2 (Google API)
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      GStreamer #Pipeline
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Project Reactor
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.