๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ!
- ๋ฆฌ์กํฐ๋ธ ์์คํ
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ
- ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ
โ๏ธ ๋ฆฌ์กํฐ๋ธ ์์คํ (Reactive System)
- ๋ฐ์์ ์ํ๋ ์์คํ
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์์ ์ํ๋ ์์คํ
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต ๋๊ธฐ ์๊ฐ์ ์ต์ํ ํ ์ ์๋๋ก
์์ฒญ ์ฐ๋ ๋๊ฐ ์ฐจ๋จ๋์ง ์๊ฒ ํจ์ผ๋ก์จ(Non-Blocking) ํด๋ผ์ด์ธํธ์๊ฒ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋๋ก ๊ตฌ์ฑ๋ ์์คํ
โ ๋ฆฌ์กํฐ๋ธ ์์คํ ์ ์ค๊ณ ์์น
MEANS
โ ๋ฆฌ์กํฐ๋ธ ์์คํ ์์ ์ฌ์ฉํ๋ ์ปค๋ฎค๋์ผ์ด์ ์๋จ- Message Driven
โ ๋ฉ์์ง ๊ธฐ๋ฐ ํต์ ์ ํตํด ์ฌ๋ฌ ์์คํ ๊ฐ์ ๋์จํ ๊ฒฐํฉ ์ ์ง
- Message Driven
FORM
โ ๋ฉ์์ง ๊ธฐ๋ฐ ํต์ ์ ํตํด ๋ฆฌ์กํฐ๋ธ ์์คํ ์ด ์ด๋ค ํน์ฑ์ ๊ฐ์ง๋ ๊ตฌ์กฐ๋ก ํ์ฑ๋๋์ง- Elastic
โ ์์คํ ์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ๋์ด ์ ๊ฑฐ๋ ๋ง๊ฑฐ๋์ ์๊ด์์ด ์ผ์ ํ ์๋ต์ฑ์ ์ ์งํ๋ ๊ฒ ์๋ฏธ - Resillient
โ ์์คํ ์ ์ผ๋ถ๋ถ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๋ต์ฑ์ ์ ์งํ๋ ๊ฒ ์๋ฏธ
- Elastic
VALUE
โ ๋ฆฌ์กํฐ๋ธ ์์คํ ์ ํต์ฌ ๊ฐ์น๊ฐ ๋ฌด์์ธ์ง๋ฅผ ํํํ๋ ์์ญ- Responsive
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฆ๊ฐ์ ์ผ๋ก ์๋ตํ ์ ์์ด์ผ ํจ์ ์๋ฏธ - Maintainable
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์ฆ๊ฐ์ ์ธ ์๋ต์ด ์ง์๊ฐ๋ฅํด์ผ ํจ์ ์๋ฏธ - Extensible
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋์ ์๋์ผ๋ก ํ์ฅํ๊ณ ์ถ์ํ ์ ์์ด์ผ ํจ์ ์๋ฏธ
- Responsive
[์ฐธ๊ณ ] https://www.reactivemanifesto.org/
โ๏ธ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ (Reactive Programming)
- ๋ฆฌ์กํฐ๋ธ ์์คํ ์์ ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ
- 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๋ฌธ ์ญํ
( ํด๋น ์ฝ๋๊ฐ ์ต์ข ์ฐ์ฐ์ด ํธ์ถ๋ ๋ ํ๋ฒ์ ์๋ฃ๋จ )
โ โ ์ต์ข ์ฐ์ฐ์ ์ํํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ์์ ์์ฑํ ๋ฉ์๋ ์ฒด์ธ๋ค์ด ์คํ๋์ง ์์
[์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์ฐธ๊ณ 1], [์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์ฐธ๊ณ 2]
โ
[์ฐธ๊ณ ] https://iborymagic.tistory.com/73
โ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉ
- Spring WebFlux ๊ธฐ๋ฐ์ Non-Blocking ์ ํ๋ฆฌ์ผ์ด์ ์์ ์จ๋จน์ ์ ์์
- Blocking I/O ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ํด ์จ๋จน์ ์ ์์
- MSA(Microservice Architecture)์์ ์ค์ํ ์ญํ ์ ํจ
โ๏ธ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ (Reactive Streams)
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ์ค ์ฌ์(๋๋ ๋ช ์ธ, Specification)
โ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ์ปดํฌ๋ํธ
โ๏ธ 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)
- Publisher๋ก๋ถํฐ emit๋ ๋ฐ์ดํฐ๊ฐ Subscriber์๊ฒ ์ ๋ฌ๋๋ ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์ ํธ์ถ
onComplete()
- Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ emitํ๋ ๊ณผ์ ์ด ์ข ๋ฃ๋ ๊ฒฝ์ฐ ํธ์ถ
- ๋ฐ์ดํฐ์ emit์ด ์ ์์ ์ผ๋ก ์๋ฃ ๋ ํ, ์ฒ๋ฆฌํด์ผ ๋ ์์ ์ด ์๋ค๋ฉด onComplete() ๋ด์์ ์ํ ๊ฐ๋ฅ
โ๏ธ Subscription
public interface Subscription {
public void request(long n);
public void cancel();
}
- Subscriber์ ๊ตฌ๋ ์์ฒด๋ฅผ ํํํ ์ธํฐํ์ด์ค
- ๋๊ฐ์ ๋ฉ์๋
request(long n)
- Publihser๊ฐ emitํ๋ ๋ฐ์ดํฐ์ ๊ฐ์ ์์ฒญ
cancel()
- ๊ตฌ๋
์ ํด์งํ๋ ์ญํ
โ ๊ตฌ๋ ํด์ง๊ฐ ๋ฐ์ํ๋ฉด Publisher๋ ๋์ด์ ๋ฐ์ดํฐ๋ฅผ emitํ์ง ์์
- ๊ตฌ๋
์ ํด์งํ๋ ์ญํ
โ๏ธ 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
- ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ํ์ค ์ฌ์์ Java ์์ ํฌํจ์ ์ํจ ๊ตฌ์กฐ
( Flow API๋ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด X )
โ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ์ฌ์์ ๊ตฌํํ ์ฌ๋ฌ ๊ตฌํ์ฒด๋ค์ ๋ํ SPI ์ญํ
๐ก 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 ์ผ๋ถ
๐ ์ค์ต
- projects - be-template-reactive
( ๊ตฌํ ์ค์ต๋ณด๋จ ์์์ ๊ฐ๊น์ )
๐ ๋๋์
์ผ๋จ ์ด ํ์ต์ '์ด๋ฌํ ๊ธฐ์ ์ด ์๋ค ~'๋ผ๊ณ ์๊ฐํ๋ ๋๋์ ์ถ๊ฐํ์ต์ด๋ผ๊ณ ํ๋
Spring MVC ํ์ต์ ๋ณต์ต ํด์ผ๊ฒ ๋ค !
( ๋ณธ ๊ฒ์๋ฌผ์ 2022/11/29์ ์์ฑํ ๊ธ์ ์ฎ๊ธด ๊ธ์ ๋๋ค. ์๋ฌธ์ ์๊ธฐ์ ์์! )
'โข CodeStates BootCamp > Section 4' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ [Section4] 9. [Spring WebFlux] Spring WebFlux (1) | 2023.04.13 |
---|---|
๐ [Section4] 8. [Spring WebFlux] Project Reactor (2) | 2023.04.13 |
๐ [Section4] 6. [Spring Security] OAuth2 2 (0) | 2023.04.13 |
๐ [Section4] 5. [ Spring Security ] OAuth2 1 (0) | 2023.04.13 |
๐ [Section4] 4. [ Spring Security ] JWT ์ธ์ฆ (0) | 2023.04.13 |