Spring Framework/Spring WebFlux

[WebFlux] flatMap๊ณผ map์˜ ์ฐจ์ด

soogoori 2024. 7. 17. 09:53

Webflux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค flatMap๊ณผ map์ด ํ•ญ์ƒ ํ—ท๊ฐˆ๋ฆฌ๋ฏ€๋กœ ์ •๋ฆฌ.

 

๋‘ ๋ฉ”์„œ๋“œ๋Š” Reactive Stream API ์ผ๋ถ€๋กœ Reactor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ Mono์™€ Flux์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 
๋‹จ, flatMap์ด ๋น„๋™๊ธฐ ์ž‘์—…์— ๋” ์ ํ•ฉ !

 

 

flatMap()

์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ ์šฉ ๐Ÿ‘‰ 1:N ๋ณ€ํ™˜
  • ์›๋ณธ ์š”์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒˆ๋กœ์šด Mono ๋˜๋Š” Flux ๋ฐ˜ํ™˜
  • ๋ฐ˜ํ™˜๋œ ์ŠคํŠธ๋ฆผ์€ flatten(ํ‰ํƒ„ํ™”)๋˜์–ด ๋‹จ์ผ Mono ๋˜๋Š” Flux๋กœ ํ•ฉ์ณ์ง
@GetMapping("/user/{id}")
public Mono<User> getUser(@PathVariable String id) {
    return userRepository.findById(id)  // returns Mono<User>
                         .flatMap(user -> {
                             return Mono.just(user)
                                        .map(User::getName)
                                        .flatMap(name -> someOtherService.process(name));
                         });
}

๐Ÿ‘‰ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด์–ด๋ฐ›์•„์•ผํ•  ๋•Œ ์œ ์šฉ

  • userRespository.findById(id) ๐Ÿ‘‰ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ด
  • someOtherService.process(name) ๐Ÿ‘‰ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰

 

 

map()

์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋™๊ธฐ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ ์šฉ ๐Ÿ‘‰ 1:1 ๋ณ€ํ™˜
  • ์›๋ณธ ์š”์†Œ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒˆ๋กœ์šด Mono ๋˜๋Š” Flux ๋ฐ˜ํ™˜
  • blocking ์ž‘์—… ์—†์ด ๊ฐ„๋‹จํ•œ ๋ณ€ํ™˜ ์‹œ ์‚ฌ์šฉ ๐Ÿ‘‰ ๋‹จ์ˆœ ๋ณ€ํ™˜ ์ž‘์—… 
@GetMapping("/hello")
public Mono<String> hello() {
    return Mono.just("hello")
               .map(value -> value.toUpperCase());
}

 

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ 

https://www.baeldung.com/java-reactor-map-flatmap

https://luvstudy.tistory.com/95