๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Study/Java

[TIL] ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

by hong- 2022. 8. 10.

๐Ÿ™๐Ÿป ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  - ์ „ํ†ต์ ์ธ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹(ex. Spring MVC) ๊ณผ ๋‹ฌ๋ฆฌ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉ

  ๐Ÿ’ก ๋ฆฌ์•กํ‹ฐ๋ธŒ : Reactive
    - ๋ฐ˜์‘์„ ํ•˜๋Š”, ๋ฐ˜์‘์„ ๋ณด์ด๋Š”

๐Ÿ“ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ : Reactive System

   - ๋ฐ˜์‘์„ ์ž˜ํ•˜๋Š” ์‹œ์Šคํ…œ

   - ์ฆ‰, ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋ฐ˜์‘์„ ์ž˜ํ•˜๋Š” ์‹œ์Šคํ…œ

   - ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™” ํ• ์ˆ˜ ์žˆ๋„๋ก ์š”์ฒญ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ ๋˜์ง€ ์•Š๊ฒŒํ•จ์œผ๋กœ์จ 

      ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ์‹œ์Šคํ…œ


  โ–ช๏ธ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ ํŠน์ง•

  โ—ฝ๏ธ MEANS

    - ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ˆ˜๋‹จ

     ๐Ÿ”น Message Driven : ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ†ต์‹ 

      - ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ๊ฐ„์— ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ์œ ์ง€ํ•จ

      - Non-Blocking ํ†ต์‹ ๊ณผ ์œ ๊ธฐ์ ์ธ ๊ด€๊ณ„๋ฅผ๋งบ๊ณ  ์žˆ์œผ๋ฉฐ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋žจ์€ Non-Blocking ํ†ต์‹ ์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ


  โ—ฝ๏ธ FORM

    - ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ํ†ตํ•ด ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์ด ์–ด๋–ค ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ๋กœ ํ˜•์„ฑ ๋˜๋Š”์ง€๋ฅผ ์˜๋ฏธํ•จ

     ๐Ÿ”น Elastic : ํƒ„๋ ฅ์žˆ๋Š”

      - ์‹œ์Šคํ…œ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋Ÿ‰์ด ์ ๊ฑฐ๋‚˜ ๋งŽ๊ฑฐ๋‚˜์— ์ƒ๊ด€์—†์ด ์ผ์ •ํ•œ ์‘๋‹ต์„ ์œ ์ง€

     ๐Ÿ”น Resilient : ํƒ„๋ ฅ

      - ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๋ถ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ


  โ—ฝ๏ธ VALUE

    - ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ๊ฐ€์น˜๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์˜์—ญ

     ๐Ÿ”น Responsive

      - ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ์ฆ‰๊ฐ์ ์œผ๋กœ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธ

     ๐Ÿ”น Maintainable

      - ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฆ‰๊ฐ์ ์ธ ์‘๋‹ต์ด ์ง€์†๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

     ๐Ÿ”น Extensible

      - ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ž๋™์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ์ถ•์†Œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธ


๐Ÿ“ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ : Reactive Programming

   - ๋ฆฌ์•กํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์˜๋ฏธํ•จ


  โ–ช๏ธ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŠน์ง•

  โ—ฝ๏ธ Declarative Programming Paradigm : ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    - ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ชจ๋ธ

  โ—ฝ๏ธ Data Streams and The Propagation of Change : ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ๊ณผ ๋ณ€ํ™”์˜ ์ „ํŒŒ

    - ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์€ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ

    - ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋ฅผ ๋ฐ์ดํ„ฐ์— ์–ด๋– ํ•œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•จ์„ ์˜๋ฏธ

  โ—ฝ๏ธ Automatic Propagation of The Changed Data Flow : ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ž๋™ ์ „ํŒŒ

    - ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๋กœ ๋ณด๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ „๋‹ฌํ•จ


๐Ÿ“ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ : Reactive Streams

  - ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ํ‘œ์ค€์‚ฌํ•ญ

 โ—ฝ๏ธ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ์—์„œ ์‚ฌ์–‘์œผ๋กœ ์ •์˜๋œ ๊ตฌ์„ฑ์š”์†Œ

  ๐Ÿ”น Publisher

public interface Publisher<T> {
    public void subscribe(Subscriber <? super T> s);
 }

  - ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์—ญํ•  = emit ํ•œ๋‹ค !

  - subscribe( )๋ผ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ → ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋˜๋Š” Subscribe๊ฐ€ Publisher๋กœ๋ถ€ํ„ฐ

     ๋‚ด๋ณด๋‚ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ์—ญํ• ์„ ํ•จ

   * subscribe( )

   - Publisher๊ฐ€ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ตฌ๋…์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

   - ์ผ๋ฐ˜์ ์œผ๋กœ subscribe( )๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด Publisher๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์‹œ์ž‘๋˜์ง€ ์•Š์Œ


  ๐Ÿ”นSubscriber

public interface Subscriber<T> {
    public void onSubscribe(Subscription s);
    public void onNext(T t);
    public void onError(Throwable t);
    public void onComplete();
}

  - Publisher๋กœ ๋ถ€ํ„ฐ ๋‚ด๋ณด๋‚ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ์—ญํ• 

  - ๋„ค ๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ

   โ‘  onSubscribe(Subscription s)

     - ๊ตฌ๋…์ด ์‹œ์ž‘๋˜๋Š” ์‹œ์ ์— ํ˜ธ์ถœ

     - onSubscribe( )๋‚ด์—์„œ Publisher์—๊ฒŒ ์š”์ฒญํ•  ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋… ํ•ด์ง€ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

   โ‘ก onNext(T t)

     - Publisher๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ emitํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋ฉฐ emit๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„์„œ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Œ

   โ‘ข onError(Throwable t)

     - Publisher๋กœ๋ถ€ํ„ฐ emit๋œ ๋ฐ์ดํ„ฐ๊ฐ€ Subscriber์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ํ˜ธ์ถœ๋จ

   โ‘ฃ onComplete( )

     - Publisher๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ emit ํ•˜๋Š” ๊ณผ์ •์ด ์ข…๋ฃŒ๋  ๊ฒฝ์šฐ ํ˜ธ์ถœ

     - ๋ฐ์ดํ„ฐ์˜ emit์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํ›„ ์ฒ˜๋ฆฌํ•ด์•ผ ๋  ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด onComplete๋‚ด์—์„œ ์ˆ˜ํ–‰


  ๐Ÿ”น Subscription

public interface Subscription{
   public void request(long n);
   public void cancel();
}

  - Subscriber์˜ ๊ตฌ๋… ์ž์ฒด๋ฅผ ํ‘œํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

  โ‘  request(long n)

    - Publisher๊ฐ€ emitํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์š”์ฒญ 

  โ‘ก cancel( )

    - ๊ตฌ๋…์„ ํ•ด์ง€ํ•˜๋Š” ์—ญํ• 

    - ๊ตฌ๋… ํ•ด์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Publisher๋Š” ๋”์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ emit ํ•˜์ง€ ์•Š์Œ

  ๐Ÿ”น Processor

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}

 

  - Subscriber ์ธํ„ฐํŽ˜์ด์Šค์™€ Publisher ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†

      → Publisher์™€ Subscriber์˜ ์—ญํ• ์„ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์„ ๊ฐ€์ง


 โ—ฝ๏ธ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ ๊ตฌํ˜„์ฒด

  ๐Ÿ”ธ Project Reactor

   - ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด

   - ์Šคํ”„๋ง๊ณผ ๊ถํ•ฉ์ด ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ ๊ตฌํ˜„์ฒด

   - Spring 5์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์Šคํƒ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ Spring Reactive Application ๊ตฌํ˜„์— ์žˆ์–ด ํ•ต์‹ฌ์ ์ธ ์—ญํ•  ๋‹ด๋‹น

  ๐Ÿ”ธ Rx Java

   - .NET ๊ธฐ๋ฐ˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„ทํ”Œ๋ฆญ์Šค์—์„œ Java ์–ธ์–ด๋กœ ํฌํŒ…ํ•œ JVM ๊ธฐ๋ฐ˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

   - 2.0 ๋ถ€ํ„ฐ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ ํ‘œ์ค€ ์‚ฌ์–‘์„ ์ค€์ˆ˜

   - RX๋Š” Reactive Extension์˜ ์ค„์ž„๋ง → ํŠน์ • ์–ธ์–ด์—์„œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ๋ฅผ ๊ตฌํ˜„ํ•œ ๋ณ„๋„์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ

  ๐Ÿ”ธ Java Flow API

   -  ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ ํ‘œ์ค€ ์‚ฌ์–‘์„ Java ์•ˆ์— ํฌํ•จ ์‹œํ‚จ ๊ตฌ์กฐ

   -  ๋‹ค์–‘ํ•œ ๋ฒค๋”๋“ค์ด JDBC API๋ฅผ ๊ตฌํ˜„ํ•œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก SPI์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ

       Flow API ์—ญ์‹œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ ์‚ฌ์–‘์„ ๊ตฌํ˜„ํ•œ ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒปใ„น์— ๋Œ€ํ•œ SPI ์—ญํ• ์„ ํ•จ

  ๐Ÿ”ธ ๊ธฐํƒ€ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ™•์žฅ : Reactive Extension

   -  ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ RxJava, RxJS, RxAndroid, RxKotlin, RxPython, RxScala ๋“ฑ


 ๐Ÿ’ก ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ vs ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  ๐ŸŒŸ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

public class test {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(1, 5, 6, 7, 8, 9, 13);
        int sum = 0;
        
        for(int number : numbers) {
           if(number > 4 && (number % 2 == 0)) {
               sum += number;
           }
        }
        System.out.println(sum);
     }
 }
           
//numbers๋ผ๋Š” ๋ฆฌ์ŠคํŠธ ์† ์ˆซ์ž๋“ค์—์„œ 4๋ณด๋‹ค ํฐ ์ง์ˆ˜์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ

  - List์— ํฌํ•จ๋œ ์ˆซ์ž๋“ค์„ for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผ → if๋ฌธ์œผ๋กœ ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ์ˆซ์ž๋งŒ sum ๋ณ€์ˆ˜์— ๋”ํ•˜๊ธฐ

  - ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋กœ์ง๋“ค์ด ์ฝ”๋“œ ์•ˆ์— ๊ทธ๋Œ€๋กœ ๋“œ๋Ÿฌ๋‚จ


  ๐ŸŒŸ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

public class test {
   public static void main(String[] args) {
      List<Integer> numbers = List.of(1, 3, 5, 6, 7, 8, 9, 13);
      
      int sum = 
                number.stream()
                      .filter(number -> number > 4 && (number % 2 == 0))
                      .mapToInt(number -> number)
                      .sum();
                      
      System.out.println("# ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: " + sum);
   }
}

 - ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์„ ์–ธ๋งŒ ํ•˜๋ฉฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Œ

 - Java์—์„œ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ ์ ˆํ•œ ์˜ˆ๋Š” Stream !

 - ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋‹ค๋ฆ„

 - Java Stream API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ƒ์— ๋ณด์ด์ง€ ์•Š๋Š” ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๊ฐ€ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์—์„œ ์‚ฌ์šฉํ•˜๋Š” for๋ฌธ ๋Œ€์ฒด

 - filter( ) ๋ฉ”์„œ๋“œ๊ฐ€ if๋ฌธ์„ ๋Œ€์‹ ํ•ด์„œ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ์ˆซ์ž ํ•„ํ„ฐ๋ง

 - Stream ์ฝ”๋“œ๋Š” stream() → filter( )  →  mapToInt( ) → sum( ) ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹˜

      → ์ตœ์ข… ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์•ž์—์„œ ์ž‘์„ฑํ•œ ๋ฉ”์„œ๋“œ ์ฒด์ธ๋“ค์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ

    = ์ค‘๊ฐ„ ์—ฐ์‚ฐ์—๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ•ด๋‹ฌ๋ผ๊ณ  ์„ ์–ธ(์š”์ฒญ)ํ•˜๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹๋งŒ ๋„˜๊ฒจ์ฃผ๊ณ 

       ์ตœ์ข… ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋  ๋•Œ ๋น„๋กœ์†Œ ์ „๋‹ฌ ๋ฐ›์€ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘

 ๐Ÿ‘‰๐Ÿป ์ฆ‰, ํ•„์š”ํ•œ ๋™์ž‘๋“ค์„ ๋žŒ๋‹ค ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜(์„ ์–ธ)ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์ˆ˜ํ–‰์€ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ ์ฒด์ธ์— ์œ„์ž„


๐Ÿ“ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌ์กฐ

public class Example {
   public static void main(String[] args) {
      (1) Publisher์˜ ์—ญํ• 
      Mono<String> mono = Mono.just("Hello, Reactive");
      
      (2) Subscribe์˜ ์—ญํ• 
      mono.subscribe(message -> System.out.pintln(message));
   }
}
public class Example2 {
   public static void main(String[] args) {
      Mono
          .just("Hello, Reactive")
          .subscribe(message -> System.out.println(message));
   }
}
//ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“ฃ ์ฒด์ธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„

 * Publisher๋Š” ๋ฐ์ดํ„ฐ๋ฅผ emit(๋‚ด๋ณด๋‚ด๋Š”) ์—ญํ• 

 - Publisher์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์€ Mono

 * Subscriber์€ Publisher๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์†Œ๋น„ํ•˜๋Š” ์—ญํ• 

 - Subscriver์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์€ subscribe( ) ๋‚ด๋ถ€์— ์ •์˜๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹์ธ message -> System.out.println(message)


๐Ÿ“ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด

public class Example3 {
   public static void main(String[] args) {
       Flux
           .fromIterable(List.of(1, 3, 6, 7, 8, 11))
           .filter(number -> number > 4 && (number % 2 == 0))
           .reduce( (n1, n2) -> n1 + n2 )
           .subscribe(System.out::println);
    }
 }

๐Ÿ”ธ Publisher

  - ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์ฃผ์ฒด : Flux

๐Ÿ”ธ Emit

  - Publisher๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ

๐Ÿ”ธ Subscriber

  - Publisher๊ฐ€ emitํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„์„œ ์†Œ๋น„ํ•˜๋Š” ์ฃผ์ฒด

  - System.out::println์ด subscriber์— ํ•ด๋‹น

๐Ÿ”ธ Subscribe

  - ๊ตฌ๋…

  - subscribe( )๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ตฌ๋…์„ ํ•˜๋Š” ๊ฒƒ์ด ๋จ

๐Ÿ”ธ Signal

  - Publisher๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ

  - ์ฝ”๋“œ์—์„œ subscibe( )๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด Publisher์ธ Flux๋Š” ์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ emit ํ•จ

     → ์ด๋•Œ, ์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ emit ํ•˜๋Š” ์ž์ฒด๋ฅผ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ

          ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ Signal์„ ์ „์†กํ•œ๋‹ค๊ณ  ํ‘œํ˜„

๐Ÿ”ธ Operator

  - ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ

  - fromIterable( ), filter( ), reduce( ) ๋“ฑ์„ Operator๋ผ๊ณ  ํ•จ

๐Ÿ”ธ Sequence

  - Operator ์ฒด์ธ์œผ๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„

  - Oprerator๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ํ•˜๋‚˜์˜ Sequence๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋จ

๐Ÿ”ธ Upstream / Downstream

  - Sequence ์ƒ์˜ ํŠน์ • Operator๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์ชฝ์˜ Sequence ์ผ๋ถ€๋ฅผ Upstream์ด๋ผ๊ณ  ํ•˜๋ฉฐ 

     ์•„๋ž˜์ชฝ Sequence ์ผ๋ถ€๋ฅผ Downstream์ด๋ผ๊ณ  ํ‘œํ˜„

  - filter()๋ผ๋Š” Operator๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์ชฝ์˜ fromIterable์€ Upstream, ์•„๋ž˜์ชฝ์˜ reduce๋Š” Downstream์ด ๋จ

'Study > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TIL] Project Reactor  (0) 2022.08.11
[TIL] ์šด์˜ ์ „๋žต (2)  (0) 2022.08.09
[TIL] ์šด์˜ ์ „๋žต (1)  (0) 2022.08.09
[TIL] Github Actions  (0) 2022.08.08
[TIL] ๋ฐฐํฌ ์ž๋™ํ™”  (0) 2022.08.08