์ด๋ฒ ๊ณ ์ฐฐ์ ์ฃผ์ ๋ coroutine์ด๋ค.
kotlin์ ์ฌ์ฉํ๊ฑฐ๋, ์ฌ์ฉ ์ค์ธ ๊ฐ๋ฐ์๋ค์๊ฒ๋ ํญ์ ๋ฐ๋ผ๋ค๋๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฐ๋ ์ด๋ค.
์ด๋ฒ ํฌ์คํ ์ผ๋ก ํ์คํ๊ฒ ๊ถ๊ธํ๋ ๊ฒ๋ค์ ๊ณต๋ถํ๋ฉด์ ์ง๊ณ ๋์ด๊ฐ ์์ ์ด๋ค.
coroutine์ด๋?
coroutine์ thread ์์์ ์คํ๋๋ ์ผ์ ์ค๋จ ๊ฐ๋ฅํ ์์ ๋จ์์ด๋ค.
ํ๋์ thread์์ ์ฌ๋ฌ coroutine์ด ์๋ก thread๋ฅผ ์๋ณดํด ๊ฐ๋ฉฐ ์คํ๋ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์งธ์ coroutine์ด ์๊ฒจ๋๊ฒ ๋ ๊ฑธ๊น?
coroutine์ ์ ์ฌ์ฉํ๊ฒ ๋์์๊น?
thread ๊ธฐ๋ฐ์ ๋ค์ค thread ์์ ์ ํ๊ณ
coroutine ์ด์ ์ ๋์์ฑ ์์
์ ๋ชจ๋ thread ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฃจ์ด์ก๋ค.
thread ๊ธฐ๋ฐ์ผ๋ก ์์
์ ์ํํ๊ฒ ๋๋ฉด thread 1์ ์์
์ด ์งํ๋๋ ์ค์ ๋ค๋ฅธ thread์ ์์
์ ์งํํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ thread 1์ด blocking ๋๊ณ thread 2๊ฐ ์์
ํ๋ ํ์์ด์๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋์ํ๋๋ฐ, ์ด๋ฅผ andorid ๊ฐ๋ฐ๋ก ๋์ด๊ฐ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
android์๋ main thread๊ฐ ์กด์ฌํ๋๋ฐ, ์ด thread๋ ๊ฐ์ฅ ์ค์ํ thread์ด๋ค.
main thread์์ ์์ ์ ์งํํ๋ค๊ฐ ๋ค๋ฅธ thread ์์ ์ผ๋ก ์ธํด blocking ๋๋ค๋ฉด, ์คํ๋๋ android ์ฑ์ ๋ฉ์ถค ํ์์ด ์๊ธฐ๊ณ , ์ผ์ ์๊ฐ ์ด์ blocking ๋๋ฉด ์ฑ์ด ๊ฐ์ ์ข ๋ฃ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์์ ๋จ์๊ฐ thread์ธ ์์ ๋ค์ ์์ฑ ๋น์ฉ์ด ๋ฐ์ธ๊ณ ์์ ์ ํ ๋น์ฉ์ด ๋น์ธ๋ค.
๋ํ ๋ค๋ฅธ thread๋ก๋ถํฐ ์์ ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ thread๋ blocking ๋๋ค.
์ด ํน์ฑ ๋๋ฌธ์ ํด๋น thread๋ ํ๋ ์์ ์์ด ๋ค๋ฅธ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์์์ด ๋ญ๋น๋๋ค. ์ด๊ฒ ์์ ๋จ์๊ฐ thread์ธ ๊ฒฝ์ฐ ์๊ธฐ๋ ๊ณ ์ง์ ์ธ ๋ฌธ์ ์ ๋ค์ด๋ค.
coroutine์ ๊ธฐ์กด ๋ฌธ์ ์ ๊ทน๋ณต ๋ฐฉ๋ฒ
coroutine์ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ์ง๋๋ค.
- thread๋ฅผ ์ฌ์ฉํด coroutine์ ์คํ
- thread ์์ coroutine์ ์ธ์ ๋ ์ง ์ค๋จ ๊ฐ๋ฅ
์ ํน์ง ๋๋ฌธ์ coroutine์ ๊ฒฝ๋ thread๋ก ๋ถ๋ฆฐ๋ค.
์ฝ๋ฃจํด์ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- ์ฝ๋ฃจํด 1์ด ์์ฑ๋ผ thread 1์ ์คํ ์์ฒญ๋๊ณ , ์ฝ๋ฃจํด 2๊ฐ ์์ฑ๋ผ thread 2์์ ์คํ๋๋ค.
- ์ฝ๋ฃจํด 1 ์คํ ๋์ค ์ฝ๋ฃจํด 2์ ์์ ๊ฒฐ๊ณผ๊ฐ ํ์ํด์ก๋ค. ์ฝ๋ฃจํด 2์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ์ฝ๋ฃจํด 1์ thread์ ์ฌ์ฉ๊ถ์ ์๋ํ๋ค.
- ์ฌ์ฉ๊ถ์ ์๋๋ฐ์ ์ฝ๋ฃจํด 3์ด ์ค๋ ๋ 1์์ ์คํ๋๋ค.
- ์ฝ๋ฃจํด 3์ด ์คํ์ ๋ง์น๋ฉด ์ค๋ ๋ 1์ ์ฌ์ฉ ๊ถํ์ ๋ค์ ์ฝ๋ฃจํด 1๋ก ๋๊ธด๋ค.
- ์ฝ๋ฃจํด 2์ ์์ ์ด ์ข ๋ฃ๋๊ณ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉด ์ฝ๋ฃจํด 1์ ํ ๋น๋ฐ์ ์์ ์ด ์๋ thread๋ฅผ ์ฌ์ฉํด ์คํ๋๋ค.
coroutine์ thread๊ฐ ํ์ ์์ ๋ thread์ ๊ถํ์ ์๋ณดํ๋ค. ์ด๋ฅผ ํตํด thread๋ฅผ blocking ํ๋ ์ํฉ์ด ์ค์ด์ thread๋ฅผ ์ต๋ํ ํ์ฉํ ์ ์๊ฒ ๋๋ค.
coroutine์ thread๊ฐ ํ์ ์์ด์ง๋ฉด, thread๋ฅผ ์๋ณดํ๋ ๋ฐฉ์์ผ๋ก thread ์ฌ์ฉ์ ์ต์ ํํ๋ค.
๋ ์์ธํ ์ ๋ณด๋ ์๋์ ๊ธ์ ์ฐธ๊ณ ํ์.
[Coroutine] 1. ์ฝ๋ฃจํด์ ์ด๋ป๊ฒ ์ค๋ ๋ ์์ ์ ์ต์ ํํ๋๊ฐ?
thread๋ ๋ฌด์์ผ๊น?
์ด์ coroutine์ ์ ์์ ์ ์ฌ์ฉ๋๋์ง๋ฅผ ์์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ๋ coroutine๊ณผ ์์ฃผ ์ฎ์ด๋ thread๊ฐ ๋ฌด์์ธ์ง ๊ฐ๋ณ๊ฒ ์์๋ณด๋๋ก ํ์.
thread๋ ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ฐ์ ์์์ ์ด์ฉํ๋ ์คํ์ ๋จ์ ํน์ ํ๋ก์ธ์ค์ ํน์ ํ ๊ฒฝ๋ก์ด๋ค.
ํ๋ก์ธ์ค๋ 4๊ฐ์ง์ ์์ญ(stack, code, data, heap)์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋๋ค. thread์ด ์์ญ๋ค ์ค stack ์์ญ์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ๋น๋ฐ๊ณ , ๋จ์ 3๊ฐ์ง ์์ญ์ ์ฌ๋ฌ thread๊ฐ ๊ณต์ ํ๋ค.
thread์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ ์ด ๋งํฌ๋ก.
coroutine vs thread
์ด๋ฏธ ์์ ์ด๋ ์ ๋ ์ธ๊ธ๋์ด ์์ง๋ง, ๋ค์ ์ด ๋ถ๋ถ์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
- thread๋ ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ฐ์ ์์์ ์ด์ฉํ๋ ์คํ์ ๋จ์์ด๋ค.
coroutine์ thread ๋ด๋ถ์์ ์คํ๋๋ค. - thread๋ ํ ํ๋ก์ธ์ค์์ ์ฌ์ฉ ์ค์ด ์๋ ๋ค๋ฅธ ์์
์ ๋ชจ๋ blocking ์ํ๊ฐ ๋์ง๋ง,
coroutine์ ์์ ํ๋ํ๋ ๋ชจ๋ ํ์ํด์ก์ ๋, ์์ ๋ค์ ์์ ๋กญ๊ฒ switching ํ๋ฉด์ ๋์์ฑ์ ๋ณด์ฅํ๋ค.
๋ ์์ธํ ์ ๋ณด๋ ์๋์ ๊ธ ์ฐธ๊ณ .
๐ค Thread vs Coroutine ์ ๊ฒฉ ๋น๊ต
kotlin์ flow
๊ฐ์๊ธฐ flow๋ก ์ ํํ ์ด์ ๋ coroutine์ ๊ณต๋ถํ ๋ชฉ์ ์ด flow์ ๊ฐ๋ ์ ๊ณต๋ถํ๊ธฐ ์ํด์์๋ค.
kotlin์ flow๋ ๋ฌด์์ผ๊น?
์ฝํ๋ฆฐ์ flow๋ ์์ฐจ์ ์ผ๋ก ๊ฐ์ ๋ณด๋ด๊ณ ์ ์์ ์ผ๋ก ๋๋ ์์ธ๋ก ์๋ฃ๋๋ ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ด๋ค.
์ฆ, coroutine ์์์ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๊ธฐ ์ํ ๊ตฌ์ฑ ์์์ด๋ค.
flow๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ด์
- ์ฝ๋ฐฑ๊ณผ ๋ฆฌ์ค๋์ ํ๊ณ
๊ธฐ์กด์๋ ์ด๋ฒคํธ ๋ฐ์ ์ ํน์ ๋์์ ์ํํ๊ฒ ํ๊ธฐ ์ํด ์ฝ๋ฐฑ๊ณผ ๋ฆฌ์ค๋๋ฅผ ๊ตฌํํ์๋ค.
ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ๋ง์ ์ฝ๋ฐฑ๊ณผ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ , ๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์๋ค.
์ดํ์ live data, rx java์ ๊ฐ์ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋์ค๊ฒ ๋๊ณ , ๋ ๋์๊ฐ coroutine๊ณผ flow๊ฐ ๋์ค๊ฒ ๋๋ฉด์ ์์ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ ์ ์์๋ค.
flow์ ์ฅ์
- ๋น๋๊ธฐ ์คํธ๋ฆผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
flow๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ฑํ๊ณ ์ฒ๋ฆฌํ ์ ์์ด, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ํ, ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๊ธฐ ์ ๊น์ง suspend ์ํ๋ฅผ ์ ์งํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. - coroutine๊ณผ์ ํตํฉ
flow๋ coroutine๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ด, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. coroutine์ suspend ํจ์๋ก ๊ตฌํ๋์ด ์์ผ๋ฏ๋ก, coroutine์ ๋์์ฑ๊ณผ ๋น๋๊ธฐ์ฑ์ ๋ณด๋ค ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. - cold stream ์ง์
flow๋ cold stream์ผ๋ก ๊ตฌํ๋์ด ์์ด, ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด collect ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ์๋ถํฐ ๋ค์ ์์ฑํ๊ณ ์ฒ๋ฆฌํ ์ ์์ด, ์ํฉ์ ๋ง๊ฒ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ ์ ํ ์ฒ๋ฆฌํ ์ ์๋ค. - ์ฐ์ฐ์ ์ง์
flow๋ ์ฐ์ฐ์(operator)๋ฅผ ์ง์ํด, ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ค. ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ๋์ผ ์ ์๋ค. - backpressure ์ฒ๋ฆฌ
flow๋ backpressure ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ฏ๋ก, ๋ฐ์ดํฐ์ ์์ฐ ์๋์ ์๋น ์๋๊ฐ ์ผ์นํ์ง ์์ ๋๋ ์์ ์ ์ผ๋ก ๋์ํ๋ค.
cold stream?
ํ ๊ฐ์ flow๊ฐ ํ๋์ ์๋น์์๊ฒ๋ง ๊ฐ์ ๋ณด๋ธ๋ค.
์๋น์๊ฐ ์๋น๋ฅผ ์์ํ ๋, ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค. ์๋น์๊ฐ ์๋นํ๊ธฐ ์ ๊น์ง๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ง ์๋๋ค.
๋ชจ๋ ๋ฐ์ดํฐ๋ ์คํธ๋ฆผ ๋ด๋ถ์์ ์์ฑ๋๋ค.
backpressure?
์์ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์๋น์๊ฐ ๊ฐ๋นํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
์๋ฅผ ๋ค์ด ์ด๋น 100๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ฐ๋ ๋, ์๋น์๋ ๋ฐ์ดํฐ๋ฅผ 1์ด์ 1๊ฐ ์ฌ์ฉํ ๋, ์๋น์๋ ๋์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋นํ์ง ๋ชปํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ฐ์ดํฐ๋ ๊ณ์ ์์ด๊ฒ ๋๊ณ ์ต์ ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค.
๋ ๋ง์ ์ ๋ณด๋ ์๋ ๊ธ๋ค์ ์ฐธ๊ณ .
[์๋๋ก์ด๋] Coroutine Flow
[Kotlin] Flow์์ ColdStream๊ณผ HotStream์ ์ฐจ์ด
์ ๋ฆฌ
coroutine์ ์ ์์ coroutine์ ํ์ ๋ฐฐ๊ฒฝ์ ๊ณต๋ถํ๊ณ , thread์์ ์ฐจ์ด์ ์ ๊ณต๋ถํ๋ค.
kotlin flow์ ๋ํด์๋ ๊ณต๋ถํ์ง๋ง, ์ด ๋ถ๋ถ์ ๋ ๊ณต๋ถ๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค. ์์ง ์ดํด๋๊ฐ ๋ถ์กฑํ๋ค.