- '์ฝํ๋ฆฐ ์ฝ๋ฃจํด์ ์ ์' ์ฑ ์ ์๋ ํ๋ฉฐ ์ฝ๋ฃจํด์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ๋ถํฐ ๋ด๋ถ ๋์ ์๋ฆฌ, ์ค์ ํ ์คํธ ๋ฐฉ๋ฒ๊น์ง ๊น์ด ์๊ฒ ํ์ตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ๋จ์ํ API ์ฌ์ฉ๋ฒ์ ๋์ด, '์' ๊ทธ๋ ๊ฒ ๋์ํ๋์ง ๊ทผ๊ฑฐ๋ฅผ ํ๊ตฌํ์ฌ ์ฝ๋ฃจํด์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ์ค๋ฌด์ ์์ ๊ฐ ์๊ฒ ์ ์ฉํฉ๋๋ค.
-
์ฃผ๊ธฐ: ๋งค์ฃผ ๊ธ์์ผ 21:00 1ํ ๋์ค์ฝ๋์์ ์ง์ ๋ ๋ฒ์์ ๋ํด ํ์ตํ ๋ด์ฉ์ ๊ณต์ ํ๊ณ ํ ๋ก ํฉ๋๋ค.
-
๋ฐํ ๋ฐ ํ ๋ก : ๋งค์ฃผ ๋ฐํ์๋ฅผ ์ ์ (์ค์ฅ 1๋ช , ์คํฐ๋์1๋ช )ํ์ฌ ํ์ต ๋ด์ฉ์ ๊ณต์ ํ๊ณ , ๊ฐ์ ์คํฐ๋ํ๋ฉฐ ๊ถ๊ธํ๋ ์ ์ด๋ ๋ ผ์ํ๊ณ ์ถ์ ์ฃผ์ ๋ฅผ ์ค์ฌ์ผ๋ก ์์ ๋กญ๊ฒ ํ ๋ก ํฉ๋๋ค.
-
๊ฒฐ๊ณผ๋ฌผ: ๊ฐ์ ํ์ตํ ๋ด์ฉ์ด๋ ํ ๋ก ๊ฒฐ๊ณผ๋ฅผ GitHub, Notion, ๋ธ๋ก๊ทธ ๋ฑ์ ์ ๋ฆฌํ์ฌ PR์ ์์ฑํด ๊ณต์ ํฉ๋๋ค.
// Repo ์ด๋ฆ์ ๋ง๋๋ก ํ์์ง์ใ ใ ๐ week1 |- README.md |- Test.kt (ํ์ํ๋ค๋ฉด) ๐ week2 ๐ week3// README ์์ # 1์ฃผ์ฐจ (1,2์ฅ) [1์ฃผ์ฐจ ๋ด์ฉ์ ๋ฆฌ](๋งํฌ) [1์ฃผ์ฐจ ๋ฐํ์๋ฃ](๋งํฌ)
- ํ์ต ๋ชฉํ: ๊ธฐ์กด ์ค๋ ๋ ๊ธฐ๋ฐ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ณ๋ฅผ ์ดํดํ๊ณ , ์ฝ๋ฃจํด์ด ์ ํ์ํ์ง ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ฅผ ํ์ ํฉ๋๋ค. ๋ํ, ์ฝ๋ฃจํด์ ํ์ตํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์๋ฒฝํ๊ฒ ๊ตฌ์ถํฉ๋๋ค.
- ์ฃผ์ ํ์ต ์ฃผ์ :
- ์ค๋ ๋ ๊ธฐ๋ฐ ๋ฉํฐํ์คํน์ ํ๊ณ (์ปจํ ์คํธ ์ค์์นญ, ๋ธ๋กํน)
- ์ฝ๋ฃจํด์ด ์ค๋ ๋ ๋ธ๋กํน ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๋ ์๋ฆฌ
- ์ฝ๋ฃจํด ๊ฐ๋ฐ ๋ฐ ๋๋ฒ๊น
ํ๊ฒฝ ์ค์ (
Dkotlinx.coroutines.debug์ต์ ) - ์ฒซ ์ฝ๋ฃจํด ์คํ ๋ฐ
runBlocking,launch๋น๋์ ๊ธฐ๋ณธ ๊ฐ๋
- ํ์ต ๋ชฉํ: ์ฝ๋ฃจํด์ ์คํํ๊ณ , ์ ์ดํ๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์์ธ
Dispatcher,Job,Deferred์ ์ญํ ๊ณผ ๊ด๊ณ๋ฅผ ์ดํดํฉ๋๋ค. - ์ฃผ์ ํ์ต ์ฃผ์ :
CoroutineDispatcher: ์ฝ๋ฃจํด์ด ์ด๋ค ์ค๋ ๋์์ ์คํ๋ ์ง ๊ฒฐ์ ํ๋ ์ญํ (IO, Default, Main)Job: ์ฝ๋ฃจํด์ ์ํ(Lifecycle)๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ์ดํ๋ ํธ๋ค (join,cancel,start)async์Deferred: ์ฝ๋ฃจํด์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ๋ ๋ฐฉ๋ฒ (await,awaitAll)withContext๋ฅผ ์ฌ์ฉํ ์ค๋ ๋ ์ ํ ๋ฐasync-await์์ ์ฐจ์ด์
- ํ์ต ๋ชฉํ: ์ฝ๋ฃจํด์ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ด๊ณ ์๋
CoroutineContext๋ฅผ ์ดํดํ๊ณ , ์ฝ๋ฃจํด์ ํต์ฌ ์์น์ธ '๊ตฌ์กฐํ๋ ๋์์ฑ'์ ํตํด ์์ ํ๊ฒ ์ฝ๋ฃจํด์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค. - ์ฃผ์ ํ์ต ์ฃผ์ :
CoroutineContext์ ๊ตฌ์ฑ ์์ (Job, Dispatcher, CoroutineName, CoroutineExceptionHandler)CoroutineContext์ ์กฐํฉ(+)๊ณผ ์ฌ๊ตฌ์ฑ- ๊ตฌ์กฐํ๋ ๋์์ฑ: ๋ถ๋ชจ-์์ ์ฝ๋ฃจํด ๊ด๊ณ์ ์ค์์ฑ (์ทจ์ ์ ํ, ์๋ฃ ๋๊ธฐ)
CoroutineScope์ ์ญํ ๊ณผ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒGlobalScope์ฌ์ฉ์ ์ง์ํด์ผ ํ๋ ์ด์
- ํ์ต ๋ชฉํ: ๊ตฌ์กฐํ๋ ๋์์ฑ ์์์ ์์ธ๊ฐ ์ด๋ป๊ฒ ์ ํ๋๋์ง ์ดํดํ๊ณ ,
SupervisorJob,CoroutineExceptionHandler๋ฑ์ ์ฌ์ฉํด ์์ ์ ์ผ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค. ๋ํ ์ฝ๋ฃจํด์ ํต์ฌ์ธ ์ผ์ ์ค๋จ ํจ์์ ์๋ฆฌ๋ฅผ ํ์ ํฉ๋๋ค. - ์ฃผ์ ํ์ต ์ฃผ์ :
- ์ฝ๋ฃจํด ๋น๋(
launchvsasync)์ ๋ฐ๋ฅธ ์์ธ ์ ํ ๋ฐฉ์์ ์ฐจ์ด SupervisorJob๊ณผsupervisorScope๋ฅผ ์ด์ฉํ ์์ธ ์ ํ ์ ํCoroutineExceptionHandler๋ฅผ ์ฌ์ฉํ ์ค์ ์ง์ค์ ์์ธ ์ฒ๋ฆฌtry-catch๋ฅผ ์ด์ฉํ ์์ธ ์ฒ๋ฆฌ์ ์ฃผ์์ - *์ผ์ ์ค๋จ ํจ์(suspend function)**์ ์ ์์ ๋์ ์๋ฆฌ
- ์ฝ๋ฃจํด ๋น๋(
- ํ์ต ๋ชฉํ: ์ฝ๋ฃจํด์ ๋ด๋ถ ๋์ ์๋ฆฌ์ธ
Continuation๊ณผ ์ค๋ ๋ ์๋ณด(yield) ๊ฐ๋ ์ ์ดํดํ๊ณ , ๊ณต์ ์ํ ๋ฌธ์ ๋ฐ ๋๊ธฐํ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค. ์ต์ข ์ ์ผ๋กrunTest๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ฃจํด ์ฝ๋๋ฅผ ์ ํํ๊ฒ ๋จ์ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ์ตํ๋๋ค. - ์ฃผ์ ํ์ต ์ฃผ์ :
- ์๋ธ๋ฃจํด๊ณผ ์ฝ๋ฃจํด์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด
- ์ฝ๋ฃจํด์ ์ค๋ ๋ ์๋ณด (
delay,yield) - ๊ณต์ ์ํ(Mutable State) ์ฌ์ฉ ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๊ธฐํ ๋ฐฉ๋ฒ
- ์ฝ๋ฃจํด์ ๋์ ์๋ฆฌ์ Continuation Passing Style (CPS)
- ์ฝ๋ฃจํด ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (
runTest,TestDispatcher) - ๊ฐ์ ์๊ฐ์ ์ด์ฉํ ์ฝ๋ฃจํด ํ ์คํธ ๋ฐฉ๋ฒ