ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
.NET 9 Middleware Pipeline: Advanced Patterns and Performance ๐Ÿš€
Dev.toDev.to
Backend

.NET 9 Middleware ์ตœ์ ํ™”๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ•ด๊ฒฐ

.NET 9 Middleware Pipeline: Advanced Patterns and Performance ๐Ÿš€

Vikrant Bagal2026๋…„ 4์›” 6์ผ8๋ถ„intermediate

Context

ASP.NET Core Middleware Pipeline์˜ ๋‹จ์ˆœํ•œ ์ถ”์ƒํ™” ์˜คํ•ด๋กœ ์ธํ•œ ์‹คํ–‰ ํ๋ฆ„ ์ œ์–ด ์‹คํŒจ. Singleton ๊ธฐ๋ฐ˜ ํ™œ์„ฑํ™” ๋ฐฉ์‹ ์‚ฌ์šฉ ์‹œ Scoped ์„œ๋น„์Šค ์บก์ฒ˜๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ. ์ž˜๋ชป๋œ Middleware ๋“ฑ๋ก ์ˆœ์„œ๋กœ ์ธํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ ๋ฐ ์ฒ˜๋ฆฌ ์ง€์—ฐ.

Technical Solution

  • UseWhen๊ณผ MapWhen์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•œ ํŒŒ์ดํ”„๋ผ์ธ ์ œ์–ด. UseWhen์€ ์กฐ๊ฑด๋ถ€ ์‹คํ–‰ ํ›„ ๋ฉ”์ธ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ณต๊ท€ํ•˜๋Š” ๊ตฌ์กฐ. MapWhen์€ ์กฐ๊ฑด ์ผ์น˜ ์‹œ ๋ฉ”์ธ ํ๋ฆ„์„ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ์˜๊ตฌ์  ํฌํฌ ๋ฐฉ์‹.
  • IMiddleware ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ํ†ตํ•œ Factory ๊ธฐ๋ฐ˜ ํ™œ์„ฑํ™” ์ „๋žต. ์š”์ฒญ๋งˆ๋‹ค DI ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Scoped ์„œ๋น„์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ ํ•ด๊ฒฐ.
  • ๋น„์šฉ ๊ธฐ๋ฐ˜ Middleware ๋ฐฐ์น˜ ์ตœ์ ํ™” ์„ค๊ณ„. ExceptionHandler์™€ HttpsRedirection ๊ฐ™์€ ์ €๋น„์šฉ ๋กœ์ง์„ ์ „๋ฉด์— ๋ฐฐ์น˜ํ•˜๊ณ  CustomAudit ๊ฐ™์€ ๊ณ ๋น„์šฉ ๋กœ์ง์„ ํ›„์ˆœ์œ„๋กœ ๋ฐฐ์น˜ํ•˜๋Š” ๊ตฌ์กฐ.
  • Sync-over-Async ์ œ๊ฑฐ๋ฅผ ํ†ตํ•œ Thread Pool Deadlock ๋ฐฉ์ง€. .Result๋‚˜ .Wait() ๋Œ€์‹  ์ „ ๊ตฌ๊ฐ„ await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์™„์ „ ๋น„๋™๊ธฐ ํ๋ฆ„ ์„ค๊ณ„.
  • Request Body ๋ฒ„ํผ๋ง ์ตœ์†Œํ™” ์ „๋žต. ๋Œ€์šฉ๋Ÿ‰ ํŽ˜์ด๋กœ๋“œ ์ฒ˜๋ฆฌ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ ์žฌ ๋Œ€์‹  Stream ์ง์ ‘ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ ํ™•๋ณด.

Key Takeaway

Middleware Pipeline์€ ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ฒด์ธ์ด๋ฉฐ ๋“ฑ๋ก ์ˆœ์„œ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์•ˆ์ •์„ฑ๊ณผ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ์„ค๊ณ„ ์š”์†Œ์ž„.


Scoped ์„œ๋น„์Šค(DB Context ๋“ฑ)๊ฐ€ ํ•„์š”ํ•œ Middleware๋Š” ๋ฐ˜๋“œ์‹œ IMiddleware๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  Transient๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ

์›๋ฌธ ์ฝ๊ธฐ