Visual Studio 2026 κ³Ό Aspire 감상

κ·Έκ°„ λŒ“κΈ€μ€ λͺ‡ 번 λ‹¬μ•˜λŠ”λ° 글은 처음 μ μ–΄λ³΄λ„€μš”!

이직을 ν•˜κ³  λ‚˜μ„œ μƒˆλ‘œμš΄ νšŒμ‚¬μ—μ„œλŠ” λ…Έλ“œ 기반으둜 λ˜μ–΄ μžˆμ–΄μ„œ 닷넷을 κ·Ό 1λ…„κ°„ μ•ˆ λΆ™μž‘κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

그런데 μš”μ¦˜ μƒˆλ‘œμš΄ μ„œλΉ„μŠ€λ₯Ό μ€€λΉ„ν•˜λ˜ 쀑 μ „λΆ€ν„° 파보고 μ‹Άμ—ˆλ˜ Aspireλ₯Ό 써보기둜 ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 MSμ—μ„œ 적절히 VS 2026을 μΆœμ‹œ ν•œ 참에 1λ…„λ§Œμ— VSλ₯Ό λ‹€μ‹œ 써본 감상도 남겨보렀고 ν•©λ‹ˆλ‹€.

μ˜€λŠ˜μ€ κ·Έ 1μΌμ°¨μž…λ‹ˆλ‹€.

μ§‘ 컴퓨터에 VS 2026을 μ„€μΉ˜ν•˜κ³  ASP.NET도 μ„€μΉ˜ν•˜κ³  μ˜μ–΄νŒ©λ„ μ„€μΉ˜ν•˜κ³  λ‹€ μ§„ν–‰ ν–ˆμŠ΅λ‹ˆλ‹€. (이 글을 적기 μ „ μ„€μΉ˜λ₯Ό ν•΄λ²„λ €μ„œ μŠ€μƒ·μ€ μ—†μŠ΅λ‹ˆλ‹€..)

Aspire Starter Project λ₯Ό λ§Œλ“œλ‹ˆκΉŒ 무렀 ν”„λ‘œμ νŠΈκ°€ 4κ°œκ°€ 생겨 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ApiService - λŒ€μΆ© λ³΄λ‹ˆ μƒˆλ‘œ λ‚˜μ˜¨ File based App 기반으둜 μ›λž˜ ASP.NET Core 예제 ν”„λ‘œμ νŠΈ λ§Œλ“€λ©΄ 있던 WeatherForecast μ„œλΉ„μŠ€ μ˜ˆμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ†€λžκ²Œλ„ ApiController 없이 파일 ν•˜λ‚˜λ‘œ ν‰μΉœκ²Œ λ‹·λ„·μ˜ λ°œμ „μ„ λ³΄μ—¬μ£ΌλŠ” 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€.

AppHost
μ—¬κΈ°κ°€ Main 인 것 같은데 Blazor Server (ν”„λ‘ νŠΈ) ApiService λ₯Ό ν•œ 데 λͺ¨μ•„놓고 λŒλ¦¬λŠ” 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€. ASP NET Core 기쑴처럼 WebHost μ΄λ ‡κ²Œ μ‹œμž‘ν•΄μ„œ λ³΅μž‘ν•˜κ²Œ μ˜μ‘΄μ„± μ£Όμž…ν•΄μ£ΌλŠ”κ²Œ μ‚¬λΌμ Έμ„œ κ°œμΈμ μœΌλ‘œλŠ” λ§ˆμŒμ— λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

ServiceDefaults

이게 Aspire 에 핡심인 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€. Extensions.cs 에 μ΅μˆ™ν•œ μ˜μ‘΄μ„± μ£Όμž… μ½”λ“œλ“€μ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ Extensions static class 인거 λ³΄λ‹ˆκΉŒ 이걸 Aspire μ–΄λ”˜κ°€μ„œ λΆˆλŸ¬μ™€μ„œ λ•‘κ²¨μ„œ μ“Έ 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€. (μ›λ¦¬λŠ” μ•Œμ•„λ΄μ•Ό 함)

Web - Blazor Server ν”„λ‘œμ νŠΈλ‘œ λ³΄μž„

μ•žμœΌλ‘œ 각각을 더 νŒŒν—€μ³λ³Ό μƒκ°μž…λ‹ˆλ‹€.

그리고 λ‹Ήλ‹Ήν•˜κ²Œ https μž¬μƒ λ²„νŠΌμ„ λˆŒλŸ¬λ³΄λ‹ˆ μ•Œμ•„μ„œ 둜컬호슀트 17223 둜 λ°λ €λ‹€μ£Όλ”λ‹ˆ

λ­”κ°€ μ•„κΉŒ Extensions μ—μ„œ μ˜μ‘΄μ„± μ£Όμž…μ„ μ‹€μ»· ν•΄μ„œ κ·ΈλŸ°μ§€ Aspire κΈ°λ³Έ μ–΄λ“œλ―Όμ²˜λŸΌ λ³΄μ΄λŠ”κ²Œ 반겨 μ€λ‹ˆλ‹€. μ—¬κΈ°μ„œ λ¦¬μ†ŒμŠ€λ³„λ‘œ 켜고 λ„κ±°λ‚˜λ„ κ°€λŠ₯ν•˜κ³  μ½˜μ†”μ—μ„œ λ‘œκ·Έλ„ λ°”λ‘œ 확인 κ°€λŠ₯ν•˜κ³ 

image

μ•„κΉŒ λ³΄λ‹ˆ OpenTelemetry 도 λ‹¬λ €μžˆμ–΄μ„œ μ•Œμ•„μ„œ λ‹€ 집계도 λ˜λŠ” 것 κ°™μ•„μ„œ μ’‹μ•„λ³΄μž…λ‹ˆλ‹€.

λ‹€μŒ λ‹¨κ³„λŠ” DB (μ›λž˜ μ„œλΉ„μŠ€μ—μ„œ μ“°λ˜ Postgresql DB) μ—°κ²°νŽΈμœΌλ‘œ λŒμ•„μ˜€κ² μŠ΅λ‹ˆλ‹€.
VS 2026은 μ „λ°˜μ μœΌλ‘œ μ’€ 깔끔해진 것 κ°™κ³  μ•„μ§κΉŒμ§€λŠ” 큰 λ³€ν™”λŠ” λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ’€ 더 써봐야 μ•Œ 것 κ°™κΈ΄ ν•©λ‹ˆλ‹€. μ„€μ • ν•˜λŠ” 곳에 검색이 생겼긴 ν–ˆλŠ”λ° 아직 μœˆλ„μš° μ œμ–΄νŒ 같이 λ ˆκ±°μ‹œ μ„€μ •κ³Ό κ³΅μ‘΄ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ (κΈ€κΌ΄ λ°”κΎΈλŠ” κ±°λŠ” λ ˆκ±°μ‹œ 섀정인듯)

λΆ€μ‘±ν•œ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

10개의 μ’‹μ•„μš”

PostgreSQL integration | Aspire

κΈ°μ‘΄ 저희 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ—°κ²°ν•˜κ³  μ‹Άμ–΄μ„œ μ–΄λ–»κ²Œ ν•˜λ©΄ λ˜λ‚˜ μ°Ύμ•„λ³΄λ‹ˆ μœ„μ™€ 같은 λ¬Έμ„œκ°€ μžˆμ–΄μ„œ.. μ’€ 더 μ½μ–΄λ³΄λ‹ˆ λ­”κ°€ Postgresql DBλ₯Ό μƒˆλ‘œ λ§Œλ“€μ–΄μ„œ μ—°κ²°ν•˜λŠ” 것 같은 λŠλ‚Œμ΄ λ“€μ–΄μ„œ μ•Œμ•„λ³΄λŠ” μ€‘μž…λ‹ˆλ‹€ (μΆ”κ°€ν•˜λ©΄ μœ„μ— Aspire κ΄€λ¦¬μž νŽ˜μ΄μ§€?에 μƒκΈ°λŠ”κ²Œ μ•„λ‹κΉŒ μ‹ΆμŠ΅λ‹ˆλ‹€)

κ·Έλƒ₯ κΈ°μ‘΄ DB 연결은 μ•Œμ•„μ„œ ν•˜λ©΄ λ˜λŠ” κ±΄μ§€λŠ” μ’€ 더 μ•Œμ•„λ³΄κ³  λ³΄μΆ©ν•˜κ² μŠ΅λ‹ˆλ‹€.

1개의 μ’‹μ•„μš”

λ³„λ„λ‘œ Blazor 도 겉ν•₯κΈ° μ‹μœΌλ‘œ κ³΅λΆ€ν•΄μ„œ μ΄λ²ˆμ— 일단 혼자 λ§Œλ“€μ–΄λ³΄λ©΄μ„œ κ³Όμ—° μ½”νŒŒμΌλŸΏμ΄ μ•„λ‹Œ Cursor λŠ” C# μ΄λž‘ ASP.net Core도 잘 μ§œμ€„ 것인가.. 도 κ³΅λΆ€ν•˜λ©΄μ„œ κ²€μ¦ν•΄λ‚˜κ°€κ² μŠ΅λ‹ˆλ‹€. νšŒμ‚¬μ—μ„œλŠ” λ§₯뢁 + Cursor μ‘°ν•©μœΌλ‘œ 갈 것 κ°™μŠ΅λ‹ˆλ‹€.

2개의 μ’‹μ•„μš”

aspire CLIκ°€ μ•ˆ λ˜λŠ” μ΄μœ λŠ” 말 κ·ΈλŒ€λ‘œ μ„€μΉ˜λ₯Ό μ•ˆν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ¬Έμ„œ 보고 μ„€μΉ˜ν•˜μ‹œλ©΄ λ˜κ΅¬μš”.

그러면 μ•„κΉŒ λ§μ”€λ“œλ¦° aspire add λͺ…λ Ήμ–΄λ₯Ό μ“Έ 수 있게 되고 그러면 μ•Œμ•„μ„œ λ§μ”€λ“œλ¦° AppHost λ₯Ό μ°Ύμ•„μ„œ μ•Œμ•„μ„œ csporj νŒŒμΌμ— μ„€μΉ˜λ˜κΈ΄ ν•©λ‹ˆλ‹€.

이런걸 μΆ”κ°€ν•˜λŠ”λ° μ•½κ°„ 정체가 κΆκΈˆν•œλ°.. 더 해보고 μˆ˜μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

2개의 μ’‹μ•„μš”

λ‹Ήμ—°ν•˜μ§€λ§Œ μ§‘ μœˆλ„μš° μ»΄μ—μ„œ λ§Œλ“  Aspire ν”„λ‘œμ νŠΈλ₯Ό κΉƒμœΌλ‘œ μ˜¬λ €μ„œ νšŒμ‚¬ λ§₯뢁 ν”„λ‘œμ— λ‹·λ„· 10을 μ„€μΉ˜ν•˜κ³  aspire CLIλ₯Ό μ΄μš©ν•΄μ„œ λ˜‘κ°™μ΄ ν”„λ‘œμ νŠΈλ₯Ό λ„μšΈ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ—­μ‹œ 닷넷은 ν¬λ‘œμŠ€ν”Œλž«νΌμ΄ λ§žμŠ΅λ‹ˆλ‹€

4개의 μ’‹μ•„μš”

μ•„μ£Ό μ‚¬μ•Œμ§ λ―Έλ¬˜ν•΄μ§ˆ 수 μžˆλŠ”κ²Œ, λ§₯은 μš”μ¦ˆμŒ arm64인지라 aspireμ—μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ“°λ €κ³  ν•˜λ©΄ μœˆλ„μš°κ°€, 그리고 λ§Žμ€ ν΄λΌμš°λ“œ ν™˜κ²½μ΄ amd64인 κ²½μš°κ°€ λ§Žμ€μ§€λΌ λ¬Έμ œκ°€ 생기기 μ‰¬μš΄ 것 κ°™μŠ΅λ‹ˆλ‹€. γ… γ… 

λ¬Όλ‘  Rosetta 2κ°€ 있긴 ν•˜μ§€λ§Œ μ™„μ „ν•˜μ§€ μ•Šκ³ , κ²°κ΅­ μ—†μ–΄μ§ˆκ²ƒμœΌλ‘œ λ³΄μ΄λŠ” μŠ€νƒμΈμ§€λΌ μ»¨ν…Œμ΄λ„ˆ μ‚¬μš©μ€ 항상 λ―Έλ¬˜ν•œλ“― ν•©λ‹ˆλ‹€.

1개의 μ’‹μ•„μš”

λ„€ λ§žμŠ΅λ‹ˆλ‹€. ν¬λ‘œμŠ€μ»΄νŒŒμΌμ„ ν•΄μ•Ό 되긴 ν•˜λ”λΌκ΅¬μš”. γ… γ… 

1개의 μ’‹μ•„μš”

μ–΄λŠ 정도 κ°œλ°œμ„ ν•΄μ„œ 감상을 말씀 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

CursorλŠ” 일단 닷넷도 잘 ν•œλ‹€λŠ” 사싀을 κΉ¨λ‹¬μ•˜κ΅¬μš”.

Aspire둜 λ§Œλ“ κ±Έ AWS 에 EC2 ν•˜λ‚˜ νŒŒμ„œ docker-compose둜 λ„μ›Œλ΄€μŠ΅λ‹ˆλ‹€. Aspire.Hosting.DockerλΌλŠ” κ±Έ ν†΅ν•΄μ„œ docker-compose.yml을 기본적으둜 λ½‘μ•„μ€˜μ„œ 일단 μ‰½κ²Œ κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€ (아직 λ‹·λ„·10은 프리뷰라 κ·ΈλŸ°μ§€ 버그가 μ’€ μžˆκΈ΄ν•΄μ„œ 직접 μˆ˜μ •ν•˜κΈ΄ 함)

AWS ECSκΉŒμ§€ 가보고 μ‹Άμ—ˆμœΌλ‚˜ 인프라 μ„ΈνŒ…ν•˜λŠ”κ²Œ λ„˜ νž˜λ“€μ–΄μ„œ 일단 ν¬κΈ°ν–ˆμŠ΅λ‹ˆλ‹€ (Azure둜 λ„μš΄λ‹€κ³  ν•˜λ©΄ λ°”λ‘œ 될지도?)

Aspire 에 λŒ€ν•œ 감상은 docker-composeλ₯Ό ν•œ 번 더 μΆ”μƒν™”ν•΄μ„œ λ‹·λ„·μœΌλ‘œ 가져닀놓은 λŠλ‚Œμ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€. 아직 μ›λž˜ μ„œλΉ„μŠ€ DBλ₯Ό μ—°κ²°λ§Œ 해놓은 μƒνƒœλΌ Redis같은 κ±Έ λ„μ›Œλ³΄μ§€λŠ” λͺ»ν–ˆλŠ”λ°μš”. Aspire.Hosting.Redisλ₯Ό μ‹œλ„ν•΄λ³΄λŠ” 게 λ‹€μŒ κ³Όμ œκ°€ λ˜κ² μŠ΅λ‹ˆλ‹€.

이 글은 μ—¬κΈ°μ„œ λ§ˆλ¬΄λ¦¬ν•˜κ³  이미 λ°°ν¬λŠ” 해놓긴 ν–ˆλŠ”λ° μ’€ 더 λ‹€λ“¬μ–΄μ„œ 홍보가 κ°€λŠ₯ν•΄μ§€λŠ”λ•Œμ— λ‹€μ‹œ λŒμ•„μ˜€κ² μŠ΅λ‹ˆλ‹€!

6개의 μ’‹μ•„μš”