flatMap vs Map...(3) 논블록킹 vs 블록킹
몇번을 같은 주제로 끄적끄적 했던 녀석들이다.
동일한 주제로..3번째다.
늘 곱씹자!!
flatMap vs map
지나가는 스트림, 즉 흘러가고 있는 데이터의 물결에서 어떤 가공을 하려면 ? 1년동안 주구장창 쓰고 있는데도..아.. 잘 모르고 쓰고 있구나 싶어서 다시 한번 이해도를 높이기 위한 고민을 시작
hcnmy.tistory.com
[리액티브] map vs flatMap 와우..진짜.
map 구독이 안 되고Flux.just("SMS", "EMAIL").map(it -> userRoleRepository.save(UserRole.builder().userUid(userUid).type("MARKETING") .roleName(it).build())).subscribeOn(Schedulers.boundedElastic()).subscribe(); flatMap은 구독이 된다.Flux.just
hcnmy.tistory.com
결론!
flatMap과 Map은
일반객체로 처리할때는 동일하다!!!!!!
비동기 작업을 할 때는 반드시 flatMap으로 처리해야 한다.
그럼에도 쉽게 와 닿지 않는닷. ㅋㅋ
1번(flatMap)은 쌉커밋이 되지만 2번(map)은 커밋이 안 된다.
1.. flatMap
fun addPointBenefit(formId: Long, userId: String){
..
.filter{ it.pointBenefit > 0 }
.flatMap {
ServiceUtils.getProductService().save( .... )
}.subscribe()
..
}
2.. map
fun addPointBenefit(formId: Long, userId: String){
..
.filter{ it.pointBenefit > 0 }
.map {
ServiceUtils.getProductService().save( .... )
}.subscribe()
..
}
두 번째 차이가... 논블록킹 처리닷.!!
// 각각 3초 걸리기 때문에 9초
Flux.just("1", "2", "3")
.map(it ->
// 3초 수행
)
).subscribe();
// 난블록킹이기 때문에 3초
Flux.just("1", "2", "3")
.flatMap(it ->
// 3초 수행
)
).subscribe();
응용할 수 있는 부분을 보자
게시글 20개를 가져와.. 특정 비니지스 로직에서 처리한다고 했을 때
기존에는 for문을 돌려서 처리했겠쥬.
근데 그것을 flatMap으로 병렬 처리 한다는 거다.
그래서 두번째 인자로 병렬 처리할 개수도 지정할 수 있다.
// 난블록킹이기 때문에 3초
Flux.just("1", "2", "3")
.flatMap(it ->
// 3초 수행
, 3) // 병렬 처리 개수
).subscribe();
리액티브 스타일로 하면 쉽게 병렬 처리가 가능하다.
프론트에서 비동기로 여러개의 EndPoint를 호출 하는거나
하나의 Endpoint에서 논블로킹 처리해서 응답을 주나 동일하겠다. (병렬처리해서)
지금 이말을 이해 했으면 어느정도 동기/비동기 ... 블록킹/논블록킹...개념을 이해 한다고 본다.
내 똥머리에서는 동일한 개념인데 시점의 차이라고 본다.
- 갑의 입장에서 요청 (클라이언트 SIDE)
두 개의 API(EndPoint)를 동시(병렬)에 요청을 쏜다. (비동기) - 막무가내 갑
하나씩...하나씩... 쏜다.. (동기) - 친절한 갑
- 을의 입장에서 처리(서버SIDE)
동시(병렬)로 처리한다. (논 블록킹) - 팀내 에이스
step by step으로 차례차례 처리한다.(블록킹) - 답답이!!
개념이 밥먹여 주지 않는다.. 대에에충 하자.