MediatR을 사용하는 명령과 처리기
요청을 전용 처리기로 전달합니다.
MediatR을 사용하는 명령과 처리기은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
MediatR 등록하기
MediatR는 어셈블리를 검색하여 처리기를 찾습니다. 시작 시 한 번 등록하고, 처리기가 포함된 어셈블리를 지정합니다.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));요청 인터페이스
응답을 기대하는 메시지는 IRequest<TResponse>를 구현합니다. 형식 매개 변수는 handler가 반환하는 형식입니다.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order id결과가 없는 명령
명령이 의미 있는 값을 반환하지 않는다면 제네릭이 아닌 IRequest를 구현합니다. 이는 IRequest<Unit>의 축약형입니다.
public record CancelOrderCommand(int OrderId) : IRequest;요청 처리기 인터페이스
처리기는 IRequestHandler<TRequest, TResponse>를 구현하고 실제 작업이 수행되는 Handle 메서드를 제공합니다.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}종속성 주입하기
처리기는 DI에서 확인되므로 생성자를 통해 데이터베이스 컨텍스트, 리포지토리 또는 다른 서비스를 전달받을 수 있습니다.
public class CreateOrderHandler(AppDbContext db)
: IRequestHandler<CreateOrderCommand, int>
{
public async Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
var order = new Order { CustomerId = request.CustomerId };
db.Orders.Add(order);
await db.SaveChangesAsync(ct);
return order.Id;
}
}전송자 인터페이스
요청을 전달하려면 ISender(또는 더 포괄적인 IMediator)를 주입하고 Send를 호출합니다. MediatR가 일치하는 처리기를 찾습니다.
public class OrdersController(ISender sender) : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
int id = await sender.Send(cmd);
return CreatedAtAction(nameof(Get), new { id }, null);
}
}최소 API에서 Send 사용하기
최소 API에서는 엔드포인트 대리자에 ISender를 직접 주입합니다.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});쿼리도 단순한 요청입니다
쿼리는 동일한 IRequest / IRequestHandler 메커니즘을 사용합니다. 유일한 차이는 의도입니다. handler는 읽기만 수행하고 절대 변경하지 않습니다.
public record GetOrderQuery(int Id) : IRequest<OrderDto?>;
public class GetOrderHandler(AppDbContext db)
: IRequestHandler<GetOrderQuery, OrderDto?>
{
public async Task<OrderDto?> Handle(
GetOrderQuery q, CancellationToken ct) =>
await db.Orders
.Where(o => o.Id == q.Id)
.Select(o => new OrderDto(o.Id, o.Total))
.SingleOrDefaultAsync(ct);
}요청마다 하나의 처리기
Send의 경우 요청 형식과 일치하는 처리기는 반드시 하나여야 합니다. 같은 요청에 처리기를 0개 또는 2개 등록하면 구성 오류가 발생합니다.
// CreateOrderCommand -> exactly one CreateOrderHandler풍부한 결과 반환하기
응답은 데이터 전송 객체, 결과 래퍼, 구분된 결과 등 어떤 형식이든 될 수 있으므로 처리기에서 성공과 실패를 명시적으로 표현할 수 있습니다.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;처리기 테스트하기
처리기는 종속성이 주입되는 일반 클래스이므로 HTTP 통신이나 컨트롤러 없이 직접 테스트할 수 있습니다.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);빠른 확인
MediatR의 전달 모델을 확인합니다.
복습
명령과 처리기를 구현했습니다.
AddMediatR는 어셈블리를 검색하여 처리기를 등록합니다.- 메시지는
IRequest<T>를 구현하고, 처리기는IRequestHandler<TRequest, T>를 구현합니다. ISender를 주입하고Send를 호출하여 전달하며, 정확히 하나의 처리기가 일치합니다.- 쿼리도 동일한 메커니즘을 재사용하며 부작용이 없습니다.
다음 주제: 파이프라인 동작입니다.
자주 묻는 질문
“MediatR을 사용하는 명령과 처리기” 강의는 무료인가요?
네 — “MediatR을 사용하는 명령과 처리기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“MediatR을 사용하는 명령과 처리기”에서 뭘 배우나요?
요청을 전용 처리기로 전달합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“MediatR을 사용하는 명령과 처리기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.