[Android] Flowλž€?

μ§€κΈˆλ³„Β·2024λ…„ 2μ›” 23일
post-thumbnail

πŸ€” Flowλž€?

flowλŠ” μ§μ—­ν•˜λ©΄ νλ¦„μž…λ‹ˆλ‹€.
androidμ—μ„œλŠ” 값을 순차적으둜 보낼 수 μžˆλŠ” data Streamμž…λ‹ˆλ‹€.
flowλŠ” 데이터λ₯Ό μƒμ„±ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” μž‘μ—…μ„ *λΉ„λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

* 비동기 : 비동기 μž‘μ—…μ€ μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•œ μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°λ₯Ό 기닀리지 μ•Šκ³ , λ‹€μŒ μž‘μ—…μ„ μ¦‰μ‹œ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



그림은 (값을 순차적으둜 λ‚΄λ³΄λ‚΄λŠ” κ³Όμ •μœΌλ‘œ) μƒμ‚°μžλŠ” 데이터λ₯Ό μƒμ‚°ν•˜κ³  flowλ₯Ό 톡해 μ€‘κ°œμžλŠ” 데이터λ₯Ό 가곡할 수 μžˆμŠ΅λ‹ˆλ‹€.
그리고 μ†ŒλΉ„μžκ°€ ꡬ독을 ν•˜λ©΄ 데이터λ₯Ό μ†ŒλΉ„ν•  수 μžˆλŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

일단 flow의 λ™μž‘λ°©μ‹μ„ κ΅¬ν˜„ν•΄λ³΄κ³  flow에 λŒ€ν•΄μ„œ 더 이야기 ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


πŸ’» Flow 예제

flowλŠ” flow λΉŒλ” APIλ₯Ό μ‚¬μš©ν•΄ λ§Œλ“€κ³ , emit()을 μ΄μš©ν•΄ 값을 μˆ˜λ™μœΌλ‘œ 데이터 슀트림으둜 λ³΄λƒ…λ‹ˆλ‹€.

1. μƒμ‚°μž

flow λΉŒλ”λ₯Ό 톡해 TestFlowλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

val TestFlow: Flow<Int> = flow {
    for (i in 1..10) {
        delay(1000)
        emit(i)
    }
}

2. μ€‘κ°œμž

flowλŠ” λ‹€μ–‘ν•œ μ—°μ‚°μžλ₯Ό μ§€μ›ν•˜λ©° map, filter, reduce, transform λ“±μ˜ μ—°μ‚°μžλ‘œ 데이터λ₯Ό λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€

TestFlow
    .map { it * 2 }  // 각 값에 2λ₯Ό 곱함
    .filter { it % 2 == 0 }  // 짝수만 톡과

3. μ†ŒλΉ„μž

flowλŠ” 비동기 방식을 μ΄μš©ν•˜λ―€λ‘œ Coroutine을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
μ†ŒλΉ„μžλŠ” collectλ₯Ό 톡해 flowμ—μ„œ 값을 μˆ˜μ§‘ν•˜κ³  데이터λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

launch {
    TestFlow.collect { value ->
        println(value)
    }
}




πŸ“Œ flow 더 듀여닀보기

flowλŠ” Cold Stream의 νŠΉμ„±μ„ κ°€μ§‘λ‹ˆλ‹€.
Cold Stream은 ꡬ독이 μ‹œμž‘λ  λ•Œ 데이터λ₯Ό μƒμ„±ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.
Cold Stream은 κ°€μž₯ μ΅œμ‹ μ˜ 데이터 λΆ€ν„° λ°©μΆœν•˜κΈ°μ— 이전에 λ°©μΆœλ˜μ—ˆλ˜ λ°μ΄ν„°λŠ” μœ μ§€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ‘β€πŸ—¨ 예λ₯Ό λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ§‘μ—μ„œ 물을 λ§ˆμ‹œκ³  μ‹Άλ‹€κ³  ν–ˆμ„ λ•Œ,
μƒμ‚°μžλŠ” 물탱크 μžˆλŠ” 물을 μƒμ‚°ν•©λ‹ˆλ‹€. (μ΄λ•Œ μ›λž˜ λΉ„μ–΄μžˆλŠ” 물탱크라고 κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.)
μ΄λ•Œ μ •μˆ˜κΈ°λ‘œ 물을 온수둜 ν• μ§€, λƒ‰μˆ˜λ‘œ ν• μ§€, μ–ΌμŒμœΌλ‘œ ν• μ§€ 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€. μ΄λŠ” μ€‘κ°œμžμ˜ 역할을 ν•©λ‹ˆλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ μ‚¬λžŒμ΄ μ›ν•˜λŠ” 물을 μ†ŒλΉ„( collect=ꡬ독 ) ν•˜μ—¬ 물을 λ§ˆμ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λ•Œ flowλŠ” λ¬Ό(data)을 감싸고 μžˆλŠ” λ°°κ΄€(데이터 슀트림)이 λ©λ‹ˆλ‹€.

flowλŠ” 비동기 λ°©μ‹μœΌλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ°μ— λŒ€μš©λŸ‰ λ°μ΄ν„°λ‚˜ λ„€νŠΈμ›Œν¬ μš”μ²­ λ“±μ˜ μ‹œκ°„μ΄ μ˜€λž˜κ±Έλ¦¬λŠ” μž‘μ—…μ— UI μŠ€λ ˆλ“œλ₯Ό μ°¨λ‹¨ν•˜μ§€ μ•Šκ³  μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
또 λ‹€μ–‘ν•œ μ—°μ‚°μžλ₯Ό μ œκ³΅ν•˜κΈ°μ— λ³΅μž‘ν•œ 데이터 처리 λ‘œμ§μ„ κ°„νŽΈν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.




πŸ˜₯ flow 단점?

flowλŠ” Cold Stream νŠΉμ„±μœΌλ‘œ ꡬ독이 μ‹œμž‘λ  λ•Œλ§Œ 데이터λ₯Ό μƒμ„±ν•˜λ―€λ‘œ μ›ν•˜λŠ” μ‹œμ μ˜ 데이터λ₯Ό μΊμ‹œν•˜κ±°λ‚˜ μž¬μ‚¬μš©ν•˜λŠ” 것이 μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.
또 λΉ„λ™κΈ°μ‹μœΌλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ―€λ‘œ λ³΅μž‘ν•œ 데이터 νλ¦„μ΄λ‚˜ 였λ₯˜ μƒν™©μ—μ„œμ˜ 디버깅이 μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.



😊 마치며

이번 μ‹œκ°„μ— flow에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€
λ‹€μŒ μ‹œκ°„μ—” flow의 단점을 보완할 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€