์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ์ค๋ผํด
- ์ด์์ฒด์
- Kafka
- aws
- JPA
- retry
- ์ฟผ๋ฆฌ
- DP
- db
- ๋ฐฑ์ค
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- feign
- Spring Boot
- Spring Cloud Feign
- ์๊ณ ๋ฆฌ์ฆ
- ์ฝ๋ฉ
- MST
- Intellj
- golang
- MVC
- ์๋ฐ
- Spring Cloud
- ํด๋ผ์ฐ๋
- ๋์์ธ ํจํด
- PL/SQL
- ์๋ฃ๊ตฌ์กฐ
- Spring
- ํ์ด์ง
- Jenkins
- SQL
- Today
- Total
justgo_developer
Kotlin Coroutine ์ฑ๋ฅ ๋ฐ ์ต์ ํ ๊ฐ์ ๋ณธ๋ฌธ
๐ 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 |