Post

스프링을 이용한 리액티브 프로그래밍 - 기본 개념

2. 스프링을 이용한 리액티브 프로그래밍 - 기본 개념

리액티브를 위한 스프링 프레임워크의 초기 해법

관찰자(Observer) 패턴

관찰자라고 불리는 자손의 리스트를 가지고 있는 주체(subject)를 필요로 함

주체는 일반적으로 자신의 메소드 중 하나를 호출해 관찰자에게 상태 변경을 알림

관찰자 패턴을 사용하면 런타임에 일대다 의존성 등록 가능

일반적인 관찰자 패턴은 Subject와 Observer 2개의 인터페이스로 구성됨

Observer는 Subject에 등록되고 Subject로 부터 알림 수신

Subject의 구현체 안에는 notify를 받는 데 관심이 있는 Observer Set이 존재

registerObserver 및 unregisterObserver 메서드를 이용해 수정이 가능

이벤트를 브로드캐스트하기 위해 Subject에는 각 Observer에 대해 반복적으로 observe() 메서드를 호출하는 notifyObservers 메서드 존재

Java.util 에 포함된 Observer를 사용하거나 직접 구현하는 것보다는 믿을 수 있는 조직에서 제공하는 좀 더 성숙한 구현체를 사용하는 것이 좋다.

@EventListener를 사용한 발행-구독 패턴

스프링 프레임워크는 이벤트 처리를 위한 @EventListener 애노테이션과 이벤트 발행을 위한 ApplicationEventListener 클래스 제공

관찰자 패턴의 변형으로 보일수도 있지만, 발행-구독 패턴을 구현한 것

관찰자 패턴과는 달리, 발행-구독 패턴에서 게시자와 구독자는 서로를 알 필요가 없다.

발행-구독 패턴은 게시자와 구독자 간에 간접적인 계층을 제공

구독자는 알림을 브로드캐스트하는 이벤트 채널을 알고 있지만, 일반적으로 구독자가 누구인지 신경 쓰지 않음

또한 각 이벤트 채널에는 동시에 몇 명의 게시자가 있을 수도 있음

이벤트 채널은 수신 메시지를 구독자에게 배포하기 전에 필터링 가능

@EventListener를 활용한 응용 프로그램 개발

리액티브 디자인에 따라 애플리케이션을 만들어야 하므로 고전적인 방식의 풀링 모델 사용 불가능

그래서 SSE(Server-Sent Events) 사용

SSE를 사용하면 클라이언트가 서버에서 자동으로 업데이트 수신 가능

스프링부트 애플리케이션 만들기

비즈니스 로직 구현하기

스프링 웹 MVC를 이용한 비동기 HTTP 통신

SSE 엔드포인트 노출

비동기 지원 설정하기

SSE를 지원하는 UI 작성

기능 확인

솔루션에 대한 평가

스프링에서 고부하를 처리하지 못함

프레임워크의 사소한 변경으로 인해 응용 프로그램의 안정성을 위협할 수 있음

스프링 컨텍스트를 로드하지 않도 비즈니스 로직을 단위 테스트하기 어려움

오류 해결 방법이 복잡해짐

스레드 풀을 사용하는 단점

클라이언트가 없을 때도 이벤트는 발생함 -> 자원 낭비

리액티브 프레임워크 RxJava

RxJava 라이브러리는 Reactive Extensions의 자바 구현체

동기식 또는 비동기식 스트림과 관계없이 명령형 언어를 이용해 데이터 스트림을 조작 가능

관찰자 패턴, 반복자 패턴, 함수형 프로그래밍의 조합

관찰자 + 반복자 = 리액티브 스트림

RxObserver

onNext()를 통해 새로운 값 통지

onComplete()를 통해 스트림의 끝을 알림

onError()를 통해 오류 전파

관찰자 패턴의 Observer와 유사

Observable

관찰자 패턴의 Subject와 일치

Subscriber: Observer 인터페이스를 구현하고 소비

스트림의 생산과 소비

참조

  1. 실전! 스프링5를 활용한 리액티브 프로그래밍
This post is licensed under CC BY 4.0 by the author.