.NET 11 Preview 2 ๊ณต๊ฐœ

Microsoft๊ฐ€ .NET 11 Preview 2๋ฅผ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

.NET 11์€ 2026๋…„ 11์›” ์ถœ์‹œ ์˜ˆ์ •์ธ STS(Standard Term Support) ๋ฆด๋ฆฌ์Šค๋กœ, ๋Ÿฐํƒ€์ž„๊ณผ SDK, ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „๋ฐ˜์— ๊ฑธ์นœ ๊ฐœ์„ ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ์ฐจ๊ธฐ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ Preview 2๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ์‹œํ—˜ํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต๋œ ๋‘ ๋ฒˆ์งธ ํ”„๋ฆฌ๋ทฐ ๋นŒ๋“œ์ž…๋‹ˆ๋‹ค.

.NET 11์˜ ์ฒซ ๋ฒˆ์งธ ํ”„๋ฆฌ๋ทฐ์ธ Preview 1์€ 2026๋…„ 2์›” 10์ผ ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ธ”๋กœ๊ทธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6๊ฐœ์˜ ์ข‹์•„์š”

Runtime Async์™€ ๊ด€๋ จํ•ด์„œ๋Š” ๋งŽ์€ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ์˜ ๋งฅ๋ฝ์„ ์ •๋ฆฌํ•ด๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ Claude Opus๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. :smiley:


Runtime Async๋Š” .NET์˜ async/await ๊ตฌํ˜„ ๋ฐฉ์‹ ์ž์ฒด๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ณ€ํ™”์ด๋ฏ€๋กœ, ๊ทธ ๋ฐฐ๊ฒฝ๋ถ€ํ„ฐ ํ˜„์žฌ ์ƒํƒœ๊นŒ์ง€ ์ •๋ฆฌํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ: Green Threads์—์„œ Runtime Async๋กœ

์›๋ž˜ .NET 8 ์‹œ๊ธฐ์— Green Threads ์‹คํ—˜์ด ๋จผ์ € ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. OS๊ฐ€ ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์Šค๋ ˆ๋“œ๋ฅผ ๋„์ž…ํ•˜๋ ค๋Š” ์‹œ๋„์˜€๋Š”๋ฐ, ๊ธฐ์กด async ๋ชจ๋ธ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ณต์žก์„ฑ, ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์ธํ„ฐ๋กญ ๋ฌธ์ œ, Shadow Stack ๋“ฑ ๋ณด์•ˆ ์™„ํ™” ๊ธฐ๋ฒ•๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ ํŒ€์€ ๋ฐฉํ–ฅ์„ ์ „ํ™˜ํ•˜์—ฌ, async/await๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” โ€œasync2โ€ ์‹คํ—˜์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. JIT ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์ด ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ์–‘์ชฝ์—์„œ ๋” ์œ ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์™”๊ณ , ๊ธฐ์กด ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ async์™€ ์ตœ์†Œ ๋™๋“ฑํ•˜๊ฑฐ๋‚˜ ๊ทธ ์ด์ƒ์˜ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ณ€ํ™”: ์ปดํŒŒ์ผ๋Ÿฌ State Machine โ†’ ๋Ÿฐํƒ€์ž„ ๋ ˆ๋ฒจ ์ฒ˜๋ฆฌ

๊ธฐ์กด async/await์˜ ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ async ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด C# ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒํƒœ ๋จธ์‹ (state machine)์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” async/await ์ž์ฒด์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ž…์žฅ์—์„œ๋Š” ๊ทธ๋ƒฅ ์ผ๋ฐ˜ ์ฝ”๋“œ์ผ ๋ฟ์ด๋ผ ์ตœ์ ํ™” ์—ฌ์ง€๊ฐ€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

Runtime Async๋Š” ์ด๋ฅผ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค. C# ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ „์ฒด ์ƒํƒœ ๋จธ์‹ ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋Œ€์‹  AsyncHelpers.Await(...) ํ˜ธ์ถœ์„ ์ƒ์„ฑํ•˜๊ณ , ๋Ÿฐํƒ€์ž„์ด ์ด๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด Task๊ฐ€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ์ƒํƒœ๋งŒ ์ €์žฅํ•œ ํ›„ ๋ฉ”์„œ๋“œ๋ฅผ ์ผ์‹œ ์ค‘๋‹จํ–ˆ๋‹ค๊ฐ€ ๊ฒฐ๊ณผ๊ฐ€ ์ค€๋น„๋˜๋ฉด ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ Steven Giesel์˜ ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋™์ผํ•œ .NET 11 Preview 1์—์„œ runtime-async๋ฅผ ์ผ  ๊ฒฝ์šฐ์™€ ๋ˆ ๊ฒฝ์šฐ๋ฅผ ๋น„๊ตํ•˜๋ฉด, ๋™๊ธฐ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋Š” async ํ˜ธ์ถœ ์ฒด์ธ์—์„œ ์•ฝ 33% ์†๋„ ํ–ฅ์ƒ(192ns โ†’ 128ns)๊ณผ ์•ฝ 42% ํ• ๋‹น ๊ฐ์†Œ(1.61KB โ†’ 928B)๊ฐ€ ๊ด€์ธก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ•ฉ์„ฑ ๋ฒค์น˜๋งˆํฌ์ด๋ฏ€๋กœ ์‹ค์ œ ์›Œํฌ๋กœ๋“œ์—์„œ์˜ ์ฐจ์ด๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ์›๋ฆฌ

ํ•ต์‹ฌ์€ ๋กœ์ปฌ ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .NET 10๊นŒ์ง€๋Š” ์ƒํƒœ ๋จธ์‹ ์ด ๋ชจ๋“  ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ๋œ ์ƒํƒœ ๋จธ์‹  ํด๋ž˜์Šค์˜ ํ•„๋“œ๋กœ ํ˜ธ์ด์ŠคํŒ… (๊ธ€ ํ•˜๋‹จ์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”) ํ•ฉ๋‹ˆ๋‹ค. .NET 11์˜ Runtime Async์—์„œ๋Š” ๋Ÿฐํƒ€์ž„์ด ๋ณ€์ˆ˜๋ฅผ ์Šคํƒ์— ์œ ์ง€ํ•˜๋‹ค๊ฐ€, ์‹ค์ œ๋กœ await ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํž™์œผ๋กœ spillํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋™๊ธฐ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋Š” hot path์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ํž™ ํ• ๋‹น์ด ๋Œ€ํญ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

Lowered ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ด ์ฐจ์ด๊ฐ€ ๊ทน๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฐฉ์‹์€ AsyncTaskMethodBuilder, IAsyncStateMachine ๊ตฌํ˜„์ฒด, 100์ค„ ์ด์ƒ์˜ ์ƒํƒœ ๋จธ์‹  ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋งŒ, ์ƒˆ ๋ฐฉ์‹์€ ์›๋ณธ ์ฝ”๋“œ์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ํ˜•ํƒœ์— AsyncHelpers.Await ํ˜ธ์ถœ๋งŒ ์ถ”๊ฐ€๋œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

๋””๋ฒ„๊น… ๊ฒฝํ—˜ ๊ฐœ์„ 

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

ํ˜„์žฌ ์ƒํƒœ์™€ ์ œ์•ฝ

.NET 11 Preview 1์—์„œ CoreCLR์˜ Runtime Async ์ง€์›์€ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋˜์–ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. NativeAOT์— ๋Œ€ํ•œ ๊ธฐ์ดˆ ์ง€์›๋„ ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์•„์ง runtime-async๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ์ดํ›„ ํ”„๋ฆฌ๋ทฐ์—์„œ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ง์ ‘ ์‹คํ—˜ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์— ๋‹ค์Œ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

<EnablePreviewFeatures>true</EnablePreviewFeatures>
<Features>$(Features);runtime-async=on</Features>

์ฆ‰, ์ง์ ‘ ์ปดํŒŒ์ผํ•˜๋Š” ์ฝ”๋“œ์—์„œ๋Š” ์„ฑ๋Šฅ ์ด์ ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ”์–ด ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„์ง runtime-async๋กœ ์žฌ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๊ฐœ์„  ํšจ๊ณผ๋Š” ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

SynchronizationContext ๊ด€๋ จ ๋ณ€ํ™” ๊ฐ€๋Šฅ์„ฑ

ํ•œ ๊ฐ€์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์ƒํƒœ ๋จธ์‹ ์ด SynchronizationContext๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ continuation์„ ์›๋ž˜ ์ปจํ…์ŠคํŠธ๋กœ ๋Œ๋ ค๋ณด๋ƒˆ๋Š”๋ฐ, ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ๋Ÿฐํƒ€์ž„์ด SynchronizationContext๋ฅผ ๋“œ๋กญํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๊ธฐ์กด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด ํ™•์ •์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ, AsyncLocal, ExecutionContext ๋“ฑ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์—์„œ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋ผ๋ฉด ํ›„์† ํ”„๋ฆฌ๋ทฐ๋ฅผ ๋ฉด๋ฐ€ํžˆ ์ถ”์ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, Runtime Async๋Š” โ€œ๊ธฐ์กด async/await์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ, ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋Ÿฐํƒ€์ž„ ๋ ˆ๋ฒจ๋กœ ๋Œ์–ด๋‚ด๋ ค ์„ฑ๋Šฅยทํ• ๋‹นยท๋””๋ฒ„๊น…์„ ๊ฐœ์„ ํ•˜๋Š”โ€ ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค. Drop-in replacement๋ฅผ ์ง€ํ–ฅํ•˜๋ฏ€๋กœ ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜๊ณ  ์žˆ์œผ๋ฉฐ, .NET 11 GA(2026๋…„ 11์›” ์˜ˆ์ •)๊นŒ์ง€ ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์žฌ์ปดํŒŒ์ผ์ด ์ง„ํ–‰๋˜๋ฉด ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋” ๋šœ๋ ทํ•ด์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.


ํ˜ธ์ด์ŠคํŒ… (Hoisting)

"ํ˜ธ์ด์ŠคํŒ…(hoisting)"์ด๋ผ๋Š” ์šฉ์–ด๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์˜ ์—ฌ๋Ÿฌ ๋งฅ๋ฝ์—์„œ ๋“ฑ์žฅํ•˜์ง€๋งŒ, ๊ฐ๊ฐ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋™์ž‘์€ ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ…(Loop-Invariant Code Motion)์€ ๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ ๋ฐ˜๋ณต๋งˆ๋‹ค ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฐ์ถœํ•˜๋Š” ์—ฐ์‚ฐ์„ ๋ฃจํ”„ ๋ฐ”๊นฅ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค ๋ถˆํ•„์š”ํ•œ ์žฌ๊ณ„์‚ฐ์„ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด์ชฝ์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ์ด๋™์‹œํ‚จ๋‹ค๋Š” ์ ์—์„œ "๋Œ์–ด์˜ฌ๋ฆผ"์˜ ์˜๋ฏธ๊ฐ€ ๊ฐ€์žฅ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

async ์ƒํƒœ ๋จธ์‹ ์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ…์€ ์ด ๋‘˜๊ณผ ์„ฑ๊ฒฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ์Šคํƒ ํ”„๋ ˆ์ž„์— ํ• ๋‹น๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์Šคํƒ ํ”„๋ ˆ์ž„๊ณผ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ async ๋ฉ”์„œ๋“œ๋Š” await ์ง€์ ์—์„œ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ œ์–ด๋ฅผ ๋Œ๋ ค์ฃผ๊ณ  ๋‚˜์ค‘์— ์žฌ๊ฐœ๋˜๋ฏ€๋กœ, ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” await ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์‚ด์•„๋‚จ์•„์•ผ ํ•˜๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ํž™์— ํ• ๋‹น๋˜๋Š” ์ƒํƒœ ๋จธ์‹  ๊ตฌ์กฐ์ฒด(๋˜๋Š” ํด๋ž˜์Šค)์˜ ํ•„๋“œ๋กœ ๋Œ์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ "๋Œ์–ด์˜ฌ๋ฆผ"์€ ์Šค์ฝ”ํ”„๋‚˜ ์‹คํ–‰ ์ˆœ์„œ์˜ ์ด๋™์ด ์•„๋‹ˆ๋ผ, **์ €์žฅ ์œ„์น˜์˜ ์Šน๊ฒฉ(promotion)**์ž…๋‹ˆ๋‹ค. ์Šคํƒ์ด๋ผ๋Š” ์ˆ˜๋ช…์ด ์งง์€ ์ €์žฅ์†Œ์—์„œ ํž™์ด๋ผ๋Š” ์ˆ˜๋ช…์ด ๊ธด ์ €์žฅ์†Œ๋กœ ๋ณ€์ˆ˜์˜ ๊ฑฐ์ฒ˜๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๊ธฐ์กด ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์—์„œ๋Š” ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ await ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋Š”์ง€ ์ •๋ฐ€ํ•˜๊ฒŒ ํŒ๋ณ„ํ•˜์ง€ ์•Š๊ณ , ๋ฉ”์„œ๋“œ ๋‚ด ๋ชจ๋“  ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. Runtime Async์—์„œ๋Š” ๋Ÿฐํƒ€์ž„์ด ์ด ํŒ๋‹จ์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜์—ฌ, ์‹ค์ œ๋กœ await๋ฅผ ๋„˜์–ด ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋งŒ ์„ ํƒ์ ์œผ๋กœ ํž™์— spillํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์Šคํƒ์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋™๊ธฐ์  ์™„๋ฃŒ ๊ฒฝ๋กœ(hot path)์—์„œ ๋ถˆํ•„์š”ํ•œ ํž™ ํ• ๋‹น์ด ๋Œ€ํญ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์ด Runtime Async์˜ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ด์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

5๊ฐœ์˜ ์ข‹์•„์š”