์ฝ”๋ฃจํ‹ด Coroutine

๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด Android์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ ์„ค๊ณ„ ํŒจํ„ด.

  • ๊ฒฝ๋Ÿ‰ : ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •์ง€
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ์†Œ
  • ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ทจ์†Œ ์ง€์›
  • Jetpack ํ†ตํ•ฉ

์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—… ๊ด€๋ฆฌ

  • suspend : ํ˜„์žฌ ์ฝ”๋ฃจํ‹ด ์‹คํ–‰์„ ์ผ์‹œ์ค‘์ง€ํ•˜๊ณ  ๋ชจ๋“  ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅ
  • resume : ์ •๊ธฐ๋œ ์œ„์น˜๋ถ€ํ„ฐ ์ •์ง€๋œ ์ฝ”๋ฃจํ‹ด์„ ๊ณ„์† ์‹คํ–‰

๊ธฐ๋ณธ ์•ˆ์ „์„ ์œ„ํ•ด ์ฝ”๋ฃจํ‹ด ์‚ฌ์šฉ

๋””์ŠคํŒจ์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ํ™•์ธ.
์ฝ”๋ฃจํ‹ด์€ ์ž์ฒด์ ์œผ๋กœ ์ •์ง€๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋””์ŠคํŒจ์ฒ˜๋Š” ์ฝ”๋ฃจํ‹ด ์žฌ๊ฐœ๋ฅผ ๋‹ด๋‹น.

  • Dispatchers.Main : ๊ธฐ๋ณธ Android ์Šค๋ ˆ๋“œ. UI์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ๋น ๋ฅธ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
  • Dispatchers.IO : ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ ์™ธ๋ถ€์—์„œ ๋””์Šคํฌ ๋˜๋Š” ๋„คํŠธ์›Œํฌ I/O๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ตœ์ ํ™”.
  • Dispatchers.Default : CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์„ ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ ์™ธ๋ถ€์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ์ตœ์ ํ™”. ์˜ˆ) ๋ชฉ๋ก ์ •๋ ฌ, JSON ํŒŒ์‹ฑ

withContext()์˜ ์„ฑ๋Šฅ

์ƒ์‘ํ•˜๋Š” ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์— ๋น„ํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ๋Š” ๋Šฅ๊ฐ€ํ•œ๋‹ค. withContext()๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ๋””์ŠคํŒจ์ฒ˜์— ์œ ์ง€๋˜๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ์ „ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ์Šค๋ ˆ๋“œ ์ „ํ™˜์„ ๋ฐฉ์ง€ํ•˜๋„๋ก Dispatchers.Default์™€ Dispatchers.IO ๊ฐ„์˜ ์ „ํ™˜์„ ์ตœ์ ํ™”.

์ฝ”๋ฃจํ‹ด ์‹œ์ž‘

  • launch : ์ƒˆ ์ฝ”๋ฃจํ‹ด์„ ์‹œ์ž‘ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. '์‹คํ–‰ ํ›„ ์‚ญ์ œ' ์ž‘์—….
  • async : ์ƒˆ ์ฝ”๋ฃจํ‹ด์„ ์‹œ์ž‘ํ•˜๊ณ  await๋ผ๋Š” ์ •์ง€ ํ•จ์ˆ˜๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ—ˆ์šฉ. ๋‹ค๋ฅธ ์ฝ”๋ฃจํ‹ด ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ •์ง€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ณ‘๋ ฌ ๋ถ„ํ•ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ. [!] await ํ˜ธ์ถœ์˜ ์ผ๋ถ€๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ. ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” await๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ž๋™์œผ๋กœ ์˜ˆ์™ธ ์‚ญ์ œํ•˜์—ฌ ๊ธฐ๋ก๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ณ‘๋ ฌ ๋ถ„ํ•ด

suspend ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ์ฝ”๋ฃจํ‹ด์€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์ค‘์ง€๋˜์–ด์•ผ ํ•จ. ๋ฐ˜ํ™˜ ์ „์— awaitย ๋ฅผ ํ˜ธ์ถœํ•ด ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Œ.

CoroutineScope

launch ๋˜๋Š” async๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ์ฝ”๋ฃจํ‹ด์„ ์ถ”์ ํ•œ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…(์‹คํ–‰ ์ค‘์ธ ์ฝ”๋ฃจํ‹ด)์€ ์–ธ์ œ๋“ ์ง€ scope.cancel()์„ ํ˜ธ์ถœํ•˜์—ฌ ์ทจ์†Œ ๊ฐ€๋Šฅ.
KTX ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŠน์ • ์ˆ˜๋ช… ์ฃผ๊ธฐ ํด๋ž˜์Šค์— ์ž์ฒด CoroutineScope๋ฅผ ์ œ๊ณต. (viewModelScope, lifecycleScope ๋“ฑ)

References

  • https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ko