Aspnetcore: Microsoft.AspNetCore.App 3.0์—์„œ ์ œ๊ฑฐ๋˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ

์— ๋งŒ๋“  2018๋…„ 10์›” 29์ผ  ยท  73์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/aspnetcore

:bulb: _Working draft: ์ด ๋ชฉ๋ก์€ ASP.NET Core 3.0์—์„œ ๊ณ„์† ์ž‘์—…ํ•จ์— ๋”ฐ๋ผ ๋ณ€๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค._

ASP.NET Core 3.0์—์„œ๋Š” Microsoft.AspNetCore.App์—์„œ ๋‹ค์Œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ API๋Š” ๊ณ„์† NuGet ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ๋ฅผ ASP.NET Core 2.1์—์„œ 3.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ <PackageReference> ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Microsoft.AspNet.WebApi.Client(https://github.com/aspnet/AspNetCore/pull/6552 ์ฐธ์กฐ)
  • Microsoft.AspNetCore.Authentication.Facebook
  • Microsoft.AspNetCore.Authentication.Google
  • Microsoft.AspNetCore.Authentication.JwtBearer
  • Microsoft.AspNetCore.Authentication.Microsoft ๊ณ„์ •
  • Microsoft.AspNetCore.Authentication.OpenIdConnect
  • Microsoft.AspNetCore.Authentication.Twitter
  • Microsoft.AspNetCore.Authentication.WsFederation
  • Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.AspNetCore.Identity.UI
  • Microsoft.AspNetCore.JsonPatch
  • Microsoft.AspNetCore.MiddlewareAnalysis
  • Microsoft.AspNetCore.Mvc.Razor.Extensions
  • Microsoft.AspNetCore.NodeServices
  • Microsoft.AspNetCore.Owin
  • Microsoft.AspNetCore.Razor.Design
  • Microsoft.AspNetCore.Razor.Language
  • Microsoft.AspNetCore.Server.Kestrel.Https(cref #4228)
  • Microsoft.AspNetCore.Spa ์„œ๋น„์Šค
  • Microsoft.AspNetCore.SpaServices.Extensions
  • Microsoft.CodeAnalysis.Razor
  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Abstractions
  • Microsoft.EntityFrameworkCore.Analyzers
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.InMemory
  • Microsoft.EntityFrameworkCore.Relational
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.Extensions.Caching.SqlServer
  • Microsoft.Extensions.DiagnosticAdapter
  • Microsoft.Extensions.DependencyModel
  • System.Net.WebSockets.WebSocketProtocol(https://github.com/aspnet/AspNetCore/pull/6699)
Docs area-platform breaking-change

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

MVC ํŒจํ‚ค์ง€๋„ ์ถ”๊ฐ€ NuGet ํŒจํ‚ค์ง€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. MVC๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋ฐ”๋‹๋ผ ASP.NET Core์™€ ๋‹ฌ๋ฆฌ ๋ชจ๋“  .NET ์–ธ์–ด์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋งž๋Š” ๊ฒƒ์€ ๊ณ ์‚ฌํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ฐจ๊ฐ€ ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋งค์šฐ ๋…๋‹จ์ ์ž…๋‹ˆ๋‹ค. ๊ณต์œ  ASP.NET Core ํ”„๋ ˆ์ž„์›Œํฌ๋Š” MVC๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋‘ ๋ฒˆ์งธ MVC ๋ฌด๋ฃŒ ๋ฒ„์ „์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‚˜์š”?

๋ชจ๋“  73 ๋Œ“๊ธ€

MVC ํŒจํ‚ค์ง€๋„ ์ถ”๊ฐ€ NuGet ํŒจํ‚ค์ง€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. MVC๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋ฐ”๋‹๋ผ ASP.NET Core์™€ ๋‹ฌ๋ฆฌ ๋ชจ๋“  .NET ์–ธ์–ด์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋งž๋Š” ๊ฒƒ์€ ๊ณ ์‚ฌํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ฐจ๊ฐ€ ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋งค์šฐ ๋…๋‹จ์ ์ž…๋‹ˆ๋‹ค. ๊ณต์œ  ASP.NET Core ํ”„๋ ˆ์ž„์›Œํฌ๋Š” MVC๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋‘ ๋ฒˆ์งธ MVC ๋ฌด๋ฃŒ ๋ฒ„์ „์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‚˜์š”?

์–ด๋–ค ์ด์ ์ด ์žˆ์„๊นŒ์š”? ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ASP.NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์‚ถ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?

์—„์ฒญ๋‚œ! asp.net ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@davidfowl

์–ด๋–ค ์ด์ ์ด ์žˆ์„๊นŒ์š”? ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ASP.NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์‚ถ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?

๊ฐ™์€ ์ด์œ ๋กœ ์ด ๋ฌธ์ œ์˜ ๋งจ ์œ„์— ๋‚˜์—ด๋œ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค .NET Core 3.0๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋” ๋งŽ์€ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž‘์€ ๊ณตํ†ต ๋ถ„๋ชจ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋ณธ ASP.NET Core ์•ฑ์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋‚˜๋จธ์ง€๋ฅผ NuGet ํŒจํ‚ค์ง€๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜๋ฉด ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜์ค‘์— ๋” ์ด์ƒ ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์šฉํ•จ๊ณผ ๊ท ํ˜•์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋„ค, ๋ฐ”๋‹๋ผ ASP.NET Core๋Š” ์ด๋ฏธ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ƒ๊ด€์—†์–ด์š” ;)

์ˆœ์ˆ˜์ฃผ์˜์ž๋ผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ฏธ๋“ค์›จ์–ด๋‚˜ MVC ๋˜๋Š” SignalR์ด ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ž์— ๋“ค์–ด ์žˆ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ธํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ์‚ฌ์ด์— ์ด ์„ ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ ์ง๊ฐ์ ์ด๊ณ  ๋ชจํ˜ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฒฝํ—˜์— ๊ธฐ์ดˆํ•˜์—ฌ ๊ณผ๊ฑฐ์™€ ํ˜„์žฌ์˜ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์„ ์‚ดํŽด๋ณด๊ณ  ์ „ํ™” ๊ฑธ๊ธฐ). ASP.NET Core 3.0๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋Š” (์ ์–ด๋„ ์ง€๊ธˆ ๋‹น์žฅ์€) ๊ทธ๊ฒƒ๋“ค์„ ๊บผ๋‚ผ ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค.

๋„ค, ์ด๊ฒƒ์ด ํ•ญ์ƒ ์–ด๋ ค์šด ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€๋”์€ (Microsoft์— ์˜ํ•œ) ๊ฒฝํ–ฅ์ด ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ถ€ํ’€๋ ค์ง€๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ์žฅ์—์„œ ์ž์‹ ์˜ ์ œํ’ˆ์„ ํฌ์ง€์…”๋‹ํ•˜๋Š” ๋ฐฉ์‹์€ ์ œํ’ˆ์ด ์–ด๋–ป๊ฒŒ ์ธ์‹๋  ๊ฒƒ์ธ์ง€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ASP.NET Core๋Š” ์ƒˆ๋กœ์šด ํ˜„๋Œ€์ ์ธ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๊ฐ„์ฃผ๋˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ MVC + SignalR + Identity + EF๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ํ•œ ASP.NET Core๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ๋‹น์‹ ์€ ์ด๋ฏธ ์„ ์„ ๊ทธ๋ ค์•ผ ํ•  ์œ„์น˜๋ฅผ ํ˜ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— MVC์™€ SignalR์ด ASP.NET Core์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ํ•„์š”ํ•  ๋•Œ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ธ๋ฐ ์™œ ์ง€๊ธˆ ์ด ์„ ์„ ํ๋ฆฟํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ๊ด€์„ฑ์ด ์—†๊ณ  ๊ทธ๋กœ๋ถ€ํ„ฐ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ฐ€์น˜๋„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ASP.NET Core + ๋ฒˆ์„ฑํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์—์ฝ” ์‹œ์Šคํ…œ์„ ํ™๋ณดํ•˜๋Š” ๋Œ€์‹  ๋งค์šฐ ์ข์€ ์›น ๊ฒฝํ—˜์„ ํ™๋ณดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋‹น์‹ ์ด ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ผ์„ ๋ฐ€์–ด๋ถ™์ด๊ฒŒ ๋จ์— ๋”ฐ๋ผ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ณ  ๋” ๋งŽ์€ ์ผ์„ ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ขŒ์ ˆ๊ฐ์„ ์ฃผ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

MVC๋ฅผ ๊ธฐ๋ณธ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋„ฃ์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด MVC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ NuGet ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค๋ฉด ์•„๋ฌด๋„ NuGet์—์„œ MVC๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๊ณ  ๋ถˆํ‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์™€์„œ ๋‚˜์ฒ˜๋Ÿผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค๋กœ ๊ธฐ๋ณธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ถ€ํ’€๋ฆฐ ์ด์œ ๋ฅผ ๋ฌป๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ํฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ† ๋ก ์ด๊ณ  ์—ฌ์ „ํžˆ ์—ฌ๋Ÿฌ๋ถ„์ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ๊ฐ€์ง€ ๋ฌป๊ณ  ์‹ถ์€ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์ด ์งˆ๋ฌธ์„ ํŒ€์— ๋‹ค์‹œ ์ œ๊ธฐํ•˜๊ณ  ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘๊ฐ€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‚ด ์•„์ด๋””์–ด๋ฅผ ํ–ฅํ•ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :)

์ถ”์‹ : ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ SignalR๋„ ๋ณ„๋„์˜ NuGet ํŒจํ‚ค์ง€์˜€์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. Bootstrap๊ณผ Angular2๋ฅผ ๊ธฐ๋ณธ ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ์ œํ’ˆ์ด Microsoft์—์„œ ๊ฐœ๋ฐœํ–ˆ๋‹ค๋ฉด ์•„๋งˆ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ง์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  ์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์ œ3์ž์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ง์ด ๋˜์ง€ ์•Š๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

TBH ๊ธฐ๋ณธ ์„ค์น˜์—์„œ ์ œ๊ฑฐ๋œ ํ•ญ๋ชฉ์„ ๋” ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ MVC. ์ด๊ฒƒ์ด ASP.NET Core ์œ„์— ์žˆ๋Š” ๋Œ€์ฒด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋”์šฑ ๋งค๋ ฅ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ContentResult์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์ฝ”์–ด๊ฐ€ ์•„๋‹Œ MVC์— ์žˆ๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•˜๋Š˜๋น› ํ•จ์ˆ˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ ์ด์ œ๋Š” ํ•ญ์ƒ ContentResult์— ๋Œ€ํ•ด์„œ๋งŒ MVC ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์š”์ ์€ ASPNET SDK์— MVC ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๋ ‡๊ฒŒ ๋ฐฐ์†กํ•˜๋Š” ๊ฒƒ์ด ๋ณต์› ๋กœ๋“œ๋ฅผ ๋ถ€ํ’€๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. ์›ํ•˜์ง€ ์•Š์œผ์‹œ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ์œ„์— ๋‚˜์—ด๋œ ๋Œ€๋ถ€๋ถ„์˜ ํŒจํ‚ค์ง€๋Š” ํƒ€์‚ฌ ์ข…์†์„ฑ(json)์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ์ผ๋ถ€ ๋ฌด๊ฑฐ์šด ์ธก๋ฉด(๋ฉด๋„๊ธฐ)์ด ์žˆ๊ฑฐ๋‚˜, ๊ฐœ๋…์ ์œผ๋กœ ASPNET๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ข…์ข… SDK(EFCore) ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.

OSS ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ํ‰๋“ฑํ•œ ๊ฒฝ์Ÿ์˜ ์žฅ์„ ์กฐ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œ๊ฐ’์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋™์˜ํ•˜๋Š” ๋งŒํผ ๊ท ํ˜•์ด ๋งž์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”์–ด(๋ฒ ํƒ€ ๋ฐ 1.0)์˜ ์ดˆ๊ธฐ์—๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํŒจํ‚ค์ง€์˜€์œผ๋ฉฐ ํ›จ์”ฌ ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ๋ณต์›์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

@psibernetic ๋ฌผ๊ฑด์ด ๋ถ„๋ฆฌ๋œ ํŒจํ‚ค์ง€์— ์žˆ๋”๋ผ๋„ .net ์ฝ”์–ด ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์€ ์ด๋Ÿฌํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ด๋ฏธ ๋กœ์ปฌ ์บ์‹œ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@psibernetic ๊ท ํ˜•์ด ์ค‘์š”ํ•˜๋‹ค๊ณ 

MVC๋ฅผ ๋‹จ์ผ NuGet ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฑฐ๋‚˜, ๋ณต์›์— ์˜์›ํžˆ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ, ๋˜๋Š” ์–ธ๊ธ‰ํ•œ ๋‹ค๋ฅธ ๋ถ€์ •์ ์ธ ๊ฒฝ์šฐ๋ฅผ ํ•œ ๊ฐ€์ง€ ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๊ทธ๋ฆฌ๊ณ  ๋ณต์› ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ โ€‹โ€‹...

IMHO ๊ฐœ๋ฐœ์ž ์ปดํ“จํ„ฐ์—์„œ ์•ฝ๊ฐ„ ๋” ๋น ๋ฅด๊ฒŒ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜(์ด๊ฒƒ์ด ๋น„์ฆˆ๋‹ˆ์Šค์— ์‹ค์ œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ)๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ํ›„์ž๋„ ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ ๋งค์šฐ ๋น ๋ฅด๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ์ค‘์š”๋„๋ฅผ ๋งค๊ฒจ์•ผ ํ•œ๋‹ค๋ฉด ํด๋ผ์šฐ๋“œ์˜ ํ”„๋กœ๋•์…˜ ์ธํ”„๋ผ๋ณด๋‹ค ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ์—์„œ ์•ฝ๊ฐ„์˜ ํƒ€๊ฒฉ์„ ๋ฐ›๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ณต์› ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ๋ณด๋‹ค ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ด์ ์ด ์žˆ์„๊นŒ์š”? ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ASP.NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์‚ถ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?

๋‚ด Windows 10 PC์— ์‚ฌ์ „ ์„ค์น˜๋œ CandyCrush์™€ ๊ฐ™์ด MVC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์›์น˜ ์•Š๋Š” ๋ธ”๋กœํŠธ์›จ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Asp.net ์ฝ”์–ด๋Š” ํ•„์š”์— ๋”ฐ๋ผ ๋ฏธ๋“ค์›จ์–ด ๋“ฑ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๋œ ๋…์„ ์ ์ด๋ผ๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. dotnet ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”์–ด์— ๋ฒ ์ดํฌํ•  ํ•„์š” ์—†์ด MVC๊ฐ€ ๊ธฐ๋ณธ ํฌํ•จ ํŒจํ‚ค์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Nancy, ServiceStack ๋ฐ Giraffe์™€ ๊ฐ™์€ ๋งŽ์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ ์›ํ•˜์ง€ ์•Š๋Š”/ํ•„์š”ํ•˜์ง€ ์•Š์€ MVC ๊ฐ•์ œ ์„ค์น˜๋กœ ์ธํ•œ ํŒฝ์ฐฝ/์ถฉ๋Œ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ, ๋ฉด๋„๊ธฐ, EF ๋“ฑ์ด ๋ชจ๋‘ ํŒจํ‚ค์ง€๋˜์–ด ์žˆ์ง€๋งŒ MVC, ๊ณจ๋“  ์ž์‹์ด ํ•ต์‹ฌ์ด ์•„๋‹ ๋•Œ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ผ๋ถ€๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ์ผ๊ด€์„ฑ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

MVC๊ฐ€ ์ฝ”์–ด์— ๋„ˆ๋ฌด ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ๋””์ปคํ”Œ๋ง์ด ๋งŽ์€ ์ž‘์—…์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒŒ์œผ๋ฅด๊ณ  ์ด์ „ asp.net๊ณผ ๋งค์šฐ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค. MVC ์‚ฌ๊ณ ๋ฐฉ์‹ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฉ€๋ฆฌํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค.

.NET Core๋Š” .NET์šฉ node.js์˜ ๋ฆฐ ๋ชจ๋“ˆ์‹ ํด๋ก ์ด์–ด์•ผ ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ์ž‘๊ณ  ์œ ์—ฐํ•œ ์˜๊ฒฌ ์—†๋Š” ์ฝ”์–ด์ธ ๋ฒˆ์ฐฝํ•˜๊ณ  ํ™œ๊ธฐ์ฐฌ ์ƒํƒœ๊ณ„๋ฅผ ์กฐ์„ฑํ•˜๋Š” ํŠน์„ฑ์„ ๋ณต์ œํ•  ์˜๋„๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋…์ฐฝ์ ์ธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๋•๋ถ„์— ํ•ต์‹ฌ์ ์ธ ์ด์ ์€ ์ž์ฒด ๋…๋ฆฝ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ•จ๊ป˜ โ€‹โ€‹๊ฑด๊ฐ•ํ•œ ์ˆ˜์˜ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฆ๊ธฐ๋Š” ์‹คํ—˜์œผ๋กœ ๋ฌด๋ฅด์ต์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ง์€ ASP.NET ํŒ€์ด ๊ทธ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์„ ํƒํ•œ ๋ชจ๋“  ์˜๊ฒฌ์ด๋‚˜ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณต์žก์„ฑ ์ˆ˜์ค€์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. .NET Core์˜ ๋ชจ๋“  ๊ฒƒ์€ .NET์—์„œ ์˜ค๋Š” ๋‹ค์Œ ํ˜์‹ ์„ ๊ตถ์ฃผ๋ฆฌ๊ฒŒ ํ•˜๋Š” ์–ด๋–ค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๊ตฝํž˜์œผ๋กœ์จ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ์–ด๋–ค ์ ‘๊ทผ ๋ฐฉ์‹์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ๋งŽ์€ ์˜๊ฐ์„ ๋ฐ›์•„ ๋’ค๋Šฆ๊ฒŒ ์•Œ๊ฒŒ ๋œ ์ด์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ผ์ด ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ๊ด€์‹ฌ์„ ๋ชจ์„ ๋•Œ ASP.NET Core๋Š” ๋ชจ๋“  ์›น์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์•ž์œผ๋กœ ๊ธฐ๋ณธ "MVC ์„ธ๊ธˆ"์„ ์˜์›ํžˆ ์ง€๋ถˆํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์„ฑ๊ณต์„ ๋ณต์ œํ•˜๋Š” ๋ฐ ๋ถˆ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•ฑ ๊ด‘๊ณ ๋Š” ๋ฌดํ•œํ•ฉ๋‹ˆ๋‹ค.

Node์˜ ๊ฐ€๋ฒผ์›€์€ ๋˜ํ•œ Electron, Native Mobile Apps, IOT, ์…ธ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์น˜๊ฐ€ ๋ถ€ํ’€๋ ค์งˆ์ˆ˜๋ก ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋œ ์œ ์šฉํ•ด์ง‘๋‹ˆ๋‹ค.

IMO ๊ธฐ๋ณธ๊ฐ’์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์„ ๋ถ€ํ’€๋ฆฌ์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ(๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ)์„ ๋” ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘” ๊ฐ„๊ฒฐํ•œ ๋ชจ๋“ˆ์‹ ์ฝ”์–ด๋ฅผ ๊ฐ–๋Š” .NET Core์˜ ์›๋ž˜ ๋น„์ „์œผ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜.

ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ํŠธ๋ฆฌ๋ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๋Š” ๊ฐ ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ 2.x์—์„œ 3.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋น„์šฉ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Microsoft.AspNetCore.App์— ํฌํ•จ๋˜๋Š” ํ•ญ๋ชฉ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์›์น™์ž…๋‹ˆ๋‹ค. https://github.com/aspnet/AspNetCore/blob/master/docs/SharedFramework.md. ์ œ๊ฑฐ๋ฅผ ์ œ์•ˆํ•˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์—๋Š” ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ถ€ ๊ธฐ์ค€์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋Ÿฌํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” (1) ์„œ๋น„์Šคํ•  ์ˆ˜ ์—†๋Š” ํƒ€์‚ฌ ์ฝ”๋“œ์— ์ข…์†๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. (2) ์–ด์…ˆ๋ธ”๋ฆฌ ์ž์ฒด๊ฐ€ 3.0์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ (3) ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ํ”„๋กœํ† ์ฝœ ๋˜๋Š” ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค( ์˜ˆ๋ฅผ ๋“ค์–ด Facebook/Google/Twitter๋Š” ๋‚ด์ผ ์ธ์ฆ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. Microsoft.AspNetCore.App์—์„œ MVC๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๊ณ ๋ ค ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ MVC๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ASP.NET Core ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ Microsoft.AspNetCore.App์— ๋ณด๊ด€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  3. MVC๋Š” 2.1๋ถ€ํ„ฐ Microsoft.AspNetCore.App์˜ ์ผ๋ถ€์˜€์ง€๋งŒ 2.1 "๋นˆ ์›น" ํ…œํ”Œ๋ฆฟ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด MVC๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณ ์œ ํ•œ ๋ณด๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ "์›์‹œ" aspnetcore API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ง์ ‘ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. @dustinmoris : ๋‚˜์ค‘์— ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค .NET Core 3.0๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋” ๋งŽ์€ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž‘์€ ๊ณตํ†ต ๋ถ„๋ชจ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋ณธ ASP.NET Core ์•ฑ์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋‚˜๋จธ์ง€๋ฅผ NuGet ํŒจํ‚ค์ง€๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜๋ฉด ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜์ค‘์— ๋” ์ด์ƒ ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2.0์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์•ž์œผ๋กœ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ธธ์„ ์œ„ํ•ด ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์„ธํŠธ๋ผ๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์œผ๋กœ ๋‹ค์‹œ ์กฐ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Microsoft.AspNetCore.App์—์„œ ์ œ๊ฑฐ๋œ ๋Œ€๋ถ€๋ถ„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์—ฌ์ „ํžˆ NuGet ํŒจํ‚ค์ง€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ชจ๋“  ๊ณ ๊ฐ์˜ 90%๊ฐ€ ๋™์ผํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋œ๋‹ค๋ฉด ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ข‹์€ ํ›„๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€์นจ ๋ฌธ์„œ ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด API๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉ๋˜๋Š”์ง€๋Š” ์ค‘์š”ํ•œ ์ง€ํ‘œ์ด์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•˜๋Š” ์œ ์ผํ•œ ์š”์†Œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

  5. "๋ฐ”๋‹๋ผ"๋Š” ์ฃผ๊ด€์ ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ MVC์™€ SignalR์€ "๋ฐ”๋‹๋ผ"์ž…๋‹ˆ๋‹ค.

  6. ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์€ .NET Core๊ฐ€ ์ด๊ฒƒ ๋˜๋Š” ์ €๊ฒƒ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ๋ณ€ํ•˜๊ณ , ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•˜๊ณ , ์ œํ’ˆ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๊ด€์ฐฐํ•˜๊ณ , ๊ฐ€์žฅ ๋งŽ์€ ๊ณ ๊ฐ์—๊ฒŒ ํ˜œํƒ์„ ์ค„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๊ธฐ๋ณธ๊ฐ’์„ ์กฐ์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ ์ œ์•ˆ๋œ ์กฐ์ •์€ .NET Core 2.x์—์„œ ๋ฐ›์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ˜์˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ตœ์ข… ์ƒ๊ฐ: ์ด ๋ฌธ์ œ๊ฐ€ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ˆ˜์‹ญ๋งŒ ๋ช…์˜ ๊ณ ๊ฐ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ์†Œ์ˆ˜๋งŒ์ด ํ”ผ๋“œ๋ฐฑ์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด GitHub์— ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ง์ ‘ ๋ฐฉ๋ฌธ, ์ „ํ™” ํ†ตํ™”, ์ด๋ฉ”์ผ, ์†Œ์…œ ๋ฏธ๋””์–ด, ๊ณ ๊ฐ ์ง€์› ์š”์ฒญ, ๋ธ”๋กœ๊ทธ, Visual Studio ์›๊ฒฉ ๋ถ„์„ ๋“ฑ์—์„œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๋•Œ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์˜ ์ผ๋ถ€์ด๋ฉฐ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์˜ ์ผ๋ถ€์ด๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๋™๊ธฐ๋‚˜ ์ด์œ ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋ช…ํ™•ํžˆ ํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๊ณ ๊ฐ๊ณผ ์ ‘์ด‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝ์šฐ MVC ๋ฐ SignalR์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ฐ์ด ๋ช‡ ๋ช…์ธ์ง€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์งˆ๋ฌธํ•œ ๊ฒƒ์ด ์–ธ์ œ์ž…๋‹ˆ๊นŒ? ํ•„์š”ํ•  ๋•Œ ๋งค์šฐ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋‹จ์ผ NuGet ํŒจํ‚ค์ง€์— ๊ฐ๊ฐ ํฌํ•จํ•˜๋Š” ๋Œ€์‹  ํ™•์‹คํžˆ ์œ ์ง€ํ•˜๋Š” ์ด ์ž…์žฅ ๋’ค์— ์‹ค์ œ ์‚ฌ์šฉ ๋ฉ”ํŠธ๋ฆญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ณต์œ  ๋Ÿฐํƒ€์ž„์— MVC๋ฅผ ํฌํ•จํ•˜๋Š” @dustinmoris ๋Š” ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ ์ƒํƒœ๋กœ ๋ฐฐ์†ก๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†์‹ค๋  ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด๋ฉฐ, ์ด๋กœ ์ธํ•ด ์‹œ์ž‘ ์‹œ๊ฐ„์ด ์ตœ์†Œํ•œ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ๋น ๋ฅธ ์‹œ์ž‘์˜ ์˜ˆ์—์„œ IMO๊ฐ€ ์ข‹์ง€ ์•Š์€ ์ ˆ์ถฉ์•ˆ์ด ๋ฉ๋‹ˆ๋‹ค. ๋„์ปค ์ปจํ…Œ์ด๋„ˆ. ๊ทธ ์™ธ์—๋„ ๋ชจ๋“  ๋ฐฐํฌ๋Š” ์ด์ œ ๋Ÿฐํƒ€์ž„์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ๊ณผ ํ•จ๊ป˜ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐ์†กํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ๋“  MVC ์•ฑ์˜ ๋ฐฐํฌ ํŒจํ‚ค์ง€ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋Ÿฐํƒ€์ž„์—์„œ MVC์— ์ข…์†๋œ ๋ชจ๋“  ํŒจํ‚ค์ง€๋„ ๋ณ„๋„์˜ ๋ฐฐํฌ ๊ฐ€๋Šฅ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์„ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋ช‡ ๊ฐœ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋งํ–ˆ๊ณ  Microsoft ๋˜๋Š” aspnet ํŒ€๊ณผ ์ œํœด ๊ด€๊ณ„๊ฐ€ 0์ด๋ผ๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์‹ค์ œ๋กœ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋†’์ด๊ณ  ์ด๊ฒƒ์ด ์ฃผ์š” ์š”๊ตฌ ์‚ฌํ•ญ์ž„์„ ์ž…์ฆํ–ˆ๋‹ค๋ฉด ๋ฒ ์–ด๋ณธ aspnetcore ๋Ÿฐํƒ€์ž„์ธ ๋ณ„๋„์˜ ๋Ÿฐํƒ€์ž„์ด ๋ฐฐ์†ก๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž„๋ฌด๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ›Œ๋ฅญํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ํ˜„์žฌ ๊ณต์œ  ๋Ÿฐํƒ€์ž„์—์„œ MVC์˜ ์ด์  ์ค‘ ์—„์ฒญ๋‚˜๊ฒŒ ๋†’์€ ๋น„์œจ์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @natemcmaster ๊ด€๋ จ ๊ฐœ์ธ์ด ํ–ฅํ›„ GitHub ๋ฌธ์ œ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๊นŒ?

@psibernetic ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ MVC๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด GitHub ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Microsoft.AspNetCore.App์—์„œ MVC๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•  ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋Š” ๋‚ด์—์„œ ๊ฒฌ์ธ๋ ฅ์„ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€.

@Bomret ์šฐ๋ฆฌ๊ฐ€ ์กฐ์‚ฌํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์‹ค์ œ ๊ณ ๊ฐ ์•ฑ์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  MVC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์œ ์ง€ํ•˜๋ฉด ๋งŽ์€ ์ด์ ์ด ์žˆ์œผ๋ฉฐ, ์™œ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•œ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@Natemcmaster : ์ง€๊ธˆ์€ ํ†ตํ™” ์ค‘์ด์ง€๋งŒ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๋™์•ˆ ์ด๊ฒƒ์ด ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.
๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ.

@natemcmaster ๋‚˜๋Š” @forki , @dustinmorris , @gerardtoconnor ๋ฐ @mythz ๊ฐ€ ๋‚ด๊ฐ€ ์•„์ง ๋ฐ˜๋Œ€ ๋…ผ์ฆ์„ ๋“ฃ์ง€ ๋ชปํ•œ ๋งค์šฐ ํƒ€๋‹นํ•œ ์ด์œ ๋ฅผ ์–ธ๊ธ‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์„ฑ์ž๊ฐ€ ์˜๊ฒฌ์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๋Œ€์‹  nodejs์™€ ๊ฐ™์ด ๋งจ ์œ„์— ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์›น ๋Ÿฐํƒ€์ž„/lib๊ฐ€ ์žˆ์œผ๋ฉด ๋งค์šฐ ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋…ธ๋“œ๋Š” ๋„ˆ๋ฌด ๋งŽ์ด ์š”๊ตฌํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ ์œ„์— ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์„ฑ๊ณต์ ์ž…๋‹ˆ๋‹ค. MVC๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๋ฌผ๋Ÿฌ๋‚  ๊ฒƒ์ด๋ฉฐ ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ์›น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์—์„œ ์„ ํƒํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ํฌํ•จํ•จ์œผ๋กœ์จ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ž…์žฅ์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ ๋ณด์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์†”์งํ•œ ์˜๊ฒฌ์œผ๋กœ๋Š” ์ •์น˜์™€ ๋งˆ์ผ€ํŒ…์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋ถˆ์พŒ๊ฐ์„ ์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

"Microsoft.AspNetCore.App"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ "Microsoft.AspNetCoreMVC.App"์„ ๋งŒ๋“ค์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

์–ด์จŒ๋“  ๋‚˜๋Š” ์„ ์„ ๊ธ‹๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ํ”ผ๋“œ๋ฐฑ์€ ๋‹น์‹ ์ด aspnet ์ฝ”์–ด๋กœ ํ•œ ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ MVC, ๋ฉด๋„๊ธฐ ๊ฐ™์€ ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ ์  ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. , EF ๋˜๋Š” signalR.

๋ฌผ๋ก . api, ์›น, ์›น ์†Œ์ผ“, ํ…œํ”Œ๋ฆฟ, db ์•ก์„ธ์Šค ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ๋งŽ์€ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•  ๋งŒํผ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ™œ๋ฐœํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ MVC, Razor, EF ๋“ฑ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ•˜๋‚˜์˜ ์˜ต์…˜์„ ์ œ๊ณตํ•  ๊ฒƒ์ด์ง€๋งŒ ์œ ์ผํ•œ ์˜ต์…˜๋„ ๊ธฐ๋ณธ ์˜ต์…˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

@natemcmaster ๋‚ด ์‹ค์ˆ˜, ๋‚˜๋Š” ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์—์„œ ์ด ๋ฌธ์ œ์˜ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€์—๋„ ๊ฐ™์€ ์ด์œ ๊ฐ€ ์ ์šฉ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์†”์งํžˆ ๋งํ•˜๋ฉด ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€ ๋Œ€์‹  ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ ์ด๋ฏธ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋œ ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘์€ ์ปจํ…Œ์ด๋„ˆ์ด๋ฏ€๋กœ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ์ œ์•ˆ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

@natemcmaster ์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•ด ์ฃผ

  • ๋‹ค์Œ .NET Core ๋Ÿฐํƒ€์ž„(3.0)์— ๊ตฌ์šด ๊ณต์œ  ASP.NET Core ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ASP.NET Core๋Š” ํ™˜๊ฒฝ์— .NET Core ์„ค์น˜์˜ ์ผ๋ถ€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

  • ๋˜ํ•œ ASP.NET Core ์•ฑ์šฉ NuGet ํŒจํ‚ค์ง€ ๋ชจ์Œ์ธ Microsoft.AspNetCore.App ๋ฐ Microsoft.AspNetCore.All ๋ผ๋Š” ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ณต์œ  ASP.NET Core ํ”„๋ ˆ์ž„์›Œํฌ < EF Core์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜๋Š” Microsoft.AspNetCore.App ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€?

  • ์•„์ฃผ ์ž‘์€ API๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด EF Core, SignalR, MVC ๋“ฑ์ด ํฌํ•จ๋œ Microsoft.AspNetCore.App ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ ๋„ ASP.NET Core ์›น ์•ฑ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฌด์—‡์„ ํ•˜๋“ , ์ž‘์€ API๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ASP.NET Core์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ๊ฐ€์žฅ ์ ์€ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”?

๋‹ค์Œ .NET Core ๋Ÿฐํƒ€์ž„(3.0)์— ๊ตฌ์šด ๊ณต์œ  ASP.NET Core ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ASP.NET Core๋Š” ํ™˜๊ฒฝ์— .NET Core ์„ค์น˜์˜ ์ผ๋ถ€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์˜ˆ

๋˜ํ•œ ASP.NET Core ์•ฑ์šฉ NuGet ํŒจํ‚ค์ง€ ๋ชจ์Œ์ธ Microsoft.AspNetCore.App ๋ฐ Microsoft.AspNetCore.All์ด๋ผ๋Š” ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”. FrameworkReference ๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด ์žˆ์œผ๋ฉฐ Microsoft.AspNetCore.App์ด ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Microsoft.AspNetCore.All์€ 3.0์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ASP.NET Core ํ”„๋ ˆ์ž„์›Œํฌ < EF Core์™€ ๊ฐ™์€ ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” Microsoft.AspNetCore.App ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€?

์•„๋‹ˆ์š”, EF๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ๋ฌด์—‡์„ ํ•˜๋“ , ์ž‘์€ API๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ASP.NET Core์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ๊ฐ€์žฅ ์ ์€ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”?

์–ด์…ˆ๋ธ”๋ฆฌ ํŠธ๋ฆฌ๋ฐ ๋ฐ ๋ง์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ, ASP.NET Core์šฉ ํŒจํ‚ค์ง€๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@natemcmaster

์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ํŠธ๋ฆฌ๋ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๋Š” ๊ฐ ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ 2.x์—์„œ 3.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋น„์šฉ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋Š” v3 ์ฃผ ๋ฒ„์ „ ์ฐฝ ๋‚ด์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ฐฝ์€ ์‚ฌ์‹ค์ƒ ์ด์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

Microsoft.AspNetCore.App์—์„œ MVC๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๊ณ ๋ ค ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ MVC๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

"ASP.NET Core ์•ฑ"์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ๋…ผ๋ฆฌ์ ์œผ๋กœ "์ด ํŒจํ‚ค์ง€ ์ฐธ์กฐ"๋กœ ์ฝํžˆ๋Š” "Microsoft.AspNetCore.App"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ASP.NET Core ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ Microsoft.AspNetCore.App์— ๋ณด๊ด€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ASP.NET Core์˜ ๋ชฉํ‘œ๊ฐ€ ๋ฆฐ(lean)์˜ ๊ฐœ๋ฐฉํ˜• node.js-esque ์Šคํƒ€์ผ ์—์ฝ”์‹œ์Šคํ…œ์„ ์œก์„ฑํ•˜๋Š” ๊ฒƒ์—์„œ ๋ฉ€์–ด์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์— ์ ์  ๋” ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ASP.NET Core ์•ฑ์„ MVC ์•ฑ๊ณผ ๋™์˜์–ด๋กœ ํ†ตํ•ฉํ•˜๋ ค๋Š” ๊ฒƒ์ด ํŒ€์˜ ์˜๋„์ž…๋‹ˆ๊นŒ? ASP.NET Core์˜ ํŒ๋งค ํฌ์ธํŠธ ์ค‘ ์ผ๋ถ€๋Š” "Pay to play" ๋ฐ ๋ถ„๋ฆฌ๋œ "layering"์ด์—ˆ์ง€๋งŒ "ASP.NET Core App"์ด ์˜์›ํžˆ = MVC App์œผ๋กœ ์˜๋„๋˜์—ˆ์Œ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๊ฐ€ ๋” ๋ช…์‹œ์ ์ด๋ผ๋ฉด ๊ด€๋ จ๋œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋” ๋ช…ํ™•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Microsoft.AspNetCore.App => ๋ชจ๋“  ASP.NET Core ์•ฑ์˜ ๊ธฐ๋ฐ˜
  • Microsoft.AspNetCore.Mvc => ASP.NET Core MVC ์•ฑ

๊ทธ๋Ÿฌ๋‚˜ "Microsoft.AspNetCore.App"์ด ๊ฑด๋“œ๋ฆด ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ตœ์†Œํ•œ ํ•ต์‹ฌ ์„œ๋ฒ„ ๊ธฐ๋Šฅ๋งŒ ํฌํ•จ๋œ ๊ณต์‹ "๊ธฐ๋ณธ" ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€(๋˜๋Š” FrameworkReference)(์ฆ‰, ๋…๋‹จ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์Œ)์™€ ๋ช‡ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ์ด๋ฆ„:

  • Microsoft.AspNetCore.[๋ฒ ์ด์Šค | ๋ฒ ์–ด | ๋ผ์ดํŠธ | ๊ธฐ์ดˆ์ ์ธ]

("ํ•ต์‹ฌ"๋„ ์ ์ ˆํ–ˆ์ง€๋งŒ ์ด๋ฏธ ์ด ์šฉ์–ด๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค).

๊ณต์‹ ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€/์ด๋ฆ„์ด ์—†์œผ๋ฉด ๋ชจ๋“  ASP.NET Core ์•ฑ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ๊ธฐ๋ฐ˜์ธ ํ˜„์žฌ ๊ถŒ์žฅ๋˜๋Š” "Microsoft.AspNetCore.App"๋งŒํผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ œ์•ฝ ์กฐ๊ฑด์ด ํ˜์‹ ์„ ๋‚ณ์Šต๋‹ˆ๋‹ค. MVC๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๊ณผ ๋™์ผํ•œ ๊ฒฝ๊ธฐ์žฅ์—์„œ๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์•ฑ์— ํ•„์š”ํ•œ ์ œํ’ˆ(ํŒจํ‚ค์ง€ ์ œํ’ˆ๊ตฐ์ด๋ผ๊ณ ๋„ ํ•จ)์„ ์‰ฝ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋Ÿผ:

  • Microsoft.AspNetCore.Mvc+SignalR+EF

๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์„ ์–ธํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฐฐํ›„์˜ ๋„๊ตฌ๋Š” "Microsoft.AspNetCore.SignalR", "Microsoft.AspNetCore.EF" ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋˜๋Š” ์˜๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์ˆ˜ํ•œ ์†”๋ฃจ์…˜์„ ๋Œ€์ฒด).

๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“ค์–ด์ง„ ๋ชจ๋“  ๋‹จ์ผ์ฒด์˜ ๊ทผ๊ฑฐ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. "์šฐ๋ฆฌ๊ฐ€ ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๊ท€ํ•˜์˜ ํŽธ์˜๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค."

์—ฌ์ „ํžˆ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•˜๊ณ , ์ž์‹ ๋งŒ์˜ ๋ทฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ ,

์˜ˆ๋ฅผ ๋“ค์–ด MVC ๋ฐ Razor์— ๋Œ€ํ•œ ์ž์ฒด "๋ณด๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ" ๋Œ€์•ˆ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ .NET Core์—์„œ .NET Core๋ฅผ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ‘œ์ค€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๋™์ž‘์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. NET Core ํ”„๋กœ์ ํŠธ, ์ฆ‰:

 dotnet publish -c Release

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

EXEC(1,11): error CS0246: The type or namespace name 'System' could not be found (are you missing a using directive or an assembly reference?) [C:\src\NetC
oreWebApps\WebApp\src\WebApp\WebApp.csproj]
EXEC(1,54): error CS0518: Predefined type 'System.String' is not defined or imported [C:\src\NetCoreWebApps\WebApp\src\WebApp\WebApp.csproj]
C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.aspnetcore.mvc.razor.viewcompilation\2.0.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.targets(60,5):

MVC, Razor๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ .cshtml ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์•ฑ์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— MVC์— ๋Œ€ํ•œ ๋Œ€์•ˆ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋†€๋ผ์šด ๋™์ž‘์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๋Š” ์—ฌ๋Ÿฌ GitHub ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ…์ƒ…์ด ๋’ค์ง„ ํ›„ ์†”๋ฃจ์…˜์ด MVC Razor ์ปดํŒŒ์ผ ์ค‘๋‹จ ๋นŒ๋“œ์—์„œ ์„ ํƒ ํ•ด์ œ๋˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

dotnet publish -c Release /p:MvcRazorCompileOnPublish=false

ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์†์ƒ๋œ ๋นŒ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์Šค์œ„์น˜๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ .NET Core 2.0 ์›น ์•ฑ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํŒฝ์ฐฝ์‹œํ‚ค๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์˜ตํŠธ์•„์›ƒํ•˜์—ฌ /refs/*.dll ์— ์žˆ๋Š” 150๊ฐœ์˜ .dll ๋งŒํผ ๊ฒŒ์‹œ๋œ ๊ณต๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ Razor์— ํ•„์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ตํŠธ์•„์›ƒ:

<PreserveCompilationContext>false</PreserveCompilationContext>

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘๋”์ง€ ์žก๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ์ค‘๋‹จํ•˜๊ณ  MVC/Razor ์•ฑ์—๋งŒ ํ•„์š”ํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„๊ตฌ์— MVC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์•Œ๋ ค์•ผ ํ•˜๋Š” ์Šค์œ„์น˜๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. MVC ๋น„ํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋„๊ตฌ๊ฐ€ ๋ชจ๋“  ์•ฑ์ด MVC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ "๊ธฐ๋ณธ" ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ฐ”๋žŒ์งํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ASP.NET Core๊ฐ€ ์—ฌ์ „ํžˆ ๋Œ€์•ˆ์ ์ธ "๋ณด๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ"์˜ ์‹คํ—˜, ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๋Š” ํ™˜์˜ํ•˜๋Š” ํ”Œ๋žซํผ์ด๋ผ๊ณ  ๋งํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ MVC์™€ ๊ฐ™์ด ๊ทœ์ •๋œ ์˜๊ฒฌ์ด ์žˆ๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๊ฒƒ์€ ์ƒ์„ฑ ๋ฐ ์ƒ๊ธฐ ๋Œ€์•ˆ์˜ ์‚ฌ์šฉ. ๋– ์˜ค๋ฅด๋Š” ์ธ๊ธฐ ์žˆ๋Š” ๋Œ€์•ˆ์˜ ์ˆ˜๋ฅผ ์ž ์‹œ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์€ ํ”Œ๋žซํผ์ด ๊ทธ๋“ค์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋งค๋ ฅ์ ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์ฒ™๋„์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ASP.NET Core ์•ฑ์ด ๋‹ค๋ฅธ ๋ชจ๋“  "๋ณด๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ"๋ณด๋‹ค MVC๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(ext ๋ฉ”์„œ๋“œ์˜ ๋‹จ์ผ .cs ํŒŒ์ผ ๋“œ๋กญ์ธ ํฌํ•จ) " ๊ทธ๋ฆฌ๊ณ  ๋ฒˆ๋“ค MVC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ๋ทฐ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด "MVC"๊ฐ€ ์˜ตํŠธ์ธ๋˜์–ด .App ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ, ๊ฒฐ์ •์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋‹ค๋ฉด ์ตœ์†Œํ•œ ๊ณต์‹ ๋ฒ ์ด์Šค๋ผ์ธ ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€ ๊ธฐ๋ฐ˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํฌํ•จํ•˜์ง€?

์šฐ๋ฆฌ๋Š” ์ˆ˜์‹ญ๋งŒ ๋ช…์˜ ๊ณ ๊ฐ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ์†Œ์ˆ˜๋งŒ์ด ํ”ผ๋“œ๋ฐฑ์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด GitHub์— ์˜ต๋‹ˆ๋‹ค.

๋น„๋Œ€ํ•ด์ง„ ์‹œ์ž‘ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ IMO์˜ ์š”๊ตฌ๊ฐ€ ์ œ๋Œ€๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผํ™”: VS 2012, VS 2013, VS 2015, VS 2017 ๋ฐ .NET Core์šฉ์œผ๋กœ ๋งŒ๋“  ๋ชจ๋“  C#/.NET ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ ์ค‘์—์„œ ์ผ๊ด€๋˜๊ฒŒ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ์ง€๊ธˆ๊นŒ์ง€ VS.NET์˜ ๊ธฐ๋ณธ ๋นˆ ASP.NET ํ…œํ”Œ๋ฆฟ์ด ์ถฉ๋ถ„ํžˆ ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ํด๋ž˜์‹ ASP.NET์— ๋Œ€ํ•œ ๋นˆ๋ฒˆํ•œ ๋น„ํŒ์ด๊ธฐ๋„ ํ•œ "๋นˆ" ํ…œํ”Œ๋ฆฟ์ด ํ•ญ์ƒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ MVC ์—†์ด "๋นˆ" ํด๋ž˜์‹ ASP.NET .NET Framework๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋˜ ๋•Œ์˜€์ง€๋งŒ ์ง€๊ธˆ์€ ๋” ์ƒˆ๋กญ๊ณ  ๋” ๊ฐ€๋ณ๊ณ  ๋ชจ๋“ˆ์‹์ธ ASP.NET Core ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ MVC๊ฐ€ ์ตœ์†Œ ๊ถŒ์žฅ ์‹œ์ž‘ ํŒจํ‚ค์ง€ ๋‚ด์— ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ง์ ‘ ๋ฐฉ๋ฌธ, ์ „ํ™” ํ†ตํ™”, ์ด๋ฉ”์ผ, ์†Œ์…œ ๋ฏธ๋””์–ด, ๊ณ ๊ฐ ์ง€์› ์š”์ฒญ, ๋ธ”๋กœ๊ทธ์—์„œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ์ข…์ข… ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋Š” ๋ณต์žก์„ฑ๊ณผ ๋™์ผ์‹œ๋˜๋Š” ํŒฝ์ฐฝ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์š”์ฒญ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ดˆ์ ์ด ๋˜์–ด์•ผ ํ•˜๊ณ  ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ํŒฝ์ฐฝ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝํ—˜์ƒ ๋ช…์‹œ์ ์ด๋ผ๋Š” ๊ฒƒ์ด ๋งˆ๋ฒ• ๊ฐ™์€ ๋™์ž‘์ด ํฌํ•จ๋œ ๋ถ€ํ’€๋ ค์ง„ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ด๋ผ๋ฉด ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ณ , ๊ฒ€์ƒ‰ํ•˜๊ณ , ์ฝ๊ณ , ์ œ๊ฑฐํ•˜๊ณ , ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰์„ ํ…Œ์ŠคํŠธํ•˜๊ณ (๋ฌธ์ œ์˜ ์›์ธ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด) ๋‹ค๋ฅธ ๊ตฌ์„ฑ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋น„๊ตํ•  ๋•Œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ mvc/razor-less ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” MVC ๋„๊ตฌ์˜ ๋งˆ๋ฒ• ๊ฐ™์€ ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์–ด๋Š ๋ถ€๋ถ„์ด ์ด๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ–ˆ๋Š”์ง€, ์‹คํ–‰ ์ค‘์ธ ์ด์œ , ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ MVC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ๊ฐ€ MVC๊ฐ€ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์–ด ์†๋„๊ฐ€ ๋Š๋ ค์ง€์ง€ ์•Š๊ฑฐ๋‚˜ MVC ๋˜๋Š” Razor๋ฅผ ์ˆ˜์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ์ด ์•„๋‹Œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

Visual Studio ์›๊ฒฉ ๋ถ„์„ ๋“ฑ.

์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€์˜ ์ธ๊ธฐ์— ๋Œ€ํ•œ ์›๊ฒฉ ์ธก์ •์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IMO๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ํฌํ•จํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „์— "Microsoft.AspNetCore.All"์€ ์ŠคํŽ™ํŠธ๋Ÿผ์˜ ๋‹ค๋ฅธ ์ชฝ ๋์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์šฐ์ฃผ๋ฅผ ํฌํ•จํ–ˆ์ง€๋งŒ ์ตœ์†Œํ•œ์˜ ์œ ์šฉํ•œ ๊ธฐ์ค€์„ ์„ ๊ฐ–๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์œ ์šฉํ•œ ์—ญ์€ ์•„๋‹™๋‹ˆ๋‹ค.

MVC ์•ฑ์„ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๋ผ์ธ์„ ์„ ํƒํ•˜๋Š” ์˜ต์…˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด MVC๋ฅผ ํฌํ•จํ•˜๋Š” ๋” ๋ถ€ํ’€๋ ค์ง„ ์Šคํƒ€ํ„ฐ ์˜ต์…˜๋ณด๋‹ค ์„ ํƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@๋ด„๋ ›

ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์„ฑ์ž๊ฐ€ ์˜๊ฒฌ์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๋Œ€์‹  nodejs์™€ ๊ฐ™์ด ๋งจ ์œ„์— ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์›น ๋Ÿฐํƒ€์ž„/lib๊ฐ€ ์žˆ์œผ๋ฉด ๋งค์šฐ ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์—์„œ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์•ฝ๊ฐ„ ์ž˜๋ชป ํ•ด์„ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .NET Core์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์ผ์ข…์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ณด๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Node ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด: Express์˜ ํ˜„์žฌ ๋ฒ„์ „์ด Node.js์™€ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์‚ฌ์šฉํ•  _๊ฐ€์ง€๋Š”_ ์—†์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  MVC์˜ ๊ฒฝ์šฐ MVC๊ฐ€ ์‹ค์ œ๋กœ ASP.NET Core์— ํฌํ•จํ•˜๋Š” ๋‚ด์šฉ์„ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์™€ Razor ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ ์–ด์จŒ๋“  ์•ฑ์—์„œ ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ๋งŽ์€ MVC ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ์™€ Razor ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ ์–ด์จŒ๋“  ์•ฑ์—์„œ ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ๋งŽ์€ MVC ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌด์—‡์ฒ˜๋Ÿผ?

์ปจํŠธ๋กค๋Ÿฌ์™€ Razor ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ ์–ด์จŒ๋“  ์•ฑ์—์„œ ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ๋งŽ์€ MVC ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค, ์•Œ๋ ค์ฃผ์„ธ์š”. ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์€ ํ•ต์‹ฌ ๋ฏธ๋“ค์›จ์–ด/Kestrel์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋Œ€์ฒด ํ”„๋ ˆ์ž„์›Œํฌ์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ ์ค‘์ธ ์ปจํŠธ๋กค๋Ÿฌ์™€ Razor ๋ณด๊ธฐ๋Š” MVC์˜ ์ž‘์€ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ . F# ํ”„๋ ˆ์ž„์›Œํฌ์ธ Giraffe/Saturn & Zebra๋Š” ๋” ๋‚˜์€ ๋ผ์šฐํŒ…๊ณผ ๋‹จ์ˆœํ™”๋œ ์ฒ˜๋ฆฌ ๋ชจ๋ธ๋กœ MVC๋ณด๋‹ค ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์‹œ TechEmpower์—์„œ Zebra x2๊ฐ€ MVC๋ณด๋‹ค ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ ํŠธ๋ฆฌ๋ฐ/๋ง์ปค๊ฐ€ ๋‚˜์ค‘์— ํ’‹ํ”„๋ฆฐํŠธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ตœ์†Œํ•œ์˜ ๊ฒƒ์ด์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ๋” ๊ณตํ‰ํ•œ ๊ฒฝ์Ÿ์˜ ์žฅ์„ ํ—ˆ์šฉํ•˜๊ณ  asp.net ์ฝ”์–ด ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ํ™œ์šฉ๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mythz ์กฐ์ง์  ๊ด€์ ์—์„œ ๋‹น์‹  ๋ง์ด ๋งž์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋…ผ๋ฆฌ์  ๊ตฌ๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์„ธ๋ถ„ํ™”์—๋Š” ์ œํ’ˆ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ƒ๋‹นํ•œ ๋ณต์žก์„ฑ๊ณผ ์—”์ง€๋‹ˆ์–ด๋ง ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋‹ค์ˆ˜์˜ ๊ณ ๊ฐ์ด MVC ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™œ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ๋•Œ ์ด๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋น„์šฉ์€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋‹จ์ ์€ ๋ฌด์‹œํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ช‡ MB๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ๋กœ๋“œํ•˜์ง€ ์•Š๋Š” ํ•œ ๋Ÿฐํƒ€์ž„์— ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

์š”์ ์„ ์„ค๋ช… ํ•˜๊ธฐ ์œ„ํ•ด

@์ฐŒ๋ฆ„
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ์ผ๋“ฏ์ด: ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋Ÿฐํƒ€์ž„๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋Š” ํ•ญ๋ชฉ์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ต์Šคํ”„๋ ˆ์Šค ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ์™€ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„๊ฐ€ ์ด๋ ‡๊ฒŒ ํ™œ๊ธฐ์ฐจ๊ณ  ๋‹ค์–‘ํ•ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋˜ํ•œ ๊ธฐ๋ณธ ์„ค์น˜์—์„œ MVC, SingalR ๋“ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ๊ฐ "๋ณต์žก์„ฑ ์ถ”๊ฐ€"๋กœ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ NuGet ํŒจํ‚ค์ง€๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ ˆ๋Œ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ฐœ๋ฐœ์ž๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ ํŒจํ‚ค์ง€๋กœ ์ œ๊ณตํ•˜๋ฉด ๋ณต์› ์‹œ๊ฐ„์ด "์ƒ๋‹นํžˆ" ์ฆ๊ฐ€ํ•˜๋”๋ผ๋„ ์–ด์จŒ๋“  ๋„ˆ๋ฌด ๋šฑ๋šฑํ•ฉ๋‹ˆ๋‹ค.

@ํŠธ๋ž˜์ฒ˜

๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์„ธ๋ถ„ํ™”

์ด๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜๋Š” ๊ฒƒ์€ MVC์˜ ๋ถ„๋ฆฌ์ด๋ฏ€๋กœ ASP.NET Core ์•ฑ์€ ASP.NET Core ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ๊ทœ์ •ํ•˜๋Š” ๋…๋‹จ์ ์ธ ๊ฐœ๋ฐœ์ž ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด๋„ ์ตœ์†Œํ•œ์˜ ์œ ์šฉํ•œ ๊ธฐ์ค€์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œํ’ˆ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ๋ณต์žก์„ฑ๊ณผ ์—”์ง€๋‹ˆ์–ด๋ง ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‚ด์šฉ์„ ๋ช…ํ™•ํžˆ ํ•˜๋ ค๋ฉด MVC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ASP.NET Core ์•ฑ์—์„œ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์—”์ง€๋‹ˆ์–ด๋ง ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. MVC๊ฐ€ "MVC์—" ๋ณต์žก์„ฑ์„ ํฌ๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋Œ€์ฒด ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

MVC๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ๋Œ€์ฒด ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ๋™์ผํ•œ ํ™•์žฅ์„ฑ ์˜ต์…˜ ๋‚ด์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๋‹นํ•œ ๋ณต์žก์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋Š” MVC์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋” ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ด์ต์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋†€๋ฆฌ์‹์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋„๊ตฌ ๋ฐ ๋Ÿฐํƒ€์ž„์˜ ๋ณต์žก์„ฑ์€ MVC ๋ฐ ํ†ตํ•ฉ/๋„๊ตฌ์— ์†ํ•˜๋Š” ์œ„์น˜๋กœ ์ถ”๊ฐ€๋œ ๋ณต์žก์„ฑ์ด ์ด๋™ํ•˜์—ฌ ๋” ๊ฐ€๋ณ๊ณ  ๋œ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹ ์— ์šฐ๋ฆฌ๋Š” MVC๊ฐ€ ํผ๋ธ”๋ฆฌ์‹ฑ ํ”„๋กœ์ ํŠธ๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๊ณ  ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์„ ๋ถ€ํ’€๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋„๊ตฌ์— ํ™•๊ณ ํžˆ ์ž๋ฆฌ ์žก์€ ์ƒํ™ฉ์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— MVC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ MVC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ํ•ญ์ƒ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋‹ค์ˆ˜์˜ ๊ณ ๊ฐ์ด MVC ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™œ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ

๊ธ€์Ž„์š”, ๊ทธ๊ฒƒ์€ ์˜ˆ์ƒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋Œ€์•ˆ์— ํ”ผํ•ด๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด Apple์ด ์ข‹๋“  ์‹ซ๋“  ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋ฌด๋ฃŒ U2 ๋…ธ๋ž˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ์ตœ์†Œ ๊ถŒ์žฅ ์„ค์น˜์— โ€‹โ€‹๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” ๊ทœ์ •๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋‹จ์ ์€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ๋‹ค์–‘ํ•˜๊ณ  ์˜ต์…˜๊ณผ ํ˜์‹ ์ด ์žˆ๋Š” ๋” ๊ฑด๊ฐ•ํ•œ ์ƒํƒœ๊ณ„์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์„๊นŒ์š”?

๊ฐœ๋ฐœ์ž๋Š” "ASP.NET Core ์•ฑ"์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€๋œ ํ˜ผ๋ž€๊ณผ ๋ชจํ˜ธํ•œ ์ •์˜์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? "์ด์ „์—๋Š” .NET์šฉ node.js์™€ ๋น„์Šทํ–ˆ์ง€๋งŒ ์ด์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์•ฑ์ด ์›น ์•ฑ์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ทœ์ •ํ•˜๋Š” ๋‹ค์ˆ˜์˜ ์˜๊ฒฌ์ด ์žˆ๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋…๋‹จ์ ์ธ ๋‹จ์ผ ๊ณต๊ธ‰์—…์ฒด ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ต์Šคํ”„๋ ˆ์Šค ๋ฐ ํ•ด๋‹น ์ข…์†์„ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์ „ ์„ค์น˜๋˜๋Š” ์•ฑ - ์ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."

๊ฐœ๋ฐœ์ž๋Š” MVC์˜ ํŠน๋ณ„ํ•œ ์ผ€์ด์Šค๋กœ๋ถ€ํ„ฐ ํ˜œํƒ์„ ์–ป์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๊ฐ™์ด ์„ค์น˜๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์œผ๋ฉฐ ์กด์žฌํ•˜๊ณ  ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋ณ€์„ ๋’ค์ ธ์•ผ ํ•˜๋Š” ์ˆจ๊ฒจ์ง„ ๋„๊ตฌ ๋ฐ ๋งˆ์ˆ  ๋™์ž‘์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ํŠน์ˆ˜ ์ผ€์ด์Šค๋Š” ์šฐ์—ฐํ•œ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ถ”๋ก ํ•  ๋•Œ MVC๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ทœ์น™ ์ง‘ํ•ฉ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์ด๋ผ๋ฉด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์—์„œ MVC ์•ฑ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

  • Microsoft.AspNetCore.Mvc

MVC ์•ฑ์ž„์„ ์•Œ๋ ค์ฃผ๊ณ  ๋ชจ๋“  ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  MVC๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ๋งž์ถคํ˜• ๋„๊ตฌ๋ฅผ ์ž๋™ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ผํ•œ ๊ฐœ๋ฐฉํ˜• ํ™•์žฅ ๊ฐ€๋Šฅ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ "Microsoft.AspNetCore.App" ํ”„๋กœ์ ํŠธ์— ์œ ์ง€ํ•˜๋ฉด ๋ชจ๋“  ASP.NET Core ์•ฑ๊ณผ ์˜์›ํžˆ ์—ฐ๊ฒฐ๋˜๊ณ  ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋ถˆ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ASP.NET ์›น ํŽ˜์ด์ง€ ๋Š” ๋ช‡ ๋…„ ์ „์— ASP.NET์— ์ถ”๊ฐ€๋œ ๋˜ ๋‹ค๋ฅธ Razor ๋ณด๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์„ค์น˜๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์นจ์ž… ๋งˆ๋ฒ• ๋™์ž‘์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‹ค์šด๋กœ๋“œ ํ•  ์ œ๊ณต ๋˜๋ฏ€๋กœ ์ฃฝ์€ ๊ธฐ์ˆ ์˜ ๋ณต์žก์„ฑ์ด ํด๋ž˜์‹ ASP.NET์— ์˜์›ํžˆ ํฌํ•จ๋˜์–ด ๋‹ค๋ฅธ ํ™œ์„ฑ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์— ๋ฌธ์ œ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์ผ์œผํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€๊ฐ€ ๋ณด๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์ˆ˜ํ•˜๋ฌผ์„ ์˜์›ํžˆ ๊ฐ€์ง€๊ณ  ๋‹ค๋…€์•ผ ํ•˜๋Š” Razor .cshtml ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ:

<appSettings>
    <add key="webPages:Enabled" value="false" />
</appSettings>

์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.

  1. "Microsoft.AspNetCore.App"์„ ๋ชจ๋“  ASP.NET Core ์•ฑ(์˜ˆ: MVC ์—†์Œ)์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ์ตœ์†Œ ๊ธฐ์ค€์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  2. MVC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ตœ์†Œํ•œ์˜ ์œ ์šฉํ•œ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” "Microsoft.AspNetCore.Base"์™€ ๊ฐ™์€ ๋ฉ”ํƒ€ ํŒจํ‚ค์ง€๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ณ ๋ ค๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋“  MVC ๋„๊ตฌ๊ฐ€ ์‹คํ–‰์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” mvc:enabled = false ์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ์ „์ฒด ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mythz ๋‹น์‹ ์€ ๋‚ด ์ž…์— ๋‹จ์–ด๋ฅผ ๋„ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋œ ๋ณต์žก์„ฑ์€ MVC์— ๋Œ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณ„์ธต ๊ตฌ์„ฑ์— ๊ด€๊ณ„์—†์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋˜ ๋‹ค๋ฅธ ๊ณ„์ธต์„ ๋งŒ๋“ค๊ณ  ์ œ๊ณตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธํ”„๋ผ, ํŒจํ‚ค์ง•, ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ณ ๋ ค๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋“  MVC ๋„๊ตฌ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋ฐ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” mvc:enabled = false์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ์ „์ฒด ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋„๊ตฌ ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@ํŠธ๋ž˜์ฒ˜

์ถ”๊ฐ€๋œ ๋ณต์žก์„ฑ์€ MVC์— ๋Œ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณ„์ธต ๊ตฌ์„ฑ์— ๊ด€๊ณ„์—†์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋˜ ๋‹ค๋ฅธ ๊ณ„์ธต์„ ๋งŒ๋“ค๊ณ  ์ œ๊ณตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธํ”„๋ผ, ํŒจํ‚ค์ง•, ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, MVC๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋„๊ตฌ ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งŒ๋‚œ 2๊ฐ€์ง€ ๋ฌธ์ œ๋Š” /p:MvcRazorCompileOnPublish=false ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ํ”„๋กœ์ ํŠธ(.cshtml ํŽ˜์ด์ง€ ์ œ์™ธ)๊ฐ€ ๊ฒŒ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<PreserveCompilationContext>false</PreserveCompilationContext>

๋Œ€๋ถ€๋ถ„์˜ ๋งˆ์ˆ  ํ–‰๋™๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๋งŒ๋‚ฌ์„ ๋•Œ๋งŒ ๊ทธ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ MVC๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•˜๊ณ  MVC๋กœ ์ธํ•ด ์ถ”๊ฐ€๋œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ๋ชจ๋“  ๋„๊ตฌ ๋˜๋Š” ์–‘๋ณด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

@mythz ๊ณ„์†ํ•ด์„œ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค.

์ถ”๊ฐ€ MVC ๋ฐ SignalR dll์ด ์‚ฌ์šฉ์ž์˜ ๊ด€์‹ฌ์‚ฌ์ธ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์„œ๋น„์Šค ์Šคํƒ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@davidfowl ์ •๋ง ๋Œ€๋‹จํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ธ‰ ์ง€์›์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ทธ ํ–‰๋™์„ ๋ชจ๋ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@davidfowl ์ตœ์†Œ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๋Š” ๋ชจ๋“  ๋น„ MVC ์•ฑ์— ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์šฐํšŒํ•˜๊ณ  ์‘๋‹ต ์ž์ฒด์— ์ง์ ‘ ์“ฐ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๊ฒฝ๋Ÿ‰ ์•ฑ๊ณผ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IMO ์ด ์˜ต์…˜์€ ์ƒ์ž์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ํŒจํ‚ค์ง€ ๋ฒ„์ „์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋น„๊ณต์‹ ๊ธฐ๋ฐ˜์—์„œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์™ธ๋ถ€์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ๋‹ค๋ฅธ ์ ‘์„ ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋Œ€์‹  ๊ธฐ๋ณธ ํŒจํ‚ค์ง€์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์™ธ๋ถ€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ•จ๊ป˜ ๋ชจ์—ฌ ๋ชจ๋“  ๋น„ MVC ์•ฑ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์— ์œ ์šฉํ•œ ๊ธฐ๋ณธ "AspNetCore" ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋””๋ฅผ ์‚ดํŽด๋ด์•ผ ํ• ๊นŒ์š”? "Microsoft.AspNetCore.App"์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ๋ณต์‚ฌ๋ณธ์—์„œ ์‹œ์ž‘ํ•˜๊ณ  ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ ์œ ์šฉํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ๋งŒํผ ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mythz ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡

@natemcmaster ์‚ฌ์šฉ์ž ์ง€์ • ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@davidfowl ์ด ์‚ฌ์šฉ์ž ์ง€์ •์„ ์ œ์•ˆ

์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ๋น› ๋ฒ„์ „์ด ๋น›์ด๋‚˜ ํ•ต์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ƒ๊ฐ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

MVC๊ฐ€ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฐ ๋ชจ๋‘๊ฐ€ ๋งŒ์žฅ์ผ์น˜๋กœ ๋™์˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฌํ•จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์œ ์ผํ•œ ๋‹ค๋ฅธ "์ œํ’ˆ"์€ MVC๋ณด๋‹ค ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๊ณ  ํฌํ•จํ•  ์ด์œ ๊ฐ€ ์ ์€ SignalR์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐ ํŒจํ‚ค์ง€์— ๋ฌด์—‡์ด ๋“ค์–ด ์žˆ๋Š”์ง€ ์ž˜ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•˜๊ณ  ASP.NET Core "ํ”Œ๋žซํผ"์— ๋„์›€์ด ๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ž, ์—ฌ๊ธฐ์„œ ๊ฑด์„ค์ ์ธ ์‹œ๋„๋ฅผ ํ•ด๋ณด์ž๋Š” ์ œ์•ˆ์„ ๋˜์ง€๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Microsoft.AspNetCore.App์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๊ณ  ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด "ํ•ต์‹ฌ" ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์ธ ๋˜ ๋‹ค๋ฅธ ๊ณ„์ธต์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(์›๋ž˜ https://www.nuget.org/packages/Microsoft.AspNetCore/2.2.0-preview3-35497์—์„œ ์ด์™€ ๊ฐ™์ด ํ–ˆ์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์ด Nancy ๋ฐ ServiceStack๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ Microsoft.AspNetCore.App๊ณผ ํ•จ๊ป˜ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ์ง€๊ธˆ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ œ๊ณตํ•  ๊ฒƒ์ด์ง€๋งŒ ๊ท€ํ•˜์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์„ฑ์ž๋Š” ๊ธฐ๋ณธ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ…œํ”Œ๋ฆฟ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์‹ : ์ด ์Šค๋ ˆ๋“œ๋Š” ์›๊ฒฉ์œผ๋กœ ์‹œ์ž‘๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ณ ๊ฐ์„ ๋Œ€ํ‘œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋‹จ๋…์œผ๋กœ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ๊ณณ์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  github์€ ๊ฐ€์žฅ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ๋†’๊ณ  ์—ด์ •์ ์ธ ์ง€์นจ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์•ฑ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋งŽ์€ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๋ฐ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. Microsoft.AspNetCore.App ์˜ deps์—์„œ๋„ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • Microsoft.Extensions.Primitives
  • Microsoft.AspNetCore.Http
  • Microsoft.AspNetCore.Http.Abstractions
  • Microsoft.AspNetCore.Http.Extensions
  • Microsoft.AspNetCore.Hosting.Abstractions
  • Microsoft.AspNetCore.Logging.Abstractions
  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.AspNetCore.Cryptography.KeyDerivation

๋”ฐ๋ผ์„œ HTTP, ํ˜ธ์ŠคํŒ…, ๋กœ๊น… ๋ฐ ๊ตฌ์„ฑ ์ถ”์ƒํ™”(๋Œ€๋ถ€๋ถ„์˜ HTTP ์•ฑ์— ์œ ์šฉ)์™€ ๊ฐ™์€ ํ•ญ๋ชฉ๋„ ํฌํ•จ๋˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์œ ์ผํ•œ ์„ ํ˜ธ ์‚ฌํ•ญ์€ MVC/SignalR์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ํฅ๋ฏธ๋กœ์›Œ์ง‘๋‹ˆ๋‹ค. David๊ฐ€ ์ด๋ฏธ ๋งํ–ˆ๋“ฏ์ด: ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ
"ํ•ต์‹ฌ"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”์— ๋Œ€ํ•œ ์•„์ด๋””์–ด. ๋‚ด POV์—์„œ ๋‚˜๋Š” DependencyInjection์„ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. / ์–ด๊นจ๋ฅผ ์œผ์“ฑ

Am Do., 8. 2018๋…„ 11์›” um 08:30 Uhr schrieb Demis Bellot <
์•Œ๋ฆผ@github.com>:

์˜ˆ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋งŽ์€ ํ•„์ˆ˜ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์— ๋” ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•ฑ ๊ตฌ์„ฑ ๋ฐ ์‹œ์ž‘ ๋ฐ ์‹คํ–‰. ์˜ ๋Ž์Šค์—์„œ
Microsoft.AspNetCore.App
https://www.nuget.org/packages/Microsoft.AspNetCore.App ์šฐ๋ฆฌ๋„
์‚ฌ์šฉ:

  • Microsoft.Extensions.Primitives
  • Microsoft.AspNetCore.Http
  • Microsoft.AspNetCore.Http.Abstractions
  • Microsoft.AspNetCore.Http.Extensions
  • Microsoft.AspNetCore.Hosting.Abstractions
  • Microsoft.AspNetCore.Logging.Abstractions
  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.AspNetCore.Cryptography.KeyDerivation

HTTP, ํ˜ธ์ŠคํŒ…, ๋กœ๊น… ๋ฐ ๊ตฌ์„ฑ ์ถ”์ƒํ™”์™€ ๊ฐ™์€ ๊ฒƒ๋“ค
(๋Œ€๋ถ€๋ถ„์˜ HTTP ์•ฑ์— ์œ ์šฉํ•จ) ๋˜ํ•œ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์œ ์ผํ•œ ์ทจํ–ฅ์€ ๊ฐ–์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค
MVC/SignalR ํฌํ•จ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/aspnet/AspNetCore/issues/3755#issuecomment-436898980 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AADgNOzUVEHlJNBrPD5P2BsQj6UQdqyvks5us92zgaJpZM4YAsZ1
.

@mythz ๋Œ€๋ถ€๋ถ„์€ ์ „์ด์ ์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

@forki ๐Ÿ˜† ์šฐ๋ฆฌ์˜ ์„ธ๊ณ„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Microsoft.AspNetCore.App์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๊ณ  ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ๋ช…ํ•œ ๋งˆ์ง€๋ง‰ ๋ง. ์ด๊ฒƒ์ด ๋ชจ๋“  ์ž˜๋ชป๋œ ๊ฒฐ์ •์˜ ์ •๋‹นํ™”์ž…๋‹ˆ๋‹ค. "์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค".

๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ์•„? Microsoft๋Š” ๊ฐœ๋ฐœ์ž ๊ธฐ๋ฐ˜์„ ์–‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ๋…๋ฆฝ์ ์ธ ์ง€๋Šฅํ˜• ์—”์ง€๋‹ˆ์–ด๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฌด์—‡์„ ๋˜์ง€๋ฉด ๋”ฐ๋ผํ•˜๊ณ  ์‚ฌ์šฉํ•  ์–‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ  .NET ์Šคํƒ์—์„œ ์ƒˆ๋กœ์šด ์Šคํƒ€ํŠธ์—…์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๋•Œ๋กœ๋Š” ํŒŒ์›Œ ์œ ์ €์˜ ๋ง์„ ๋“ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” Microsoft.AspNetCore.App์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ ˆ์ถฉ์•ˆ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

@forki aspnet ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์–ด์จŒ๋“  DI์— ์ง๋ฉดํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์„œ๋น„์Šค ๋ฐ›๊ธฐ, GetRequired ์„œ๋น„์Šค๊ทธ๋ฆฌ๊ณ  ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ํŒจํ‚ค์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  F#์€ ๋ˆ„๋ฝ๋œ T :> U ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. https://github.com/fsharp/fslang-suggestions/issues/255 ๊ทธ๋ž˜์„œ ยฏ_(ใƒ„)_/ยฏ

@davidfowl์ด ์–ธ๊ธ‰ํ•œ ๊ธฐ๋ณธ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค... ์ œ ์ƒ๊ฐ์—๋Š” @mythz ์™€ @dustinmorris ๊ฐ€ ๋ชจ๋‘ ๊ทธ๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ํ† ์„ฑ @Krzysztof-Cieslak์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์–ด์จŒ๋“  DI์— ์ง๋ฉด

๋‚˜๋Š” ์•Œ๊ณ  ์žˆ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ ๋…ผ์˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ–ˆ๋‹ค. ๊ทธ๋ƒฅ ์•ˆํ•˜๋Š”๊ฒŒ ์ข‹์„๋“ฏ
;-) ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€...

์˜ค์ „ Fr., 2018๋…„ 11์›” 9์ผ, 10:57 ๋ชจ์ž Nino Floris [email protected]
๊ฒŒ์Šˆ๋ฆฌ๋ฒค:

@forki https://github.com/forki aspnet ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
์–ด์จŒ๋“  DI์— ์ง๋ฉดํ•˜๋ฉด ํŽธ์˜ ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ๊ฐ’(์„œ๋น„์Šค ๊ฐ€์ ธ์˜ค๊ธฐ, GetRequiredService ๋“ฑ์ด ๊ทธ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.
ํŒจํ‚ค์ง€). ๊ทธ๋ฆฌ๊ณ  F#์€ ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•ด ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
T :> U ์ œ์•ฝ ์กฐ๊ฑด fsharp/fslang-suggestions#255
https://github.com/fsharp/fslang-suggestions/issues/255 ๊ทธ๋ž˜์„œ ยฏ_(ใƒ„)_/ยฏ

๊ธฐ๋ณธ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ @davidfowl์„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
https://github.com/davidfowl ์–ธ๊ธ‰... ๋‚ด ์ƒ๊ฐ์— @mythz
https://github.com/mythz ๋ฐ @dustinmorris
https://github.com/dustinmorris ๋‘˜ ๋‹ค ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋˜ํ•œ ํ† ์„ฑ @Krzysztof-Cieslak์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
https://github.com/Krzysztof-Cieslak

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/aspnet/AspNetCore/issues/3755#issuecomment-437309244 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AADgNGP3d8R0otOAuUQC7AYK6O2dzJ3mks5utVGegaJpZM4YAsZ1
.

๋‹ค์Œ์„ ํฌํ•จํ•˜๋„๋ก ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Microsoft.AspNetCore.Authentication.JwtBearer
  • Microsoft.AspNetCore.Authentication.OpenIdConnect

์ด๋“ค์€ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ฑฐ๋˜๊ณ  NuGet ํŒจํ‚ค์ง€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ์—๋Š” ์•„์ง ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ง€์นจ์— ๋งž์ง€ ์•Š๋Š” IdentityModel API์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” IdentityModel ํŒ€๊ณผ ํ˜‘๋ ฅํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ํ–ฅํ›„ ์ด๋ฅผ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋‹ค์‹œ ๋„ฃ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋ ˆํ”„ https://github.com/aspnet/AspNetCore/pull/6035

Microsoft.AspNet.WebApi.Client๋ฅผ ํฌํ•จํ•˜๋„๋ก ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. https://github.com/aspnet/AspNetCore/pull/6552#issuecomment -453177732๋ฅผ ์ฐธ์กฐ

๊ผญ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Visual Studio ๋งํ•˜๊ธฐ - Microsoft.AspNetCore.App ๋…ธ๋“œ๋ฅผ ์—ด๊ณ  ๊ทธ ์•„๋ž˜์— ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์น˜ํ–ˆ์„ ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ๊ณผ ์ƒํ˜ธ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ง‘ ์ฒญ์†Œ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.6.0-beta2" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.NodeServices" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.1">

SpaServices์™€ EntityFramework ๋„๊ตฌ๊ฐ€ ํ˜„์žฌ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค(์ด์ „์—๋Š” ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ๊ณ  ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ์˜ค๋ž˜๋œ 2.2.1 ์ฐธ์กฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ ์€ - Visual Studio ํŒ€๊ณผ ๋” ๋‚˜์€ ์กฐ์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฉ”๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” IDE๊ฐ€ ์ข€ ๋” ์ง€๋Šฅ์ ์œผ๋กœ ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ v3์—์„œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋‹ค์‹œ ;-)

@simeyla ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์€ ์ฃผ์ œ์™€ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ ์ •ํ™•ํžˆ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ฐธ์กฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋„๊ตฌ๋Š” ์ƒˆ๋กœ์šด Visual Studio ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ํ”ผ๋“œ๋ฐฑ์„ Visual Studio์— ์ง์ ‘ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. VS์—์„œ "๋„์›€๋ง > ํ”ผ๋“œ๋ฐฑ ๋ณด๋‚ด๊ธฐ..."๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•œ ํ›„ ๋งํฌ๋ฅผ โ€‹โ€‹๊ณต์œ ํ•˜๋ฉด VS์—์„œ ์ž‘์—…ํ•˜๋Š” ๋™๋ฃŒ ํŒ€์— ๋‚ด๋ถ€์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.0์—์„œ๋Š” Microsoft.AspNetCore.App ๋ฉ”ํƒ€ํŒจํ‚ค์ง€๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐฐ์†กํ•  ํŒจํ‚ค์ง€๋ฅผ ๋งŽ์ด ์กฐ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2.x์—์„œ 3.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ 3.0์—์„œ ์ œ๊ณต๋˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ๋ชฉ๋ก์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด์„œ ์ด ๋ฌธ์„œ๋ฅผ ๊ณ„์† ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํ•ญ๋ชฉ์€ ์ž‘์—…์„ ์ถ”์ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 'ํ† ๋ก ' ์ด์ •ํ‘œ๋กœ ์ด๋™ํ•˜์ง€๋งŒ ๊ตฌํ˜„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

Microsoft.Extensions.DependencyModel ์„ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/aspnet/AspNetCore/pull/10271์˜ ์ผ๋ถ€๋กœ ๋ณ€๊ฒฝ๋จ

@natemcmaster @DamianEdwards์— ์งˆ๋ฌธํ•˜์„ธ์š”. ๋กœ์ปฌ์—์„œ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ๊ฐ๊ณผ ์ธ์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ œ๊ฑฐ๋กœ ์ธํ•ด ์ธ์ฆ ํ…œํ”Œ๋ฆฟ์ด 3.0์—์„œ ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋นŒ๋“œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ? ์–ด๋–ค ์ธ์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์˜คํ”„๋ผ์ธ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๋„ˆ๊ฒŸ ์บ์‹œ๊ฐ€ ์—†์œผ๋ฉด ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ ์ƒˆ ์ธ์ฆ ํ…œํ”Œ๋ฆฟ์„ ์ƒˆ๋กœ ๋งŒ๋“  ํ›„ ์ด๋ก ์ ์œผ๋กœ ๋นŒ๋“œ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์ง€ ์•Š์€ ๊ฒฝํ—˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋„ค, ์ด๊ฒƒ์ด ์ด ๋ณ€ํ™”์˜ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Preview 6(๊ณง ์ œ๊ณต ์˜ˆ์ •) ํ˜„์žฌ dotnet new mvc , dotnet new razor , dotnet new web ๋ฐ ๊ธฐํƒ€์—๋Š” PackageReferences๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์ง€๋งŒ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. , --auth individual ์™€ ๊ฐ™์ด ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•œ PackageReference๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์˜๋„์ ์ธ ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. PackageReference๊ฐ€ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์€ ๊นจ๋—ํ•œ ์‹œ์Šคํ…œ์—์„œ ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋ณต์›๋˜์ง€ ์•Š์ง€๋งŒ ๋ฏธ๋ฆฌ ์ฑ„์›Œ์ง„ ์˜คํ”„๋ผ์ธ NuGet ์บ์‹œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋งŽ์€ ๋ฌธ์ œ๋„ ๋ฐฉ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. dotnet-docker/issues/237, https://github.com/NuGet/Home/issues/6309 ๋ฐ http://blog.ctaggart.com/2019/03/using-nuget-lock-file-for-reproducible .html).

@natemcmaster๋Š” ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์ถ”๋ก ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด dotnet new webapp --auth Individual ๊ฐ€ ๋นŒ๋“œ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ์ดˆ๊ธฐ 3.0 ๋ฆด๋ฆฌ์Šค์—์„œ ์ˆ˜๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์—ด๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Microsoft.AspNetCore.Authentication.JwtBearer๊ฐ€ .netcoreapp3.0์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋œ ์ด์œ ๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? .netstandard2.x์—์„œ๋Š” ์•ˆ๋ ๊นŒ์š”? ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๊ณ  ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชจ๋‘ .netstandard๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@Pilchie ์ด ๋ฌธ์ œ๋Š” ASP.NET Core 3.0์— ๋Œ€ํ•œ ๋ฌธ์„œ์—์„œ <PackageReference> ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@Bomret ์šฐ๋ฆฌ๊ฐ€ ์กฐ์‚ฌํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์‹ค์ œ ๊ณ ๊ฐ ์•ฑ์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  MVC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์œ ์ง€ํ•˜๋ฉด ๋งŽ์€ ์ด์ ์ด ์žˆ์œผ๋ฉฐ, ์™œ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•œ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

MVC๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์„œ๋ฒ„๋ฆฌ์Šค ์•ฑ, ์›น API ๋“ฑ์„ ์œ„ํ•ด .net ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ƒ์ ์—์„œ๋Š” ํ™•์‹คํžˆ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ 3.0์„ ์ถœํ•˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชฉ๋ก์„ ๋ฌธ์„œ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@davidfowl ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค: https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#remove -obsolete-package-references

@pranavkm ๋ชฉ๋ก์€ ์‹ค์ œ๋กœ ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ณต์œ  ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์ง€๋งŒ ์ด์ œ ํŒจํ‚ค์ง€๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@scottaddie ์ด๊ฒƒ์€ ASP.NET Core ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ ๋ฌธ์„œ์—์„œ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

@DamianEdwards - https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#add -package-references-for-removed - ์–ด์…ˆ๋ธ”๋ฆฌ?

๋ฐ”๋กœ ๊ทธ๊ฑฐ์•ผ :)

ํŒŒํ‹ฐ์— ๋Šฆ์—ˆ์ง€๋งŒ ๊ฐœ๋ฐœ์„ ๋‹จ์ˆœํ™”ํ•˜๋ ค๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

a) ์ด์ œ AspNetCore ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ: SignalR)์— ๋Œ€ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ Microsoft.AspNetCore.App์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด "dotnet ํŒฉ"์ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถœ์‹œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํŒฉ์— ๋‹ค๋ฅธ?
b) ๋” ์ด์ƒ netstandard ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: Auth ๋ฏธ๋“ค์›จ์–ด)์—์„œ AspNetCore์šฉ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด ํ•ญ๋ชฉ์„ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด netcoreapp3.0์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ netstandard / netcore ๊ตฌํ˜„์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
ํŽธ์ง‘: c) <Project Sdk="Microsoft.NET.Sdk.Web"> ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์‚ฌ์šฉ ์ค‘์ธ ํŒฉ ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๊นŒ? ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๋Š” dotnet์„ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ๋‹ค๋ฅธ ๋ถ„๊ธฐ์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

a) ์ด์ œ AspNetCore ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ: SignalR)์— ๋Œ€ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ Microsoft.AspNetCore.App์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด "dotnet ํŒฉ"์ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถœ์‹œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํŒฉ์— ๋‹ค๋ฅธ?

SignalR์€ ๋‚˜๋จธ์ง€ AspNetCore์™€ ๋™์ผํ•œ ์ผ์ •์œผ๋กœ ๋ฐฐ์†ก๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์ผ์ • ๋ณ€๊ฒฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

SignalR์€ ๋‚˜๋จธ์ง€ AspNetCore์™€ ๋™์ผํ•œ ์ผ์ •์œผ๋กœ ๋ฐฐ์†ก๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์ผ์ • ๋ณ€๊ฒฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋‚˜์œ ์˜ˆ์ž…๋‹ˆ๊นŒ? ์ œ๊ฑฐ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  NuGet ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๊นŒ?

SignalR์€ ๋‚˜๋จธ์ง€ AspNetCore์™€ ๋™์ผํ•œ ์ผ์ •์œผ๋กœ ๋ฐฐ์†ก๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์ผ์ • ๋ณ€๊ฒฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋‚˜์œ ์˜ˆ์ž…๋‹ˆ๊นŒ? ์ œ๊ฑฐ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  NuGet ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๊นŒ?

๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด. ๋ชจ๋“  .NET Core ๋ฐ ASP.NET Core ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋™์ผํ•œ ๋ฐฐ์†ก ์ผ์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž์ฒด ํŒจํ‚ค์ง€๋กœ ๋ฐฐ์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด. ๋ชจ๋“  .NET Core ๋ฐ ASP.NET Core ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋™์ผํ•œ ๋ฐฐ์†ก ์ผ์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž์ฒด ํŒจํ‚ค์ง€๋กœ ๋ฐฐ์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๋ง์„ ๋ฐ›๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋ฐ˜๋Œ€ ์‚ฌ๋ก€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์— AspNetCore NuGet ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ "๋Š๋ผ์ง€" ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰