파이프라인 동작
동작을 사용해 여러 기능에 공통으로 적용되는 논리를 추가합니다.
파이프라인 동작은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
횡단 관심사
로깅, 유효성 검사, 시간 측정 및 트랜잭션은 여러 처리기에 적용됩니다. 이 코드를 각 처리기에 복사하면 반복적이고 오류가 발생하기 쉽습니다.
MediatR의 파이프라인 동작을 사용하면 모든 요청을 공유 로직으로 감쌀 수 있습니다.
// One behavior runs around all handlers파이프라인 동작 인터페이스
동작은 IPipelineBehavior<TRequest, TResponse>를 구현합니다. 동작의 Handle 메서드는 요청과 파이프라인의 나머지 부분을 호출하는 next 대리자를 받습니다.
public class LoggingBehavior<TRequest, TResponse>
: IPipelineBehavior<TRequest, TResponse>
where TRequest : notnull
{
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken ct)
{
// before
var response = await next();
// after
return response;
}
}다음 대리자
next()는 다음 동작을 호출하거나, 마지막 동작인 경우 실제 handler를 호출합니다. 호출 전의 코드는 들어오는 과정에서 실행되고, 호출 후의 코드는 나가는 과정에서 실행됩니다.
// [Behavior A in] -> [Behavior B in] -> [Handler]
// <- [Behavior B out] <- [A out]로깅 동작
구체적인 로깅 동작은 들어오는 과정에서 요청 이름을 기록하고 나가는 과정에서 경과 시간을 기록합니다.
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken ct)
{
var name = typeof(TRequest).Name;
_logger.LogInformation("Handling {Name}", name);
var sw = Stopwatch.StartNew();
var response = await next();
_logger.LogInformation("{Name} took {Ms}ms", name, sw.ElapsedMilliseconds);
return response;
}동작 등록하기
DI에 개방형 제네릭 동작을 등록합니다. MediatR가 모든 요청에 이를 적용합니다.
builder.Services.AddTransient(
typeof(IPipelineBehavior<,>),
typeof(LoggingBehavior<,>));유효성 검사 동작
널리 사용되는 예로 FluentValidation을 사용한 요청 유효성 검사가 있습니다. 이 동작은 handler가 실행되기 전에 모든 유효성 검사기를 실행하고, 하나라도 실패하면 예외를 발생시킵니다.
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken ct)
{
var context = new ValidationContext<TRequest>(request);
var failures = _validators
.Select(v => v.Validate(context))
.SelectMany(r => r.Errors)
.Where(f => f is not null)
.ToList();
if (failures.Count != 0)
throw new ValidationException(failures);
return await next();
}조기 종료
동작은 next()를 호출하지 않고 반환하여 handler를 완전히 건너뛸 수 있습니다. 쿼리 결과를 캐싱하거나 잘못된 요청을 거부할 때 유용합니다.
if (_cache.TryGet(key, out TResponse cached))
return cached; // handler never runs
var response = await next();
_cache.Set(key, response);
return response;동작 순서 지정하기
동작은 등록된 순서대로 실행됩니다. 각 동작이 다음 동작을 올바르게 감싸도록 로깅을 가장 바깥쪽에 배치하고, 그다음에 유효성 검사, 트랜잭션을 배치합니다.
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));트랜잭션 동작
명령 처리기를 데이터베이스 트랜잭션으로 감싸 전체 작업이 원자적으로 커밋되거나 롤백되도록 합니다.
await using var tx = await _db.Database.BeginTransactionAsync(ct);
try
{
var response = await next();
await tx.CommitAsync(ct);
return response;
}
catch
{
await tx.RollbackAsync(ct);
throw;
}특정 요청 대상 지정하기
표식 인터페이스와 제네릭 제약 조건을 사용하면 동작을 사용하도록 선택한 요청에만 적용할 수 있습니다. 예를 들어 트랜잭션을 명령에만 적용할 수 있습니다.
public interface ITransactional { }
public record CreateOrderCommand(...) : IRequest<int>, ITransactional;
// where TRequest : ITransactional미들웨어보다 동작이 나은 이유
HTTP 미들웨어와 달리 동작은 메시지마다 실행되고 형식이 지정된 요청과 응답을 사용하며, HTTP 외부에서 요청을 전달하는 경우에도 작동합니다. 예를 들어 백그라운드 작업에서 전달하는 경우입니다.
// Strongly typed, transport-independent cross-cutting logic빠른 확인
동작이 작동하는 방식을 확인합니다.
복습
파이프라인 동작을 학습했습니다.
IPipelineBehavior<TRequest, TResponse>는 모든 요청을 공유 로직으로 감쌉니다.next대리자는 파이프라인을 진행하며, 이를 건너뛰면 handler가 조기 종료됩니다.- 일반적인 용도에는 로깅, 유효성 검사, 트랜잭션 및 캐싱이 있습니다.
- 동작은 등록 순서대로 실행되며 강력한 형식이 적용됩니다.
다음 주제: 알림과 이벤트입니다.
자주 묻는 질문
“파이프라인 동작” 강의는 무료인가요?
네 — “파이프라인 동작” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“파이프라인 동작”에서 뭘 배우나요?
동작을 사용해 여러 기능에 공통으로 적용되는 논리를 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“파이프라인 동작” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.