filterWhen의 차이
360
작성한 질문수 3
filter와 달리 filterWhen은 비동기로 동작한다고 했는데,
실제 예제를 돌려보면 동일하게 동기로 돌아가는 것 같습니다.
FilterWhenExample01 예제에서 종료 sleep을 10초로 늘려주고, 조건을 3_000 변경 후
public static void main(String[] args) {
Flux
.fromIterable(SampleData.coronaVaccineNames)
/** filterWhen : 데이터를 비동기적으로 filtering 하고 싶을때 사용 */
.filterWhen(vaccine -> isGreaterThan(vaccine, 3_000))
.subscribe(Logger::onNext);
TimeUtils.sleep(10000);
}
isGreaterThan 메소드에서 비동기 동작 확인을 위해 sleep 1초를 주었습니다.
public static Mono<Boolean> isGreaterThan(SampleData.CoronaVaccine coronaVaccine, int amount)
{
TimeUtils.sleep(1000);
return Mono
.just(vaccineMap.get(coronaVaccine).getT2() > amount)
.publishOn(Schedulers.parallel());
}
예상 결과로 아래 출력 5건이 1초 후 동시에 나올 것이라 생각했는데 동기와 동일하게 1초당 1건씩 출력이 됩니다.
> Task :FilterWhenExample01.main()
14:37:55.393 [main] DEBUG reactor.util.Loggers - Using Slf4j logging framework
14:37:56.494 [parallel-1] INFO com.itvillage.utils.Logger - # onNext(): Pfizer
14:37:57.501 [parallel-2] INFO com.itvillage.utils.Logger - # onNext(): AstraZeneca
14:37:58.513 [parallel-3] INFO com.itvillage.utils.Logger - # onNext(): Moderna
14:37:59.527 [parallel-4] INFO com.itvillage.utils.Logger - # onNext(): Janssen
14:38:00.537 [parallel-5] INFO com.itvillage.utils.Logger - # onNext(): Novavax
좀더 간단한 예제로 아래 코드는 동기적으로 1초당 1건씩 출력되어, filter와의 차이점을 모르겠습니다.
public static void main(String[] args) {
Flux
.range(1, 20)
.filterWhen(num -> {
TimeUtils.sleep(1000); // 예시를 위해 잠시 대기
return Mono.just(num % 2 == 0);
})
.subscribe(Logger::onNext);
}filterWhen의 특성을 정확하게 나타낼 수 있는 예제와 설명을 부탁드립니다
감사합니다~
답변 1
1
안녕하세요?
filterWhen() Operator는 사실 처음 Reactor에 입문하는 분들이 학습할 때 혼란스러울 수도 있을 것 같아서 filter() Operator만 설명드리려다가 그래도 간단한 예제로라도 설명을 해보자 라는 생각으로 강의에 추가한 Operator이긴 한데요.
아무튼 filterWhen() Operator를 어떤 경우에 사용할 수 있는지에 대해서만 간단하게 설명드리겠습니다.
Flux<String> data = Flux.just("data1", "data2", "data3", "data4");
data
.filterWhen(data -> callExternalService(data)) // 외부 서비스 호출
.subscribe(filteredData -> System.out.println("Filtered data: " + filteredData));
Mono<Boolean> callExternalService(String data) {
// 외부 서비스 호출을 Non-Blocking 호출로 시뮬레이션하는 코드
return WebClient.create()
.get()
.uri("https://aaa.com/evaluate?data=" + data)
.retrieve()
.bodyToMono(Boolean.class);
}
위 코드를 보시면, filterWhen() 내부에서 callExternalService() 메서드를 호출하고 있는데요.
callExternalService()가 호출되면 WebClient를 이용해 외부 서비스에서 각각의 data의 조건을 평가할 것입니다.
여기서 WebClient로 호출하는 외부 API(aaa.com/evaluate?data=xxx)가 Spring WebFlux 기반이라면 data1부터 data4까지 각각 Non-Blocking 형태로 호출 되어서 동기적으로 조건을 평가하는 것보다 효율성이 향상 될 겁니다.
Reactor 만으로 설명하기가 사실상 한계가 있긴한데 그래도 기본 개념은 알려드리고 싶어서 강의에서 filterWhen()에 대한 예제를 추가했었습니다. ^^;
강의에서 설명이 부족했다면 양해 부탁드리겠습니다.
나중에 Spring WebFlux 기반의 애플리케이션을 여러 개 돌려 놓고, 테스트 해보시고 결과를 눈으로 확인해 보시면 좋을 것 같아요.
감사합니다.
AWS 배포 성능테스트
0
23
1
퀴즈가 안열려요
0
22
1
조건 반복문 질문: for 문 ?
0
33
0
run() 메서드 안에 지역변수 sum을 사용한 이유
0
34
0
7강 보고 있는데요.. 글자가 너무 작아요
0
26
1
무한 depth 구현 중 CommentPath 관련 질문
0
38
1
트래잭션 전파 기본- 에 대한 개념 질문? 이렇게 생각해도 맞나요?
0
26
1
헥사고날 아키텍처와 DDD를 적용할 때, 화면에 강하게 연관된 조회 데이터를 어떻게 다루는 게 좋은지 궁금합니다.
0
56
2
정처기 26-2회. 9번 질문드립니다!
0
56
1
이론 보면서 질문이 있습니다.
0
62
2
h2 database
0
37
2
정보처리기사 실기 26년 2회 SRT 스케줄링 문제 단위 질문
0
64
2
유튜브(정보처리기사 실기 | 26년 2회 기출문제 코드 해설)
0
80
2
별첨자료 URL 들어가면 404 떠요..
0
35
2
262 정처기 실기 C언어코딩
0
34
1
정보처리기사 262 실기 Hash(해시) 질문
0
66
2
static 변수 질문입니다.
0
48
2
Request DTO에서 Entity를 생성할 때 의존성 방향을 반대로 하면 어떨까요?
0
66
2
파이썬 4강 질문입니다.
0
60
2
강의 화면이 안나와요
0
38
0
모의고사 1회 3번문제
0
77
3
window 예제 1번 request(n) * maxSize 부분을 잘 모르겠습니다.
0
66
2
onErrorResume을 사용하지 않는 모든 경우 예외 발생 시, 시퀀스는 종료되나요?
0
258
2
혹시 다음강의부터는 ppt 한번에 묶어서 올려주실수있나요?
0
365
1





