연습 - 서비스 등록 및 사용
ASP.NET Core 앱은 종종 여러 구성 요소에서 동일한 서비스에 액세스해야 하는 경우가 있습니다. ASP.NET Core는 기본 제공(종속성 주입) 컨테이너를 사용하여 앱에서 사용하는 서비스를 관리합니다.
사용자의 팀 리더는 회사의 기본 웹 사이트를 만드는 업무를 맡깁니다. 웹 사이트는 기본 페이지에 환영 메시지를 표시해야 합니다. 환영 메시지를 생성하는 서비스를 만들기로 결정했습니다. 그런 다음 서비스 컨테이너에 서비스를 등록하여 필요한 구성 요소에 삽입될 수 있도록 합니다.
ASP.NET Core 앱 만들기
팀 앱의 역할을 하려면 ASP.NET Core 앱이 필요합니다. Visual Studio Code에서 C# 개발 키트 확장 기능을 사용하여 새로운 ASP.NET Core 앱을 만들어 보겠습니다.
Visual Studio Code를 시작합니다.
Ctrl+Shift+P를 눌러 명령 팔레트를 엽니다.
.NET: 새 프로젝트를 검색하여 선택합니다.
ASP.NET Core Empty를 검색하고 선택합니다.
새 프로젝트에 대한 폴더를 선택하거나 만듭니다.
새 앱 MyWebApp의 이름을 지정합니다.
프로젝트 만들기를 선택하여 프로젝트를 만듭니다.
새 프로젝트가 열리면
Solution Explorer창을 확장하여 프로젝트 파일을 확인합니다.
앱 실행
앱이 실행되는지 테스트합니다.
Visual Studio Code에서 F5 키를 눌러 앱을 빌드하고 실행합니다.
- 메시지가 표시되면 디버거로 C# 을 선택합니다.
- 메시지가 표시되면 사용할 시작 구성으로 C#: MyWebApp [기본 구성] 을 선택합니다.
이 명령은 앱을 시작하고 로컬 웹 서버에 호스팅합니다. 브라우저 창이 열리고 "Hello, World!"가 표시됩니다.
Visual Studio Code에서 Shift+F5 를 눌러 브라우저 창을 닫고 앱을 중지합니다.
서비스 만들기
이제 작동하는 앱이 있으므로 기본 페이지에 환영 메시지를 생성하는 서비스를 만들어 보겠습니다.
탐색기 창에서 MyWebApp 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 새 폴더를 선택합니다. 서비스 폴더의 이름을 지정합니다.
Services 폴더를 마우스 오른쪽 단추로 클릭합니다. 새 파일을 선택합니다. 파일 이름을 WelcomeService.cs.
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필드는 생성자에 설정되며 서비스 인스턴스의 수명 동안 변경되지 않습니다.
서비스 등록
이제 보유한 서비스를 서비스 컨테이너에 등록해야 합니다.
Program.cs 파일을 엽니다.
다음 지시문을 파일의 맨 위에 추가합니다.
using MyWebApp.Services;이 지시문은
WelcomeService클래스에 대한 참조를 확인합니다.var builder = WebApplication.CreateBuilder(args);줄 바로 뒤에 다음 코드를 추가합니다.builder.Services.AddSingleton<WelcomeService>();WebApplication.CreateBuilder은(는)WebApplicationBuilder클래스의 새 인스턴스인builder을(를) 만듭니다. 이 코드는WelcomeService클래스를 싱글톤 수명으로 서비스 컨테이너에 등록합니다.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();
변경 사항 테스트
- 모든 변경 내용을 저장하고 이전과 같이 앱을 실행합니다.
- 브라우저 창이 열리면 루트 URL에
WelcomeService서비스가 생성한 환영 메시지가 표시됩니다. - Visual Studio Code에서 Shift+F5 를 눌러 브라우저 창을 닫고 앱을 중지합니다.
인터페이스 사용
팀이 코드를 검토하고, 다른 개발자가 코드를 보다 유연하고 쉽게 유지 관리할 수 있도록 인터페이스를 사용하여 서비스를 등록할 것을 제안합니다.
탐색기 창에서 MyWebApp 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 새 폴더를 선택합니다. 폴더 이름을 인터페이스로 지정합니다.
Interfaces 폴더를 마우스 오른쪽 단추로 클릭합니다. 새 파일을 선택합니다. 파일 이름을 IWelcomeService.cs.
IWelcomeService.cs 내용을 다음 코드로 바꿉니다.
namespace MyWebApp.Interfaces public interface IWelcomeService { string GetWelcomeMessage(); }이 코드는
IWelcomeService메서드를 사용하여GetWelcomeMessage인터페이스를 정의합니다. 이 인터페이스를 구현하는 모든 서비스는GetWelcomeMessage메서드에 대한 구현을 제공해야 합니다.서비스/WelcomeService.cs 파일을 엽니다.
다음 지시문을 파일의 맨 위에 추가합니다.
using MyWebApp.Interfaces;이 지시문은 다음 단계에서 추가하는
IWelcomeService인터페이스에 대한 참조를 확인합니다.WelcomeService클래스 선언을 업데이트하여IWelcomeService인터페이스를 구현합니다.public class WelcomeService : IWelcomeServiceWelcomeService인터페이스를 구현하기 위해IWelcomeService클래스에 적용해야 하는 유일한 변경 내용입니다.WelcomeService클래스에는GetWelcomeMessage인터페이스의 메서드 시그니처와 일치하는IWelcomeService메서드가 이미 존재합니다.Program.cs 파일을 엽니다.
builder.Services.AddSingleton<WelcomeService>();줄을 다음 코드로 업데이트합니다.builder.Services.AddSingleton<IWelcomeService, WelcomeService>();이 코드는
WelcomeService인터페이스를 사용하여IWelcomeService클래스를 서비스 컨테이너에 등록합니다.팁
"구성 요소가
IWelcomeService요청을 할 때WelcomeService인스턴스를 제공하는 것"으로 생각하세요.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();
변경 사항 테스트
앱이 예상대로 작동하는지 테스트해 보겠습니다.
- 모든 변경 내용을 저장하고 이전과 같이 앱을 실행합니다.
- 브라우저 창이 열리면 루트 URL에
WelcomeService서비스가 생성한 환영 메시지가 표시됩니다. - 다음 연습을 위해 앱을 실행해 둡니다.