Projects/SpringBoot project 1 (chatapp만들기)

chatapp 리액티브 스트림즈, Flux, Publisher, Subscriber

Vagins 2021. 9. 17. 02:21

21.09.17

오늘 정리할 세가지 내용은 데어프로그래밍님의 강의에서 큰 설명 없이 그냥 넘어간 부분입니다.

정확하지 않지만 제가 찾아 직접 공부해 정리해보겠습니다.

 

 

 

 

1. 리액티브 스트림즈

 

 스프링은 웹 요청처리, http 클라이언트, nosql 연동 등 많은 영역에서 리액티브 프로그래밍을 지원합니다. 스프링 리액터는 스프링에서 리액티브 프로그래밍을 위한 핵심 모듈입니다. 리액터를 잘 사용하려면 많은 것들을 알아야 하지만 가장 기본이 되는 두 타입인 flux와 mono에 대해 알아야합니다. 

 서버 관점에서 리액티브를 사용하는 이유 중 하나는 비동기 / 논블록을 이용해 더 적은 자원으로 더 많은 트래픽을 처리하기 위함입니다.

 리액티브 스트림즈는 비동기 스트림 처리를 위한 표준입니다. 스프링 리액터는 이를 구현한 라이브러리이며 자바9의 flow api도 리액티브 스트림 api를 따르고 있습니다.

 (스트림은 시간이 지남에 따라 생성되는 일련의 데이터/이벤트/신호입니다.)

 스트림은 onnext/oncomplete/onerror 세 가지 신호를 발생 시킬 수 있습니다.

 next는 데이터를 담습니다. complete는 스트림이 끝났음을 의미하고 error는 에러가 발생했음을 의미합니다. complete와 error는 둘 중 하나만 발생할 수 있으며, 두 신호는 발생하지 않을 수도 있습니다.

 

 

 

 

2. Publisher, Subscriber, 구독, Flux

 

 flux는 스프링 리엑터가 제공하는 두가지 publisher 중 하나입니다. (나머지 하나는 mono)

이 두 타입은 발생할 수 있는 데이터의 개수에 차이가 있습니다. flux는 0개 이상, mono는 0 또는 1개의 데이터를 발생할 수 있습니다.

리액티브 스트림즈는 publisher를 이용해 스트림의 정의하고 subscriber를 이용해 발생한 신호를 처리합니다. subscriber가 publisher로부터 신호를 받는 것을 구독이라고 합니다. 아래는 flux 코드 예제입니다.

 

 Flux<Integer> seq = Flux.just(1,2,3);                                      // Integer 값을 발생하는 flux 생성

 seq.subscribe(value -> System.out.println("데이터 : " + value));  // 구독 

 

실제 값 발생은 구독 시점에 이뤄집니다. 위 코드는 subscribe 메서드를 이용해서 구독합니다.

Flux.just(1,2,3);  코드에서 seq 시퀀스는 123을 값으로 갖는 세 개의 next 신호를 발생하고 마지막에 complete 신호를 발생해서 시퀀스를 끝내고 있습니다. (Mono도 유사합니다.)

 

 Flux<Integer> seq = Flux.just(1, 2, 3)

        .doOnNext(i -> System.out.println("doOnNext: " + i));

 

 System.out.println("시퀀스 생성");

 seq.subscribe(i -> System.out.println("Received: " + i));

 

실행 결과 :

  시퀀스 생성

  doOnNext: 1

  Received: 1

  doOnNext: 2

  Received: 2

  doOnNext: 3

  Received: 3

 

 위 결과를 보면 시퀀스를 생성한 시점에는 doOnNext에 전달한 함수가 실행되지 않습니다. doOnNext에 전달한 함수는 next 신호가 발생할 때 호출되기 때문입니다. 따라서 subscribe()를 실행해서 구독을 한 이후에 doOnNext에 전달한 코드가 실행됩니다. 

 

 

 

 

 

 

'Projects > SpringBoot project 1 (chatapp만들기)' 카테고리의 다른 글

chatapp Collection, Document (MongoDB)  (0) 2021.09.14
chatapp lombok, Annotation  (0) 2021.09.14
chatapp 시작  (0) 2021.09.11