์ฃผ๋ง ์•„์นจ #64

์ผ๋ฐ˜

๊ธฐ์ˆ  ๋Šฅ๋ ฅ์„ ํ‚ค์šฐ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ• ๋ฐœํ‘œ: Microsoft Learn์—์„œ ์ œ๊ณตํ•˜๋Š” 30์ผ ํ”Œ๋žœ | Phil Evans

.NET / C#

์ œ์•ˆ๋œ C# ์œ ํ˜• ๊ณต์šฉ์ฒด๋Š” ๋ฌด์—‡์ด๋ฉฐ ์ฐจ๋ณ„๋œ ๊ณต์šฉ์ฒด์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋‚˜์š”? | Peter Ritchie

Data API Builder์™€ EF Core Power Tools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช‡ ๋ถ„ ์•ˆ์— CRUD ์›น API ๋งŒ๋“ค๊ธฐ | Erik Ejlskov Jensen

async2 - .NET ๋Ÿฐํƒ€์ž„ ๋น„๋™๊ธฐ ์‹คํ—˜์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. | Steven Giesel

.NET์˜ Wolverine ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๊ฐœ | Konstantinos Polychronopoulos

ํฌ๋กœ์Šคํ”Œ๋žซํผ

Avalonia UI - ๋””์ž์ธ ํƒ€์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

DB

์•Œ์•„์•ผ ํ•  EF ํ•ต์‹ฌ ๊ธฐ๋Šฅ 5๊ฐ€์ง€ | Milan Jovanoviฤ‡

ํด๋ผ์šฐ๋“œ

์—ฌ๋Ÿฌ ๊ฐœ์˜ Docker ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜์˜ ๋‹ค์ค‘ ์•„ํ‚คํ…์ฒ˜ ์ด๋ฏธ์ง€๋กœ ๊ฒฐํ•ฉ | Andrew Lock

Windows์—์„œ ARM64์šฉ Docker ๋‹ค์ค‘ ์•„ํ‚คํ…์ฒ˜ ์ด๋ฏธ์ง€ ์ƒ์„ฑ | Andrew Lock

AI

์™œ ML.NET์„ ์‚ฌ์šฉํ•˜๋‚˜์š”? | Matt Eland

C#์œผ๋กœ ChatGPT์™€ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ | Alvaro Montoya

๋ฆด๋ฆฌ์Šค

.NET 9๊ฐ€ ํฌํ•จ๋œ Visual Studio 2022 v17.12์˜ ์ฒซ ๋ฒˆ์งธ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ | Mads Kristensen

JetBrains Rider์šฉ Uno Platform Solution Template Wizard ๋ฐœํ‘œ | Uno Platform Team

Windows App SDK - v1.6.0-๋ฏธ๋ฆฌ๋ณด๊ธฐ1

ํ–‰์‚ฌ

.NET Conf 2024 - .NET 9 ์ถœ์‹œ๋ฅผ ๊ธฐ๋…ํ•˜๋Š” ํ–‰์‚ฌ! - ๋‚ ์งœ๋ฅผ ์ €์žฅํ•˜์„ธ์š”! | Mehul Harry

๋งํฌ

.NET 9 Preview 7์˜ ASP.NET Core ์—…๋ฐ์ดํŠธ

Humanizer - ํœด๋จธ๋‚˜์ด์ €๋Š” ๋ฌธ์ž์—ด, ์—ด๊ฑฐํ˜•, ๋‚ ์งœ, ์‹œ๊ฐ„, ๊ธฐ๊ฐ„, ์ˆซ์ž ๋ฐ ์ˆ˜๋Ÿ‰์„ ์กฐ์ž‘ํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  .NET ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

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

async/await ํ‚ค์›Œ๋“œ ๋‚˜์˜ฌ๋•Œ
ํŒ€ ์ปจ๋ฒค์…˜์œผ๋กœ ๋น„๋™๊ธฐ ์ฝ”๋“œ ์ž‘์„ฑ ๊ธˆ์ง€๊ฐ€ ์ƒ๊ฒผ์—ˆ์ฃ .
wpf ๋ฒ„ํŠผ ํด๋ฆญํ•˜๋ฉด reentrant ์ฒ˜๋ฆฌ ์•ˆ๋˜์žˆ์–ด์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๋ˆŒ๋ฆฌ๊ณ 

์ง€๊ธˆ์€ nodejs์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ธฐ๋กœ ์‚ฌ์šฉํ•ด์„œ ์ •๋ง ์„ธ์ƒ์ด ๋ฌด์„ญ๊ฒŒ ๋ณ€ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋Š”๊ตฐ์š”.

๊ณ ๋ฃจํ‹ด์ด๋‚˜ Virtual Thread์— ๋Œ€์‘ํ•  ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์‹คํ—˜์ด ์ด์–ด์ง€๊ณ  ์žˆ๋‚˜๋ณด๋„ค์š”

Green threads are also known as โ€œcoroutinesโ€ or โ€œfibersโ€ in other programming languages.

์ด ๊ธ€์— ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์€ ๋ฌธ์žฅ์ด ์žˆ๋Š”๋ฐ, ์™œ ์ฝ”๋ฃจํ‹ด์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜์‹ ๊ฑด์ง€ ๋ชจ๋ฅด๊ฒ ๊ตฐ์š”.

๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์–ธ์–ด ๋ ˆ๋ฒจ์—์„œ ์ง€์›ํ•˜๋Š” ์ฝ”๋ฃจํ‹ด์ด๋ผ๋Š” ๊ฒŒ ๋”ฐ๋กœ ์žˆ๋Š”๊ฑด๊ฐ€โ€ฆ

๋‹ค๋ฅธ ์–ธ์–ด๋Š” ๊ฒฝํ—˜์ด ์—†์–ด์„œ ์ •ํ™•ํžˆ ๊ทธ๋ฆฐ์Šค๋ ˆ๋“œ ๋ผ๋Š” ๊ฒŒ ๋ญ”์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์ฝ”๋ฃจํ‹ด์€ ์ œ๊ฐ€ ์•Œ๊ธฐ๋ก  ๋ฉ€ํ‹ฐ์ฝ”์–ด๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „๋ถ€ํ„ฐ ๊ทธ ์—ญ์‚ฌ๊ฐ€ ๋งค์šฐ ์˜ค๋ž˜๋˜์—ˆ๊ณ , .NET์—์„œ๋„ ์ด๋ฏธ async/await ๊ฐœ๋… ์ž์ฒด๋Š” ์ฝ”๋ฃจํ‹ด์ธ๊ฑฐ๋กœ ์•„๋Š”๋ฐ ๋ง์ด์ฃ .

.NET์€ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ๋งŒ ์žˆ๋Š”๊ฑธ๋กœ ์•„๋Š”๋ฐ ๊ฐœ๋…์ด ๋‘๊ฐœ๊ฐ€ ์ถฉ๋Œ๋‚˜์„œ ๋‡Œ์ ˆ์ด ์˜ค๋„ค์š”.

๊ทธ๋ฆฐ ์Šค๋ ˆ๋“œ๋Š” ์šด์˜ ์ฒด์ œ๊ฐ€ ์•„๋‹Œ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ (VM)์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ฐ€ ์ด๊ฑฐ ํ•ด์„์ข€ ํ•ด์ฃผ์„ธ์š”โ€ฆ์˜์–ด๋ฅผ ํ•ด์„ ํ•œ๊ฑด๋ฐ ์™œ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์ฃ  ใ… ใ… 

์ €๋„ ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ๋Œ€๋กœ, ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ํ•ด๋ณธ ๊ฒฝํ—˜์ด ์—†์–ด์„œ ๊ทธ๋ฆฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ญ”๊ฐ€โ€ฆ๋‰˜์•™์Šค๋‚˜ ๋งฅ๋ฝ์ด ์šด์˜์ฒด์ œ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์—์„œ ์ง€์›๋˜๋Š” ์Šค๋ ˆ๋“œ๋ผ๊ณ  ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค ๊ทธ๊ฒŒ ์ฝ”๋ฃจํ‹ด์ด ๋งž๊ธดํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋ฃจํ‹ด์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์—์„œ ๋น„๋™๊ธฐ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์ง€/์žฌ์‹œ์ž‘ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค ์Šค๋ ˆ๋“œ์™€ ๊ด€๋ จ์€ ์—†๋Š” ๊ธฐ๋Šฅ์ด๊ฑฐ๋“ ์š”.

๊ทธ๋ฆฌ๊ณ  ์ฝ”๋ฃจํ‹ด์€ ์ข€ ์ฐพ์•„๋ณด๋‹ˆ ์ œ๊ฐ€ ์˜ค๋ž˜๋˜์—ˆ๋‹ค๊ณ ๋งŒ ์จ๋†จ๋Š”๋ฐ 1958๋…„๋„์— ์ฒ˜์Œ ํƒ„์ƒํ•œ ์šฉ์–ด๋กœ์„œ, ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๊ธฐ ์ „๋ถ€ํ„ฐ ์žˆ๋˜ ๊ฐœ๋…์ด ๋งž์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค์˜ ํž™ ์˜์—ญ์„ ์ฝ”๋ฃจํ‹ด์˜ Stack์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•จ์ˆ˜์˜ ์ผ์‹œ์ •์ง€/์žฌ์‹œ์ž‘์„ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ธ๋ฐ ๊ฒฐ๊ตญ ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๋ ˆ๋“œ 1๊ฐœ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์€ ๋งž๊ธฐ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์ฝ”์–ด์—์„œ๋Š” ์ฝ”๋ฃจํ‹ด๋งŒ ์“ฐ๋ฉด CPU ์ฝ”์–ด์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ๋งž์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ฝ”๋ฃจํ‹ด+์Šค๋ ˆ๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์ด ์ง€๊ธˆ .NET์˜ TAP๋ผ๊ณ  ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. await๊ฐ€ ํ˜ธ์ถœ๋œ ์‹œ์ ์—์„œ ์ž ์‹œ ์ •์ง€ํ–ˆ๋‹ค๊ฐ€ await๋กœ ๋ฐ˜ํ™˜๋ฐ›๊ณ  ๋‹ค์‹œ ๊ทธ ์ดํ›„๋กœ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„ ๋•Œ๋ฌธ์— ์ฝ”๋ฃจํ‹ด์ด๋ผ๊ณ  ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

await๊ฐ€ ๋Œ๋ฉด์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œํ’€์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋ฃจํ‹ด ์ดํ›„์˜ ๊ฐœ๋…์ธ ๊ฒƒ์ด์ง€์š”

Task๋ฅผ ๋œฏ์–ด๋ณด์‹œ๋ฉด ์•Œ๊ฒ ์ง€๋งŒ Task๋Š” Thread ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉฐ, Task๋ผ๋Š” ์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ ์Šค๋ ˆ๋“œ ์Šค์ผ€์ฅด๋Ÿฌ์— ์ด๊ด€ํ•˜์—ฌ ์Šค๋ ˆ๋“œํ’€์—์„œ ํ• ๋‹นํ•˜์—ฌ ๋Œ์•„๊ฐ€๋Š” ํ˜•ํƒœ์ธ๋ฐ ์ฝ”๋ฃจํ‹ด์ด reactor pattern(๋ฆฌ์—‘ํ„ฐ ํŒจํ„ด)์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ์ด๋ฏ€๋กœ ์ €๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” ์ด๋ฏธ .NET์—๋Š” ์ฝ”๋ฃจํ‹ด๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ๊ฐœ๋…์ด ๋ณตํ•ฉ์ ์œผ๋กœ ๋“ค์–ด์žˆ๋Š”๊ฒŒ ๋งž๋Š”๋ฐ ๊ธ€์“ด์ด ๋ถ„๊ป˜์„œ ๊ทธ๋ฆฐ์Šค๋ ˆ๋“œ๊ฐ€ ์ฝ”๋ฃจํ‹ด์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์ดํ•ด๊ฐ€ ์„œ๋กœ ์ถฉ๋Œํ•˜๋Š” ๋ถ€๋ถ„์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„ ์—ฌ๊ธฐ ์ด๊ฑฐ ์ œ ๋Œ“๊ธ€์— ๋Œ€ํ•œ ํ‘œ์‹œ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ•œ๊ฑด์ง€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์…”์„œ ์ œ ๋Œ“๊ธ€์— ๋Œ€ํ•œ ํ•ด์„์„ ์จ๋†“์€ ๊ฒƒ์ธ๋ฐ ์ œ ๋Œ“๊ธ€์— ๋Œ€ํ•œ ์˜๋„๋ฅผ ๋ฌผ์–ด๋ณด์‹  ๊ฒŒ ์•„๋‹ˆ๊ตฐ์š”?

์ฝ”๋ฃจํ‹ด์„ โ€˜์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์Šค๋ ˆ๋“œโ€™ ๋ผ๊ณ  ๋ถ€๋ฅด๊ธด ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ๋ฅผ ์ชผ๊ฐœ์„œ ๋” CPU ์‹œ๊ฐ„์„ ์กฐ๊ธˆ์”ฉ ๋” ์ž‘์€ ๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ '์Šค๋ ˆ๋“œโ€™๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์€ ๊ฒŒ ์ข€ ์—๋ฐ” ์•„๋‹Œ๊ฐ€ ํ•˜๋„ค์š” ๊ฐœ์ธ์ ์œผ๋กœ๋Š”โ€ฆ;