일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 11053
- Reactive stream
- 다이나믹프로그래밍
- MariaDB
- 자바
- search api
- 빗버킷
- 페이징
- 컴퓨터공학기초
- while
- 2375
- bitbucket
- event_scheduler
- 젠킨스
- jenkins
- 검색 API
- Programming
- 스프링 번역
- DP
- 알고리즘
- RESTful
- 도커
- 알고리즘다지기프로젝트
- WebFlux
- 백준
- Today
- Total
쑥로그
webflux) Reactive stream과 while문 본문
관련 개념
- Reactive stream
- Mono, Flux
목적
DB에 값이 있으면 while문을 빠져나오는 코드를 작성하자. 이로 인해 무한으로 돌 수 있는 사항은 제외
구현
webflux를 6개월 동안 다뤘지만 아직도 많이 어렵다. 기존 스프링의 동작 방식에 너무 익숙해져서 웹플럭스에 익숙해졌다고 생각할 때쯤 의외로 이상한 곳에서 또 기존으로 돌아가는 것이다. 제일 먼저 작성했던 코드는 아래와 같다.
while(check) {
println(1)
디비 가져오는 함수.flatMap {
println(2)
check = false
Mono.just(check)
}
println(3)
}
예상했던 안은, 1번 ) 1->2->3, 2번) 1->3(무한). 그런데 의외롭게도 1만 무한으로 출력되는 상황이 벌어졌다. DB를 여는 것은 비동기로 동작하기 때문에 사용 때 call을 하지 않으면 동작하지 않는다.
다음으로 작성했던 코드는 아래와 같다.
while(check) {
println(1)
runBlocking{
디비 가져오는 함수.awaitSingle()
check=false
}
println(3)
}
물론 좋지 않다. 비동기가 장점인 프레임워크에서 블로킹을 걸어버리면 쓰나마나인 프레임워크라고 생각한다. 어쨋든 동작하는지 확인해보기로 했다. 이거야말로 디비에 가서 값을 가져올 때까지 기다리지않을까? 결론은 1을 출력하고 가만히 있는 것이었다. 위에서 말한 call을 하지 않아 동작하지 않는다는 개념이 문제인 것 같았다.
Mono와 Flux를 사용하게 되면 자동으로 구독이 이루어진다고 이해하고 있었다. 스트림은 기본적으로 lazy하다. call하지 않으면 동작하지 않지만 구독(subscribe)이라는 행위를 통해 call이 이루어지는데 자동으로 구독이 이루어지니 부른다고 생각했던 것이다. mono와 flux의 구현체는 observable이다. 즉, 스트림을 만드는 아이들이다.
만약 while문 바깥 스트림에서 flatmap으로 연결해준다면 부르는 행위가 되어 동작하지 않을까 싶어 이리저리 flatmap으로 연결해보려고 했지만 while문이 가로막고있어 이어주는 부분을 찾지 못했다. 그렇다면 스트림 안에 while문으로 동작할 수 있는 함수가 있지않을까? 만약 그렇다면 while문에 가로막히지 않고 스트림으로 바깥 flatmap에 이어지지않을까?
디비 가져오는 함수().flatMap{
check = false}.repeat(5, check=check check).collectList().flatMap(Mono.just(check))
그렇게해서 성공적으로 동작하는 코드를 작성했다. 스트림 내부에서 정해진 횟수만큼 반복하는 repeat()을 사용했다. 5라고 해서 다섯번만을 수행하는건 아니고 6번까지 수행해서 로그를 출력한다.
참조
RxJava를 활용한 리액티브 프로그래밍 : RxJava의 개념과 사용법, 실무 적용까지(안드로이드 활용 사례 포함) 저 : 토마스 누르키비치, 벤 크리스텐센
싸니까 믿으니까 인터파크도서
기존의 절차적인 명령형 프로그램에 익숙한 개발자에게는 RxJava의 API가 낯설게 느껴진다. Observable/Observer와 같은 용어가 쉽게 머릿속에 들어오지 않고 혼란스러울 것이다. 예제 코드는 간결하지만 실무에서 만드는 코드에는 어떻게 적용할지 연상이 안 될 수도 있다. 이 책은 RxJava를 이해하고 적용하는 데 좋은 길잡이가 될 만하다. RxJava의 기본 개념에서 실무에 응용하는 기법까지 폭넓게 설명하고 있다. RxJava의 API가 막
book.interpark.com