WWDC 24์ Swift 6 migration guide๋ฅผ ์ ๋ฆฌํด๋ณธ๋ค.
Queue ์ฌ์ฉ
Swift Concurrency
- Swift Concurrency์์๋, ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ๊ฐ์ฒด๋ฅผ Actor๋ก ๋ณ๊ฒฝํ๊ณ ,
- ๊ทธ ์ฌ์ด์์๋ thread safeํ Value ํ์ ์ ํตํด ํต์ ํจ์ผ๋ก์จ ๋ณด๋ค ๊ฐ๊ฒฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์๋ค.
๋ฌธ์
- ๊ฐ๋ ์ ์ข์ผ๋, ์ด๊ฑธ ์ด์ ์ฝ๋๋ก๋ถํฐ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ข ๋ถ๋ด์ด ๋๋ค.
- Data race๋ฅผ ํํผํด์ผ ํ๋ค๋ ๊ฒ.
- Value type์ผ๋ก ํต์ ํด์ผ ํ๋ค๋ ๊ฒ๋ ์๊ณ , actor๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ๋ ์๋ค.
- ๊ทผ๋ฐ ๊ผญ ๊ทธ๋ ๊ฒ ํ ํ์๋ ์์๋ค.
- ์ฆ,
@Sendable
ํ์ง ์์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด๋ ๊ด์ฐฎ์๋ค. - ์ด๋ ๊ฒ Tightํ๊ฒ ์กํ์์ง ์๋ ์ํฉ์ด๋ผ๋ฉด ๋ค์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์์ง๊ฐ ์๋ค.
- Crash๋ก ์ธํ ์ฌ์ฉ์ ๊ฒฝํ ์ ํด
- ๋ฐ์ดํฐ ๋ถํจ
๋ฐฉํฅ
๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ฒ ๋ค. (Enforcement of data isolation)
- thread safeํ์ง ๋ชปํ ๋ถ๋ถ์ ๋ํด ์ปดํ์ผ๋ฌ์์ ์ด๋ฅผ ์ฒดํฌํ๊ณ ์์ ํ๋๋ก ๋ง๋ค๊ฒ ๋ค.
- ์ด์ ๋ถํฐ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๋, Multi thread ํ๊ฒฝ์ ๊ณ ๋ คํ๋ฉฐ ์ด๋์ ์ด๋ป๊ฒ ํธ์ถ๋ ๊ฒ์ธ์ง๋ ์ผ๋์ ๋๊ณ ์ฝ๋๋ฅผ ์์ฑํด๋ผ.
- ํน์ ํ์ ์ด ์ด๋ป๊ฒ Multi thread ํ๊ฒฝ์์ ๋์ํด์ผ ํ๋์ง๋ฅผ ์ ์ฝํ์ฌ โLocal reasoning(ํน์ ์์ค์ฝ๋์ ์ ๊ทผํ๋ ๊ฒ๋ง์ผ๋ก ๋์์ ์ ์ถํ ์ ์๋ ํน์ฑ)โ์ ๋์ด๊ฒ ๋ค.
Global Variable
- ์ ์ญ ๋ณ์๋ data race๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์กฐ๊ฑด์ด๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ
let
์ผ๋ก ์ ์ธํ๋ ๊ฒ์ผ๋ก ์ผ๋จ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.- (ํด๋น ๊ฐ์ฒด๊ฐ
Sendable
์ด๋ผ๋ฉด)
- (ํด๋น ๊ฐ์ฒด๊ฐ
- ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ํด๋น ๊ฐ์ ๋์ค์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋จ๊น?
- ์ฆ,
var
๋ก ์ ์ธํ๋ฉด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ฉด? - ํด๋น ๊ฐ์ฒด๋ฅผ Global Actor๋ก ์ ์ธํ๋ฉด ๋๋ค.
@MainActor
keyword๋ Global Actor์ ์ผ์ข ์ด๋ค.
- ์ ์ญ์์ Actor์ ๊ฐ์ด ๋์ํ๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค.
- ๋๋ก๋ ์ด๋ฐ ์๋ฌ๊ฐ ๋ฌ์ ๋, Actor์ ๊ฐ์ ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์์ ์ ์๋ค.
- ๊ฐ๋ น, ํด๋น ๋ณ์์ data race ๋ฌธ์ ๋ฅผ lock, semaphore, dispatch queue์ ๊ฐ์ ๋ก์ง์ผ๋ก ์ฒ๋ฆฌํ์ ์๋ ์๋ค.
- ๊ทธ๋์ ๊ตณ์ด swift concurrency๋ฅผ ์ฐ์ง ์๊ณ ์ถ์ ์๋ ์๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ nonisolated(unsafe) ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
- Lazy Initialization์ ๋ํ ๋ฌธ์ ๋ ์๋?
- Swift๋ Lazy Initialization์ ์ฌ์ฉํ๋๋ฐ, ์ด๊ธฐ์ ๋๊ฐ ์ด์์ ์ค๋ ๋์์ ๋์์ ๊ทผํ์ ๋์ ๋ฌธ์ ๋ ์์๊น?
- Swift๋ ์ ์ญ ๋ณ์์ ๋ํด mutual exclusive๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ๋ค.
Delegate
- ์์คํ ์์ ์ ๊ณตํ๋ Delegate๋ฅผ ์๊ฐํด๋ณด์.
- iOS์๋ ๋ค์ํ delegate๋ค์ด ์๋๋ฐ, ํด๋น ๋ฌธ์์ ๊ฐ๋ณด๋ฉด delegate์ call back์ ์ด๋ ์ค๋ ๋๋ก ์ฃผ๋์ง์ ๋ํ ์ค๋ช ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ์ฝ๋๋ง ์ถ์ ํด์ ๋ณด์์๋ ํด๋น delegate๊ฐ ์ด๋ ์ค๋ ๋๋ก callback์ ์ค์ง ์ ์ ์๋ค.
- ์ด๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์ ๋๋ก๋ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ฌธ์๋ฅผ ์ฐพ๊ณ , ๋ค์ ์ด๋ฅผ ๋ฐ์ํ๊ณ ๋ฅผ ๋ฐ๋ณตํ๋ ์ง์ ํด์ผ ํ๋ค.
- ์๋ชปํ๋ฉด data race๋ฅผ ์ผ์ผํค๊ธฐ๋ ์ฝ๋ค.
- ์์คํ ์์ call back ํ๋ ์ค๋ ๋๋ผ๋ ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ฉด, ๋ด ์ฝ๋๊ฐ ๋ฌด๋์ง๊ธฐ๋ ์ฝ๋ค.
- Swift์์๋ ์ด๋ฌํ ๋ณด์ฅ์ ๋ถ์กฑ ํ์์ ๋ช ์์ ์ผ๋ก ๋ฐ๊ฟจ๋ค.
Example
- ๋ง์ฝ ํน์ delegate๊ฐ ํธ์ถ๋์ด์ผ ํ๋ thread๊ฐ Main์ด์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํ์.
- Main ๋ง๊ณ ๋ด๊ฐ ์ ํ ๋ค๋ฅธ ์คํํ๋ฆ์์๋ง ํธ์ถ๋์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํ์. (Global Actor)
- ๊ทธ๋ผ ์๋ฌด๊ฒ๋ ๋ฌ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ์์ ์๋ ๋ฉ์๋๋ ๋ชจ๋ nonisolatedํ๋ค๊ณ ์ฒ๋ฆฌํ๋ค.
- ์ฆ, ์ด๋ค ์ค๋ ๋์์ ๋์ํด๋ ๊ด์ฐฎ์~ ๋ผ๊ณ ์ฒ๋ฆฌํด๋ฒ๋ฆฐ๋ค.
๊ฒช์ ์ ์๋ ๋ฌธ์ ๋ค
- ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ์๋ค๊ณ ํ์.
- ์ ์ํฉ์ด๋ผ๋ฉด ์๋ฌ๊ฐ ๋๋ค.
- delegate์ thread์ ๋ํ ์ ์ฝ์ ๊ฑธ์ง ์์๊ธฐ ๋๋ฌธ์
nonisolated
ํ๋ค๊ณ ์ฒ๋ฆฌํ๊ณ , Recaffeinater
์ ๊ฒฝ์ฐ์๋ ํ์ ๋ชจ๋ property์ method์ ์คํ thread๋ฅผ main์์ ํ๊ฒ ๋ค ํ์ผ๋, ์ถฉ๋์ด ๋ ๊ฒ.
ํด๊ฒฐ 1
- delegate์ ์์ฒญ์ฌํญ์ ๋ง์ถฐ, ํด๋น ๋ฉ์๋๋ main์์ ๊ฒฉ๋ฆฌ๋์ด ์คํ๋จ์ ๋ณด์ฅํ์ง ์๋๋ก ๋ฐ๊ฟ๋ฒ๋ฆฐ๋ค.
- ๊ทผ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด, 4๋ฒ ๋ผ์ธ์์ ๋ด๊ฐ ํด์ผํ๋ ๋์์ธ UI ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
- main thread์์ ๋์ํด์ผ ํ๋๊น.
- ๋ํ์ ์ผ๋ก
minimunCaffeine
๋ณ์๊ฐ@MainActor
๋ผ์ 3๋ฒ ๋ผ์ธ์์ ์๋ฌ๊ฐ ๋๋ค.
- ๊ทธ๋ผ ์ด๋ฌํ ๋ชจ์์ด ๋๊ฒ ๋ค.
- ์ฌ์ค ์ด๋ฐ ๊ฒฝ์ฐ๋ณด๋ค๋
CaffeineThresholdDelegate
๊ฐ ์ ๋ง non isolated ํ๊ฒฝ์์๋ง ํธ์ถ๋์ด์ผ ํ๋์ง๋ฅผ ์ฒดํฌํ๋ ๊ฒ์ด ๋ ์ณ์ ๊ฒ์ด๋ค.
ํด๊ฒฐ 2
CaffeineThresholdDelegate
๋ฅผMainActor
์์ ํธ์ถํ๋๋ก ์ ํํ ์ ์๋ค๊ณ ํ์.- SDK์์ ์ ๊ณตํ๋ ๊ฑฐ๋ผ ๋ด๊ฐ ์ด๋ป๊ฒ ์๋ณผ์๊ฐ ์๋ค๊ณ ์น์.
- ๊ทธ๋ผ ์ด๋ ๊ฒ๋ ํด๊ฒฐํ ์ ์๋ค.
- delegate์์ ์ค๋ ์ค๋ ๋๋ฅผ ์ ์ ์๋ค๊ณ ?
- ๊ทธ๋ผ main์์ ์ค๋ ๊ฒฝ์ฐ๋ง ์ฒ๋ฆฌํ์. / ํน์ main์์ ์ฌ ๊ฒ์ ๋ฏฟ๊ณ ์์ฒ๋ผ ์ฒ๋ฆฌํ์.
- ํน์๋ผ๋ ๋ค๋ฅธ ์ค๋ ๋์์ ์ฌ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด
assert
๊ฐ์ ๊ฑธ๋ก ๋๋นํ๋ฉด ์ข๊ฒ ๋ค. - ์ด๋ ๊ฒ callback์ ๋ํ ๋ฏฟ์(?)์ ์์ญ์ผ๋ก ๊ฐ๋ ์ฝ๋์ ๋ํด ๋ชจ๋ ์์ ๊ฐ์ด ์ฒ๋ฆฌํ ์๋ ์์ผ๋ฏ๋ก ์๋์ ๊ฐ์ ๊ฒ์ ์ ๊ณตํ๋ค.
- ํน์ swift concurrency๊ฐ ์ ๊ณต๋์ง ์๋ ์ฝ๋์ ๋ํ ํธํ์ฑ์ ์ํ ํค์๋๋ผ๊ณ ์๊ฐํ ์๋ ์๊ฒ ๋ค.
@preconcurrency
๋ ๊ธฐ์กด ์ฝ๋๊ฐ ๋์์ฑ ๋ชจ๋ธ ๊ท์น์ ๋ฐ๋ฅด์ง ์์๋ ํ์ฉํ ์ ์๊ฒ ๋ง๋๋ ํค์๋๋ค.- ์ฆ, ํ๋ก๊ทธ๋๋จธ๋ฅผ ๋ฏฟ์ผ๋ผ๋ ํค์๋.
- ์ถํ์
CaffeineThresholdDelegate
๊ฐMainActor
์ด์ด์ผ ํ๋ค๋ ์ ์ฝ์ด ์ถ๊ฐ๋๋ค๋ฉด, ์ปดํ์ผ๋ฌ๋ ๋์ด์@preconcurrency
๊ฐ ํ์์๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ๋ ๋ ค์ค๋ค.
Donโt Panic
- ์ค์ ํ๋ก์ ํธ์์๋ ๊ต์ฅํ ๋ง์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ๊ฑฐ๋ค.
- ์ซ์ง๋ง๋ผ (?)
let
์ ์ธ๊ณผ ๊ฐ์ด ์ฌ์ด ๋ณ๊ฒฝ๋ ์์ ๊ฒ์ด๊ณ ,- ํน์ ํด๋์ค ์์ฒด์
@MainActor
์ ์ธ๊ณผ ๊ฐ์ด ๊ฐ๋จํ ๋ณ๊ฒฝ์ผ๋ก ๋ง์ ๊ฒฝ๊ณ ๋ฅผ ์ง์ธ์๋ ์์ ๊ฒ์ด๋ค. - ์ฆ, ๋๋ค์์ ์ฌ์ด ๋ฌธ์ + ์ด๋ ค์ด ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ค. (๊ณผ์ฐ?)
Actor๊ฐ์ ํต์
- ํน์ C ๊ฐ์ฒด์ ๋ฐฐ์ด์ A actor์์ B actor๋ก ๋ณด๋ธ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
- C ๊ฐ์ฒด๋
Sendable
์ ์ค์ํด์ผ ํ๋ค.
ACL์ ๋ฐ๋ฅธ sendability inference
- A, B Actor๊ฐ ํน์ framework ๋ด๋ถ์ ์๊ณ ,
- ์ ๋ฌ๋๋ C ํ์
์ด
internal
๋ก ์ ์ธ๋์ด ์๋ค๋ฉด, - Swift๋ struct์ ๋ํด ์๋์ผ๋ก
Sendable
์ ์ถ๋ก ํด์ ์ ์ฉํ๋ค. - ํ์ง๋ง
public
ํ์ ์ ๋ํด์๋ ์๋ ์ ์ฉํ์ง ์๋๋ค. public
์ด๋ ์๋ฏธ๋, ๊ณง ํด๋น framework๋ฅผ ์ฌ์ฉํ๋ client๊ฐ ์๋ค๋ ๋ป์ด๊ณ ,- ๊ทธ๋ค์๊ฒ ์ถ๋ก ํ ์ ์๋ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ง์ฝ C ํ์
์
Sendable
์ด๋ผ๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ์ฑํํ์ง ์๋ ์ํฉ์์ client๊ฐ Cํ์ ์ ์ฌ์ฉํ๋ค๋ฉด, - ํด๋น ๊ฐ์ด ๋ณํ๋์ง ๊ทธ๋ ์ง ์์์ง๋ฅผ ์ผ์ผํ ์ดํด๋ด์ผ ํ๋ค.
- (์ด๋ฐ ๋ฌธ์ ๋ก ๋ฐ์ํ๋ ์๋ฌ๋ ์๊ธฐ ๋๋ฌธ์ ๊ฒ๋จน์ง ๋ง๋ผ๊ณ ํ ๊ฒ)
Objective C ํ์ ์ด๋ฉด ์ด๋กํ์ง?
- ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ํ์ ์ด ์๋ ์๋ ์๋ค.
- ๋ง์ฝ์ Objective-C ํ์ ์ ๋ฐ๊นฅ์ผ๋ก ์ ๋ฌํด์ผ ํ๋ ์ํฉ์ด๋ฉด ์ด์ฉ์ง?
- Reference Type์ธ๋ฐ ๋ง์ด๋ค.
์๋ฏธ์ ์ผ๋ก ์์ ํ๋ค๋ฉด..
- ํญ์ copy๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ด ๋ณด์ฅ๋ ํ์ ์ผ ์ ์๋ค.
NSCopying
์ ์ํด ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ๋ค๋ ๊ฒ์ด ๋ณด์ฅ๋๋ค๋ฉด,Sendable
์ด ์๋์ง๋ผ๋ ์๋ฏธ์ ์ผ๋ก ๋ณดํธํ ๋ค, ์ฌ์ฉํ ์ ์๋ค.nonisolated(unsafe)
ํค์๋๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๋ฉด ๋๋ค.- ๊ฒฐ๊ตญ ์ด๊ฑด ํ๋ก๊ทธ๋๋จธ์ ์ญ๋์ ๋งก๊ธฐ๋ ์ต์ ์ด๋ค.
Wrap-up
- ์ฒ์ฒํ ํด๋ผ.
- ๊ฐ๋จํ ๊ฒ ๋ถํฐ ์ฒ๋ฆฌํ์.
- ๋ฆฌํฉํ ๋ง ํด์ผํ ๊ฒ์ด๋ค.
- Migrating to Swift 6๋ฅผ ์ฐธ๊ณ ํด๋ผ.
์์๋๋ ๋ฌธ์ ์
Annotation ์ ํ์ ๋ฌธ์
- ํน์ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- ์ด์ ์๋
my function
์ด ์๋class
์์ ๊ทธ๋ฅ ์ฌ์ฉํ์ผ๋ฉด ๋๋ค.
- ๊ทธ๋ฐ๋ฐ swift ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ฉด์ ํน์ ๋ฉ์๋ ์์ฒด๊ฐ ํธ์ถ๋์ด์ผ ํ๋ ์ค๋ ๋๊ฐ ์ ์ฝ๋๋ค๋ฉด,
- ์ด๋ฅผ ์ฌ์ฉํ๋ ํจ์๋ค์์๋ ์ด๋ค ์ค๋ ๋์์ ์คํ์ด ๋์ด์ผ ํ๋์ง ๋ช ์์ ์ผ๋ก ๊ฒฐ์ ํด์ฃผ์ด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.