파이프라인과 미들웨어

blimeyoops·2023년 9월 18일
0

asp.net core

목록 보기
1/4

파이프라인

ASP.NET에서 파이프라인은 web app을 실행하는데 필요한 모듈(미들웨어)를 등록해서 사용할 수 있도록 하는 것을 말한다.

미들웨어

HTTP 서비스를 통해서 어떤 서비스를 제공할 때마다 해당 서비스를 구현한 미들웨어를 추가해주고 추가된 미들웨어는 순서대로 적용된다. 예전에는 Startup.cs 클래스 파일 Configure 메서드에 미들웨어를 추가했고 .NET 6, 7, 8 이후로는 기존 .NET 버전에서의 Startup.cs 파일이 생성되지 않고 대신에 Program.cs 파일에 Startup.cs 파일의 기능을 적용한다.

Startup 클래스

ASP.NET Core에는 애플리케이션이 시작되면 모든 구성이 완료되고 처리되는 Startup 클래스가 있고 새로운 web application을 실행하면 ConfigureServices와 Configure 메서드가 Startup 클래스에 포함된다.

ConfigureServices

ConfigureServices 메서드에는 애플리케이션에 대한 서비스를 등록하는데 서비스를 추가하면 종속성 주입에 사용해 애플리케이션의 어느 곳에나 해당 서비스에 주입된 서비스를 사용할 수 있다. 즉, 여기에 애플리케이션 내부에서 사용할 모든 서비스를 추가하는데 이는 내장된 서비스일 수도 있고 자체 서비스일 수도 있다. 대표적으로 MVC 프레임워크 종속성을 주입하기 위해 내장 서비스인 AddMvc를 추가해 준다.

public void ConfigureServices(IServiceCollection services)
{  
    services.AddMvc();
}

자체 서비스를 만들어 사용할 수도 있다.

public void ConfigureServices(IServiceCollection services)
{
   services.AddSingleton<IEmailSender, EmailSender>();
}

services에 AddSingleton을 사용해 IEmailSender 인터페이스에 EmailSender 클래스 인스턴스 주입을 통해 원하는 곳에서 생성자의 파라미터를 통해 인터페이스를 지정하여 서비스 클래스 인스턴스를 받아올 수 있다.

public HomeController(IEmailSender emailSender)
{ 
}

때로는 컨트롤러에서 단 하나의 액션에서만 서비스가 필요한 경우도 있는데 그런 경우에는 메서드 자체 매개변수에 [FromServices] 어트리뷰트를 적용하여 의존성 주입을 처리할 수도 있다.

Services 생명주기

ASP.NET Core에서 의존성 주입에 의해 추가되는 Service는 크게 3가지 생명주기를 지닌다.

  • Singleton
    클라이언트의 접속상태에 관계없이 하나만 생성되서 종료될때까지 유지된다. 즉, 클라이언트가 아무리 많이 붙어도 오직 1개의 서비스만 존재하게 된다.

  • Scope
    클라이언트의 Request 시작부터, Response 종료까지 유지되고 각 클라이언트마다 존재하므로 연결되는 클라이언트 수 만큼 존재한다.

  • Transient
    클라이언트의 요청,응답 관계없이 사용 순간마다 생성되고 Scope과 달리 유지되지 않으므로 (클라이언트 연결되는 수 X 요청 수)만큼 존재한다.

<HomeController.cs>

public class HomeController : Controller
{
    private readonly ILifecycleService _lifecycleService1;
    private readonly ILifecycleService _lifecycleService2;

    public HomeController(ILifecycleService lifecycleService1, ILifecycleService lifecycleService2)
    {
        _lifecycleService1 = lifecycleService1;
        _lifecycleService2 = lifecycleService2;
    }

    public IActionResult Index()
    {
        ViewData["lifecycleService1"] = _lifecycleService1.GetGuid();
        ViewData["lifecycleService2"] = _lifecycleService2.GetGuid();
        return View();
    }

    public IActionResult Privacy()
    {
        return View();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

<ILifecycleService.cs>

public interface ILifecycleService
{
    public Guid GetGuid();
}

<LifecycleService.cs>

public class LifecycleService : ILifecycleService
{
    private Guid _guid;

    public LifecycleService()
    {
        _guid = Guid.NewGuid();
    }

    public Guid GetGuid()
    {
        return _guid;
    }
}

Program.cs에 AddSingleton을 사용해 해당 서비를 등록한다.

builder.Services.AddSingleton<ILifecycleService, LifecycleService>();

뷰 파일에 ViewData로 넘긴 데이터를 표시하면 Guid가 표시되는데 새로고침이 발생해도 Guid가 변하지 않는다.

Program.cs에 AddScoped을 사용해 해당 서비를 등록한다.

builder.Services.AddScoped<ILifecycleService, LifecycleService>();

새로고침이 발생할 때마다 Guid가 변한다.

Program.cs에 AddTransient 사용해 해당 서비를 등록한다.

builder.Services.AddTransient<ILifecycleService, LifecycleService>();

클라이언트의 요청,응답 관계없이 사용 순간마다 생성되므로 각 Guid가 다르게 표시된다.

Configure

Configure 메소드는 애플리케이션에 제공되는 모든 HTTP 요청을 처리하는 미들웨어를 설정한다. Configure 메서드에서는 순서가 중요하고 메서드 내부의 첫 번째 코드 조각이 요청을 먼저 처리하고 응답을 다음 미들웨어에 요청에 전달할 수 있다.

미들웨어 종류

UseStaticFiles()

UseStaticFiles 미들웨어는 wwwroot 폴더에 위치한 정적파일(HTML, CSS, Javascript 등...)을 실행하기 위한 미들웨어이다. 기본으로 제공되는 wwwroot 폴더가 아닌 다른 폴더를 정적 파일이 서비스되도록 하기 위해서는 옵션을 사용해 변경할 수 있다.

StaticFiles에 정적 파일을 위치시키고 정적 파일에 접근할 요청 경로를 /RequestFils로 설정한다.

app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
    RequestPath = new PathString("/RequestFils")
});

UseDirectoryBrowser()

UseDirectoryBrowser는 디렉터리 목록이 표시된다. 루트 페이지를 호출하면 디렉터리 목록이 표시된다.

UseDeveloperExceptionPage()

UseDeveloperExceptionPage는 개발 환경에서 에러 발생 시 자세히 표시해 주는 미들웨어이다.

기타 미들웨어

  • UseHttpsRedirection()
  • UseRouting()
  • UseAuthorization()
  • MapRazorPages()
  • UseMvc()

0개의 댓글

관련 채용 정보