Runtime Async์ ๊ด๋ จํด์๋ ๋ง์ ๋ณํ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฃผ์ ์
๋๋ค. ๊ทธ๋์์ ๋งฅ๋ฝ์ ์ ๋ฆฌํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ Claude Opus๋ฅผ ํตํด ์ ๋ฆฌํ ๋ด์ฉ์ ํฌ์คํ
ํฉ๋๋ค. 
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์ ํต์ฌ ์ฑ๋ฅ ์ด์ ์ค ํ๋์
๋๋ค.