0Pricing
C# Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. CQRS 개념
  2. MediatR을 사용하는 명령과 처리기
  3. 파이프라인 동작
  4. 알림과 이벤트
← C# Academy(으)로 돌아가기