Reactive Programmingaaa/Reactor 기초 문제풀이~

03 Request

peter.j 2021. 3. 16. 03:45

PubSub 구조는 대표적인 Push방식의 디자인 패턴이다.

Push방식의 대표적인 특징으로, 데이터를 받는 입장에서는 주는 데이터를 여건에 상관없이 받아서 처리해야 한다.

만약 데이터를 받아서 복잡한 로직을 처리해야 하는데 계속 데이터가 밀려올 경우 부하가 발생할 수도 있다.

초기 Push방식의 디자인패턴인 Observer패턴에서 이러한 단점이 나타나자, 이를 보완한 PubSub 디자인 패턴이 등장하게 되었다.

 

PubSub 디자인패턴에서는 request() 메서드를 통해서 Subscriber의 상황에 따라 Publisher에게 얼만큼의 데이터를 받을 수 있는지 전달 할 수 있다.

 

 

1. thenRequest(Long.MAX_VALUE)

Reactor의 Subscriber에서 Publisher로 처리가능한 데이터 양을 알려주는 용도로 사용되는 메서드가 request(Long n)이다.

기본값은 request(Long.MAX_VALUE)로 어마어마하게 큰 값이다.

StepVerifier에서는 thenRequest(Long.MAX_VALUE)로 무한에 가까운 요청을 받겠다는 메서드를 호출할 수 있다.

expectNextCount(int n)는 요청을 n개만 처리하고 검증을 마칠때 사용된다.

StepVerifier requestAllExpectFour(Flux<User> flux) {
	return StepVerifier.create(flux)
    		.thenRequest(Long.MAX_VALUE)
            .expectNextCount(4)
            .expectComplete();
}

 

 

2. thenRequest(1)

flux에서 생산되는 데이터를 한개 한개씩 요청하며 검증하는 방법도 있는데, 1개의 데이터만 요청하기 위해 thenRequest(1)처럼 사용도 가능하다.

검증하고자 하는 데이터를 모두 검증했다면 thenCancel()을 통해 검증을 끝낼 수 있다.

StepVerifier requestOneExpectSkylerThenRequestOneExpectJesse(Flux<User> flux) {
	return StepVerifier.create(flux)
    		.thenRequest(1)
            .expectNext(User.SKYLER)
            .thenRequest(1)
            .expectNext(User.JESSE)
            .thenCancel();
}

 

 

3. JPA repository와 함께 사용

현재 Reactor는 공식적으로 jdbc와 연동이 되지 않기 때문에, jpa역시 사용불가능하다.

다음 예제들은 log(), doOnXXX() 메서드에 대해 살펴보기 위한 예제로서 풀어보자.

 

  • log() : Reactive Sterams의 onNext, request, onComplete 등의 신호에 대해 로깅
  • doOnSubscribe(Consumer<T> con) : onSubscribe()메서드가 호출될 때 수행할 콜백 등록
  • doOnNext(Consumer<T> con) : onNext()메서드가 호출될 때 수행할 콜백 등록
  • doOnComplete(Consumer<T> con) : onComplete()메서드가 호출될 때 수행할 콜백 등록
Flux<User> fluxWithLog() {
	return repository.findAll().log();
}
 
 
Flux<User> fluxWithDoOnPrintln() {
	return repository.findAll()
			.doOnSubscribe(u -> System.out.println("Starring:"))
			.doOnNext(u -> System.out.println(u.getFirstname() + " " + u.getLastname()))
			.doOnComplete(() -> System.out.println("The end!"));
}

 

 

 

 

 

참고

tech.io/playgrounds/929/reactive-programming-with-reactor-3/Request

 

Request - Reactive Programming with Reactor 3

Explore this playground and try new concepts right into your browser

tech.io

wiki.sys4u.co.kr/pages/viewpage.action?pageId=7766994#id-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C%EB%A1%9C%EB%B0%B0%EC%9B%8C%EB%B3%B4%EB%8A%94Reactor-6.Request

 

http://wiki.sys4u.co.kr/pages/viewpage.action?pageId=7766994#id-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C%EB%A1%9C%EB%B0%B0%EC%9B%8C%EB%B3%B4%EB%8A%94Reactor-5.Merge

페이지 … PLATEER OPEN WIKI Architectures 리액티브 프로그래밍(Reactive Programming) 배너의 맨 끝으로 배너의 맨 처음으로 연습문제로 배워보는 Reactor 메타 데이터의 끝으로 건너뛰기 작성자 : 알 수 없는

wiki.sys4u.co.kr

 

사업자 정보 표시
1 | g | asdf | 사업자 등록번호 : 123-12-12345 | TEL : 010-111-1111 | Mail : asdf@gmail.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기

'Reactive Programmingaaa > Reactor 기초 문제풀이~' 카테고리의 다른 글

07 Blocking to Reactive  (0) 2021.03.30
06 Reactive To Blocking  (1) 2021.03.30
05 Others operations  (0) 2021.03.30
04 Adapt  (0) 2021.03.30
02 Merge  (0) 2021.03.16
01 Introduction to Reactive Programming  (5) 2021.03.02