해결된 질문
작성
·
40
·
수정됨
0
안녕하세요.
강의 잘 보고 있습니다. 마지막에 와서 의문이 드는게 있어 질문 남겨봅니다.
첫 번째 예제 TestPublisherTestExample01
에서는 source.next
로 테스트를 진행했고,
세 번째 예제 TestPublisherTestExample03
에서는 source.emit
으로 테스트를 진행했는데요.
emit의 경우 내부적으로 complete()을 통해 signal을 발생 시키는 것으로 이해했습니다. 그런데, 말씀대로라면 첫 번째 테스트에서 expectComplete()
이 통과하는게 이해가 가지 않아서요.
둘의 차이는 결국 Flux를 create 해주는 방식에 있는 것 같은데, 첫 번째 예제의 경우 zipWith을 통해 complete이 발생하는 걸까요? 잘 감이 오지 않는데, 설명해주시면 감사하겠습니다!
답변 2
0
안녕하세요? 어제 일찍 잠이 드는 바람에 답변이 좀 늦어졌네요. 양해 부탁드리겠습니다. ^^;
우선 아래 예제를 실행시켜 보시면 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이 발생합니다.
0
안녕하세요, 인프런 AI 인턴입니다. azsxd34님께서 질문하신 내용에 대해 도움을 드리겠습니다.
source.next
와 source.emit
의 차이에 대해 궁금하셨군요. 두 방법은 주로 테스트 환경에서 Flux나 Mono 같은 리액티브 스트림에 이벤트를 수동으로 주입하기 위해 사용됩니다.
source.next: 이 메소드는 명시적으로 지정한 다음 값을 Flux에 전달합니다. 즉, 구독자에게 해당 값을 보낼 수 있도록 수동으로 지정하는 것입니다. 주로 다음 값을 지정하고 추가적인 신호(예: complete, error 등)를 발생시키지 않으므로, 명시적으로 완료 신호를 보내지 않으면 테스트에서는 무한 대기 상태일 수 있습니다.
source.emit: 이 메서드는 내부적으로 complete()
을 호출하여 시퀀스를 완료하는 신호를 보냅니다. 그래서 source.emit
을 사용하면, 지정한 값 후에 자동으로 스트림이 완료되기 때문에 expectComplete()
와 같은 테스트 구문이 자연스럽게 통과하게 됩니다. 이는 next
가 완전히 전송되면 시퀀스가 종료가 보장된다는 점에서 다릅니다.
따라서 두 방법의 차이는 주로 시퀀스의 완료 시점에 있습니다. next
를 사용해 값을 보내고 별도로 완료 신호를 보내지 않으면, expectComplete()
는 실패할 것입니다. 반면, emit
은 값을 보내고 자동으로 완료 신호를 보내기 때문에, expectComplete()
가 통과하게 됩니다.
이러한 내용에 대한 더 자세한 설명은 강의 또는 인프런의 다른 질문 게시판에서도 확인하실 수 있습니다. 아래 유사한 질문을 참고하세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
친절히 설명해주셔서 감사합니다. 많은 도움 되었습니다!