연습 - 서비스 등록 및 사용

완료됨

ASP.NET Core 앱은 종종 여러 구성 요소에서 동일한 서비스에 액세스해야 하는 경우가 있습니다. ASP.NET Core는 기본 제공(종속성 주입) 컨테이너를 사용하여 앱에서 사용하는 서비스를 관리합니다.

사용자의 팀 리더는 회사의 기본 웹 사이트를 만드는 업무를 맡깁니다. 웹 사이트는 기본 페이지에 환영 메시지를 표시해야 합니다. 환영 메시지를 생성하는 서비스를 만들기로 결정했습니다. 그런 다음 서비스 컨테이너에 서비스를 등록하여 필요한 구성 요소에 삽입될 수 있도록 합니다.

ASP.NET Core 앱 만들기

팀 앱의 역할을 하려면 ASP.NET Core 앱이 필요합니다. Visual Studio Code에서 C# 개발 키트 확장 기능을 사용하여 새로운 ASP.NET Core 앱을 만들어 보겠습니다.

  1. Visual Studio Code를 시작합니다.

  2. Ctrl+Shift+P를 눌러 명령 팔레트를 엽니다.

  3. .NET: 새 프로젝트를 검색하여 선택합니다.

  4. ASP.NET Core Empty를 검색하고 선택합니다.

    ASP.NET Core Empty가 선택된 명령 팔레트의 스크린샷.

  5. 새 프로젝트에 대한 폴더를 선택하거나 만듭니다.

  6. 새 앱 MyWebApp의 이름을 지정합니다.

  7. 프로젝트 만들기를 선택하여 프로젝트를 만듭니다.

  8. 새 프로젝트가 열리면 Solution Explorer 창을 확장하여 프로젝트 파일을 확인합니다.

    Visual Studio Code의 솔루션 탐색기 창 스크린샷

앱 실행

앱이 실행되는지 테스트합니다.

  1. Visual Studio Code에서 F5 키를 눌러 앱을 빌드하고 실행합니다.

    1. 메시지가 표시되면 디버거로 C# 을 선택합니다.
    2. 메시지가 표시되면 사용할 시작 구성으로 C#: MyWebApp [기본 구성] 을 선택합니다.

    이 명령은 앱을 시작하고 로컬 웹 서버에 호스팅합니다. 브라우저 창이 열리고 "Hello, World!"가 표시됩니다.

  2. Visual Studio Code에서 Shift+F5 를 눌러 브라우저 창을 닫고 앱을 중지합니다.

서비스 만들기

이제 작동하는 앱이 있으므로 기본 페이지에 환영 메시지를 생성하는 서비스를 만들어 보겠습니다.

  1. 탐색기 창에서 MyWebApp 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 새 폴더를 선택합니다. 서비스 폴더의 이름을 지정합니다.

  2. Services 폴더를 마우스 오른쪽 단추로 클릭합니다. 새 파일을 선택합니다. 파일 이름을 WelcomeService.cs.

  3. WelcomeService.cs 내용을 다음 코드로 바꿉니다.

    namespace MyWebApp.Services;
    
    public class WelcomeService : IWelcomeService
    {
    
        DateTime _serviceCreated;
        Guid _serviceId;
    
        public WelcomeService()
        {
            _serviceCreated = DateTime.Now;
            _serviceId = Guid.NewGuid();                
        }
    
        public string GetWelcomeMessage()
        {
            return $"Welcome to Contoso! The current time is {_serviceCreated}. This service instance has an ID of {_serviceId}";
        }
    }
    

    이 코드는 환영 메시지를 생성하는 WelcomeService 메서드를 사용하여 GetWelcomeMessage 클래스를 정의합니다. 메시지에는 서비스가 만들어진 현재 시간뿐만 아니라 서비스의 각 인스턴스에 대한 고유 식별자가 포함됩니다.

    _serviceCreated_serviceId 필드는 생성자에 설정되며 서비스 인스턴스의 수명 동안 변경되지 않습니다.

서비스 등록

이제 보유한 서비스를 서비스 컨테이너에 등록해야 합니다.

  1. Program.cs 파일을 엽니다.

  2. 다음 지시문을 파일의 맨 위에 추가합니다.

    using MyWebApp.Services;
    

    이 지시문은 WelcomeService 클래스에 대한 참조를 확인합니다.

  3. var builder = WebApplication.CreateBuilder(args); 줄 바로 뒤에 다음 코드를 추가합니다.

    builder.Services.AddSingleton<WelcomeService>();
    

    WebApplication.CreateBuilder은(는) WebApplicationBuilder 클래스의 새 인스턴스인 builder을(를) 만듭니다. 이 코드는 WelcomeService 클래스를 싱글톤 수명으로 서비스 컨테이너에 등록합니다.

  4. app.MapGet("/", () => "Hello World!"); 줄을 다음 코드로 변경합니다.

    app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    

    이 코드는 루트 URL(/) 대상 HTTP GET 요청을 WelcomeService 서비스에서 생성된 환영 메시지를 반환하는 대리자로 매핑합니다.

    Program.cs 파일은 다음과 같습니다.

    using MyWebApp.Services;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSingleton<WelcomeService>();
    
    var app = builder.Build();
    
    app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    
    app.Run();
    

변경 사항 테스트

  1. 모든 변경 내용을 저장하고 이전과 같이 앱을 실행합니다.
  2. 브라우저 창이 열리면 루트 URL에 WelcomeService 서비스가 생성한 환영 메시지가 표시됩니다.
  3. Visual Studio Code에서 Shift+F5 를 눌러 브라우저 창을 닫고 앱을 중지합니다.

인터페이스 사용

팀이 코드를 검토하고, 다른 개발자가 코드를 보다 유연하고 쉽게 유지 관리할 수 있도록 인터페이스를 사용하여 서비스를 등록할 것을 제안합니다.

  1. 탐색기 창에서 MyWebApp 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 새 폴더를 선택합니다. 폴더 이름을 인터페이스로 지정합니다.

  2. Interfaces 폴더를 마우스 오른쪽 단추로 클릭합니다. 새 파일을 선택합니다. 파일 이름을 IWelcomeService.cs.

  3. IWelcomeService.cs 내용을 다음 코드로 바꿉니다.

    namespace MyWebApp.Interfaces
    
    public interface IWelcomeService
    {
        string GetWelcomeMessage();
    }
    

    이 코드는 IWelcomeService 메서드를 사용하여 GetWelcomeMessage 인터페이스를 정의합니다. 이 인터페이스를 구현하는 모든 서비스는 GetWelcomeMessage 메서드에 대한 구현을 제공해야 합니다.

  4. 서비스/WelcomeService.cs 파일을 엽니다.

  5. 다음 지시문을 파일의 맨 위에 추가합니다.

    using MyWebApp.Interfaces;
    

    이 지시문은 다음 단계에서 추가하는 IWelcomeService 인터페이스에 대한 참조를 확인합니다.

  6. WelcomeService 클래스 선언을 업데이트하여 IWelcomeService 인터페이스를 구현합니다.

    public class WelcomeService : IWelcomeService
    

    WelcomeService 인터페이스를 구현하기 위해 IWelcomeService 클래스에 적용해야 하는 유일한 변경 내용입니다. WelcomeService 클래스에는 GetWelcomeMessage 인터페이스의 메서드 시그니처와 일치하는 IWelcomeService 메서드가 이미 존재합니다.

  7. Program.cs 파일을 엽니다.

  8. builder.Services.AddSingleton<WelcomeService>(); 줄을 다음 코드로 업데이트합니다.

    builder.Services.AddSingleton<IWelcomeService, WelcomeService>();
    

    이 코드는 WelcomeService 인터페이스를 사용하여 IWelcomeService 클래스를 서비스 컨테이너에 등록합니다.

    "구성 요소가 IWelcomeService 요청을 할 때 WelcomeService 인스턴스를 제공하는 것"으로 생각하세요.

  9. app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage()); 줄을 다음 코드로 업데이트합니다.

    app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    

    이제 익명 함수는 IWelcomeService 대신 WelcomeService을 예상합니다.

    Program.cs 파일은 다음과 같습니다.

    using MyWebApp.Interfaces;
    using MyWebApp.Services;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSingleton<IWelcomeService, WelcomeService>();
    
    var app = builder.Build();
    
    app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    
    app.Run();
    

변경 사항 테스트

앱이 예상대로 작동하는지 테스트해 보겠습니다.

  1. 모든 변경 내용을 저장하고 이전과 같이 앱을 실행합니다.
  2. 브라우저 창이 열리면 루트 URL에 WelcomeService 서비스가 생성한 환영 메시지가 표시됩니다.
  3. 다음 연습을 위해 앱을 실행해 둡니다.