๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IOS๐ŸŽ/WWDC

[WWDC 2021] Protect mutable state with Swift actors

by Jouureee 2022. 5. 24.

์ด๋ฒˆ ์„ธ์…˜์—๋Š” await/async ์— ์ด์–ด ์ƒˆ๋กญ๊ฒŒ ๋“ฑ์žฅํ•œ Actor ํƒ€์ž…์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค !!

https://developer.apple.com/videos/play/wwdc2021/10133/

 

Protect mutable state with Swift actors - WWDC21 - Videos - Apple Developer

Data races occur when two separate threads concurrently access the same mutable state. They are trivial to construct, but are notoriously...

developer.apple.com

 

Actor in swift 

์ฒซ๋ฒˆ์งธ๋กœ, actor๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ ์ด์œ ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

concurrent ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ• ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” data racing์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด์ฃ . data racing์€ ๋‘ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์‹œ and ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์“ฐ๊ธฐ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์„๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

์•„๋ž˜ ์•ˆ์ข‹์€ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค.

์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ 1, 2 ๋˜๋Š” 2,1์˜ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ counter๊ฐ€ ์•ˆ์ •์ ์ธ state์— ๋‚จ๊ฒจ์ ธ ์žˆ์„๋•Œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‘ task ๋ชจ๋‘ 0์„ ์ฝ๊ณ  1์„ ์จ์„œ 1,1์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป์„ ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐ’์ด ์ฆ๊ฐ€๋œ ํ›„์— return๋œ๋‹ค๋ฉด ๋‘˜๋‹ค 2, 2๋ฅผ ์ฝ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
data racing์€ ํ”ผํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ๋กœ ์•…๋ช…์ด ๋†’์Šต๋‹ˆ๋‹ค. 

 

data racing์€ shared mutable state์— ์˜ํ•ด ๋ฐœ์ƒ๋ฉ๋‹ˆ๋‹ค.(์œ„ ์˜ˆ์‹œ์—์„œ๋Š” value state๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

๋งŒ์•ฝ data๊ฐ€ ๋ณ€ํ™”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ concurrent task์— ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด data racing์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
data racing์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” value semantics๋ฅผ ์‚ฌ์šฉํ•ด shared mutable state๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.  ๋‹ค์–‘ํ•œ value type๊ณผ ํ•จ๊ป˜ ๋ชจ๋“  mutation์€ ์ง€์—ญ์ ์ž…๋‹ˆ๋‹ค. ๋”์šฑ์ด let value semantic ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๋Š” immutableํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ concurrent task๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. 

์˜ˆ์‹œ๋ฅผ ๋ด…์‹œ๋‹ค. array1์€ int ํƒ€์ž…์˜ array์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  array2์— ์ฒซ๋ฒˆ์งธ array1 ๊ฐ’์„ copyํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋ฐฐ์—ด์— ๊ฐ’์„ append ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถœ๋ ฅํ•ด๋ณด๋ฉด ?
//array1 = [1,2,3]
//array2 = [1,2,4]
๊ฐ€ ํ• ๋‹น ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด value type์ธ struct๋กœ ๋ฐ”๊พธ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š” ? ๋˜ํ•œ increment ํ•จ์ˆ˜๋ฅผ mutating์œผ๋กœ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค. 

ํ—๋žญ ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 
counter๊ฐ€ let์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๊ทธ๋ž˜์„œ let์„ var๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด counter๊ฐ€ ๋‘ concurrent task์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ race condition์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๋‹คํ–‰์ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆ์™„์ „ํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. 

 

๋”ฐ๋ผ์„œ ๊ฐ concurrent task์— ๋Œ€ํ•ด ๋กœ์ปฌ mutable ๋ณ€์ˆ˜๋ฅผ ๋‚ด๋ถ€์— ๋„ฃ์–ด์คŒ์œผ๋กœ์„œ(์ง€์—ญ์ ์œผ๋กœ) ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ concurrent task์— ๋Œ€ํ•ด ํ•ญ์ƒ 1์„ ํ”„๋ฆฐํŠธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋Š” ์ด์ œ race condition์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ์ง€๋งŒ ๊ทธ ํ–‰๋™์€ ๋” ์ด์ƒ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณต์œ  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ concurrent ํ”„๋กœ๊ทธ๋žจ์— shared mutable state๊ฐ€ ์žˆ์„๋•Œ ์ด๊ฒƒ์ด race condition์ด ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด synchronization์˜ ํ˜•ํƒœ๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
atomic๊ณผ locks๊ณผ ๊ฐ™์€Low level tool๋กœ๋ถ€ํ„ฐ serial dispatch queue์™€ ๊ฐ™์€ ๊ณ ์ˆ˜์ค€์˜ construct๊นŒ์ง€ synchronization๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์€ ๊ฐ๊ฐ์€ ๋‹ค์–‘ํ•œ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ชจ๋‘ ๋™์ผํ•œ ์น˜๋ช…์ ์ธ ์•ฝ์ ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์ •ํ™•ํžˆ ์ •ํ™•ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ธ์‹ฌํ•œ ํ›ˆ๋ จ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ ๊ฒฝ์Ÿ์œผ๋กœ ๋๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Actor๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. Actor๋Š” swift๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํƒ€์ž…์ž…๋‹ˆ๋‹ค. 
๊ทธ๋“ค์€ Swift์˜ ๋ชจ๋“  ์ด๋ฆ„์„ ๊ฐ€์ง„ type๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
actor๋Š” properties, methods, initializer, subscripts ๋“ฑ๋“ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. protocol๋ฅผ ์ˆœ์‘ํ•˜๊ฑฐ๋‚˜ extension์„ ๊ฐ€์งˆ ์ˆ˜ oo

๋˜ํ•œ class์™€ ๊ฐ™์ด reference type์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ์† ์ง€์› x

actor์˜ ๋ชฉ์ ์œผ๋กœ shared mutable state๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

์‹ค์ œ๋กœ actor type์˜ ์ฃผ์š” ๊ตฌ๋ณ„๋˜๋Š” ํŠน์ง•์€ ์ธ์Šคํ„ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋ถ„๋ฆฌํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋™๊ธฐํ™”๋œ ์•ก์„ธ์Šค๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋ฅผ ๋ด…์‹œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” actor type์˜ Counter๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 
struct์™€ class์™€์˜ ์ฐจ์ด์ ์€ actor๋Š” value๊ฐ€ ๋™์‹œ์ ์œผ๋กœ ์ ‘๊ทผ๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
์ด ์˜ˆ์‹œ์—์„œ increment ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ๋ ๋•Œ actor์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์—†์ด ํ˜ธ์ถœ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ actor state์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ data race๊ฐ€ ์—†์Œ์„ ๋ณด์žฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. 

์šฐ๋ฆฌ๋Š” ๊ฐ™์€ counter์— increment ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‘ concurrent task๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 
์•กํ„ฐ์˜ ๋‚ด๋ถ€ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํ•˜๋‚˜์˜ increment ํ˜ธ์ถœ์ด ๋‹ค๋ฅธ ํ˜ธ์ถœ์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” 1 -> 2 ๋˜๋Š” 2 -> 1์˜ ๊ฐ’์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
์–ด๋–ป๊ฒŒ ๋‘๋ฒˆ์งธ task๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ actor์— ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š” ? swift๋Š” ์ด์— ๋Œ€ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ด resetSlowly ๋ฉ”์„œ๋“œ๋Š” ์นด์šดํ„ฐ ์•กํ„ฐ ์œ ํ˜•์˜ ํ™•์žฅ์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์•กํ„ฐ ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์นด์šดํ„ฐ ๊ฐ’์„ 0์œผ๋กœ ์žฌ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์•กํ„ฐ์˜ ์ƒํƒœ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Actor์—์„œ ์‹คํ–‰ ์ค‘์ž„์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ธฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ actor์˜ ์ค‘์š”ํ•œ ํŠน์ง•์ž…๋‹ˆ๋‹ค. 
Actor์˜ ๋™๊ธฐ ์ฝ”๋“œ๋Š” ์ค‘๋‹จ ์—†์ด ํ•ญ์ƒ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋™๊ธฐ ์ฝ”๋“œ๋Š” ์ค‘๋‹จ ์—†์ด ์‹คํ–‰๋˜์ง€๋งŒ Actor๋Š” ์ข…์ข… ์„œ๋กœ ๋˜๋Š” ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•œ๋‹ค๊ณ  ๊ฐ•์กฐํ–ˆ์Šต๋‹ˆ๋‹ค. 
๋น„๋™๊ธฐ ์ฝ”๋“œ์™€ Actor์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ImageDownloader actor์— ๋Œ€ํ•ด ์˜ˆ์‹œ๋ฅผ ๋ด ๋ด…์‹œ๋‹ค. ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œ ๋œ image๊ฐ€ ์žˆ๋‹ค๋ฉด cache์—์„œ ๋ฆฌํ„ดํ•˜๋„๋ก ํ•˜๋ฉฐ ์—†๋‹ค๋ฉด ๋‹ค์šด๋กœ๋“œ ๋œ image๋ฅผ cache์— ์ €์žฅํ•˜์—ฌ ๋ฆฌํ„ดํ•˜๋„๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

์•กํ„ฐ์˜ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์บ์‹œ ์ธ์Šคํ„ด์Šค ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜๋ฏ€๋กœ ์บ์‹œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
์ฆ‰ ์—ฌ๊ธฐ์„œ await ํ‚ค์›Œ๋“œ๋Š” await๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ๋งˆ๋‹ค downloadImageํ•จ์ˆ˜๊ฐ€ ์ด ์‹œ์ ์— ์ค‘๋‹จ๋ ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ CPU๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ• ์ˆ˜ ์žˆ๋„๋ก ์ž ์‹œ ๋†”๋‘์ฃ . ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์žฌ๊ฐœ๋˜๋ฉด ์ „๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ state๊ฐ€ ๋ณ€๊ฒฝ ๋˜์–ด ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. 

Await ํ›„์— ์œ ์ง€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” await ์ด์ „ ์ƒํƒœ์— ๋Œ€ํ•ด ๊ฐ€์ •ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ image๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‘ ๋‹ค๋ฅธ concurrent task๋ฅผ ๊ฐ€์ง€๊ณ . ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ด…์‹œ๋‹ค. 

์ž, ์ฒซ๋ฒˆ์งธ Task1์€ cache ์ €์žฅ์†Œ์— image๊ฐ€ ์—†์Œ์„ ํ™•์ธํ•˜๊ณ  downloadImageํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. 

downloadImage ํ•จ์ˆ˜๋Š” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— suspend๋ฉ๋‹ˆ๋‹ค.  

์ฒซ๋ฒˆ์งธ Task1๊ฐ€ image๐Ÿ˜ธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๋„์ค‘ ์ƒˆ ์ด๋ฏธ์ง€๐Ÿ˜ฟ๊ฐ€ ๊ฐ™์€ url๋กœ ์„œ๋ฒ„์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์„๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž ์ด์ œ task2๊ฐ€ image๋ฅผ ๊ฐ€์ ธ์˜ค๊ธธ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง task1์—์„œ ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, cache ๋”•์…”๋„ˆ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  task2 ์—ญ์‹œ downloadImageํ•˜๋Š” ๋™์•ˆ suspend ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ ํ›„์— ์ฒซ๋ฒˆ์งธ task1์ด ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋งˆ์น˜๊ณ  actor์—์„œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.
cache์— ๋ฐ›์•„์˜จ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  return ํ•˜๊ฒ ์ฃ  ?

๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ task2 ์—ญ์‹œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋งˆ์น˜๊ณ  url์— image๋ฅผ ์ €์žฅํ•˜๊ณ  return ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
์šฐ๋ฆฌ๊ฐ€ ์ฒซ๋ฒˆ์งธ task1์„ ํ†ตํ•ด ์ด๋ฏธ image๋ฅผ cache์— ์ €์žฅํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  task2๊ฐ€ image๋ฅผ ๋‹ค์‹œํ•œ๋ฒˆ ๊ฐฑ์‹ ํ•˜๋ฉด์„œ ๋‘๋ฒˆ์˜ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 
Await ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์ž ์žฌ์ ์ธ bug๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 
์—ฌ๊ธฐ์„œ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ await ํ›„ ๊ฐ€์ •์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

task๋ฅผ ์žฌ๊ฐœ(resume)ํ• ๋•Œ, cache์— ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์›๋ž˜ image์„ ์œ ์ง€ํ•˜๊ณ  ์ƒˆ image์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. 

๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์€ ์ค‘๋ณต ๋‹ค์šด๋กœ๋“œ๋ฅผ ์™„์ „ํžˆ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

actor์˜ ์žฌ์ง„์ž…์€ ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์•ž์œผ๋กœ์˜ ์ง„ํ–‰์„ ๋ณด์žฅํ•˜์ง€๋งŒ ๊ฐ ๋Œ€๊ธฐ์—์„œ ๊ฐ€์ •์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์žฌ์ง„์ž…์„ ์œ„ํ•œ ๋””์ž์ธ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋™๊ธฐ ์ฝ”๋“œ ์•ˆ์—์„œ actor state์˜ mutation์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. state mutation์€ ์ผ์‹œ์ ์œผ๋กœ actor๋ฅผ ์ผ๊ด€์„ฑ ์—†๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

await ์ „์— ์ผ๊ด€์„ฑ์„ ๋ณต์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. await๋Š” ์ž ์žฌ์ ์ธ suspension point์ž„์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ๋งŒ์•ฝ ์ฝ”๋“œ๊ฐ€ suspend๋œ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ”๋“œ๊ฐ€ ์žฌ๊ฐœ๋˜๊ธฐ ์ „๊นŒ์ง€ ์›€์ง์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์—ญ sate, clock, timer ๋˜๋Š” actor์— ๋Œ€ํ•ด ๋งŒ๋“  ๋ชจ๋“  ๊ฐ€์ •์€ await ํ›„์— ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

Actor isolation์€ actor type์˜ ํ–‰๋™์— ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

LibraryAccount actor์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค
== ๋ฉ”์„œ๋“œ๋Š” static ํƒ€์ž…์œผ๋กœ actor์— isolate๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.  Equatable ํ”„๋กœํ† ์ฝœ์„ ์ˆœ์‘ํ•˜๋Š” == ๋ฉ”์„œ๋“œ๋Š” actor type์˜ ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด static ๋ฉ”์†Œ๋“œ๋Š” ๋‘˜ ๋‹ค ์™ธ๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. actor์— ์˜ค์ง immutable state๋งŒ ์ ‘๊ทผํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. 

(isolate๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์ง€์—ญ์ (local)? ์ด๋ž‘ ์ผ๋งฅ์ƒํ†ตํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค .. ๐Ÿค”)

 

์ด๋ฒˆ์—” Hashable ํ”„๋กœํ† ์ฝœ์„ ์ˆœ์‘ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ด…์‹œ๋‹ค. Hashable์€ hash ํ•จ์ˆ˜ ๊ตฌํ˜„์„ ํ•„์š”๋กœ ํ•˜๋Š”๋ฐ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋„ค์š”. Hashable์„ ์ˆœ์‘ํ•˜๋Š” ์ด actor๋Š” actor ๋ฐ–์—์„œ ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ hashํ•จ์ˆ˜๋Š” asyncํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ actor isolation์„ ์œ ์ง€ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ non-isolation์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

isolation์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ํ—ท๊ฐˆ๋ ค zedd๋‹˜ ์ •๋ฆฌ ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค -> https://zeddios.tistory.com/1303

 

actor๋‚ด์— ์ •์˜๋œ
- stored, computed instance properties
- instance methods
- instance subscripts
๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ actor-isolated ์ƒํƒœ์ด๋‹ค.

ํŠน1. actor-isolated ์ •์˜๋“ค์€ ๋‹ค๋ฅธ actor-isolated ์ •์˜๋“ค์„ ์ž์œ ๋กญ๊ฒŒ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠน2. actor-isolated๊ฐ€ ์•„๋‹Œ ์ •์˜๋“ค์€ actor-isolated ์ •์˜๋“ค์— ๋™๊ธฐ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์œ„์˜ ์˜ˆ์‹œ์—์„œ func hash()๋Š” actor-isolated์ธ๋ฐ actor-non-isolated์ธ Hasher์—์„œ actor-isolated์ธ idNumber์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์ง€์š” ! ๋‹ค์‹œ ์ด์–ด๊ฐ€๋ด…์‹œ๋‹ค.

 

Non-isolated๋Š” actor ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— actor์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. nonisolated ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” idNumber๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋กœ hashํ•˜๊ธธ ์‹œ๋„ํ•œ๋‹ค๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด booksOnLoan๊ณผ ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ๋กœ ๋ง์ด์ฃ . ๊ทธ๋ ‡๋‹ด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด mutable state(var)์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ data race๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 

์ž, ํด๋กœ์ €์— ๋Œ€ํ•ด ์–˜๊ธฐํ•ด๋ด…์‹œ๋‹ค. ํ•จ์ˆ˜์™€ ๊ฐ™์ด ํด๋กœ์ €๋Š” isolated ๋  ์ˆ˜๋„ non-isolated ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

readSome ํด๋กœ์ €๋Š” read()๋ผ๋Š” actor-isolated ํ•จ์ˆ˜์—์„œ ๋งŒ๋“ค์–ด์ง„ ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ญ์‹œ actor-isolated์ด๋ฉฐ await๊ฐ€ ์—†์Œ์— ์ฃผ๋ชฉํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋ด…์‹œ๋‹ค. Task.detached๋Š” actor๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…๊ณผ ๋™์‹œ์—(async) ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ read()๋Š” actor์•ˆ์— ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ํด๋กœ์ €๋Š” non-isolated์ž…๋‹ˆ๋‹ค. 
Read ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธธ ์›ํ•  ๋•Œ, await๋ฅผ ๋ถ™์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๊ฐ€ actor์˜ ๋ฐ–์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š”์ง€์— ๋”ฐ๋ผ isolation์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” actor isolation๊ณผ data์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด๋ด…์‹œ๋‹ค.

Book์€ structํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ด๋Š” LibaryAccount actor์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ์ƒํƒœ๊ฐ€ ์ž์ฒด ํฌํ•จ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. (๊ฐ’ ๋ณต์‚ฌ ํƒ€์ž…์œผ๋ฏ€๋กœ ) ๋”ฐ๋ผ์„œ ๊ณ„์†ํ•ด์„œ ์ด ๋ฉ”์„œ๋“œ(visit)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ์„ ์ฑ…์„ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๋ฉด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ฑ…์˜ ๋ณต์‚ฌ๋ณธ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฑ… ์‚ฌ๋ณธ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ actor์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ Book์„ class ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ ๋‹ค๋ฉด, ๋‹ฌ๋ผ์ง€๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

LibraryAccount actor๋Š” ์ด์ œ Book class์˜ ์ฐธ์กฐํƒ€์ž…์ž…๋‹ˆ๋‹ค. 
ํ•˜์ง€๋งŒ ๊ทธ ์ž์ฒด๋กœ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ, selectRandomBook() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ์š” ? Mutable state์˜ actor์— ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— actor์˜ ๋ฐ–์—์„œ ๊ณต์œ ๋˜์–ด์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž ์žฌ์ ์ธ data race condition์„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ฑ…์˜ ์ œ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์•กํ„ฐ ๋‚ด์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์—์„œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธ ๋ฐฉ๋ฒ•์ด actor ๋‚ด์— ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ˆ˜์ •์€ ๊ฒฐ๊ตญ data race condition์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

value ์œ ํ˜•๊ณผ actor๋Š” ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€๋งŒ class๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Sendable์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

Sendable type์€ ๋‹ค๋ฅธ actor ๊ฐ„์— ๊ฐ’์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” type์ž…๋‹ˆ๋‹ค.
ํ•œ ๊ณณ์—์„œ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ณ  ๋‘ ์œ„์น˜๊ฐ€ ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ํ˜•์€ Sendable์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1. value ํƒ€์ž…์€ ๊ฐ ๋ณต์‚ฌ๋ณธ์ด ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ Sendable์ž…๋‹ˆ๋‹ค.

2. Actor ํƒ€์ž… ์—ญ์‹œ mutable state์— ๋Œ€ํ•ด ๋™๊ธฐ์ ์ธ ์ ‘๊ทผ์„ ๋ณด์žฅํ•˜๋ฏ€๋กœ sendable์ž…๋‹ˆ๋‹ค.

3. class๋Š” ์ฃผ์˜๊นŠ๊ฒŒ ๋‹ค๋ค„์ง€๋ฉด sendable ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งŒ์•ฝ class์™€ ๋ชจ๋“  subclass๊ฐ€ immutable data๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด sendable์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
4. ๋˜๋Š” class๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„๋™๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๋”ฐ๋ผ์„œ concurrent์— ์•ˆ์ „ํ•œ ์ ‘๊ทผ์„ ๋ณด์žฅํ•œ๋‹ค๋ฉด sendable์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ํด๋ž˜์Šค๋Š” ์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์•„๋‹ˆ๋ฉฐ Sendable์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
5. ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ Sendable์ด ์•„๋‹ˆ๋ฏ€๋กœ ์•กํ„ฐ ๊ฐ„์— ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ํ•จ์ˆ˜ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์‹œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ฃ 


actor๋Š” ์ฃผ๋กœ Sendable type ์ธก๋ฉด์—์„œ ํ†ต์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.  ์™œ๋ƒํ•˜๋ฉด sendable ํƒ€์ž…์€ data race๋ฅผ ๋ง‰๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
์ด๊ฒƒ์€ Swift๊ฐ€ ๊ฒฐ๊ตญ ์ •์ ์œผ๋กœ ๊ฒ€์‚ฌ๋ฅผ ์‹œ์ž‘ํ•  ์†์„ฑ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  non sendable ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. 

 

Sendable protocol์„ ์ฑ„ํƒํ•˜๋ฉด swift๊ฐ€ ์ž๋™์œผ๋กœ sendable ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š”์ œ ์ฒดํฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

Author์€ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ sendable ํƒ€์ž…์ด ์•„๋‹™๋‹ˆ๋‹ค ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ค์ฃ .

 

์ œ๋„ค๋ฆญ ํƒ€์ž…์— ๋Œ€ํ•ด์„  ์ธ์ž์— ๋”ฐ๋ผ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•„๊นŒ ๋งํ–ˆ๋˜ ํ•จ์ˆ˜๊ฐ€ sendable์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด๋ด…์‹œ๋‹ค.
ํ•จ์ˆ˜ ์ž์ฒด๋Š” Sendable์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์•กํ„ฐ ๊ฐ„์— ํ•จ์ˆ˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋ฉด ๋ง์ด์ฃ . ์ด๋Š” ํด๋กœ์ €๊ฐ€ data race condition์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ž‘์—…์„ ์ œํ•œํ•˜๋Š” ํด๋กœ์ €์— ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด sendable closure๋Š” mutable ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ captureํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. sendable์ด ๋œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. 
๋™๊ธฐ์‹ Sendable ํด๋กœ์ €๋Š” actor๋ฅผ isolatedํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์™ธ๋ถ€์—์„œ actor์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์‚ฌ์‹ค Task.detached์—๋Š” sendable ํƒ€์ž…์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค..! (์™œ ์ด์ œ ์•Œ๋ ค์ฃผ๋Š”๊ฑฐ๋‹ˆ !!)

detached๊ฐ€ sendable์ž„์„ ๋ณด์žฅํ•˜๋Š” ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— counter struct์— mutable ํ•จ์ˆ˜์ธ increment๋ฅผ ํ˜ธ์ถœ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์•„๊นŒ ๋ณด์•˜๋˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. detached๊ฐ€ sendable์ด๋ฏ€๋กœ actor์— isolated ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ detached์•ˆ์— ์ž‘์—…์€ ๋น„๋™๊ธฐ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

Sendable type๊ณผ ํด๋กœ์ €๋Š” actor๊ฐ€ isolation ๋˜๋Š”๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. 

๋งˆ์ง€๋ง‰์œผ๋กœ ํŠน๋ณ„ํ•œ actor์ธ main actor์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด๋ด…์‹œ๋‹ค !
Main thread์—์„œ ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

์ด ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋Š” ๋ชจํ˜ธํ•˜๊ฒŒ ์นœ์ˆ™ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์€ ์•กํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ž„์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด UI ์ƒํƒœ์— ์•ˆ์ „ํ•˜๊ฒŒ ์•ก์„ธ์Šคํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ actor๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 

 

์šฐ๋ฆฌ๋Š” ๋ฉ”์ธ ์•กํ„ฐ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์•กํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.๋ฉ”์ธ ์•กํ„ฐ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์•กํ„ฐ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์—์„œ ์ผ๋ฐ˜ ๋ฐฐ์šฐ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋จผ์ € ์ฃผ ์•กํ„ฐ๋Š” ์ฃผ ๋””์ŠคํŒจ์น˜ ๋Œ€๊ธฐ์—ด์„ ํ†ตํ•ด ๋ชจ๋“  ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋Ÿฐํƒ€์ž„ ๊ด€์ ์—์„œ ์ฃผ ์•กํ„ฐ๋Š” DispatchQueue.main์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‘˜์งธ, ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์— ์žˆ์–ด์•ผ ํ•  ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. SwiftUI, AppKit, UIKit ๋ฐ ๊ธฐํƒ€ ์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด view, viewController ๋ฐ data model์˜ UI ๋ถ€๋ถ„์— ๊ฑธ์ณ ์žˆ์Šต๋‹ˆ๋‹ค. Swift ๋™์‹œ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ ์–ธ์„ ์ฃผ ์•กํ„ฐ ์†์„ฑ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ฃผ ์•กํ„ฐ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์„ธ์…˜์—์„œ ์šฐ๋ฆฌ๋Š” actor isolation๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  serialํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด actor ๋ฐ–์—์„œ ๋น„๋™๊ธฐ ์•ก์„ธ์Šค๋ฅผ ์š”๊ตฌํ•จ์œผ๋กœ์จ actor๊ฐ€ ๋™์‹œ ์•ก์„ธ์Šค๋กœ๋ถ€ํ„ฐ mutable state๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. 
actor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Swift ์ฝ”๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ณ  ๋™์‹œ์ ์ธ ์ถ”์ƒํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜์‹ญ์‹œ์˜ค.

Value type๊ณผ actor๋Š” ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ data race condition์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์™€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ณต์œ  ์ƒํƒœ๋ฅผ ๋‹ค์‹œ ๋„์ž…ํ•˜๋Š” ๊ธฐํƒ€ ๋น„์ „์†ก ์œ ํ˜•์— ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋งˆ์ง€๋ง‰์œผ๋กœ UI์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์ฝ”๋“œ์˜ ์ฃผ ์•กํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ ์Šค๋ ˆ๋“œ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ์ฃผ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์•กํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด Swift ๋™์‹œ์„ฑ์„ ์œ„ํ•œ ์•ฑ ์—…๋ฐ์ดํŠธ ์„ธ์…˜์„ ํ™•์ธํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์•กํ„ฐ๋ฅผ ํฌํ•จํ•œ Swift์˜ ๋™์‹œ์„ฑ ๋ชจ๋ธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด “๋น„ํ•˜์ธ๋“œ ์Šคํ† ๋ฆฌ” ์„ธ์…˜์„ ํ™•์ธํ•˜์„ธ์š”. ์•กํ„ฐ๋Š” Swift ๋™์‹œ์„ฑ ๋ชจ๋ธ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ๋ฐ ๊ตฌ์กฐํ™”๋œ ๋™์‹œ์„ฑ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ์ •ํ™•ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์™€.. ์„ค๋ช…์ด ์ •๋ง ๊ธธ์—ˆ์Šต๋‹ˆ๋‹ค.

swift-evolution/Actors <- evolution ๊ธ€๋“ค๋„ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด๊ณ  ๋‹ค์‹œ ๋ณต์Šต์ด ํ•„์š”ํ•  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค .. ํ™”์ดํŒ… ..!

swift-evolution/Actors-isolation-control 

swift-evolution/golbal-Actors 

swift-evolution/sendable 

'IOS๐ŸŽ > WWDC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[WWDC 2021] Make blazing fast lists and collection views  (0) 2022.05.27
[WWDC 2021] Your guide to keyboard layout  (0) 2022.05.26
[WWDC 2021] Meet async/await in Swift  (0) 2022.05.17
[WWDC 2020] Advances in diffable data sources  (0) 2022.05.12
[WWDC 2019] Advances in UI Data Sources  (0) 2022.05.10

๋Œ“๊ธ€