justgo_developer

Kotlin Coroutine ์„ฑ๋Šฅ ๋ฐ ์ตœ์ ํ™” ๊ฐœ์„  ๋ณธ๋ฌธ

IT/๊ธฐํƒ€

Kotlin Coroutine ์„ฑ๋Šฅ ๋ฐ ์ตœ์ ํ™” ๊ฐœ์„ 

๋‹ค๋‚ 92 2025. 2. 19. 21:54

๐Ÿš€ Kotlin Coroutine ์ตœ์ ํ™” ๊ฐœ์„  ๋‚ด์šฉ 4๊ฐ€์ง€


1๏ธโƒฃ runBlocking → suspend fun์œผ๋กœ ๋ณ€๊ฒฝ (๋™๊ธฐ ์‹คํ–‰ ๋ฌธ์ œ ํ•ด๊ฒฐ)

๋ฌธ์ œ์ 

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

๊ฐœ์„  ์‚ฌํ•ญ

  • runBlocking์„ ์ œ๊ฑฐํ•˜๊ณ , ํ•จ์ˆ˜๋ฅผ suspend fun์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์™„์ „ํ•œ ๋น„๋™๊ธฐ ์‹คํ–‰ ๊ฐ€๋Šฅ.
  • suspend ๋ฐฉ์‹์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ.

๋น„๊ต: runBlocking vs suspend fun

๋ฐฉ์‹์‹คํ–‰ ๋ฐฉ์‹๋ธ”๋กœํ‚น ์—ฌ๋ถ€๋™์‹œ์„ฑ ์ง€์›์„ฑ๋Šฅ

runBlocking ๋™๊ธฐ ์‹คํ–‰ (Blocking) โœ… ๋ธ”๋กœํ‚น๋จ โŒ ์ œํ•œ์  (ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—… ์‹คํ–‰) โŒ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ
suspend ๋น„๋™๊ธฐ ์‹คํ–‰ (Non-blocking) โŒ ๋ธ”๋กœํ‚น๋˜์ง€ ์•Š์Œ โœ… ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ”๋ฃจํ‹ด ์‹คํ–‰ ๊ฐ€๋Šฅ โœ… ๊ณ ์„ฑ๋Šฅ

๊ฒฐ๋ก 

โœ… ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด suspend fun์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
โœ… ๋น„๋™๊ธฐ API์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๋™๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ.
โœ… ์ผ๋ฐ˜์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ๋Š” suspend fun ๋ฐฉ์‹์ด ๋” ์ ํ•ฉ.


2๏ธโƒฃ CoroutineScope(Dispatchers.IO).launch() ๋Œ€์‹  withContext(Dispatchers.IO) ์‚ฌ์šฉ

๋ฌธ์ œ์ 

  • ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” CoroutineScope(Dispatchers.IO).launch {}๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ I/O ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์—ˆ์Œ.
  • ํ•˜์ง€๋งŒ launch๋Š” ์ƒˆ๋กœ์šด ์ฝ”๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„ ๋ฐœ์ƒ ๊ฐ€๋Šฅ.
  • ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์—†์Œ.

๊ฐœ์„  ์‚ฌํ•ญ

  • launch ๋Œ€์‹  withContext(Dispatchers.IO) {} ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ฝ”๋ฃจํ‹ด์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋งŒ ๋ณ€๊ฒฝ.
  • withContext๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด I/O ์ž‘์—…์„ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋ฉด์„œ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ.

๋น„๊ต: launch vs withContext

์ฐจ์ด์ launch (Job)withContext (suspend ๋ธ”๋ก)

๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ (Job) T ๊ฐ’์„ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ
์ฝ”๋ฃจํ‹ด ์ƒ์„ฑ ์—ฌ๋ถ€ ์ƒˆ๋กœ์šด ์ฝ”๋ฃจํ‹ด ์ƒ์„ฑ ์ƒˆ๋กœ์šด ์ฝ”๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ปจํ…์ŠคํŠธ๋งŒ ๋ณ€๊ฒฝ
์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ โŒ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ โœ… ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ถ€๋ชจ ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์ „ํŒŒ๋จ ์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ์ง์ ‘ ์ „๋‹ฌ ๊ฐ€๋Šฅ
์‚ฌ์šฉ ๋ชฉ์  ๊ฒฐ๊ณผ๊ฐ’์ด ํ•„์š” ์—†๋Š” ๋น„๋™๊ธฐ ์‹คํ–‰ (Fire & Forget) ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์•ผ ํ•  ๋•Œ

๊ฒฐ๋ก 

โœ… I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” withContext(Dispatchers.IO)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
โœ… ๋ถˆํ•„์š”ํ•œ ์ฝ”๋ฃจํ‹ด ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Œ.
โœ… ์˜ˆ์™ธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ.


3๏ธโƒฃ launch ๋Œ€์‹  async + await() ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์‹คํ–‰ ์ตœ์ ํ™”

๋ฌธ์ œ์ 

  • ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” launch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•œ ํ›„ join()์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋‹ค๋ฆผ.
  • ํ•˜์ง€๋งŒ launch๋Š” Deferred๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†์Œ.
  • launch๋Š” ๋ณ‘๋ ฌ ์‹คํ–‰์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ๋Š” ๋น„ํšจ์œจ์ ์ž„.

๊ฐœ์„  ์‚ฌํ•ญ

  • launch ๋Œ€์‹  async๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—… ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ.
  • ๋ณ‘๋ ฌ ์‹คํ–‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ awaitAll()์„ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ํ™”.

๋น„๊ต: launch vs async

์ฐจ์ด์ launch (Job)async (Deferred<T>)

๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ (Job) Deferred<T> (๊ฒฐ๊ณผ ์žˆ์Œ)
๊ฒฐ๊ณผ ์ ‘๊ทผ .join() (์™„๋ฃŒ ๋Œ€๊ธฐ) .await() (๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ)
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฆ‰์‹œ ์ „ํŒŒ๋จ await() ํ˜ธ์ถœ ์‹œ ๋ฐœ์ƒ
์‚ฌ์šฉ ๋ชฉ์  ๋‹จ์ˆœํ•œ ๋น„๋™๊ธฐ ์‹คํ–‰ (Fire & Forget) ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•  ๋•Œ

๊ฒฐ๋ก 

โœ… ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ → launch ์‚ฌ์šฉ
โœ… ๋น„๋™๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ → async + await() ์‚ฌ์šฉ
โœ… ์ฆ‰, launch๋Š” "์‹คํ–‰๋งŒ", async๋Š” "๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ"์— ์ ํ•ฉ! ๐Ÿš€


4๏ธโƒฃ await() / awaitAll() ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์‹คํ–‰ ์ตœ์ ํ™”

๋ฌธ์ œ์ 

  • ๊ธฐ์กด ์ฝ”๋“œ์—์„œ awaitAll()์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ฐ API์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— Type Mismatch ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ.
  • awaitAll()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  async ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€ ํƒ€์ž…์ด์–ด์•ผ ํ•จ, ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋‹ค๋ฆ„.

๊ฐœ์„  ์‚ฌํ•ญ

  • ๊ฐ API์˜ ์‘๋‹ต DTO ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฏ€๋กœ, ๊ฐœ๋ณ„ await()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๊ณ  ๋ช…ํ™•ํ•จ.
  • ํŠน์ • API์˜ ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ € ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ await()์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์„œ๋Œ€๋กœ ๋กœ์ง์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ.

๋น„๊ต: awaitAll() vs ๊ฐœ๋ณ„ await()

์ฐจ์ด์ awaitAll()๊ฐœ๋ณ„ await()

์‹คํ–‰ ๋ฐฉ์‹ ๋ชจ๋“  async ์ž‘์—…์„ ๋ณ‘๋ ฌ ์‹คํ–‰ ํ›„ ํ•œ ๋ฒˆ์— ๊ฒฐ๊ณผ ์ˆ˜์ง‘ ๊ฐœ๋ณ„ async ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ฐ ๊ฐ€์ ธ์˜ด
ํƒ€์ž… ๋ฌธ์ œ ๋ชจ๋“  ์‘๋‹ต ํƒ€์ž…์ด ๊ฐ™์•„์•ผ ํ•จ ๊ฐ ์‘๋‹ต ํƒ€์ž…์ด ๋‹ค๋ฅผ ๋•Œ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
์ˆœ์„œ ์ œ์–ด ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์–ด๋ ค์›€ ํŠน์ • API ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

๊ฒฐ๋ก 

โœ… ๋ชจ๋“  ์‘๋‹ต์ด ๊ฐ™์€ ํƒ€์ž…์ผ ๋•Œ → awaitAll() ์‚ฌ์šฉ
โœ… ๊ฐ API์˜ ์‘๋‹ต ํƒ€์ž…์ด ๋‹ค๋ฅผ ๋•Œ → ๊ฐœ๋ณ„ await() ์‚ฌ์šฉ
โœ… ์ฆ‰, ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” awaitAll()๋ณด๋‹ค ๊ฐœ๋ณ„ await()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•จ! ๐Ÿš€


๐Ÿ”ฅ ์ตœ์ข… ์ •๋ฆฌ

โœ… 1๏ธโƒฃ runBlocking → suspend fun ๋ณ€๊ฒฝ

  • runBlocking์„ ์ œ๊ฑฐํ•˜์—ฌ ๋น„๋™๊ธฐ ์‹คํ–‰ ์ตœ์ ํ™”.
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ํšจ์œจ์ ์ธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ.

โœ… 2๏ธโƒฃ CoroutineScope(Dispatchers.IO).launch() ๋Œ€์‹  withContext(Dispatchers.IO) ์‚ฌ์šฉ

  • ๋ถˆํ•„์š”ํ•œ ์ฝ”๋ฃจํ‹ด ์ƒ์„ฑ ๋ฐฉ์ง€.
  • I/O ์ž‘์—…์—์„œ ์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐ•ํ™”.

โœ… 3๏ธโƒฃ launch ๋Œ€์‹  async + await() ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์‹คํ–‰ ์ตœ์ ํ™”

  • launch๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ณ‘๋ ฌ ์‹คํ–‰์ด ํ•„์š”ํ•  ๋•Œ async + await() ํ™œ์šฉ.

โœ… 4๏ธโƒฃ await() / awaitAll() ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์‹คํ–‰ ์ตœ์ ํ™”

  • ์‘๋‹ต DTO ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฏ€๋กœ awaitAll() ๋Œ€์‹  ๊ฐœ๋ณ„ await() ์‚ฌ์šฉ.
  • ๋ณ‘๋ ฌ ์‹คํ–‰ ์ตœ์ ํ™” ๋ฐ ์ฝ”๋“œ ์•ˆ์ „์„ฑ ํ–ฅ์ƒ.

 

'IT > ๊ธฐํƒ€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Bearer Authorization  (0) 2023.10.10
Gson ์ด์šฉ ์‹œ Unicode ๋ณ€ํ™˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•  (0) 2023.10.10
Xml ํŒŒ์‹ฑ  (1) 2023.10.05
RabbitMQ  (0) 2023.10.05