โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต ๋๊ธฐ ์๊ฐ์ ์ต์ํ ํ ์ ์๋๋ก
์์ฒญ ์ฐ๋ ๋๊ฐ ์ฐจ๋จ๋์ง ์๊ฒ ํจ์ผ๋ก์จ(Non-Blocking) ํด๋ผ์ด์ธํธ์๊ฒ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋๋ก ๊ตฌ์ฑ๋ ์์คํ
MEANS
โ ๋ฆฌ์กํฐ๋ธ ์์คํ
์์ ์ฌ์ฉํ๋ ์ปค๋ฎค๋์ผ์ด์
์๋จ
FORM
โ ๋ฉ์์ง ๊ธฐ๋ฐ ํต์ ์ ํตํด ๋ฆฌ์กํฐ๋ธ ์์คํ
์ด ์ด๋ค ํน์ฑ์ ๊ฐ์ง๋ ๊ตฌ์กฐ๋ก ํ์ฑ๋๋์ง
Elastic
โ ์์คํ
์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ๋์ด ์ ๊ฑฐ๋ ๋ง๊ฑฐ๋์ ์๊ด์์ด ์ผ์ ํ ์๋ต์ฑ์ ์ ์งํ๋ ๊ฒ ์๋ฏธ
Resillient
โ ์์คํ
์ ์ผ๋ถ๋ถ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๋ต์ฑ์ ์ ์งํ๋ ๊ฒ ์๋ฏธ
VALUE
โ ๋ฆฌ์กํฐ๋ธ ์์คํ
์ ํต์ฌ ๊ฐ์น๊ฐ ๋ฌด์์ธ์ง๋ฅผ ํํํ๋ ์์ญ
Responsive
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฆ๊ฐ์ ์ผ๋ก ์๋ตํ ์ ์์ด์ผ ํจ์ ์๋ฏธ
Maintainable
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์ฆ๊ฐ์ ์ธ ์๋ต์ด ์ง์๊ฐ๋ฅํด์ผ ํจ์ ์๋ฏธ
Extensible
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋์ ์๋์ผ๋ก ํ์ฅํ๊ณ ์ถ์ํ ์ ์์ด์ผ ํจ์ ์๋ฏธ
[์ฐธ๊ณ ] https://www.reactivemanifesto.org/
๋ฆฌ์กํฐ๋ธ ์์คํ ์์ ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ
Non-Blocking ํต์ ์ ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ
๐ก ์ํคํผ๋์์ ๋์ ์๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ
In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change. With this paradigm, it's possible to express static (e.g., arrays) or dynamic (e.g., event emitters) data streams with ease, and also communicate that an inferred dependency within the associated execution model exists, which facilitates the automatic propagation of the changed data flow.
[์ฐธ๊ณ ] https://en.wikipedia.org/wiki/Reactive_programming
declarative programming paradigm
data streams and the propagation of change
์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ์ผ๋ก ๋ค์ด์ฌ ์ ์์์ ์๋ฏธ
( ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒ ์์ฒด๋ฅผ ๋ฐ์ดํฐ์ ์ด๋ค ๋ณ๊ฒฝ์ด ๋ฐ์ํจ์ ์๋ฏธํจ )
์ด ๋ณ๊ฒฝ ์์ฒด๋ฅผ ์ด๋ฒคํธ๋ก ๊ฐ์ฃผํ๊ณ , ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ์ ๋ฌ
automatic propagation of the changed data flow
์์ data streams and the propagation of change์ ๊ฐ์ ์๋ฏธ
์ง์์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ฐ์ดํฐ ํ๋ก์ฐ๋ก ๋ณด๊ณ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ ๋ฌ
๐ก ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ vs ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
โ
โ๏ธ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ
- ์ด๋ค ์ผ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ์ ๊ดํ ๊ฒ
- ์ฝ๋๊ฐ ์ด๋ค์์ผ๋ก ์คํ๋์ด์ผ ํ๋์ง์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ก์ง๋ค์ด ์ฝ๋ ์์ ๊ทธ๋๋ก ๋ค์ด์์
โ
Ex. for๋ฌธ / if๋ฌธ
( ์์ ์ฝ๋๋ค์ด ์์์ ์๋๋ก ์์ฐจ์ ์ผ๋ก ์คํ๋จ )
โ๏ธ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
- ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ์ ๊ดํ ๊ฒ
- ์ ์ฐจ์ ๊ตฌํ์ ์ถ์ํํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง
โ
Ex. stream
โ ๋ด๋ถ ๋ฐ๋ณต์๊ฐ ๋ช ๋ นํ ํ๋ก๊ทธ๋จ ๋ฐฉ์์ for๋ฌธ ์ญํ
โ filter() ๋ฉ์๋๊ฐ ๋ช ๋ นํ ํ๋ก๊ทธ๋จ ๋ฐฉ์์ if๋ฌธ ์ญํ
( ํด๋น ์ฝ๋๊ฐ ์ต์ข ์ฐ์ฐ์ด ํธ์ถ๋ ๋ ํ๋ฒ์ ์๋ฃ๋จ )
โ โ ์ต์ข ์ฐ์ฐ์ ์ํํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ์์ ์์ฑํ ๋ฉ์๋ ์ฒด์ธ๋ค์ด ์คํ๋์ง ์์
[์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์ฐธ๊ณ ]
https://www.techtarget.com/searchitoperations/definition/declarative-programming
https://en.wikipedia.org/wiki/Declarative_programming
โ
[์ฐธ๊ณ ] https://iborymagic.tistory.com/73
Spring WebFlux ๊ธฐ๋ฐ์ Non-Blocking ์ ํ๋ฆฌ์ผ์ด์ ์์ ์จ๋จน์ ์ ์์
Blocking I/O ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ํด ์จ๋จน์ ์ ์์
MSA(Microservice Architecture)์์ ์ค์ํ ์ญํ ์ ํจ
[์ฐธ๊ณ ] https://github.com/reactive-streams/reactive-streams-jvm
โ๏ธ Publisher
public interface Publisher< T > { public void subscribe(Subscriber< ? super T > s); }
๋ฐ์ดํฐ ์์ค๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋(emit) ์ญํ
( ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ์ฃผ์ฒด )
๐ก emitํ๋ค = Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ
subscribe()
์ถ์ ๋ฉ์๋๋ฅผ ํฌํจ
โ ์ด subscribe()
์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ Subscriber๊ฐ 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์๊ฒ ์์ฒญํ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์ง์ ํ๊ฑฐ๋ ๊ตฌ๋ ํด์ง ์ฒ๋ฆฌ ๊ฐ๋ฅ
onSubscribe(Subscription s)
Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ emitํ ๋ ํธ์ถ
emit๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์์ ์๋น ๊ฐ๋ฅ
onNext(T t)
onComplete()
Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ emitํ๋ ๊ณผ์ ์ด ์ข ๋ฃ๋ ๊ฒฝ์ฐ ํธ์ถ
๋ฐ์ดํฐ์ emit์ด ์ ์์ ์ผ๋ก ์๋ฃ ๋ ํ, ์ฒ๋ฆฌํด์ผ ๋ ์์ ์ด ์๋ค๋ฉด onComplete() ๋ด์์ ์ํ ๊ฐ๋ฅ
โ๏ธ Subscription
public interface Subscription { public void request(long n); public void cancel(); }
Subscriber์ ๊ตฌ๋ ์์ฒด๋ฅผ ํํํ ์ธํฐํ์ด์ค
๋๊ฐ์ ๋ฉ์๋
request(long n)
cancel()
โ๏ธ Processor
public interface Processor<T, R> extends Subscriber< T >, Publisher< R > { }
Subscriber ์ธํฐํ์ด์ค์ Publisher ์ธํฐํ์ด์ค๋ฅผ ์์
โ Publisher์ Subscriber์ ์ญํ ์ ๋์์ ํ ์ ์์
๋ณ๋๋ก ๊ตฌํํด์ผ ๋๋ ์ถ์ ๋ฉ์๋๋ ์์
โ๏ธ Project Reactor
( ์ค์ฌ์ Reactor )
๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ๊ตฌํ์ฒด
Spring๊ณผ ๊ถํฉ์ด ๊ฐ์ฅ ์ ๋ง๋ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ๊ตฌํ์ฒด
Spring 5์ ๋ฆฌ์กํฐ๋ธ ์คํ์ ํฌํจ๋์ด ์๊ณ ,
Sprig Reactive Application ๊ตฌํ์ ์์ด ํต์ฌ์ ์ธ ์ญํ ๋ด๋น
โ๏ธ RxJava
( Rx - Reactive Extension์ ์ค์๋ง )
๋ํ์ ์ธ ๋ฆฌ์กํฐ๋ธ ํ์ฅ(Reactive Extension) ๋ผ์ด๋ธ๋ฌ๋ฆฌ
.NET ๊ธฐ๋ฐ์ ๋ฆฌ์กํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ทํ๋ฆญ์ค์์ Java ์ธ์ด๋ก ํฌํ ํ JVM ๊ธฐ๋ฐ์ ๋ฆฌ์กํฐ๋ธ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
2.0๋ถํฐ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ํ์ค ์ฌ์ ์ค์
( ์ด ์ ๋ฒ์ ์ ์ปดํฌ๋ํธ์ ํจ๊ป ํผ์ฉ๋์ด ์ฌ์ฉ์ด ๋๊ณ ์์ )
โ๏ธ Java Flow API
๐ก SPI (Service Provider Interface)
โ ํน์ ํ ์ญํ ์ ํ๋ ์๋น์ค ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ์๊ฐ ๊ตฌํํ ์ ์๋๋ก ํด ์ฃผ๋ ํ์ฅ ๋ฉ์ปค๋์ฆ (extension mechanism)
( ์ ๊ตฌํ์ฒด๋ค์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๊ฒ )
โ๏ธ ๊ธฐํ ๋ฆฌ์กํฐ๋ธ ํ์ฅ (Reactive Extension)`
ํน์ ์ธ์ด์์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ๋ฅผ ๊ตฌํํ ๋ณ๋์ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ
๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ๋ฅผ ๊ตฌํํ ๋ฆฌ์กํฐ๋ธ ํ์ฅ(Reactive Extension) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณต
๋ํ์ ์ธ ๋ฆฌ์กํฐ๋ธ ํ์ฅ(Reactive Extension) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก RxJava๊ฐ ์์
( ์ด์ธ์๋ RxJS, RxAndroid, RxKotlin, RxPython, RxScala ๋ฑ )
[์ฐธ๊ณ ] https://reactivex.io/
( ์์์ ์ ๋ฆฌํ ์ฉ์ด๋ ์ค๋ช ์๋ต )
Publisher
Emit
Subscriber
Subscribe
Signal
โ Publisher๊ฐ ๋ฐ์์ํค๋ ์ด๋ฒคํธ
Ex.
subscribe()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ emitํจ
โ
โ ํ๋ํ๋๋ฅผ emit ํ๋ ๊ฒ == ์ด๋ฒคํธ์ ๋ฐ์
โ
โ ์ด ์ด๋ฒคํธ๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ๋ ๊ฒ == Signal์ ์ ์กํ๋ค
Operator
โ โ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ค ๋์์ ์ํํ๋ ๋ฉ์๋
Ex. fromIterable(), filter(), reduce() ๋ฑ ๋ฉ์๋ ํ๋ ํ๋
Sequence
โ Operator ์ฒด์ธ์ผ๋ก ํํ๋๋ ๋ฐ์ดํฐ์ ํ๋ฆ
( Operator ์ฒด์ธ์ผ๋ก ์์ฑ๋ ์ฝ๋ ์์ฒด๊ฐ ํ๋์ Sequence )
Upstream
/ Downstream
Upstream
โ Sequence ์์ ํน์ Operator๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ Sequence ์ผ๋ถ
Downstream
โ Sequence ์์ ํน์ Operator๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ ์ชฝ Sequence ์ผ๋ถ
์ผ๋จ ์ด ํ์ต์ '์ด๋ฌํ ๊ธฐ์ ์ด ์๋ค ~'๋ผ๊ณ ์๊ฐํ๋ ๋๋์ ์ถ๊ฐํ์ต์ด๋ผ๊ณ ํ๋
Spring MVC ํ์ต์ ๋ณต์ต ํด์ผ๊ฒ ๋ค !