센로그

1. MVC 프로젝트 소개 (Program.cs) 본문

게임/ASP.NET Core

1. MVC 프로젝트 소개 (Program.cs)

seeyoun 2024. 4. 15. 13:54

◆ ASP.NET Core 웹앱(MVC)

이 시리즈에서는 ASP.NET Core 웹앱(MVC) 프로젝트가 어떻게 구성되었는지, 각각 어떤 기능을 하는지 공부할 것이다.
 
MVC는 말 그대로 모델, 뷰, 컨트롤러로 구분하여 코드를 관리하는 디자인 패턴이다.
 

ASP.NET Core 웹앱 프로젝트로 생성하면 된다.
 
참고로 .NET 6부터는 이전 버전과 달라진 점이 몇가지 있다.

  • Program.cs, Stratup.cs로 분리되어있던 게 통합됨.
  • main 없이 Program.cs가 자동으로 진입점이 됨.
  • 코드들도 대폭 수정됨.

 


Program.cs

기본적으로 ASP.NET Core 웹앱(MVC) 프로젝트를 생성하면, Program.cs에 다음 코드가 포함된다.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build(); 

if (!app.Environment.IsDevelopment())  
{
    app.UseExceptionHandler("/Home/Error"); 
    app.UseHsts();
}

app.UseHttpsRedirection();  
app.UseStaticFiles();   

app.UseRouting(); 

app.UseAuthorization();

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

app.Run();

코드를 보면 builder 객체와 app 객체를 생성하는데, 각 객체의 역할은 다음과 같다.

  • builder: 구성 설정, 서비스 추가(DI), 로깅 설정
  • app: 미들웨어 구성

 

어떤 코드로 구성되었는지 자세히 알아보자.

1.  WebApplication.CreateBuilder(args)

웹 응용프로그램 구성 (구성 추가, 서비스 추가, 로깅 설정)

 
웹 응용프로그램(WebApplication)을 구성하기 위한 코드이다. 

var builder = WebApplication.CreateBuilder(args);    //WebApplicationBuilder 개체 반환
  • WebApplicationBuilder 개체를 반환함
    • 이는 데이터와 로깅을 위한 서비스를 생성하고, ASP.NET Core의 기본적인 구성을 설정하기 위한 것. 
      • builder.Configuration을 사용해서 구성 추가
      • builder.Serives를 사용해서 서비스 추가
      • builder.Logging를 사용해서 로깅 설정
      • 일반 IHostBuilder  IWebHostBuilder 구성
    • 또한 Kestrel(ASP.NET Core의 내장 HTTP Server)을 사용해 HTTP 요청에 응답할 수 있도록 함.

 
 

2. AddControllersWithViews()

DI를 통해 각종 서비스를 추가할 수 있도록 함

이제 영업 시작! 이런 느낌.
 

builder.Services.AddControllersWithViews();

 

  • 서비스란, 웹 애플리케이션에서 어떤 기능을 제공하는 개체를 의미함.
    • ASP.NET Core에서는 SRP(Single Responsibility Principle) 철학을 사용함. 
      • ex) 랭킹 관련 기능이 필요하다면, 랭킹 서비스로부터 결과값을 가져와 사용하는 방식.
    • 모든 class는 서비스로 사용될 수 있음.
  • 서비스는 ASP.NET Core에 의해 관리된다. 
    • 따라서 DI(Dependency Injection)기능을 통해 애플리케이션의 어디서든 서비스들에 쉽게 접근이 가능하다. 
    • 당연히 미들웨어 컴포넌트에서도 접근 가능.
    • 각 미들웨어 컴포넌트들은 자신이 필요한 서비스만을 사용하도록 한다.
  • ASP.NET Core의 내장 서비스들도 있다.
  • WebAPI 프로젝트에서는 AddControllers()를 사용한다. (뷰 불필요)

 
 

3. builder.Build()

초기 설정을 종료하고 앱 객체를 생성한다.
var app = builder.Build();   //WebApplication 개체 반환
  • WebApplication 개체를 반환함
  • app을 통해서 미들웨어 컴포넌트를 설정할 수 있음.

 
 

4. HTTP request pipeline (Middleware)

HTTP request 및 response를 처리하는 중간 부품

 
WebApplication 개체를 통해 미들웨어를 구성할 수 있다.
 
미들웨어란 어떤 HTTP 요청이 왔을 때, 앱이 어떻게 응답하는지에 관한 일련의 과정들을 의미한다.

  • 한 미들웨어에서 처리한 결과물을 다른 미들웨어로 넘길 수 있음.

 
기본 코드에서는 다음 부분이 미들웨어에 해당한다.

if (!app.Environment.IsDevelopment())  
{
    app.UseExceptionHandler("/Home/Error"); 
    app.UseHsts();
}

app.UseHttpsRedirection();  
app.UseStaticFiles();   

app.UseRouting(); 

app.UseAuthorization();

 
 
MVC를 사용한 ASP.NET Core 프로젝트에서, HTTP 요청이 처리되는 순서는 다음과 같다.

  1. IIS, Apache 등 서버에 HTTP 요청이 도착
  2. ASP.NET Core 서버 (Kestrel)로 전달받음
  3. 미들웨어 적용 (파이프라인 실행)
  4. Controller로 전달
  5. Controller에서 처리하고, View로 전달

 
 
ex)
미들웨어의 일종인 MapGet() 의 경우, 특정 URL에 대한 HTTP 요청을 처리함. (if의 역할)

app.MapGet("/", () => "Hello World!");
  • '/'로 표현된 URL로의 모든 요청에 대해 "Hello World!"라는 string 형식의 응답을 반환하는 코드

 

※ 요청에 대한 처리는 Controller에서 한다며? 왜 굳이 미들웨어라는 걸 따로 사용할까?
일괄적으로 모든 요청에 대해 특정 처리를 하고싶을 수도 있다.
이런 경우 많은 컨트롤러의 많은 액션들에 같은 처리문을 넣으면 중복이 많아짐.
미들웨어를 사용하면 일괄적으로 모든 요청에 대한 처리를 할 수 있다! => 코드의 반복 제거

ex) 모든 요청마다 로깅을 하고 싶은 경우에 사용
컨트롤러의 모든 처리마다 로깅을 넣도록 할 수도 있으나, 코드도 많아지고 새 기능 추가시에도 까다로워짐

 
 

5. app.Run()

HTTP request 수신 대기

Listen의 역할.
 

'게임 > ASP.NET Core' 카테고리의 다른 글

6. View  (0) 2024.04.15
5. Model Binding (+Validation)  (0) 2024.04.15
4. Routing  (0) 2024.04.15
3. MVC 철학  (0) 2024.04.15
2. Middleware 기초  (0) 2024.04.15
Comments