센로그
2. Middleware 기초 본문
◆ 미들웨어
미들웨어는 요청 및 응답을 처리하는 소프트웨어를 의미한다.
미들웨어들을 사용하여 요청 및 응답을 처리하는 파이프라인을 구성한다.
- 이를 요청 파이프라인(request pipeline)이라고 부른다.
미들웨어는 WebApplication 객체를 통해 구성할 수 있다.
var builder = WebApplication.CreateBuilder(args); //WebApplicationBuilder 객체
var app = builder.Build(); //WebApplication 객체
미들웨어의 각 구성 요소는 다음과 같은 작업을 할 수 있다.
- 요청을 (파이프라인의 다음 구성 요소로) 전달할지 여부를 선택할 수 있다.
- 전달하지 않고 흐름을 끊는 것을 ShortCut이라고 함
- 파이프라인의 다음 미들웨어 실행 전/후에 특정 작업을 수행할 수 있다.
요청 파이프라인을 이해하기 위해 아주 간단한 코드 테스트 예제를 보자.
1. Program.cs에 다음과 같은 아주 간단한 코드를 작성해보자.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWelcomePage();
app.Run();
실행하면 웰컴 페이지가 뜬다!!
2. 여기다 딱 한줄 추가.
app.UseStaticFiles();
- 정적인 콘텐츠(이미지, html 등)에 대한 요청을 처리하는 메서드이다.
3. 그리고 정적인 콘텐츠를 조금 추가.
정적 콘텐츠를 요청하고 받을 수 있는 아주아주 간단한 코드가 완성되었다!
- 폴더 계층 구조를 통해 콘텐츠를 요청할 수 있다.
- ex) https://localhost:7080/hoochu01.jpg
우선 파이프라인이 어떻게 동작하는지 테스트해보자.
ex 1) 만약 아래와같이 UseWelcomePage()가 UseStaticFiles()보다 위에 있다면?
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWelcomePage();
app.UseStaticFiles();
app.Run();
- https://localhost:7080/hoochu01.jpg 를 요청해도 그대로 웰컴 페이지만 뜬다.
ex 2) 반면 UseStaticFiles()가 UseWelcomePage() 위에 있다면?
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseStaticFiles();
app.UseWelcomePage();
app.Run();
- https://localhost:7080/hoochu01.jpg 를 요청하면 요청한 정적 콘텐츠(hoochu01.jpg)가 뜬다.
동작 분석)
- ex 1의 경우, UseWelcomePages()라는 미들웨어가 더이상 다음 미들웨어 요소로 요청을 보내지 않고 컷(ShortCut)한거임. (원래 그렇게 동작하도록 되어있는 미들웨어임)
- 그래서 뭘 요청하든 간에 웰컴 페이지만 나온 것.
- ex 2의 경우, UseStaticFiles()가 UseWelcomePages()보다 위에 있으므로 여기까지 요청이 도달했음.
- 따라서 요청한 정적 콘텐츠를 보내준 것.
- 이렇듯 사용할 미들웨어 부품을 그냥 끼우면 끝인 게 아니라, 순서가 중요할 수도 있다는 점을 유의하자.
이번에는 다른 관점에서 파이프라인을 살펴보자.
요청 파이프라인은 각 구성요소의 호출 전/후에 어떤 처리를 할 수 있도록 설계되어있다고 했다.
그런데 왜 굳이 이렇게 했을까? 그냥 한번에 다 처리하면 안됨? 언제 이런 걸 쓸까?
=> 다양한 처리에 사용되겠지만, 이런 방식은 특히 에러 처리에 유용하다.
- 어떤 미들웨어에서 에러가 발생한 경우, 에러를 위로 쭉 올려보낼 수 있다.
만약 파이프라인에 다음과 같은 예외 처리 미들웨어가 있다고 하자.
app.UseExceptionHandler("/Home/Error");
- 예외 발생 시, Home/Error 경로로 연결해주겠다는 코드이다.
- 참고) 이는 솔루션 탐색기에서 Views/Shared/Error.cshtml 에 해당하는 파일이다.
- 즉 어떤 요청을 처리하는 도중 에러가 발생한 경우,
그대로 해당 요청 파이프라인 끝까지 올라가서 반환하는 것이 아니라, 다시 Home/Error로 요청하게 된다.- 만약 어떤 요청을 컨트롤러의 Privacy() 액션으로 매핑하여 처리하는 도중, 에러가 발생한 경우:
해당 요청을 Privacy() 끝까지 처리하는 게 아니라, 새롭게 /Home/Error 로 요청하겠다는 뜻임. (Redirect) - 그렇게 되면 컨트롤러의 Error() 액션으로 매핑되어 이를 처리할 것.
- 만약 어떤 요청을 컨트롤러의 Privacy() 액션으로 매핑하여 처리하는 도중, 에러가 발생한 경우:
- 이렇듯 파이프라인을 시작하면 항상 해당 파이프라인의 끝까지 도달한다는 보장은 없다는 것에 유의하자.
- 중간에 다른 곳으로 다시 요청하거나, 순환하는 경우가 생길 수도 있다는 점!
'게임 > 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 |
1. MVC 프로젝트 소개 (Program.cs) (0) | 2024.04.15 |
Comments