인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

azsxd34님의 프로필 이미지
azsxd34

작성한 질문수

Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부

TestPublisher와 PublisherProbe을 이용한 Testing

source.next와 source.emit의 차이에 대한 질문입니다.

해결된 질문

작성

·

38

·

수정됨

0

안녕하세요.

강의 잘 보고 있습니다. 마지막에 와서 의문이 드는게 있어 질문 남겨봅니다.

첫 번째 예제 TestPublisherTestExample01에서는 source.next로 테스트를 진행했고,

세 번째 예제 TestPublisherTestExample03에서는 source.emit으로 테스트를 진행했는데요.

emit의 경우 내부적으로 complete()을 통해 signal을 발생 시키는 것으로 이해했습니다. 그런데, 말씀대로라면 첫 번째 테스트에서 expectComplete()이 통과하는게 이해가 가지 않아서요.

둘의 차이는 결국 Flux를 create 해주는 방식에 있는 것 같은데, 첫 번째 예제의 경우 zipWith을 통해 complete이 발생하는 걸까요? 잘 감이 오지 않는데, 설명해주시면 감사하겠습니다!

답변 2

0

Kevin님의 프로필 이미지
Kevin
지식공유자

안녕하세요? 어제 일찍 잠이 드는 바람에 답변이 좀 늦어졌네요. 양해 부탁드리겠습니다. ^^;

 

우선 아래 예제를 실행시켜 보시면 next() 호출 후에 onComplete signal이 발생하지 않기 때문에 Sequence가 종료 되지 않고 무한 대기 상태가 되는걸 확인하실 수가 있는데요.

 

TestPublisher<Integer> source = TestPublisher.create();

StepVerifier
         .create(source.flux())
         .expectSubscription()
         .then(() -> source.next(2, 4, 6, 8, 10))
         .expectNext(2, 4, 6, 8, 10)
         .expectComplete()
         .verify();

 

말씀하셨던대로 TestPublisherTestExample01에서 expectComplete()이 통과하는 이유는 zipWith()를 사용했기 때문입니다.

 

아래 그림을 보시면 zipWith()의 파라미터로 전달한 Flux에서 데이터 emit이 끝나면 onComplete signal이 발생하는데 zipWith()의 경우 둘 중 하나의 Sequenc가 종료될 경우 최종적으로 합쳐진 Source Flux에서 onComplete signal이 발생합니다.

K-035.png

 

azsxd34님의 프로필 이미지
azsxd34
질문자

친절히 설명해주셔서 감사합니다. 많은 도움 되었습니다!

0

안녕하세요, 인프런 AI 인턴입니다. azsxd34님께서 질문하신 내용에 대해 도움을 드리겠습니다.

source.nextsource.emit의 차이에 대해 궁금하셨군요. 두 방법은 주로 테스트 환경에서 Flux나 Mono 같은 리액티브 스트림에 이벤트를 수동으로 주입하기 위해 사용됩니다.

  1. source.next: 이 메소드는 명시적으로 지정한 다음 값을 Flux에 전달합니다. 즉, 구독자에게 해당 값을 보낼 수 있도록 수동으로 지정하는 것입니다. 주로 다음 값을 지정하고 추가적인 신호(예: complete, error 등)를 발생시키지 않으므로, 명시적으로 완료 신호를 보내지 않으면 테스트에서는 무한 대기 상태일 수 있습니다.

  2. source.emit: 이 메서드는 내부적으로 complete()을 호출하여 시퀀스를 완료하는 신호를 보냅니다. 그래서 source.emit을 사용하면, 지정한 값 후에 자동으로 스트림이 완료되기 때문에 expectComplete()와 같은 테스트 구문이 자연스럽게 통과하게 됩니다. 이는 next가 완전히 전송되면 시퀀스가 종료가 보장된다는 점에서 다릅니다.

따라서 두 방법의 차이는 주로 시퀀스의 완료 시점에 있습니다. next를 사용해 값을 보내고 별도로 완료 신호를 보내지 않으면, expectComplete()는 실패할 것입니다. 반면, emit은 값을 보내고 자동으로 완료 신호를 보내기 때문에, expectComplete()가 통과하게 됩니다.

이러한 내용에 대한 더 자세한 설명은 강의 또는 인프런의 다른 질문 게시판에서도 확인하실 수 있습니다. 아래 유사한 질문을 참고하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

azsxd34님의 프로필 이미지
azsxd34

작성한 질문수

질문하기