π‘ λ€μν λΉλκΈ° μ²λ¦¬ λ°©λ²μ λνμ¬ μμλ³΄κ³ , μμ λ₯Ό ν΅ν΄μ νμ΅νμμ΅λλ€.
μ½ν¬λ¦°μ΄ μλ€λ©΄?
μΌλ°μ μΈ λΉλκΈ° λ‘μ§
- μΌλ°μ μΈ νλ‘ νΈμλ(μλλ‘μ΄λ) λ¨μμ μ ν리μΌμ΄μ
λ‘μ§μ ꡬννλ λ°©λ²μ μλμ κ°μ΅λλ€.
- λ€μν μμ€λ‘λΆν° λ°μ΄ν°λ₯Ό λ°μ
- API, λ·° ꡬμ±μμ, λ°μ΄ν°λ² μ΄μ€, λ€λ₯Έ μ±
- λ°μ΄ν° μ²λ¦¬
- κ°κ³΅λ λ°μ΄ν°λ‘ μμ
- λ·° λκΈ°ν
- λ°μ΄ν°λ² μ΄μ€ μ μ₯
- APIλ‘ μ μ‘
- λ€μν μμ€λ‘λΆν° λ°μ΄ν°λ₯Ό λ°μ
- μΌλ°μ μΈ λΉλκΈ° μ°μ° λΌμ΄λΈλ¬λ¦¬λ μλμ κ°μ΄ μ¬μ©λ©λλ€.
fun onCreate() {
val news = getNewsFromApi()
val sortedNews = news
.sortedByDescending { it.publishedAt }
view.showNews { sortedNews }
}
- μλλ‘μ΄λμμλ νλμ μ±μμ λ·°λ₯Ό λ€λ£¨λ μ€λ λκ° λ¨ νλλ§ μ‘΄μ¬νλ―λ‘, μ μ½λλ κ°μ₯ μ€μν μ€λ λλ₯Ό λΈλ‘νΉνκ² λ©λλ€.
- μ΄λ¬ν λ°©μμΌλ‘λ ꡬννλ€λ©΄ μ± ν¬λμ(λΉμ μ μ’ λ£)κ° λ°μν κ²μ λλ€.
μ€λ λλ‘ μ ν
- μ€λ λλ₯Ό νμ©νλ€λ©΄ μ λ¬Έμ λ₯Ό κ°μ₯ μ§κ΄μ μΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
- λΈλ‘νΉμ΄ κ°λ₯ν μ€λ λλ₯Ό λ¨Όμ νμ©νκ³ , μ΄νμ λ©μΈ μ€λ λλ‘ μ νν©λλ€.
fun onCreate() {
val news = getNewsFromApi()
val sortedNews = news
.sortedByDescending { it.publishedAt }
runOnUiThread {
view.showNews { sortedNews }
}
}
- μ΄λ¬ν λ°©μ μμ μλμ κ°μ λ¬Έμ λ₯Ό κ°μ§κ³ μμ΅λλ€.
- μ€λ λκ° μ€νλμμ λ λ©μΆ μ μλ λ°©λ²μ΄ μμ΄ λ©λͺ¨λ¦¬ λμλ‘ μ΄μ΄μ§ μ μμ
- μ€λ λμ λν λΉμ©κ³Ό, 볡μ‘λκ° μ¦κ°ν¨
- μ½λκ° κΈΈμ΄μ§κ³ , μ΄ν΄νκΈ° μ΄λ €μ
- μμ± λ μ€λ λλ₯Ό μ κ±°νμ§ μμΌλ©΄, μ€λ λλ μ£Όμ΄μ§ μμ μ κ³μ μνν ν λ μ΄μ μ‘΄μ¬νμ§ μλ λ·°λ₯Ό μμ νλ €κ³ μλν©λλ€.
- λ°±κ·ΈλΌμ΄λ μμΈλ₯Ό μ λ°νκ±°λ μμνκΈ° μ΄λ €μ΄ κ²°κ³Όκ° λ°μν μ μμ΅λλ€.
μ½λ°± ν¨μ νμ©
- callbackμ ν¨μλ₯Ό λ ΌλΈλ‘νΉ(non-blocking)μΌλ‘ λ§λ€κ³ , ν¨μμ μμ μ΄ λλ¬μ λ νΈμΆλ μ½λ°± ν¨μλ₯Ό λ겨주λ λ°©μμ λλ€.
fun onCreate() {
getNewsFromApi { news ->
val sortedNews = news
.sortedByDescending { it.publishedAt }
view.showNews(sortedNews)
}
}
- μμ κ°μ΄ μ½λ°±μ ν΅ν΄ ꡬννλ€λ©΄, μ€κ°μ μμ μ μ·¨μν μ μμ΅λλ€.
- μ·¨μν μ μλ μ½λ°±λ κ°λ₯νμ§λ§ μ΄λ μλΉν μ΄λ €μ°λ©°, κ° ν¨μμ λν μ·¨μ ꡬνμ ν΄μΌνλ©° λͺ¨λ κ°μ²΄λ₯Ό λΆλ¦¬ν΄μ λͺ¨μμΌ νλ€λ λ¨μ μ΄ μμ΅λλ€.
fun showNews() {
getConfigFromApi { config ->
getNewsFromApi(config) { news ->
getUserFromApi { user ->
view.showNews(user, news)
}
}
}
}
- μ μ½λμμλ λ³λ ¬ μ²λ¦¬λ₯Ό κΈ°λνμ§λ§, νμ¬ λ μμ μ λμμ μ²λ¦¬νκΈ°λ μ΄λ ΅μ΅λλ€.
- μ½λ°±μ νμ©ν μλ‘ λ€μ¬μ°κΈ°κ° μλΉν λ§μμ§λ©°, κ°λ μ±μ΄ λ¨μ΄μ§λ μν©μ΄ λ°μνλλ° μ΄λ₯Ό μ½λ°± μ§μ₯(callback hell)μ΄λΌ λΆλ¦ λλ€.
RxJavaμ Reactorλ μ΄λ?
- μλλ‘μ΄λμ λ°±μλμμ μμ£Ό νμ©λλ μλ° μΈμ΄μμλ RxJavaμ Reactorμ κ°μ 리μ‘ν°λΈ μ€νΈλ¦Όμ νμ©ν μ μμ΅λλ€.
- μ΄ λ°©λ²μ μ¬μ©νλ©΄ λ°μ΄ν° μ€νΈλ¦Ό λ΄μμ μΌμ΄λλ λͺ¨λ μ°μ°μ μμ, μ²λ¦¬, κ΄μ°°ν μ μμ΅λλ€.
- 리νν°λΈ μ€νΈλ¦Όμ μ€λ λ μ νκ³Ό λμμ± μ²λ¦¬λ₯Ό μ§μνλ©°, λ³λ ¬ μ²λ¦¬κ° κ°λ₯ν©λλ€.
RxJava νμ©
fun onCreate() {
disposable += getNesFromApi()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map { news ->
news.sortedByDescending { it.publishedAt }
}
.subscribe { sortedNews ->
view.showNews(sortedNews)
}
}
- μ μμ μμ disposables λ₯Ό νμ©νμ¬ μ¬μ©μκ° μ€ν¬λ¦°μ λΉ μ Έλκ° κ²½μ° μ€νΈλ¦Όμ μ·¨μν μ μμ΅λλ€.
- callbackκ³Ό λΉκ΅
- λ©λͺ¨λ¦¬ λμκ° μκ³ , μ·¨μκ° κ°λ₯ν©λλ€.
- μ€λ λλ₯Ό μ μ νκ² μ¬μ©ν μ μμ΅λλ€.
- λμμ± μ²λ¦¬λ₯Ό 보μ₯ν μ μμ΅λλ€.
- νμ§λ§ RxJavaλ ꡬννκΈ° λ§€μ° λ³΅μ‘νλ€λ λ¨μ μ΄ μμ΅λλ€.
fun onCreate() {
val news = getNewsFromApi()
val sortedNews = news
.sortedByDescending { it.publishedAt }
view.showNews { sortedNews }
}
- μ μ½λλ λΉμ μ μ’ λ£λ₯Ό λ°μμν€μ§λ§, κ°μ₯ μ΄μμ μΈ μ½λμ λλ€.
- μ μ½λμ λΉκ΅νμ λ, RxJavaλ λ§€μ° λ³΅μ‘νλ€λ κ²μ μ μ μμ΅λλ€.
- subscribeOn, observeOn, subscribe… λ± RxJavaλ₯Ό νμ©νκΈ° μν΄μ λ€μν ν¨μλ₯Ό λ°°μμΌ ν©λλ€.
- λν μ·¨μνλ μμ λν λͺ μμ μΌλ‘ νμν΄μΌνλ©°, κ°μ²΄λ₯Ό λ°ννλ ν¨μλ€μ Observableμ΄λ Single ν΄λμ€λ‘ λ°λμ λν(wrapping)ν΄μΌ νλ€λ λ¨μ μ΄ μμ΅λλ€.
- μ΄λ RxJavaλ₯Ό λμ νκΈ° μν΄μ λ§μ μ½λλ₯Ό μμ ν΄μΌ νλ€λ λ»ν©λλ€.
Kotlin Coroutines
- μ½νλ¦° μ½λ£¨ν΄μ΄ λμ ν΄μΌ νλ μ΄μ λ μ λ¨μ λ€μ ν΄κ²°ν μ μκΈ° λλ¬Έμ λλ€.
- μ½λ£¨ν΄μ κ°μ₯ ν΅μ¬ κΈ°λ₯μ νΉμ μ§μ μμ λ©μΆκ³ μ΄νμ μ¬κ°ν μ μλ€λ κ²μ λλ€..!
- μ΄λ λ©μΈ μ€λ λμμ μ€ννκ³ , APIμμ λ°μ΄ν°λ₯Ό μ»μ΄μ¬ λ μ μ μ€λ¨μ΄ κ°λ₯νλ€λ μλ―Έμ λλ€.
- μ½λ£¨ν΄μ μ€λ¨μμΌ°μ λ μ€λ λλ λΈλ‘νΉλμ§ μμΌλ©°, λ·°λ₯Ό λ°κΎΈκ±°λ λ€λ₯Έ μ½λ£¨ν΄μ μ€ννλ λ±μ λ λ€λ₯Έ μμ
μ΄ κ°λ₯ν©λλ€.
- λ°μ΄ν°κ° μ€λΉλλ©΄ μ½λ£¨ν΄μ λ©μΈ μ€λ λμμ λκΈ°νκ³ μλ€κ° λ©μΈ μ€λ λκ° μ€λΉλλ©΄ λ©μΆ μ§μ μμ λ€μ μμ μ μνν©λλ€.
- μ΄λ κ·Ήν λλ¬Έ μν©μ΄λ©°, μ€λ λλ₯Ό κΈ°λ€λ¦¬κ³ μλ μ½λ£¨ν΄μ΄ μμ¬μλ κ²½μ°λ₯Ό λνλ λλ€.
val scope = CoroutineScope(Dispatchers.Main)
fun onCreate() {
scope.launch { updateNews() }
scope.launch { updateProfile() }
}
suspend fun updateNews()
suspend fun updateProfile()
- μ λμμ μλμ κ°μ μμλ‘ μ€νλ©λλ€.
- updateNews() ν¨μκ° μ€ν λ©λλ€.
- updateNews() ν¨μκ° λ€νΈμν¬ μλ΅μ κΈ°λ€λ¦¬λ λμ λ©μΈ μ€λ λλ updateProfile() ν¨μκ° μ¬μ©ν©λλ€.
- updateProfile() νΈμΆμ΄ μ€λ¨λμ§ μλλ€κ³ κ°μ νλ€λ©΄, λ©μΈ μ€λ λ λ΄μμ λ©μΆμ§ μκ³ μ€νλ©λλ€.
- updateProfile() λμμ΄ μλ£λλ©΄, λ©μΈ μ€λ λλ updateNews()λ₯Ό μ²λ¦¬νλ μ½λ£¨ν΄μ μν΄ updateNews()μ μμ μ μλ£ν©λλ€.
- μ΄μ μ½νλ¦° μ½λ£¨ν΄μ νμ©ν΄ μλμ κ°μ μ΄μμ μΈ λμμ μνν μ μμ΅λλ€.
fun onCreate() {
viewModelScope.launch {
val news = getNewsFromApi()
val sortedNews = news
.sortedByDescending { it.publishedAt }
view.showNews { sortedNews }
}
}
μ¬λ¬ κ°μ μλν¬μΈνΈλ₯Ό νΈμΆνλ κ²½μ°
- μ€λ λλ₯Ό λΈλ‘νΉνλ λ¬Έμ λ₯Ό ν΄κ²°νμΌλ―λ‘, μ΄μ λ€μκ³Ό κ°μ λ¬Έμ μ μ κ·Όν΄μΌ ν©λλ€.
- λ§μ½ 3κ°μ μλν¬μΈνΈλ₯Ό νΈμΆν΄μΌ νλ μν©μ΄ λ°μνλ€κ³ κ°μ ν΄λ΄ λλ€.
fun showNews() {
viewModelScope.launch {
val config = getConfigFromApi()
val news = getNewsFromApi(config)
val user = getUserFromApi()
view.showNews(user, news)
}
}
- μ μ½λλ μλνλ λ°©μμ΄ ν¨μ¨μ μ΄μ§ μλ€λ λ¨μ μ΄ μμ΅λλ€.
- νΈμΆμ μμ°¨μ μΌλ‘ μΌμ΄λκΈ° λλ¬Έμ, ν μμ μ 1μ΄μ© κ±Έλ¦°λ€λ©΄ API νΈμΆμ 3μ΄λ₯Ό κΈ°λ€λ €μΌ ν©λλ€.
- μ΄λ° κ²½μ° async μ κ°μ μ½νλ¦°μ΄ μ 곡νλ μ½λ£¨ν΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν μ μμ΅λλ€.
- async() : μμ²μ μ²λ¦¬νκΈ° μν΄ λ§λ€μ΄μ§ μ½λ£¨ν΄μ μ¦μ μμνλ ν¨μ
- await() : νΈμΆ ν κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬λ ν¨μ
fun showNews() {
viewModelScope.launch {
val config = async { getConfigFromApi() }
val news = async { getNewsFromApi(config) }
val user = async { getUserFromApi() }
view.showNews(user.await(), news.await())
}
}
- μ κ²½μ°λ₯Ό νμ©νλ©΄ λ³λ ¬ νΈμΆμ΄ κ°λ₯νλ©°, 2μ΄λ§μ μμ μ λλΌ μ μμ΅λλ€.
for λ¬Έμ νμ©νλ κ²½μ°
- μ½ν¬λ¦°μ νμ©νλ©΄ for, 컬λ μ μ μ²λ¦¬νλ ν¨μλ₯Ό λΈλ‘νΉ μμ΄ κ΅¬νμ΄ κ°λ₯ν©λλ€.
fun showAllNews() {
viewModelScope.launch {
val allNews = (0 until getNumberOfPages())
.map { page -> async { getNewsFromApi(page) } }
.flatMap { it.await() }
view.showAllNews(allNews)
}
}
- μμ²λΌ λͺ¨λ λ΄μ€λ₯Ό λ³λ ¬μ²λ¦¬λ₯Ό ν΅ν΄μ λ°μμ€λ λ‘μ§μ ꡬνν μ μμ΅λλ€.
μ 리
- μ½νλ¦° μ½λ£¨ν΄μ μ¬μ©νλ κ°μ₯ μ€μν μ΄μ λ μ€λ λλ₯Ό μ¬μ©νλ λΉμ©μ΄ ν¬κ² κ°μνλ€λ κ²μ λλ€.
- μ€λ λλ λͺ μμ μΌλ‘ μμ±λκ³ μ μ§λλ©° λ©λͺ¨λ¦¬λ₯Ό ν λΉν©λλ€.
fun main() {
// Thread νμ©
repeat(100) {
thread {
Thread.sleep(1000)
print(".")
}
}
// Coroutine νμ©
repeat(100) {
launch {
delay(1000)
print(".")
}
}
}
- μ μ½λμ Threadλ₯Ό νμ©ν λΆλΆμ μ΄ν΄λ³΄λ©΄, λ§μ μμ μ€λ λλ₯Ό νμ©ν΄μ μ€λ λλΉ 1μ΄μ© μ λ€κ² λ§λλλ€.
- μ¬κΈ°μ μ λλ λμμ λ°μ΄ν°λ² μ΄μ€ λλ λ€λ₯Έ μλΉμ€λ‘λΆν° μλ΅μ κΈ°λ€λ¦¬λ μν©μ λνλ λλ€.
- μ΄ νλ‘κ·Έλ¨μ κ°μμ μ»΄ν¨ν°μμ μ€ννλ€λ©΄, λͺ¨λ μ μ μ°λ λ° μλΉν μκ°μ΄ 걸릴 κ²μ λλ€.
- λ°λ©΄μ Coroutineμ νμ©ν λΆλΆμμλ μ€λ λλ₯Ό μ¬μ°λ λμ μ½λ£¨ν΄μ μ€λ¨μν΅λλ€.
- νλ‘κ·Έλ¨μ μ€ννλ©΄ 1μ΄ λ€μ λͺ¨λ μ μ μΆλ ₯νκ² λ©λλ€.
- μ΄λ₯Ό ν΅ν΄ μ λ ΄νκ³ μμ ν λ°©μμ λμμ κΈ°λν μ μμ΅λλ€.
https://m.yes24.com/Goods/Detail/123034354