1. 개발 도구 선택
마이크로소프트는 Visual Studio Code와 Visual Studio(2019, 2022등)등의 개발도구를 제공하고 있습니다. Visual Studio는 .NET Application을 개발하기 위한 전통적인 개발환경으로서 개발에 필요한 많은 기능을 제공합니다. 하지만 그만큼 시스템의 많은 자원을 요구하며 필요한 자원만큼 다소 느린 동작을 보일 수 있기 때문에 Console App과 같은 아주 간단한 App을 개발하는 데는 적합하지 않을 수 있습니다.
Visual Studio Code는 Visual Studio에 대한 개발도구의 대안이 될 수 있습니다. Visual Studio에 들어간 여러가지 부가적인 기능이 포함되어 있지는 않지만 Visual Studio보다는 훨씬 가볍고 ASP.NET Core를 개 발데 필요한 것들은 충분히 제공해 주기 때문입니다.
참고로 Visual Studio는 ASP.NET Core개발시 사용되는 여러 타입의 파일들을 구조적으로 생성하기 위한 기능을 제공하고 있으므로 .NET개발이 처음이라면 Visual Studio를 사용하는 것이 ASP.NET Core의 전반적인 개발 구조를 이해하는데 도움이 될 수 있습니다.
(1) Visual Studio 설치
ASP.NET Core 6를 위해서는 Visual Studio 2022를 설치해야 하며 조건에 맞으면 Visual Studio 2022 Community Edition을 무료로 사용할 수 있습니다. 해당 개발도구는 아래에서 내려받을 수 있습니다.
파일을 다운로드하고 실행하면 잠시 후 아래와 같은 일련의 설치 옵션이 표시될 것입니다. 이 상태에서 ASP.NET Core개발을 위해 'ASP.NET and web development'를 체크합니다.
그리고 설치버튼을 클릭해 설치를 진행합니다. 잠시 뒤 필요한 SDK를 포함한 몇 가지 파일을 다운 로드한 뒤 설치가 완료될 것입니다.
2. ASP.NET Core 프로젝트 생성해 보기
Visual Studio가 설치되고 나면 윈도우의 터미널이나 Powershell, cmd 등을 열고 아래 명령을 통해 새로운 ASP.NET Core MVC프로젝트를 생성합니다.
dotnet --list-sdks
dotnet new globaljson --sdk-version 6.0.302 --output MyMvcProject
dotnet new mvc --no-https --output MyMvcProject --framework net6.0
dotnet new sln -o MyMvcProject
dotnet sln MyMvcProject add MyMvcProject
|
첫번째 명령은 시스템에 설치된 .NET SDK의 버전을 확인하기 위한 것입니다. '그림 1'에서는 현재 설치된 가장 높은 버전으로 6.0.302가 확인되고 있습니다.
설치된 SDK를 확인하고 나면 두번째 명령을 통해 프로젝트가 저장될 폴더(MyMvcProject)를 만들고 global.json이라는 파일을 생성합니다. 이 파일은 프로젝트에서 사용할 .NET버전을 명시하며 예제에서는 6.0.302버전을 지정하고 있습니다.
세 번째 명령에서는 지정한 폴더에 새로운 ASP.NET Core 프로젝트를 생성하도록 합니다. SDK는 새롭게 시작할 수 있는 여러 프로젝트의 템플릿을 포함하고 있으며 MVC는 ASP. NET Core application을 위한 템플릿 중 하나입니다. 이 프로젝트는 MVC Framework를 위해 설정된 프로젝트를 생성하며 이는 ASP.NET Core에서 지원되는 여러 Application유형 중 하나에 해당합니다.
네 번째 명령은 폴더에 설루션을 생성하고 다섯 번째 명령을 통해 생성된 설루션에 지정한 프로젝트를 추가하도록 합니다.
여러 명령을 통해 솔루션과 프로젝트를 생성했지만 Visual Studio를 사용해서는 한 번에 위의 과정과 동일한 형태의 프로젝트를 만들어낼 수 있습니다
다만 처음 시작하는 단계에서는 명령을 통해 프로젝트를 생성해 보는것도 좋은 선택이 될 수 있습니다.
위의 과정으로 프로젝트를 생성하고 나면 Visual Studio를 실행해 생성된 프로젝트를 불러올 수 있습니다.
3. ASP.NET Core Application 구동하기
우선 Visual Studio의 Solution Explorer에서 Properties->launchSettings.json파일을 열어보면 아래와 같은 내용을 볼 수 있습니다.
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:64915",
"sslPort": 0
}
},
"profiles": {
"MyMvcProject": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5143",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
이 파일은 프로젝트가 생성될때 같이 만들어지는 파일인데 ASP.NET Core가 HTTP 요청을 받아들일 HTTP포트를 지정하고 있습니다. 이번 예제에서는 별도로 포트를 바꾸지 않겠지만 필요하다면 해당 포트를 아래와 같이 임의로 변경할 수 있습니다.
"applicationUrl": "http://localhost:5000",
프로젝트를 실행하려면 프로젝트가 존재하는 폴더에서 아래 명령을 사용하거나
dotnet run |
Visual Studio에서 Ctrl + F5 또는 'Start Without Dubegging'버튼을 클릭합니다.
그러면 시스템에 설치된 기본 브라우저를 통해 새로운 WebBrowser를 생성하여 아래와 같은 결과를 보여주게 됩니다.
(1) Endpoint
ASP.NET Core Application에서 들어오는 요청은 Endpoint에 의해 처리됩니다. Endpoint는 '그림 2'와 같은 응답을 생성하는 Action에 해당하는데 C#에 의해 작성되는 일종의 Method가 됩니다. Action은 Controller안에서 정의되는 메서드이며 Controller는 Microsoft.AspNetCore.Mvc.Controller로 부터 상속받은 C#클래스입니다.
Controller에 의해 정의되는 각 메서드가 Action이 되며 HTTP요청을 제어하기 위해 호출될 수 있습니다. 전통적인 ASP.NET Core프로젝트는 Controller를 Controllers라는 이름의 폴더 안에 생성하는데 Controlllers폴더는 프로젝트를 설정하는 데 사용된 템플릿에 의해 만들어집니다.
프로젝트 템플릿은 빠른 시작을 위해 기본적으로 Controllers라는 이름의 폴더에 Controller를 추가하게 되는데 예제에서 처음 Controller는 HomeController.cs라는 이름의 클래스파일로 정의되었습니다. 즉, Controller 클래스는 Controller라는 이름을 접미사로 사용하는 관계를 따르고 있는 것입니다. 여기서 HomeController.cs라는 파일을 보면 이것이 Home이라는 단어를 포함하고 있고 이는 ASP.NET Core Application에서 사용하는 기본 Controller가 됩니다.
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using MyMvcProject.Models;
namespace MyMvcProject.Controllers;
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
기본적으로 만들어진 위의 코드에서 동작방식을 이해하는 수월함을 위해 아래와 같이 코드를 간소화합니다. Index()라는 하나의 메서드만을 남기고 모든 메서드를 제거하며 사용하지 않는 Namespace 또한 제거합니다. 남겨진 Index() 메서드도 기본적으로 구현된 방식을 변경합니다.
using Microsoft.AspNetCore.Mvc;
namespace FirstProject.Controllers
{
public class HomeController : Controller
{
public string Index()
{
return "Hello World";
}
}
}
HomeController.cs를 수정한 뒤 결과는 아래와 같습니다.
이것으로 브라우저에 의해 생성되는 HTTP요청이 기본적으로 HomeController의 Index() 메서드에 도달하였고 해당 메서드에서 문자열이 반환되었음을 알 수 있습니다.
(2) Route
ASP.NET Core Routing System은 HTTP요청을 제어할 Endpoint의 선택을 담당합니다. 여기서 Route는 요청을 어떻게 처리할지를 결정하는 데 사용하는 규칙이라고 할 수 있습니다. 프로젝트가 생성될 때는 프로젝트를 시작할 수 있는 기본적인 규칙만 만들어지게 되는데 이로 인해 아래와 같은 URL로 최초 요청을 실행할 수 있으며 이 요청은 HomeController에 의해 정의된 Index라는 Action으로 전달됩니다.
/ /Home /Home/Index |
따라서 브라우저가 http://localhost:5143 혹은 http://localhost:5143/Home으로 요청을 시도하면 HomeController의 Index()메서드로 부터 출력을 돌려받게 됩니다.
(3) HTML Rendering
위의 결과는 HTML이 아닌 순수한 문자열을 반환한 것에 불과합니다. 브라우저의 요청으로 HTML응답을 생성하기 위해서는 View라는 것이 필요한데 View는 ASP.NET Core가 Index() 메서드에 의해 만들어진 결과를 웹브라우저로 보낼 수 있는 HTML응답에 해당합니다.
● View의 생성과 랜더링
우선 Index()메서드의 반환 형식과 반환 값을 아래와 같이 변경해 줍니다.
public ViewResult Index()
{
return View("FirstView");
}
위에서 처럼 Action Method가 ViewResult객체를 반환하도록 하면 ASP.NET Core는 View를 랜더링 하기를 시도하게 됩니다. 예제에서 Index() 메서드는 ViewResult를 반환한다는 것을 정의하고 Return에서 View메서드를 사용했는데 이때 View의 이름을 FirstView로 지정했습니다. 이로 인해 ASP.NET Core는 여러 경로를 통해 지정한 View를 찾으려 시도한다는 것을 아래 보이는 결과를 통해 알 수 있습니다.
위의 에러는 ASP.NET Core가 View를 어디서 찾았는지와 결국 지정한 View를 찾지 못했다는 것을 설명하고 있습니다. View는 Views라는 폴더에 하위폴더를 갖는 형태로 저장됩니다. 예를 들어 Home Controller와 연관된 View는 Views/Home폴더 아래에 있게 됩니다. 만약 View가 특정 Controller와 연관되지 않는 경우라면 대게는 Views/Shared에 저장됩니다. 프로젝트를 만들기 위해 사용된 템플릿은 자동적으로 Home과 Shared폴더를 추가하고 프로젝트를 바로 시작할 수 있게 몇몇 기본적인 View를 추가해 줍니다.
Visual Studio에서 Solution Explorer의 View->Home 폴더에 마우스 오른쪽 버튼을 클릭하여 Add->View를 선택한뒤 'Add New Scaffolded Item'화면에서 Razor View - Empty를 선택해 'Add'버튼을 누릅니다.
추가할 View의 이름을 FirstView.cshtml로 지정한뒤 'Add'를 누르면
View->Home폴더에 FirstView.cshtml파일이 추가되고 바로 수정할 수 있도록 파일이 열릴 것입니다. 그러면 아래 내용으로 수정한 뒤 파일을 저장합니다.
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>FirstView</title>
</head>
<body>
<div>
처음 뷰파일
</div>
</body>
</html>
위의 내용중에서
@{
Layout = null;
}
이 부분은 Razor가 해석하는 부분으로 Razor는 View 내용을 처리하고 브라우저로 보낼 HTML를 생성하는 Component입니다.
위 Razor표현은 Layout을 사용하지 않을 것임을 나타내고 있으며 cshtml페이지에서 작성한 HTML을 그대로 브라우저로 전송하게 됩니다.
처음 Index() 메서드에서 문자열을 반환한 경우 ASP.NET Core는 웹브라우저로 지정한 문자열을 전달하는 것을 제외하고 는 아무런 동작도 필요하지 않습니다. 하지만 지금 Index() 메서드가 ViewResult를 반환하도록 수정되었으며 Razor는 View를 처리하고 HTML응답을 생성하는 데 사용되었습니다. 현재 View파일은 View->Home폴더에 위치하고 있으며 이는 View파일이 Action 메서드를 포함하는 Controller의 이름과 일치하는 폴더에 있어야 한다는 전통적인 규칙을 따른 것입니다. 이 경우에는 HomeController안에 FirstView를 반환하는 Action Method가 정의되었습니다.
물론 Action메서드는 문자열이나 ViewResult객체 외에 다른 결과를 반환할 수도 있습니다. 예를 들어 RedirectResult를 반환한다면 이를 통해 브라우저를 다른 URL로 Redirect 할 수 있게 하거나 HttpUnauthorizedResult를 반환하여 인증받지 않은 사용자를 Login페이지로 위치시킬 수 있습니다.(이들 개체 대부분은 Action Result로 알려져 있습니다.) Action Result System은 Action에서 일반적인 응답을 캡슐화하고 재사용할 수 있도록 합니다.
● 동적 응답 생성
Web Application의 핵심은 동적 응답을 생성하여 이를 표시할 수 있다는 것입니다. Action Method의 역할은 Data를 구성하고 이를 View로 전달하여 Data값에 기반한 HTML응답을 생성하는 것인데 여기서 Action Method는 매개변수를 통해 필요한 데이터를 View Method로 전달하게 됩니다. 이때 View Method로 전달된 데이터를 통상 View Model이라고 표현합니다.
public class HomeController : Controller
{
public ViewResult Index()
{
string viewModel = DateTime.Now.ToString();
return View("FirstView", viewModel);
}
}
예제에서 viewModel은 현재 시간을 나타내는 문자열이며 View Method의 두 번째 매개변수를 통해 View로 전달하고 있습니다.
그리고 View에서는 위에서 지정한 ViewModel을 받을 수 있게 아래와 같이 수정합니다.
@model string
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>FirstView</title>
</head>
<body>
<div>
처음 뷰파일<br />
현재 시간 : @Model
</div>
</body>
</html>
@model에서는 View로 전달되는 Data의 유형을 지정합니다. 예제에서는 단순 string형식의 값을 전달하고 있으므로 string으로 지정하고 View Model을 사용할 때는 @Model로 전달되는 데이터를 명시합니다.(대소문자에 주의하세요.)
위의 View 수정으로 인해 View가 렌더링 될 때는 Action Method로 전달된 View Model이 아래와 같이 HTML응답에 포함될 것입니다.
예제는 단순한 결과를 반환할 뿐이지만, 최소한의 ASP.NET Core Application을 만들고 동적 응답을 생성하기 위한 모든 구성요소를 보여주고 있습니다. ASP.NET Core platform은 HTTP 요청을 수신하고 요청 URL을 Endpoint와 일치시키기 위해 Routing System을 사용합니다. 이 경우 Endpoint는 Home Controller에 정의된 Index Action Method가 됩니다. 호출된 Action Mehtod는 View의 이름과 View Model객체를 포함하는 ViewResult객체를 생성합니다. Razor View Engine은 View를 찾아 처리하며 Action Method에서 제공된 데이터를 응답에 삽입하기 위해 @Model식을 평가(실행)하게 되고 브라우저를 통해 그 결과가 반환되면 최종적으로 사용자가 웹브라우저를 통해 눈으로 결과를 볼 수 있게 됩니다.
물론 ASP.NET Core는 지금까지의 것보다는 훨씬 더 많은 특징들이 존재하지만 앞으로의 진행을 위해 이 순서를 이해하는 것은 충분히 가치 있는 일이 될 것입니다.
'.NET > ASP.NET' 카테고리의 다른 글
[ASP.NET Core] Shopping mall project 시작하기 (0) | 2022.08.16 |
---|---|
[ASP.NET Core] 초간단 Application 만들어 보기 (0) | 2022.08.03 |
[ASP.NET Core] ASP.NET Core 개요 (0) | 2022.07.27 |
[ASP.NET Core] Blazor 웹 프로젝트 시작하기 (0) | 2022.04.01 |
[ASP.NET Core] ASP.NET Core Web API (2) | 2022.03.25 |