센로그

2. Middleware 기초 본문

게임/ASP.NET Core

2. Middleware 기초

seeyoun 2024. 4. 15. 14:03

◆ 미들웨어

미들웨어는 요청 및 응답을 처리하는 소프트웨어를 의미한다.

 

미들웨어들을 사용하여 요청 및 응답을 처리하는  파이프라인을 구성한다.

  • 이를 요청 파이프라인(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() 액션으로 매핑되어 이를 처리할 것.
  • 이렇듯 파이프라인을 시작하면 항상 해당 파이프라인의 끝까지 도달한다는 보장은 없다는 것에 유의하자.
    • 중간에 다른 곳으로 다시 요청하거나, 순환하는 경우가 생길 수도 있다는 점!

'게임 > 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