개발자는 기록이 답이다

패스트캠퍼스 환급챌린지 14일차 미션 (2월 14일) : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기 본문

패스트캠퍼스

패스트캠퍼스 환급챌린지 14일차 미션 (2월 14일) : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기

slow-walker 2024. 2. 14. 23:22

 

 

Reactor pattern 실습

• Reactor pattern을 이용해서 부에서 들어오는 요청을 처리한다
• Reactor patternHttpEventHandler를 추가하여 http 요청을 처리한다

 

 

이번에는 Reactor pattern을 실습하는 시간이었다.

관련된 코드를 처음 보다 보니 강의를 진행할 수록 더 어렵게 느껴졌다. 해당 강의가 3년차 이하는 구매하지 말라고 했던게 왜 인지 점점 깨닫고 있다. io,nio,aio 의 특징을 설명할때 까지만 해도 배운내용이라 괜찮았는데, nio에 어떤 코드들이 있는지 파악할시간이 필요할 것 같다. 코드를 그대로 따라한것같은데 왜 나는 계속 컴파일 에러가 날까..

 

개념 정리를 하는게 더 나을 것 같다..

  • 동기와 비동기, Blocking과 Non-blocking의 차이는 무엇인가요?
    • 동기 (Synchronous) vs. 비동기 (Asynchronous)
      • 동기 : 요청한 작업이 완료될 때까지 대기하며, 해당 작업의 결과가 반환될 때까지 다음 작업으로 진행하지 않는 방식입니다.
        • 즉, 작업이 순차적으로 실행됩니다.
      • 비동기: 요청한 작업이 완료될 때까지 기다리지 않고, 해당 작업의 결과와 상관없이 다음 작업으로 진행하는 방식입니다. 
        • 작업이 백그라운드에서 병렬로 실행될 수 있습니다.
    • Blocking vs. Non-blocking
      • Blocking: 작업이 완료될 때까지 해당 작업이 반환될 때까지 다른 작업을 수행하지 않고 대기하는 것을 의미합니다.
        • 동기적인 방식에서 주로 발생합니다.
      • Non-blocking: 작업이 완료될 때까지 기다리지 않고, 다른 작업을 계속 수행하는 것을 의미합니다. 
        • 비동기적인 방식에서 주로 발생하며, 작업을 완료하기 전에도 계속해서 다른 작업을 수행할 수 있습니다.
    • 간단히 말하면, 동기와 비동기는 작업의 진행 방식을, Blocking과 Non-blocking은 작업의 대기 여부를 나타냅니다.
      예를 들어, 웹 요청을 기다리는 동안 다른 작업을 수행하려면 비동기 및 non-blocking 방식을 사용하여 응용 프로그램의 효율성을 향상시킬 수 있습니다. 반면에 동기 및 blocking 방식은 특정 작업의 완료를 기다리며 진행되기 때문에 다른 작업을 수행할 수 없을 수 있습니다.


  • Reactive system의 필수 요소는 무엇인가요?
    • Responsive (응답성)
      • 시스템은 항상 사용자 및 다른 시스템의 요청에 대해 즉각적이고 응답성 있게 동작해야 합니다.
      • 응답성은 높은 성능과 빠른 응답 시간을 의미하며, 사용자 경험을 향상시키는 중요한 특성입니다.
    • Resilient (탄력성)
      • 시스템은 실패에 대해 견고하고 내결함성을 갖춰야 합니다.
      • 실패가 발생하더라도 시스템은 부분적으로 작동 가능하고, 전체 시스템의 성능은 저하되지 않아야 합니다.
    • Elastic (탄력성)
      • 시스템은 다양한 작업 부하에 대해 탄력적으로 대응할 수 있어야 합니다.
      • 작업 부하가 늘어나면 시스템은 확장 가능하게 자동으로 조절되어 성능을 유지해야 합니다.
    • Message-Driven (메시지 기반)
      • 시스템의 컴포넌트 간 통신은 비동기적인 메시지 전달을 기반으로 합니다.
      • 메시지 기반 통신은 느슨한 결합을 제공하며, 컴포넌트 간의 유연성을 향상시킵니다.
    • 이러한 속성들은 Reactive system이 확장 가능하며, 변경에 대응하며, 안정적으로 동작할 수 있도록 하는 기본적인 원칙들을 제공합니다. Reactive system은 이러한 속성들을 통해 높은 성능, 신뢰성, 확장성을 달성하며, 현대적이고 요구사항에 민첩한 소프트웨어 시스템을 구축할 수 있도록 돕습니다.
  • Reactive streams는 어떤 구조로 되어있나요?
    • Publisher (발행자)\
      • 데이터를 생성하거나 특정 이벤트를 발생시키는 주체로, 구독자에게 데이터를 전달합니다.
      • subscribe 메서드를 통해 Subscriber에게 데이터 푸시를 시작합니다.
    • Subscriber (구독자)
      • 데이터를 소비하고 처리하는 주체로, Publisher로부터 데이터를 받습니다.
      • onSubscribe, onNext, onError, onComplete와 같은 메서드를 통해 Publisher로부터 전달된 이벤트에 대응합니다.
    • Subscription (구독)
      • Publisher와 Subscriber 간의 구독 관계를 나타냅니다.
      • Subscriber는 Subscription을 통해 데이터를 요청하거나 구독을 해지할 수 있습니다.
    • Processor (프로세서)
      • Publisher 및 Subscriber의 역할을 모두 수행할 수 있는 중간 역할의 컴포넌트입니다.
      • 데이터를 처리하고 변환하여 다른 구독자에게 전달할 수 있습니다.
    • Reactive Streams의 핵심 목표 중 하나는 백프레셔(backpressure) 메커니즘을 통해 구독자와 발행자 간의 데이터 흐름을 제어하는 것입니다. 이를 통해 빠르게 생성되는 데이터를 구독자가 처리할 수 있는 속도로 전달함으로써 리소스 효율성을 높이고 안정성을 확보할 수 있습니다.
      Reactive Streams는 Java 9 이후의 자바 표준 라이브러리에서 제공되며, 리액티브 프로그래밍의 일관된 인터페이스를 정의하고 다양한 리액티브 라이브러리 및 프레임워크에서 활용됩니다.
  •  java nio는 어떻게 동작하나요? java io와의 차이는 무엇인가요?
    • Java NIO(New I/O)는 기존의 Java I/O(Input/Output) API와는 다른 비동기적인 입출력 모델을 제공합니다. NIO는 Java 1.4부터 소개되었으며, I/O 작업을 더 효율적으로 다루기 위한 새로운 기능을 도입했습니다.
    • Java I/O와의 주요 차이점
      • 비동기적인 입출력 (Asynchronous I/O)
        • Java NIO는 비동기적인 I/O를 지원하여 여러 채널에서 발생하는 이벤트를 하나의 스레드로 처리할 수 있습니다. 이는 많은 클라이언트를 동시에 처리할 때 효율적입니다.
        • Java I/O는 블로킹 방식으로 동작하며, 하나의 스레드가 하나의 연결에 대해 블록될 수 있습니다.
      • 채널과 버퍼 사용
        • Java NIO에서는 채널(Channel)과 버퍼(Buffer)가 중요한 개념입니다. 채널은 입출력 작업의 연결을 나타내며, 버퍼는 데이터를 임시로 저장하는 공간입니다.
        • Java I/O에서는 스트림(Stream)과 블로킹된 스트림(Blocked Stream)이 사용되며, 버퍼링을 위해 별도의 클래스를 사용해야 합니다.
      • Selectors
        • Java NIO에서는 Selector가 도입되어 여러 채널을 모니터링하고, 발생한 이벤트에 대응할 수 있습니다. 이를 통해 단일 스레드에서 여러 채널을 효율적으로 관리할 수 있습니다.
        • Java I/O에서는 이러한 Selector가 없고, 각 스트림에 대한 별도의 스레드가 필요할 수 있습니다.
      • Blocking vs. Non-blocking
        • Java NIO는 Non-blocking 모델을 지원하여 채널에서 읽기/쓰기 작업이 완료되지 않더라도 다른 작업을 처리할 수 있습니다.
        • Java I/O는 블로킹 모델로, I/O 작업이 완료될 때까지 대기합니다.
        • Java NIO를 사용하면 여러 클라이언트를 효율적으로 처리하고, 블로킹을 최소화하여 높은 확장성을 갖는 네트워크 응용 프로그램을 개발할 수 있습니다.
  • Reactor pattern을 사용해서 어떤 일을 할 수 있나요?
    • Reactor 패턴은 비동기적인 이벤트 기반 프로그래밍을 위한 디자인 패턴 중 하나로, 주로 Reactor 라이브러리나 프레임워크를 사용하여 구현됩니다. Reactor 패턴을 사용하면 다양한 일들을 효율적으로 수행할 수 있습니다
    • 이벤트 기반 프로그래밍
      • Reactor 패턴은 이벤트에 반응하여 비동기적으로 작업을 수행할 수 있도록 합니다. 이는 주로 네트워크 통신, 웹 서버, 메시지 큐 등에서 이벤트 처리에 유용합니다.
    • 비동기 및 논블로킹 처리
      • 비동기 및 논블로킹 작업을 통해 여러 작업을 동시에 처리하고, 블로킹을 최소화하여 응답 시간을 향상시킬 수 있습니다.
    • 스케일 아웃과 확장성
      • Reactor 패턴은 스케일 아웃을 지원하여 병렬적으로 많은 이벤트를 처리할 수 있도록 합니다. 이는 대규모 시스템에서 확장성을 제공하는 데 도움이 됩니다.
    • 백프레셔(Backpressure) 관리
      • Reactive Streams를 사용하면 데이터의 생산자(Producer)와 소비자(Consumer) 간에 백프레셔를 통해 효율적인 데이터 흐름 관리가 가능합니다.
    • 코드의 간결성과 유지보수성 향상
      • Reactor 패턴은 함수형 프로그래밍과 조합 가능한 연산자들을 제공하여 코드를 간결하게 작성할 수 있습니다. 이는 유지보수성과 가독성을 향상시킬 수 있습니다.
    • 다양한 데이터 처리 작업
      • Reactor는 다양한 데이터 처리 작업에 적합하며, 맵 리듀스(MapReduce), 필터링, 변환, 조합, 에러 핸들링 등 다양한 연산을 제공합니다.
    • 구독/발행 패턴(Slubscribe/Publish Pattern)
      • Reactor 패턴은 옵저버(Observer) 패턴의 발전된 형태인 구독/발행 패턴을 제공하여 컴포넌트 간의 느슨한 결합을 도모합니다.
  • Reactive 란 무엇인가요?
    • "Reactive"는 반응적인 또는 반응형을 의미하며, 소프트웨어 시스템에서는 주로 "Reactive Programming" 또는 "Reactive Systems"와 관련이 있습니다.
    • Reactive Programming
      • Reactive Programming은 데이터 스트림이나 이벤트에 반응하여 데이터의 흐름을 조작하고 전달하는 패러다임입니다. 주로 비동기적이고 이벤트 기반 프로그래밍에 사용되며, 함수형 프로그래밍의 원칙을 따르기도 합니다. 대표적으로 ReactiveX, Project Reactor, RxJava 등이 있습니다.
    • Reactive Systems
      • Reactive Systems는 Reactive Programming 원칙을 기반으로 하는 소프트웨어 아키텍처의 개념입니다. Reactive Systems는 다양한 환경에서 높은 응답성(Responsiveness), 탄력성(Resilience), 유연성(Flexibility)을 제공하여 사용자 요구사항에 반응할 수 있는 시스템을 목표로 합니다.
    • Reactive Manifesto
      • Reactive Systems 개념은 Reactive Manifesto를 통해 제시되었습니다. 이 매니페스토는 Responsive, Resilient, Elastic, Message-Driven의 네 가지 원칙을 강조하며, 시스템이 사용자의 요구사항에 반응할 수 있고, 오류에 강건하며, 동적으로 확장 가능하며, 비동기적인 메시지 전달을 활용한다는 원칙을 제시합니다.
    • Reactive Streams
      • Reactive Streams는 데이터의 비동기적인 흐름을 표현하는 스펙으로, Publisher(생산자), Subscriber(소비자), Subscription(구독) 등의 인터페이스를 제공하여 백프레셔(Backpressure)와 같은 이슈를 다룰 수 있도록 합니다.

※ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. https://bit.ly/48sS29N