상세 컨텐츠

본문 제목

C# 6, ASP.NET Core 처음부터 시작하기

ASP.NET

by 경밤 2021. 12. 19. 22:10

본문

반응형

ASP.NET은 아주 빠른 속도를 자랑하며 Model-View-Controller의 상호작용으로 객체지향적인 프로그래밍을 할 수 있게 도와주는 마이크로소프트의 웹 프레임워크입니다. cshtml 뿐만 아니라 razor를 View로 사용하며, Controller로 어떠한 Url에 대해 다양한 Action을 부여함으로써 RESTful 서비스를 만족시킵니다. Model을 통해 Controller가 View로 전달하는 정보를 명시적으로 제시함으로써 관리의 편이성 및 확장성 또한 보증되는 것으로 보입니다.

이 글에서는 제일 처음 '빈 ASP.NET 프로젝트'에서부터, 기본 작동 원리와 폴더 구성, 그리고 컨트롤러 라우팅까지를 다룹니다.

1. 빈 ASP.NET 프로젝트 만들기

정말 아무것도 없습니다. Program.cs에서는 오로지 "/" 에 대해서만 매핑하여 라우팅할 뿐 입니다. 또한 폴더 구성은 View, Model, Controller, wwwroot 등 아무것도 없습니다. 이제부터 저와 함께 만들어나가 봅시다.

2. 구조 설명

Views 폴더로 명명하셔야 합니다. Controllers, wwwroot 모두 이 이름으로 명명하셔야 합니다. 왜냐하면 ASP.NET이 자동으로 이것들을 정적 파일, 컨트롤러 매핑을 하기 때문입니다. 이와 같이, Home 컨트롤러는 반드시 Controllers 폴더에 HomeController 로 명명되어있어야 합니다. 

ASP.NET은 아래 함수를 지원하는데, 이것으로 우리는 자동으로 컨트롤러의 액션과 Url을 매핑할 수 있게 됩니다.

builder.Services.AddControllersWithViews();

그러니까, Controllers 안의 컨트롤러들을 ASP.NET이 자동으로 연결시켜주니까 이름만 잘 지키시면 됩니다. 안그러면 에러뜹니다.

View는 컨트롤러의 액션 이름과 일치시킵니다. Controller에 Action이 있다면 View에도 마찬가지로 그와 같은 폴더에 같은 이름으로의 View가 존재해야 합니다. HomeController에 Index 액션이 있다면, Views 폴더에 Home 폴더를 생성하고, 그 아래 Index.cshtml 등을 작성해야 합니다.

또, Views 폴더에는 해야할 것이 많은데 레이아웃입니다. 레이아웃, 많이 사용하죠. 이것을 사용하기 위해서는 Views 폴더 하위에 Shared 폴더에 레이아웃의 cshtml를 만들고 그곳에서 @RenderBody() 를 해야합니다. 또, 모든 페이지에 레이아웃을 적용하기 위해서 Views 폴더에 _ViewStart.cshtml을 만들어서 View가 컨트롤러에 의해서 표시되기 전에 Shared의 레이아웃을 적용하게 합니다. _ViewStart.cshtml은 이런 역할을 합니다.

3. Program.cs 작성하기

Program.cs에서 할 일은 두 가지입니다. 각종 기능 사용하는 함수 호출하기, 어떤 Url에 관해 무슨 작업을 할 것인지 라우팅하기 입니다.

먼저 builder 에게 컨트롤러와 뷰를 매핑시키라고 하겠습니다.

builder.Services.AddControllersWithViews();

그 다음, 생성된 app에서 "~/"로 접근하는 정적 파일들을 사용할 수 있도록 하는 메소드를 호출하고, 에러를 핸들링하는 코드를 작성하겠습니다.

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler(errorApp =>
    {
        errorApp.Run(async ctx =>
        {
            ctx.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            ctx.Response.ContentType = "text/html";
            var ex = ctx.Features.Get<IExceptionHandlerFeature>();
            if (ex != null)
            {
                var err = $"<h1>Error: {ex.Error.Message}</h1>{ex.Error.StackTrace}";
                await ctx.Response.WriteAsync(err).ConfigureAwait(false);
            }
        });
    });
}
else
{
    app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();

개발 모드라면 이미 만들어져 있는 개발자용 에러 페이지를 띄우고, 아니라면 직접 작성한 에러 페이지를 띄웁니다. 그리고 UseStaticFiles를 통해 wwwroot의 파일들을 ~/ 로써 접근할 수 있게 되었습니다.

앞으로 컨트롤러와 뷰를 작성할 것인데, 앞서 그것들을 모두 작성했다 가정하고 MapControllerRoute를 사용하도록 하겠습니다.

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}");

단, Pattern에서 {a?} 등으로 url에서 값을 받아올 수 있습니다. 주의할 점은 컨트롤러의 액션 함수의 파라미터 이름 또한 a와 같아야 합니다. 

HomeController를 만들 것 이기 때문에, controller=Home 이어야하고, 액션 함수를 Index로 칭할것이라서 action=Index로 해야 합니다.

4. Controller 작성

Controllers 폴더를 만들고 HomeController.cs라고 명명합니다. 이때 HomeController 클래스를 생성하는데, Controller 클래스를 상속받아야 합니다. 그리고 public으로 IActionResult, 즉 View를 반환하는 Index 함수를 작성합니다. 그대로 return View(); 를 해보겠습니다.

using Microsoft.AspNetCore.Mvc;

namespace WebApplication1
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

이와 동시에 Views 폴더도 만들고 그 속에 Home 폴더, Index.cshtml를 만들겠습니다.

이제 실행해보십시오. 잘 됩니다.

 

 

 

 

 

 

5. Model 실습

Models 폴더 등 아무 모델들을 담을 아무 폴더를 준비해주시고 그 속에 데이터를 담을 클래스를 생성합니다. 이것은 그저 관례일 뿐 입니다. 가령 CarModel 이면 class는 Name, Type 등의 Property를 가지게 되겠죠.

이런 모델들은 컨트롤러에서 View의 매개변수로 넘겨지게 되고, 결국 View에서 Model 객체로 사용됩니다.

cshtml의 최상단에 @model CarModel 을 추가하여 Model을 사용합니다.

 

HomeControlller의 Index입니다. 모델을 인자로 전달합니다.

 

 

 

Index.cshtml입니다. @model을 이용하여 "이 페이지는 이 모델을 사용한다" 라고 명시합니다.

 

 

 

 

모델 클래스입니다. 별 다른 특징은 없습니다.

 

 

 

 

이상입니다.

반응형