๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ ๊ฐœ๋ฐœ/๐Ÿ“– ๊ฐœ๋…

[iOS/WWDC21] Explore structured concurrency in swift 1

by MINT09 2025. 4. 1.

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ, ๋ฏผํŠธ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ˆ 
WWDC21 Explore structured concurrency in swift๋ฅผ ๋ณด๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์–‘์ด ๋งŽ์•„์„œ Part1๊ณผ 2๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

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

์˜ˆ๋ฅผ ๋“ค์–ด if - else๋ฌธ์€ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ ์ฝ”๋“œ ๋ธ”๋ก์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋Š” ๋™์•ˆ์—๋งŒ ์กฐ๊ฑด๋ถ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ Swift์—์„œ๋Š” ํ•ด๋‹น ๋ธ”๋ก์ด ์ •์  ๋ฒ”์œ„์ธ scoping์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด์— ํ•ด๋‹น ๋ธ”๋ก ๋‚ด์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜๋“ค์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋Š” ๋ธ”๋ก์„ ๋ฒ—์–ด๋‚  ๋•Œ ๋๋‚ฉ๋‹ˆ๋‹ค.

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

ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ์ ์ด๊ณ  ๋™์‹œ์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ•  ๋•Œ, ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์ „๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋˜ ์ฝœ๋ฐฑ ํŒจํ„ด์˜ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฐ”ํ…€ - ์—… ํ˜•์‹์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ๊ณ ์ž ํ•˜๋Š” ๊ตฌ์กฐ์  ์ œ์–ด ํ๋ฆ„์—์„œ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— Swift Concurrency, ์ฆ‰ async/await์—์„œ๋Š” ํƒ‘-๋‹ค์šด ํ˜•์‹์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ์„ฑ, Task

async/await์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์–‘์ด ๋งŽ์•„์ง„๋‹ค๋ฉด, ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋” ๋ณต์žกํ•˜๊ณ  ์„ฑ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋™์‹œ์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์ธ Task์˜ ์ƒ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

4๊ฐ€์ง€ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. Structured Concurrency (async - let)

์ผ๋ฐ˜์ ์ธ let์€ =๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์—๋Š” ๋ณ€์ˆ˜๋ช…, ์˜ค๋ฅธ์ชฝ์—๋Š” ์ดˆ๊ธฐํ™” ํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. let์— ๋„๋‹ฌ์‹œ, ์ดˆ๊ธฐํ™” ํ”„๋กœ๊ทธ๋žจ์„ ํ‰๊ฐ€ํ•˜์—ฌ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

let result = URLSession.shared.data()

URL์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์šด๋กœ๋“œ ๋œ ํ›„ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „, ํ•ด๋‹น ๊ฐ’์„ result์— ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œ์— ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์†ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” let ์•ž์— async ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

async let result = URLSession.shared.data()

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์‹ค์ œ๋กœ result๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „์— ์ž์‹ Task๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ Task๋Š” ๋ณธ์ธ์„ ์ƒ์„ฑํ•œ Task์˜ ํ•˜์œ„ Task์ž…๋‹ˆ๋‹ค.

์ด์— ์œ„์˜ ์•ž์„  ๊ทธ๋ฆผ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ํ™”์‚ดํ‘œ๊ฐ€ ๋‘๊ฐœ ๋‚˜์˜ต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ž์‹ Task๋ฅผ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ณ€์ˆ˜ result๋ฅผ ์ž๋ฆฌ ํ‘œ์‹œ์ž ๊ฐ’์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ถ€๋ชจ Task๋ฅผ ์œ„ํ•œ ํ™”์‚ดํ‘œ์ž…๋‹ˆ๋‹ค.

์ด๋•Œ result์˜ ์‹ค์ œ ๊ฐ’์ด ํ•„์š”ํ•œ ํ‘œํ˜„์‹์— ๋„๋‹ฌํ•˜๋ฉด, ๋ถ€๋ชจ๋Š” ์ž์‹์ด ์ž‘์—…์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ž์‹์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋ฉด result์— ๋Œ€ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ์—์„œ URLSession ํ˜ธ์ถœ์€ ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด try ์ž‘์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ result ๊ฐ’์„ ๋‹ค์‹œ ์ฝ์–ด๋„ ํ•ด๋‹น ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ž์‹ Task๋“ค์€ ์‹ค์ œ๋กœ ์ž‘์—… ํŠธ๋ฆฌ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์ด ํŠธ๋ฆฌ๋Š” ๊ตฌ์กฐํ™”๋œ ๋™์‹œ์„ฑ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์œผ๋กœ, Task์˜ ์†์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ทจ์†Œ, ์šฐ์„ ์ˆœ์œ„, ์ž‘์—… ๋กœ์ปฌ ๋ณ€์ˆ˜ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ async ํ•จ์ˆ˜์—์„œ ๋‹ค๋ฅธ async ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ Task๊ฐ€ ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๊ทธ Task์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๊ทธ๋ฆผ์—์„œ metadata ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ์ด๋ฏธ์ง€ data Task๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ๋กœ ๊ธฐ๋‹ค๋ฆฐ Task๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๋ฉฐ ๋๋‚ฌ๋‹ค๋ฉด fetchOne ํ•จ์ˆ˜๋Š” ๊ทธ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๋ฉฐ ์ฆ‰์‹œ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์ด Task๋ฅผ ์ทจ์†Œ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค๊ณ  ํ•ด์„œ Task๊ฐ€ ์ค‘์ง€๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ์ € ํ•ด๋‹น Task์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ Task์— ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด๊ณ , ์‹ค์ œ๋กœ ์ž‘์—…์ด ์ทจ์†Œ๋˜๋ฉด ๊ทธ ์ž‘์—…์˜ ๋ชจ๋“  ํ•˜์œ„ ์ž‘์—…๋„ ์ž๋™์œผ๋กœ ์ทจ์†Œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— ํ•จ์ˆ˜ fetchOne์€ ์ž์‹ ์ด ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๋ชจ๋“  ๊ตฌ์กฐํ™”๋œ ์ž‘์—…๋“ค์ด ์™„๋ฃŒ๋œ ํ›„, ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๋ฉฐ ์ข…๋ฃŒ๋˜๋Š”๋ฐ ์ด ๋ณด์žฅ์€ ๊ตฌ์กฐํ™”๋œ ๋™์‹œ์„ฑ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์›์น™์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ž‘์—…์˜ ์ƒ์•  ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ์–ด, ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒ์•  ์ฃผ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ARC์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹ค์ˆ˜๋กœ ์ž‘์—…์ด ์œ ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ทจ์†Œ

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

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

2. Group Task

๋‹ค๋งŒ async let์€ ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ๊ณผ ๊ฐ™์ด ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. async let์ด ๋ถ™์€ ์ž‘์—…๋งŒํผ ์‹œ์ž‘๋˜๊ณ  ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Š” ๋‹ค์Œ ๋ฃจํ”„ ๋ฐ˜๋ณต์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ Task Group์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ๋™์‹œ์„ฑ ์–‘์„ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ตฌ์กฐ์  ๋™์‹œ์„ฑ์˜ ํ•œ ํ˜•ํƒœ๋กœ withThrowingTaskGroup ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š” ์ž์‹ task๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋œ ๊ทธ๋ฃน ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน์— ์ถ”๊ฐ€๋œ ์ž‘์—…์€ ๊ทธ๋ฃน์ด ์ •์˜๋œ ๋ธ”๋ก ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

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

์ด์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋™์‹œ์„ฑ ์–‘์„ ์ฆ๊ฐ€์‹œํ‚ฌ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์—ฐํ•˜๊ฒŒ ๋ฐœ์ƒ๋˜๋Š” Data Race์ž…๋‹ˆ๋‹ค. WWDC ๋‚ด์˜ ์˜ˆ์ œ์—์„œ๋Š” ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ์ž์‹ ์ž‘์—…์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๊ณ , ๋ถ€๋ชจ ์ž‘์—…์ด ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฑ…์ž„์„ ์ง€๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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




๋‹ค์Œ ๊ธ€์— ๊ณ„์†...