[MSA] 리액티브 마이크로서비스 개발 - 1부

min.c00·2023년 4월 8일
0

MSA + Spring Boot

목록 보기
5/7
post-thumbnail

이책은 스프링으로 하는 마이크로서비스 구축(스프링 부트와 스프링 클라우드를 이용한 도커/쿠버네티스 마이크로서비스) 책을 읽고 학습한 내용을 정리한 글입니다.

1. 리액티브 프로그래밍이란?


💡리액티브 프로그래밍(Reactive Programming)은 데이터 스트림과 변경 사항에 반응하는 애플리케이션을 구축하는데 사용되는 프로그래밍 패러다임입니다. 이러한 데이터 스트림은 외부 환경과 상호작용하는 애플리케이션에 대한 입력 및 출력을 포함합니다.

  • 리액티브 프로그래밍은 이벤트 기반(Event-driven), 논블로킹(Non-blocking) 그리고 비동기(Asynchronous)를 기반으로 하며, 데이터를 처리하기 위해 콜백(callback)이나 프로미스(promise) 같은 비동기적인 메커니즘을 사용합니다.
  • 리액티브 프로그래밍은 대규모 분산 시스템과 같이 다양한 데이터 소스와 상호작용하는 애플리케이션에서 특히 유용합니다. 이러한 애플리케이션은 많은 양의 데이터를 처리하고, 다양한 소스에서 오는 데이터 스트림을 합치거나 필터링하거나 변환하는 것과 같은 복잡한 데이터 처리 로직을 다룹니다.
  • 리액티브 프로그래밍은 스트림 처리 라이브러리를 사용하여 데이터를 처리하며, 이러한 라이브러리는 Java에서는 Reactive Streams, RxJava, Reactor, Kotlin에서는 Kotlin Coroutines와 Flow, JavaScript에서는 RxJS 등이 있습니다. 최근에는 리액티브 스프링(Reactive Spring)과 같은 프레임워크도 등장하여 리액티브 프로그래밍을 더 쉽게 구현할 수 있도록 지원하고 있습니다.

2. 구현 예시(feat. Springboot WebFlux)

@Override
    public Mono<Product> getProduct(int productId) {

        if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId);

        return repository.findByProductId(productId)
            .switchIfEmpty(error(new NotFoundException("No product found for productId: " + productId)))
            .log()
            .map(e -> mapper.entityToApi(e))
            .map(e -> {e.setServiceAddress(serviceUtil.getServiceAddress()); return e;});
    }
  • 이 메서드는 Mono 객체를 변환하며 처리에 대한 선언을 할 뿐 트리거하진 않는다. 서비스 요청을 받으면 웹 플럭스 프레임워크에 의해 트리거 된다.

✏️ Mono 객체는 스프링 프레임워크의 리액티브 프로그래밍 모델에서 사용되는 객체입니다."Mono"는 0 또는 1개의 결과물을 반환할 수 있는 리액티브 스트림 객체입니다. 즉, 오직 하나의 결과만을 반환할 수 있습니다.

처리에 대한 선언? 트리거? 등의 내용이 생소하다고 느꼈고 해당 내용을 정리했습니다.


3. Publisher가 Subsscriber에게 데이터를 보내는 방식

이 문장은 리액티브 프로그래밍에서 Publisher가 Subscriber에 데이터를 보내는 방식을 설명합니다.

Publisher는 데이터를 생성하고 처리하는 책임을 가지고 있으며, Subscriber는 Publisher가 생성하는 데이터를 소비합니다. Publisher는 데이터를 처리하는 방법을 정의하고 Subscriber는 Publisher가 보낸 데이터를 수신할 준비가 되어야 합니다.

"처리에 대한 선언을 할뿐 트리거하진 않는다"는 것은 Publisher가 데이터를 생성하고 처리하는 방법을 미리 선언한다는 의미입니다. 이것은 Publisher가 생성하는 데이터가 어떤 방식으로 처리되는지를 알려주는 것입니다. 하지만 이것은 데이터 생성과 전송을 시작하는 것이 아니라, 처리를 위한 방법만을 정의하는 것입니다.

Publisher가 처리 방법을 선언하면 Subscriber는 Publisher가 데이터를 생성하면 수신할 준비를 합니다. 그리고 Publisher는 데이터 생성과 전송을 시작합니다. 이러한 방식으로 Publisher와 Subscriber는 서로 독립적으로 작동하며, Publisher는 Subscriber가 수신할 준비가 되면 데이터를 보내고 Subscriber는 수신된 데이터를 처리합니다.

0개의 댓글