서비스 등록과 미들웨어 설정
ASP.NET Core에는 내장 의존성 주입(DI) 컨테이너가 탑재되어 있어, 파이프라인 구성 및 요청 처리에 필요한 서비스를 제공합니다. MVC 프레임워크 역시 다양한 서비스를 DI 컨테이너에 사전 등록해야 정상 동작합니다.using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace sampleapp
{
class EntryPoint
{
static void Main()
{
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(builder => builder
.ConfigureServices(services => services
.AddRouting()
.AddControllersWithViews())
.Configure(pipeline => pipeline
.UseRouting()
.UseEndpoints(routes => routes.MapControllers())))
.Build()
.Run();
}
}
}
위 예제에서 UseRouting과 UseEndpoints 확장 메서드를 호출하여 두 개의 핵심 미들웨어를 파이프라인에 등록했습니다. MapControllers 메서드는 Controller 클래스 내의 Action 메서드들을 엔드포인트로 매핑하는 역할을 수행합니다.
미들웨어가 의존하는 서비스들은 ConfigureServices 메서드 내에서 등록됩니다. AddRouting은 라우팅 관련 서비스를, AddControllersWithViews는 MVC 패턴에 필요한 전체 서비스 세트를 DI 컨테이너에 추가합니다.
Controller와 Action 메서드 구현
다음은 기본 Controller의 예시입니다. ASP.NET Core MVC에서는 Controller가 특정 기반 클래스를 반드시 상속받아야 하는 것은 아닙니다.
public class GreetingController
{
[HttpGet("/greet")]
public string GetMessage() => "Welcome to ASP.NET Core MVC.";
}
HttpGet 특성에 "/greet" 템플릿을 지정하여, 해당 경로로의 GET 요청이 GetMessage 메서드로 처리되도록 설정했습니다. 애플리케이션 실행 후 http://localhost:5000/greet에 접속하면 "Welcome to ASP.NET Core MVC." 메시지를 확인할 수 있습니다.
뷰(View) 통합
순수한 문자열 반환 대신 뷰를 활용하여 완전한 MVC 패턴을 구현해보겠습니다. 이를 위해 Controller는 Controller 기반 클래스를 상속받고, Action 메서드는 IActionResult를 반환합니다.
public class GreetingController : Controller
{
[HttpGet("/greet/{visitor}")]
public IActionResult GetMessage(string visitor)
{
ViewData["VisitorName"] = visitor;
return View();
}
}
Action 메서드에 매개변수를 정의하면, 라우트 템플릿의 동적 세그먼트와 자동으로 바인딩됩니다. ViewData를 통해 뷰로 데이터를 전달하고, View 메서드 호출로 해당 Action에 대응하는 뷰를 렌더링합니다.
뷰 엔진은 실행 시점에 {ContentRoot}/Views/{ControllerName}/{ActionName}.cshtml 경로에서 Razor 뷰 파일을 탐색합니다. 따라서 위 예제에서는 Views/Greeting/GetMessage.cshtml 파일을 생성해야 합니다.
<!DOCTYPE html>
<html>
<head>
<title>Greeting Page</title>
</head>
<body>
<h1>Hello, @ViewData["VisitorName"]!</h1>
</body>
</html>
Razor 문법은 HTML 마크업 내에 C# 코드를 자연스럽게 삽입할 수 있도록 설계되었습니다. @ViewData["VisitorName"] 구문은 서버 측에서 실행되어 동적인 콘텐츠를 생성합니다.
Startup 클래스를 통한 구조화
실무에서는 서비스와 미들웨어의 등록 로직을 별도의 타입으로 분리하는 것이 일반적입니다. 관례에 따라 이 타입을 Startup으로 명명하며, 프레임워크는 특정 메서드명을 약속으로 인식합니다.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRouting();
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder pipeline)
{
pipeline.UseRouting();
pipeline.UseEndpoints(endpoints => endpoints.MapControllers());
}
}
ConfigureServices 메서드는 DI 컨테이너에 서비스를 등록하고, Configure 메서드는 HTTP 파이프라인에 미들웨어를 추가합니다. 이 두 메서드의 시그니처는 프레임워크의 규약에 따르며, 별도의 인터페이스 구현이나 상속은 필요하지 않습니다.
정의한 Startup 클래스는 UseStartup 제네릭 메서드를 통해 등록됩니다.
class EntryPoint
{
static void Main()
{
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(builder => builder.UseStartup<Startup>())
.Build()
.Run();
}
}
이러한 규약 기반 설계(Convention over Configuration)는 ASP.NET Core 전반에서 일관되게 적용되며, 개발자가 보일러플레이트 코드를 줄이고 핵심 비즈니스 로직에 집중할 수 있도록 돕습니다.