1. 개요
Spring WebFlux 의 도입으로 우리는 반응형 논블로킹 애플리케이션을 작성할 수 있는 또 다른 강력한 도구를 갖게 되었습니다. 이 기술을 사용하는 것이 이전보다 훨씬 쉬워 졌지만 Spring WebFlux에서 반응 시퀀스를 디버깅하는 것은 상당히 번거로울 수 있습니다 .
이 빠른 사용방법(예제)에서는 비동기 시퀀스에서 이벤트를 쉽게 기록하는 방법과 몇 가지 간단한 실수를 피하는 방법을 살펴봅니다.
2. 메이븐 의존성
반응형 스트림을 생성할 수 있도록 프로젝트에 Spring WebFlux 의존성을 추가해 보겠습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Maven Central에서 최신 spring-boot-starter-webflux 의존성을 얻을 수 있습니다.
3. 반응형 스트림 만들기
시작하려면 Flux 를 사용 하여 반응형 스트림을 만들고 log() 메서드를 사용하여 로깅을 활성화해 보겠습니다.
Flux<Integer> reactiveStream = Flux.range(1, 5).log();
다음으로 생성된 값을 사용하기 위해 구독합니다.
reactiveStream.subscribe();
4. 반응성 스트림 로깅
위의 애플리케이션을 실행한 후 로거가 작동하는 것을 볼 수 있습니다.
2018-11-11 22:37:04 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:37:04 INFO | request(unbounded)
2018-11-11 22:37:04 INFO | onNext(1)
2018-11-11 22:37:04 INFO | onNext(2)
2018-11-11 22:37:04 INFO | onNext(3)
2018-11-11 22:37:04 INFO | onNext(4)
2018-11-11 22:37:04 INFO | onNext(5)
2018-11-11 22:37:04 INFO | onComplete()
스트림에서 발생한 모든 이벤트를 볼 수 있습니다. 5개의 값이 방출된 후 onComplete() 이벤트로 스트림이 종료되었습니다.
5. 고급 로깅 시나리오
더 흥미로운 시나리오를 보기 위해 응용 프로그램을 수정할 수 있습니다. 특정 개수의 이벤트만 제공하도록 스트림에 지시하는 take() 를 Flux 에 추가해 보겠습니다 .
Flux<Integer> reactiveStream = Flux.range(1, 5).log().take(3);
코드를 실행하면 다음과 같은 출력이 표시됩니다.
2018-11-11 22:45:35 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:45:35 INFO | request(unbounded)
2018-11-11 22:45:35 INFO | onNext(1)
2018-11-11 22:45:35 INFO | onNext(2)
2018-11-11 22:45:35 INFO | onNext(3)
2018-11-11 22:45:35 INFO | cancel()
보시다시피 take() 는 세 개의 이벤트를 방출한 후 스트림을 취소했습니다.
스트림에서 log() 의 위치 는 매우 중요 합니다. take( ) 뒤에 log() 를 배치하면 어떻게 다른 출력이 생성 되는지 살펴보겠습니다 .
Flux<Integer> reactiveStream = Flux.range(1, 5).take(3).log();
그리고 출력:
2018-11-11 22:49:23 INFO | onSubscribe([Fuseable] FluxTake.TakeFuseableSubscriber)
2018-11-11 22:49:23 INFO | request(unbounded)
2018-11-11 22:49:23 INFO | onNext(1)
2018-11-11 22:49:23 INFO | onNext(2)
2018-11-11 22:49:23 INFO | onNext(3)
2018-11-11 22:49:23 INFO | onComplete()
보시다시피 관찰 지점을 변경하면 출력이 변경되었습니다. 이제 스트림이 세 개의 이벤트를 생성했지만 cancel() 대신 onComplete() 가 표시 됩니다. 이는 이 메서드에서 요청한 것 대신 take() 를 사용한 출력을 관찰하기 때문 입니다.
6. 결론
이 빠른 기사에서는 내장 log() 메서드를 사용하여 반응형 스트림을 기록하는 방법을 살펴보았습니다.
그리고 항상 그렇듯이 위 예제의 소스 코드는 GitHub 에서 찾을 수 있습니다 .