알림과 이벤트
MediatR로 도메인 이벤트를 게시합니다.
알림과 이벤트은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
요청과 알림 비교
요청에는 하나의 handler가 있고 값을 반환합니다. 알림은 브로드캐스트이므로 0개 이상의 처리기가 있으며 아무것도 반환하지 않습니다. 어떤 일이 발생했다는 사실을 알릴 때 알림을 사용합니다.
// Request: one handler, returns a result
// Notification: many handlers, fire-and-forget알림 인터페이스
도메인 이벤트는 INotification을 구현하는 레코드입니다. 과거에 발생한 사실을 과거형으로 설명합니다.
public record OrderPlacedNotification(int OrderId, int CustomerId)
: INotification;INotificationHandler
각 구독자는 INotificationHandler<TNotification>를 구현합니다. 여러 handler가 동일한 알림을 구독할 수 있으며, 각 handler는 알림을 독립적으로 처리합니다.
public class SendConfirmationEmailHandler
: INotificationHandler<OrderPlacedNotification>
{
public Task Handle(
OrderPlacedNotification n, CancellationToken ct)
{
// send the email...
return Task.CompletedTask;
}
}여러 구독자
필요한 만큼 handler를 추가할 수 있습니다. 어느 handler도 다른 handler의 존재를 알 필요가 없으므로, publisher를 수정하지 않고도 새로운 반응을 추가할 수 있습니다.
public class UpdateInventoryHandler
: INotificationHandler<OrderPlacedNotification>
{
public Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
// decrement stock...
return Task.CompletedTask;
}
}게시하기
알림을 발생시키려면 IPublisher(또는 IMediator)를 주입하고 Publish를 호출합니다. 등록된 모든 handler가 호출됩니다.
public class CreateOrderHandler(AppDbContext db, IPublisher publisher)
: IRequestHandler<CreateOrderCommand, int>
{
public async Task<int> Handle(CreateOrderCommand c, CancellationToken ct)
{
var order = new Order { CustomerId = c.CustomerId };
db.Orders.Add(order);
await db.SaveChangesAsync(ct);
await publisher.Publish(
new OrderPlacedNotification(order.Id, c.CustomerId), ct);
return order.Id;
}
}부수 효과 분리
알림을 사용하면 주요 사용 사례에 집중할 수 있습니다. order를 배치하면 order를 기록하고 이벤트를 게시하기만 하며, 이메일 전송과 재고 관리는 각각 자체 handler에서 처리합니다. 이는 개방/폐쇄 원칙을 실제로 적용한 예입니다.
// CreateOrderHandler does NOT know about email or inventory게시 전략
기본적으로 MediatR은 각 알림 handler를 순차적으로 기다립니다. 하나의 handler에서 예외가 발생하면 이후 handler는 실행되지 않습니다. 사용자 지정 publisher를 제공하여 handler를 병렬로 실행할 수 있습니다.
builder.Services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
cfg.NotificationPublisher = new TaskWhenAllPublisher();
});실패 처리
handler는 서로 독립적이므로, 실패가 무엇을 의미하는지 결정해야 합니다. 중요하지 않은 부수 효과라면 handler 내부에서 예외를 처리하고 기록하여 한 번의 실패가 다른 handler의 실행을 중단하지 않도록 합니다.
public async Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
try { await _email.SendAsync(n.CustomerId, ct); }
catch (Exception ex) { _logger.LogError(ex, "email failed"); }
}도메인 이벤트 패턴
일반적인 패턴은 엔터티가 도메인 이벤트를 수집하고, 트랜잭션을 저장한 후 이벤트를 모두 게시하는 것입니다. 이렇게 하면 변경 사항이 커밋된 경우에만 이벤트가 발생합니다.
await db.SaveChangesAsync(ct);
foreach (var domainEvent in order.Events)
await publisher.Publish(domainEvent, ct);
order.Events.Clear();알림과 메시지 큐 비교
MediatR 알림은 프로세스 내부에서 요청 중에 동기적으로 처리됩니다. 서비스 간 전달이나 영속적인 전달이 필요하다면 대신 실제 메시지 브로커(예: RabbitMQ, Azure Service Bus)에 게시합니다.
// In-process reactions -> MediatR notifications
// Cross-service / durable -> message broker알림 테스트
모의 IPublisher를 전달하고 호출되었는지 확인하여 handler가 올바른 이벤트를 게시하는지 검증할 수 있습니다.
var publisher = new Mock<IPublisher>();
var handler = new CreateOrderHandler(db, publisher.Object);
await handler.Handle(new CreateOrderCommand(1, []), default);
publisher.Verify(p => p.Publish(
It.IsAny<OrderPlacedNotification>(), default), Times.Once);빠른 확인
알림 모델을 확인합니다.
정리
알림과 이벤트에 대해 배웠습니다.
INotification은 0개 이상의INotificationHandler가 구독하는 브로드캐스트입니다.IPublisher.Publish로 게시하여 모든 구독자를 호출합니다.- 알림은 부수 효과를 분리하고 개방/폐쇄 원칙을 따릅니다.
- 알림은 프로세스 내부에서 처리되므로, 서비스 간 이벤트나 영속적인 이벤트에는 브로커를 사용합니다.
이로써 CQRS 및 MediatR 과정이 끝났습니다.
AI 튜터와 함께 C#을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 93
- 레슨
- 346
자주 묻는 질문
“알림과 이벤트” 강의는 무료인가요?
네 — “알림과 이벤트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“알림과 이벤트”에서 뭘 배우나요?
MediatR로 도메인 이벤트를 게시합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“알림과 이벤트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.