센로그
1. MVC 프로젝트 소개 (Program.cs) 본문
◆ 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 요청에 응답할 수 있도록 함.
- 이는 데이터와 로깅을 위한 서비스를 생성하고, ASP.NET Core의 기본적인 구성을 설정하기 위한 것.
2. AddControllersWithViews()
DI를 통해 각종 서비스를 추가할 수 있도록 함
이제 영업 시작! 이런 느낌.
builder.Services.AddControllersWithViews();
- 서비스란, 웹 애플리케이션에서 어떤 기능을 제공하는 개체를 의미함.
- ASP.NET Core에서는 SRP(Single Responsibility Principle) 철학을 사용함.
- ex) 랭킹 관련 기능이 필요하다면, 랭킹 서비스로부터 결과값을 가져와 사용하는 방식.
- 모든 class는 서비스로 사용될 수 있음.
- ASP.NET Core에서는 SRP(Single Responsibility Principle) 철학을 사용함.
- 서비스는 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 요청이 처리되는 순서는 다음과 같다.
- IIS, Apache 등 서버에 HTTP 요청이 도착
- ASP.NET Core 서버 (Kestrel)로 전달받음
- 미들웨어 적용 (파이프라인 실행)
- Controller로 전달
- 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