0Pricing
C# Academy · 강의

파이프라인 동작

동작을 사용해 여러 기능에 공통으로 적용되는 논리를 추가합니다.

파이프라인 동작은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

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