๋ฐ์ดํฐ ์คํธ๋ฆผ๊ณผ ๋ณํ์ ์ ๋ฌ(๋ฐ์ดํฐ ์คํธ๋ฆผ์์ ๊ฐ์ด ๋ณํ์ ๋ ์ ๋ฌ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ)์ ๋ํ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
-
์ดํดํ๊ธฐ ์ํ ๋ฌธ์ฅ
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์์ a = b + c ๋ฅผ ์คํํ๋ฉด b + c ์ ๊ฒฐ๊ณผ๊ฐ ํ ๋น๋๊ณ ,
b, c ์ ๊ฐ์ ๋ณํ๋ a์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
๋ฐ๋ฉด, ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ b ์ c์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค a = b + c๋ฅผ ์คํํ์ง ์๊ณ
์๋์ผ๋ก ์ ๋ฐ์ดํธ๋์ด a์ ๊ฐ์ ๊ฒฐ์ ํฉ๋๋ค. -
์์ฝํ์๋ฉด Reactive Programming์
๋ฐ์ดํฐ ์คํธ๋ฆผ
์๋น๋๊ธฐ์
์ธ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ(?)์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. -
ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ ํ ๊ธฐ๋ฅ์ ์ง์ ์ ํด์ ์คํํ๋ ๊ฒ์ด ์๋,
์์คํ ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋
์์์ ์ฒ๋ฆฌ๋๋ค. -
๊ธฐ์กด์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์
Pull ๋ฐฉ์
, Reactive Programming ๋ฐฉ์์Push ๋ฐฉ์
์ด๋ผ๊ณ ๋ ํ๋ค.- Pull ๋ฐฉ์: ๋น๋๊ธฐ request๋ฅผ ๋์ง๊ณ response๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ
callback
์ผ๋ก ๋ฐ์์ ์ฒ๋ฆฌ - Push ๋ฐฉ์: ๋น๋๊ธฐ request๋ฅผ ๋์ง๊ณ ์ธ๋ถ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ํ
subscribe
ํ์์ผ๋ก ๋ฐ์ํ๋๋ก ์ฒ๋ฆฌ
- Pull ๋ฐฉ์: ๋น๋๊ธฐ request๋ฅผ ๋์ง๊ณ response๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ
-
Reactive Programming์
์ฃผ๋ณ ํ๊ฒฝ๊ณผ ๋์์์ด ์ํธ์์ฉ
์ ํ๋๋ฐ, ํ๋ก๊ทธ๋จ์ด ์ฃผ๋ํ๋ ๊ฒ์ด ์๋ ํ๊ฒฝ์ด ๋ณํ๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ๋์ํจ์ผ๋ก์จ ์ํธ์์ฉํ๋ค. -
๋ค์ํ ์ธ์ด์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํด
ReactiveX
๋ฅผ ์ฌ์ฉํ๋ค.
Rx๋ผ๊ณ ๋ ํ๋ฉฐ, ๊ด์ฐฐ ๊ฐ๋ฅํ(observable) ์คํธ๋ฆผ์ ํตํด ๋น๋๊ธฐ, ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(API)
Observer ํจํด
์ ํ์ฅํ์ฌ๋ฐ์ดํฐ ๋ฐ ์ด๋ฒคํธ์ ์ํ์ค
๋ฅผ ์ง์ํ๋ค.- ๋ฎ์ ์์ค์ ์ค๋ ๋ฉ, ๋๊ธฐํ, ์ค๋ ๋ ์์ ์ฑ, ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ non-blocking I/O์ ๊ดํ ์ฐ๋ ค๋ฅผ ์ค์ธ๋ค.
- non-blocking: A ํจ์๊ฐ B ํจ์๋ฅผ ํธ์ถํ ๋, B ํจ์๊ฐ ์ ์ด๊ถ์ ๋ฐ๋ก A ํจ์์๊ฒ ๋๊ฒจ์ฃผ๋ฉด์, A ํจ์๊ฐ ๋ค๋ฅธ ์ผ์ ํ ์ ์๋๋ก ํ๋ ๊ฒ
- Rx์์๋
Observable ๊ฐ์ฒด
๋ฅผ ํตํด์์ด๋ฒคํธ์ ํ๋ฆ์ ํํ
ํ๋ค. - ๊ทธ ํ,
Operator
๋ฅผ ํตํด์ Observable์ด ๋ด๋ฑ๋์ด๋ฒคํธ์ ๊ฐ๋ค์ ํด๋น ํํ๋ก ์กฐํฉํ๊ณ ๋ณ๊ฒฝ
ํ๋ค.
๊ด์ฐฐํ ์ ์๋
๋ฐ์ดํฐ ์คํธ๋ฆผ
- ๋ณดํต Observable์ ์ด๋ ํ
์์ฐจ์ ์ธ ๋ฐ์ดํฐ
๋ฅผ ๊ฐ๊ฒ ๋๋ค. - ์ด ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ด์ฐฐํ๊ฒ ๋๋
Observer
๋ค์Observer ํจํด
์ ์ฌ์ฉํ์ฌObservable์ด ๋ฐํํ๋ ๋ฐ์ดํฐ์ ์ฆ๊ฐ ๋ฐ์
ํ ์ ์๋ค.
Observable์
์ ๋ ฅ๋ค์ ์ ๋ ฅ๋ฐ์ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ
ํด๋ด๋ ์ฐ์ฐ์
- ๋๋ถ๋ถ์ ์ฐ์ฐ์๋
Observable์์ ์๋
ํ๊ณObservable์ ๋ฐํ
ํ๋ค. - ์ด๋ฌํ ์ฐ์ฐ์๋ฅผ
์ฒด์ธ์์ ์ฐจ๋ก๋ก ์ ์ฉ
ํ ์ ์๋ค. - Rx์์๋ ์์ฑ, ๋ณํ, ํํฐ๋ง, ๊ฒฐํฉ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ ์๋ง์ ์ฐ์ฐ์๊ฐ ์กด์ฌํ๋ค.
- Observable ์ฐ์ฐ์์ ๋ฉํฐ์ค๋ ๋ฉ์ ๋์ ํ๋ ค๋ฉด ํด๋น ์ฐ์ฐ์ ๋๋ ํน์ Observable์ด ํน์ ์ค์ผ์ฅด๋ฌ์์ ์๋ํ๋๋ก ์ง์ํ ์ ์๋ค.
- Observable์
Emitter
์ ํฌํจ๋์ด ์๋ 3๊ฐ์ง ์ด๋ฒคํธ๋ฅผ ํ์ฉํ์ฌ ๊ฐ์์์๊ฒ ์ด๋ฒคํธ๋ฅผ ์๋ฆด ์ ์๋ค. - Observable์์ ๋ฐ์ดํฐ, ์ค๋ฅ ๋ฑ์ ๋ฐํํ ๋
null
์ ๋ฐํ๋์ง ์๋๋ค. - ํญ์
onComplete()
ํน์onError()
๋ ์ค ํ๋๋ก๋ง ๋ฐ์ดํฐ ๋ฐํ์ด ์ข ๋ฃ๋์ด์ผ ํ๋ค.
๋ฐ์ดํฐ๊ฐ
ํ๋ ๋ฐํ
๋์์ ์๋ฆฌ๋ ์ด๋ฒคํธ
- ์ฐ์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๊ฐ ํ๋์ฉ ์ฐจ๋ก๋๋ก
onNext()
๋ก ๋ฐํ๋๋ค.
๋ฐ์ดํฐ ๋ฐํ์ด
๋ชจ๋ ์๋ฃ
๋์์์ ์๋ฆฌ๋ ์ด๋ฒคํธ
onComplete()
๊ฐ ํธ์ถ๋ ์ดํ์๋ ๋์ด์onNext()
๊ฐ ํธ์ถ์ด ๋์ง ์๋๋ค.
์ค๋ฅ๊ฐ ๋ฐ์
ํ์์ ์๋ฆฌ๋ ์ด๋ฒคํธ
- ๋ง์ฐฌ๊ฐ์ง๋ก
onError()
๊ฐ ํธ์ถ๋ ์ดํ์๋ ๋์ด์onNext()
๊ฐ ํธ์ถ์ด ๋์ง ์๋๋ค.
- Functional
๊ด์ธก ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ํตํด ๊น๋ํ๊ฒ ์ /์ถ๋ ฅ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ํ๋ก๊ทธ๋จ์ ํผํ ์ ์๋ค. - Less is more
์ ๊ตํ๊ณ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ช ์ค์ ์ฝ๋๋ก ์ค์ผ์ ์๋ค. - Async error handling
์ ํต์ ์ธ try/catch๋ ๋น๋๊ธฐ ์๋ฌ๋ ์ฒ๋ฆฌํ ์ ์์ง๋ง Rx๋ ๋น๋๊ธฐ ์๋ฌ๋ ์ฒ๋ฆฌํ ์ ์๋ค. - Concurrency amd easy
๋ฎ์ ์์ค์ ์ค๋ ๋ฉ, ๋๊ธฐํ ๋ฐ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ๊ฒ ์ถ์ํ ํ ์ ์๋ค.
// ๊ธฐ์กด ์ฝ๋
Network.download(file: "https://www...")
.subscribe(onNext: { data insequence
// ๋ฐ์ดํฐ ์ถ๊ฐ
},
onError: { error in
// ์๋ฌ ํํ
},
onCompleted: {
// ๋ค์ด๋ก๋ ๋ ํ์ผ ์ฌ์ฉ
})
- Network.download๊ฐ Observable
- onNext() ์ด๋ฒคํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ , onError() ์ด๋ฒคํธ๋ฅผ ํตํด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฌ๋ฅผ ํํํ๋ค. onComplete() ์ด๋ฒคํธ๋ฅผ ๋ฐ์ผ๋ฉด ์ก์ ์ ์ทจํ ์ ์๋ค.
UIDevice.rx.orientation
.filter { value in
return value != .landscape
}
.map { _ in
return "์ธ๋ก๋ชจ๋"
}
.subscribe(onNext: { string in
showAlert(text: string)
})
- fileter ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด orientation์ด ์ธ๋ก์ธ ๊ฒฝ์ฐ์๋ง ํ๋๋งํ๋ค.
- ๊ฐ๋ก์ธ ๊ฒฝ์ฐ์๋ ์ด๋ฒคํธ๊ฐ ์์ ์์ฑ๋์ง ์๋๋ค.
- map ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด string ์ถ๋ ฅ์ผ๋ก ๋ณํ๋๊ณ ๋ง์ง๋ง์ผ๋ก subscribe()๋ฅผ ํตํด onNext() ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๋ค.
- Java: RxJava
- JavaScript: RxJS
- C#: Rx.NET
- C#(Unity): UniRx
- Scala: RxScala
- Clojure: RxClojure
- C++: RxCpp
- Lua: RxLua
- Ruby: Rx.rb
- Python: RxPY
- Go: RxGo
- Groovy: RxGroovy
- JRuby: RxJRuby
- Kotlin: RxKotlin
- Swift: RxSwift
- PHP: RxPHP
- Elixir: reaxive
- Dart: RxDart
[RxJava] RxJava ์ดํดํ๊ธฐ - 1. Reactive Programming ์ด๋