- 리μ‘ν°λΈ νλ‘κ·Έλλ° μ΄ν΄νκΈ°
- νλ‘μ νΈ λ¦¬μ‘ν°
- 리μ‘ν°λΈ λ°μ΄ν° μ€νΌλ μ΄μ
μ ν리μΌμ΄μ μ½λλ₯Ό κ°λ°ν λλ λͺ λ Ήνκ³Ό **리μ‘ν°λΈ(λ°μν)**μΌλ‘ λλ μ μλ€.
-
λͺ λ Ήν
μμ°¨μ μΌλ‘ μ°μλ μμ μ ν λ²μ νλμ© μ€ν
-
리μ‘ν°λΈ
μμ λ€μ΄ λ³λ ¬μ μΌλ‘ μ€ν
λ°μ΄ν°λ₯Ό λΆλΆμ μΌλ‘ μ²λ¦¬ κ°λ₯νλ©° μΌμ λΆλΆλ§ λ€μ μμ μΌλ‘ λκΉ, κΈ°μ‘΄μ λ¨μμλ λ°μ΄ν°λ κ³μν΄μ μμ
μ΄λ¬ν 리μ‘ν°λΈ νλ‘κ·Έλλ°μ λͺ
λ Ήν νλ‘κ·Έλ¨μ λμμ΄ λλ ν¨λ¬λ€μμ΄λ€.
κΈ°μ‘΄ λͺ
λ Ήν νλ‘κ·Έλλ°μ κ²½μ°, λΈλ‘νΉμ΄ λλ μμ
(μ격 DB μ μ, νμΌ μ
μΆλ ₯ λ±)μ΄ μ‘΄μ¬ ν λ μ€λ λ λλΉκ° λ°μνλ€. λ λ€μ€ μ€λ λλ₯Ό μ¬μ©νμ λ λμμ± λ¬Έμ κ° λ°μνκΈ°μ κ΄λ¦¬νκΈ°λ μ΄λ €μμ§λ€.
μ΄μ λ°ν΄ 리μ‘ν°λΈ νλ‘κ·Έλλ°μ μμ
μ λ¨κ³λ₯Ό λνλ΄λ κ²μ΄ μλ λ°μ΄ν°κ° νλ¬κ°λ νμ΄νλΌμΈ νΉμ μ€νΈλ¦Όμ ν¬ν¨νλ€. κ·Έλ¦¬κ³ λ°μ΄ν° μ 체λ₯Ό μ¬μ©ν μ μμ λκΉμ§ κΈ°λ€λ¦¬λ κ²μ΄ μλ λ°μ΄ν°κ° μ‘΄μ¬ν λλ§λ€ μ²λ¦¬κ° λλ€.
μμ λ³Έ 리μ‘ν°λΈ μ€νΈλ¦Όμ κ²½μ° λ°μ΄ν°κ° μ‘΄μ¬ν λλ§λ€ μ²λ¦¬κ° λλ€λ νΉμ§μ΄ μμλ€. λ§μ½, μ²λ¦¬ν μ μλ μλ³΄λ€ μ λ¬λλ λ°μ΄ν°κ° λ§λ€λ©΄ λΉμ°ν ννλλ€. λ°λΌμ 리μ‘ν°λΈ νλ‘κ·Έλλ°μμλ **λ°± νλ μ (Backpressure)**λΌλ μ²λ¦¬ν μ μλ λ°μ΄ν°μ μμ μ ν΄μ£Όλ μλ¨μ ν΅ν΄ λ°μ΄ν°μ νμ£Όλ₯Ό λ§λλ€.
리μ‘ν°λΈ μ€νΈλ¦Όμ μ΄ν΄λ³΄λ©΄ 4κ°μ μΈν°νμ΄μ€λ‘ μμ½μ΄ κ°λ₯νλ€.
-
λ°νμ(Publisher)
public interface Publisher<T> { void subscribe(Subscriber<? super T> subscriber); }
λ°νμ μΈν°νμ΄μ€μλ
subscribe()
λ©μλλ₯Ό ν΅ν΄ ꡬλ μκ° λ°νμλ₯Ό ꡬλ ν μ μλλ‘ νλ€. ꡬλ μ΄ μ μ²μ΄ λλ€λ©΄ λ°νμλ‘λΆν° μ΄λ²€νΈλ₯Ό μμ ν μ μμΌλ©°, μ΄ μ΄λ²€νΈλ€μ ꡬλ μ μΈν°νμ΄μ€μ λ©μλλ₯Ό ν΅ν΄ μ μ‘λλ€. -
ꡬλ μ(Subscriber)
public interface Subscriber<T> { void onSubscribe(Subscription sub); void onNext(T item); void onError(Throwable ex); void onComplete(); }
ꡬλ μκ° μμ νλ 첫 λ²μ§Έ μ΄λ²€νΈλ
onSubscribe()
λ©μλμ νΈμΆμ ν΅ν΄ μ΄λ£¨μ΄μ§λ€. μ¦, λ°νμκ° μ λ©μλλ₯Ό νΈμΆνλ©΄μ ꡬλ μ κ΄λ¦¬ν μ μλ κ°μ²΄μΈ Subscriptionμ λκΈ΄λ€.ꡬλ μλ ꡬλ κ°μ²΄μ
request()
λ©μλλ₯Ό νΈμΆνμ¬ λ°μ΄ν°λ₯Ό μμ²νκ±°λcancel()
λ©μλλ₯Ό ν΅ν΄ ꡬλ μ μ·¨μν μ μλ€.request()
λ©μλ μΈμλ‘ long νμ μ κ°μ λ겨 λ°λλ° μ΄κ° λ°λ‘ λ°± νλ μ μ΄λ€.ꡬλ μμ λ°μ΄ν° μμ²μ΄ μλ£λλ€λ©΄ λ°μ΄ν°κ° μ€νΈλ¦Όμ ν΅ν΄ μ λ¬λλλ° μ΄λ,
onNext()
λ©μλκ° νΈμΆλλ€.(λ°νμ β ꡬλ μ) λ§μ½, μλ¬κ° λ°μνλ€λ©΄onError()
κ° νΈμΆλλ€. κ·Έλ¦¬κ³ λͺ¨λ λ°μ΄ν°κ° μ μ‘λμλ€λ©΄onComplete()
λ©μλκ° νΈμΆλλ€. -
ꡬλ (Subscription)
public interface Subscription { void request(long n); void cancel(); }
-
νλ‘μΈμ(Processor)
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {}
νλ‘μΈμ€λ λ°νμμ ꡬλ μλ₯Ό κ²°ν©ν κ²μΌλ‘ ꡬλ μ μν λ‘ λ°μ΄ν°λ₯Ό μμ κ³Ό μ²λ¦¬κ° κ°λ₯νκ³ , λ°νμ μν λ‘ κ²°κ³Όλ₯Ό ꡬλ μλ€μκ² λ°ννλ€. νλ‘μΈμλ λ³΄ν΅ μ΄λ²€νΈλ₯Ό λ³ννλλ° μ¬μ©νλ€.
μ΄λ¬ν 리μ‘ν°λΈ μ€νΈλ¦Ό μΈν°νμ΄μ€μ κ²½μ°, μ€νΈλ¦Όμ ꡬμ±νλ κΈ°λ₯μ΄ μ‘΄μ¬νμ§ μλλ€. νμ§λ§ νλ‘μ νΈ λ¦¬μ‘ν°(리μ‘ν°λΈ μ€νΈλ¦Όμ ꡬμ±νλ API μ 곡)λ RXJava λ±μ ν΅ν΄ μ½κ² ꡬμ±ν μ μλ€.
리μ‘ν°μλ λκ°μ§ νμ μ΄ μλλ° λ°λ‘ Monoμ Fluxμ΄λ€. μ΄ λκ° λͺ¨λ 리μ‘ν°λΈ μ€νΈλ¦Όμ Publisher μΈν°νμ΄μ€λ₯Ό ꡬνν κ²μ΄λ€.
-
Mono
νλμ λ°μ΄ν° νλͺ©λ§ κ°λ λ°μ΄ν°μ μ΅μ ν
-
Flux
0, 1 λλ λ€μμ λ°μ΄ν°λ₯Ό κ°λ νμ΄νλΌμΈ
Mono.just("jongnan")
.map(n -> n.toUpperCase())
.subscribe(System.out::println)
μ μμλ "jongnan"
μ΄λ λ¬Έμμ΄μ λλ¬Έμλ‘ λ°κΎΈκ³ μ΄λ₯Ό μ½μμ μΆλ ₯νλ€. just()
μ€νΌλ μ΄μ
μ μ£Όμ΄μ§ κ°μ Mono ννλ‘ μμ±νλ©°, map()
μ μ 곡λ ν¨μλ₯Ό μ€ννλ μ€νΌλ μ΄μ
μ΄λ€. subscribe()
μ λ°μ΄ν°λ₯Ό μμ λ° μ£Όμ΄μ§ ν¨μλ₯Ό νΈμΆνκ³ μ’
λ£νλ€. κ° μ€νΌλ μ΄μ
μ μ§λμΉ λλ§λ€ μλ‘μ΄ Monoκ° μμ±λλ€.
μ΄λ¬ν 리μ‘ν°λ₯Ό μ¬μ©νκΈ° μν΄μλ λ€μκ³Ό κ°μ μμ‘΄μ±μ μΆκ°ν΄μ£Όλ©΄ λλ€.
compile "io.projectreactor:reactor-core:3.4.3"
testCompile "io.projectreactor:reactor-test:3.4.3"
Fluxμ Monoμλ 500κ° μ΄μμ μ€νΌλ μ΄μ μ΄ μ‘΄μ¬νλ©°, μ΄λ¬ν μ€νΌλ μ΄μ μ μμ±, μ‘°ν©, λ³ν, λ‘μ§μΌλ‘ λΆλ₯λ μ μλ€.
μμ Project Reactorμ 곡μ λ¬Έμλ₯Ό λ¨κ²¨λμμΌλ μμΈνκ² λ³Ό μ μλ€.