ASP.NET Core에서 앱을 빌드하기 위한 기본 코드는 Program.cs에서 시작한다.
Program.cs는 프로그램의 시작점으로 호스트를 빌드하고, 필요한 서비스들과 미들웨어를 추가하는 작업을 한다.
Program.cs를 통해 ASP.NET Core의 전반적인 동작 과정을 파악해보자.
ASP.NET Core
웹 어플리케이션을 만들기 위한 웹 프레임워크의 크로스 플랫폼 버전이다. 따라서, 윈도우, 맥, 리눅스 등 다양한 플랫폼에서 실행된다.
Program.cs
Program.cs 파일에 어플리케이션 시작 코드를 포함한다. 즉, C의 main함수와 같은 프로그램의 진입점이라고 할 수 있다.
- 앱에서 요구하는 서비스를 구성한다.
- 앱의 요청 처리 파이프라인이 일련의 미들웨어 구성 요소로 정의된다.
- Main 메서드는 빌더 패턴을 따르는 WebApplicationBuilder 클래스를 이용해 호스트를 생성한다.
- Build및 Run 매서드는 응용 프로그램을 호스트하는 개체를 만들고, 이를 실행해서 전달되는 HTTP 요청의 수신을 대기한다.
// Initializes a new instance of the WebApplicationBuilder class with preconfigured defaultsvar builder = WebApplication.CreateBuilder(args);
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
// build app
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
Builder Pattern
위 코드를 이해하기 위해 Builder Pattern에 대한 이해가 필요하다.
빌더 패턴은 복잡한 객체들을 단계별로 생성할 수 있도록 하는 생성 디자인 패턴이다.
복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여, 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공한다.
즉, 별도의 Builder 클래스를 만들어, 필수 값에 대해서는 생성자를 통해, 선택적인 값에 대해서는 메소드를 통해 step-by-step으로 값을 입력받은 후에 build 메소드를 통해 최종적으로 하나의 인스턴스를 return하는 방식이다.
생성해야 하는 객체가 optional한 속성을 많이 가질때 더 좋다.
위의 경우, 생성자에서 설정할 수 있는 매개변수가 많다.
따라서 매개변수의 타입과 순서에 대한 관리가 여려워 에러가 발생할 확률이 높아진다.
빌더 패턴을 사용하면 복잡한 객체들을 단계별로 생성할 수 있다.
객체 생성을 일련의 단계들로 정의하는 것이다.
buildWalls(벽 건설), buildDoor(문 건설)로 정리하며, 객체를 생성하고 싶으면 위 단계들을 builder 객체에 실행하면 된다.
또 모든 단계를 호출할 필요가 없으므로, 객체의 특정 설정을 제작하는데 필요한 단계들만 호출하면된다.
reference : https://refactoring.guru/ko/design-patterns/builder
빌더 패턴
/ 디자인 패턴들 / 생성 패턴 빌더 패턴 다음 이름으로도 불립니다: Builder 의도 빌더는 복잡한 객체들을 단계별로 생성할 수 있도록 하는 생성 디자인 패턴입니다. 이 패턴을 사용하면 같은 제작
refactoring.guru
WebApplication & WebApplicationBuilder
기본적인 빌더 패턴에 대해 이해했다. 그럼 코드를 다시 살펴보자.
var builder = WebApplication.CreateBuilder(args);
WebApplication
HTTP pipeline과 routes를 설정하는데 사용되는 web application이다.
ASP.NET Core 응용 프로그램은 프로그램을 실행할 호스트(Host)를 필요로 한다. 호스트는 응용 프로그램의 구동과 수명을 관리한다. ASP.NET Core에서는 일반적으로 .NET WebApplication 호스트가 권장된다.
WebApplicationBuilder
Web Applications과 services를 위한 builder 클래스다. 즉, 호스트를 빌드하는 역할을 한다.
HTTP 서버 구현, 미들웨어 구성 요소, 로깅, DI 서비스, Configuration과 같은 앱의 리소스를 모두 캡슐화한다.
다음과 같은 작업을 한다.
- Builder.Configuration을 사용해 설정 추가
- Builder.Services를 사용해 서비스 추가
- Builder.Logging을 사용해 로깅 구성
- 일반 IHostBuilder 및 IWebHostBuilder 구성
var builder = WebApplication.CreateBuilder(args);
기본값을 사용하여, WebApplicationBuilder 클래스의 새로운 인스턴스를 생성하고, 초기화한다.
즉, WebApplication을 생성하기 위한 빌더를 생성해준다. 이 빌더를 사용하여 객체를 생성하기 전, 생성할 객체에 대한 설정을 할 수 있다.
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
// build app
var app = builder.Build();
builder.Services.AddRazorPages();
builder.Services.AddControllerWithViews();
필요한 서비스들을 DI 컨테이너에 추가한다(Dependency Injection).
의존성 주입이란, 의존성이 있는 객체들을 컨테이너에 추가하여, 해당 컨테이너가 이 객체들을 대신 관리해주도록 하는 것이다. 컨테이너는 이 객체들을 필요로 하는 클래스에 주입해주고, 객체들의 수명을 관리한다.
ASP.NET에서는 이 의존성이 있는 객체들을 서비스라고 지칭한다. 이 Service들은 Web Application에서 어떤 기능을 제공하는 객체다.
앱에서 필요로 하는 서비스들을 builder.Services 에 추가하면, 이 서비스들을 앱의 어디에서든 쉽게 접근할 수 있다.
var app = builder.Build()
WebApplicationBuilder를 사용해 WebApplication(호스트)을 인스턴스화 한다. 이로써 WebApplication이 생성되었다.
Build 메서드는 다음과 같은 일련의 기본 옵션으로 호스트를 구성한다.
- Kestrel을 웹 서버로 사용, IIS 통합을 사용하도록 설정
- appsettings.json, environment variables, command line arguments, configuration sources에서 Configuration(설정)을 로드한다.
- 콘솔, 디버그 공급자에게 logging output을 보낸다.
Add Middleware to Request Pipeline
미들웨어란, 서버에서 요청을 받고 응답을 하기까지 필요한 일련의 처리과정을 구성하는 요소들을 뜻한다.
웹 서버에서 보통 클라이언트에게 요청이 오고, 응답을 할 때, 인증, 암호화, 데이터 처리와 같은 여러 과정들을 거친다. 이 모듈들을 미들웨어라고 부른다.
ASP.NET에서는 요청과 응답 사이의 일련의 처리과정을 Request Pipeline(요청 파이프라인)으로 구성한다. 이 파이프라인에 필요한 미들웨어를 추가한다.
클라이언트로부터 요청이 오면, 요청 파이프라인에서 미들웨어들을 차례대로 실행한다. 각 미들웨어는 요청을 분석하고, 응답 개체에 자신만의 응답을 붙이는 방법으로 생성된다. 그리고 최종적으로 응답이 형성된다.
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
app에 필요한 미들웨어들을 파이프라인에 추가하는 작업이다.
자세한 사항은 우선 넘어가자.
app.MapGet("/hi", () => "Hello!");
엔드포인트를 등록한다.
엔드포인트는 API가 서버에서 리소스에 접근할 수 있도록 가능하게 하는 URL으로, 여기서는
'/hi'
라는 url과 일치시켜, ()=>"Hello!" 를 실행하도록 한다. 결과적으로 “Hello!” 라는 string 형식의 응답을 반환한다.
app.Run();
Run메서드를 호출해서, HTTP request의 수신을 대기한다.
MapGet()에서 string을 반환하기는 하지만, ASP.NET Core는 웹 브라우저가 이해할 수 있는 유효한 응답을 생성하기 위해 추가적인 정보를 붙여야 하는데, 이 역할을 수행한다.
Conclusion
ASP.NET Core의 기본적인 내용을 간단한 코드로 살펴봤다.
정리하면, WebApplication을 빌더 패턴을 사용하는 WebApplicationBuilder를 통해 생성한다. 그리고 필요한 미들웨어들을 앱에 추가하여, Request Pipeline을 구성한 다음, app.Run 메서드를 실행하여 HTTP 요청 수신을 대기하며 동작을 시작한다.
'Server > ASP.NET Core Web Server' 카테고리의 다른 글
[Web Server] 01 : HTTP (0) | 2023.04.19 |
---|