1. 책임 연쇄 패턴이란?

책임 연쇄 패턴은 요청을 처리할 수 있는 객체들의 체인을 구성하고, 각 객체가 요청을 처리할 기회를 갖도록 하는 디자인 패턴입니다. 이 패턴을 사용하면 요청을 보낸 코드와 처리하는 코드 간의 결합도를 낮추고, 새로운 처리 로직을 쉽게 추가할 수 있습니다. ✨

2. 책임 연쇄 패턴의 구성 요소

책임 연쇄 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:

  • Handler (처리자): 요청을 처리하거나 다음 처리자에게 전달합니다.
  • ConcreteHandler (구체 처리자): 요청을 실제로 처리하거나 처리할 수 없는 경우 체인의 다음 처리자에게 넘깁니다.
  • Client (클라이언트): 요청을 체인의 첫 번째 처리자에게 전달합니다.

출처: 위키

3. 책임 연쇄 패턴 예제

문제 상황

사용자 요청을 다양한 수준에서 검증해야 합니다. 예를 들어, 사용자 입력에 대해 입력 값 검증, 권한 확인, 로그 기록 등의 처리를 해야 할 때 책임 연쇄 패턴을 사용할 수 있습니다.

C# 코드 예제

using System;

// Handler 인터페이스
abstract class Handler
{
    protected Handler next;

    public void SetNext(Handler nextHandler)
    {
        next = nextHandler;
    }

    public abstract void Handle(string request);
}

// ConcreteHandler: 입력 검증
class ValidationHandler : Handler
{
    public override void Handle(string request)
    {
        if (string.IsNullOrWhiteSpace(request))
        {
            Console.WriteLine("Validation failed: Input is empty.");
            return;
        }

        Console.WriteLine("Validation passed.");
        next?.Handle(request);
    }
}

// ConcreteHandler: 권한 확인
class AuthorizationHandler : Handler
{
    public override void Handle(string request)
    {
        if (request != "AuthorizedUser")
        {
            Console.WriteLine("Authorization failed: User is not authorized.");
            return;
        }

        Console.WriteLine("Authorization passed.");
        next?.Handle(request);
    }
}

// ConcreteHandler: 로그 기록
class LoggingHandler : Handler
{
    public override void Handle(string request)
    {
        Console.WriteLine($"Logging request: {request}");
        next?.Handle(request);
    }
}

// 클라이언트 코드
class Program
{
    static void Main()
    {
        // 체인 구성
        Handler validation = new ValidationHandler();
        Handler authorization = new AuthorizationHandler();
        Handler logging = new LoggingHandler();

        validation.SetNext(authorization);
        authorization.SetNext(logging);

        // 요청 처리
        string userInput = "AuthorizedUser";
        validation.Handle(userInput);
    }
}

출력 결과

Validation passed.
Authorization passed.
Logging request: AuthorizedUser

4. 책임 연쇄 패턴의 특이점 및 고려할 점

  • 유연성: 각 처리자는 독립적으로 동작하며, 체인의 구조를 동적으로 변경할 수 있습니다.
  • 결합도 감소: 요청 처리 로직이 처리자 객체들에 분리되어 코드의 재사용성을 높입니다.
  • 주의점: 요청이 체인의 끝까지 전달되었는데도 처리되지 않을 수 있으므로, 기본 처리자를 추가하거나 요청이 처리되지 않았을 경우에 대한 대책을 마련해야 합니다.

5. 결론

책임 연쇄 패턴은 요청 처리의 유연성과 확장성을 높이는 데 유용한 패턴입니다. 체인의 각 구성 요소를 독립적으로 관리할 수 있어, 유지보수가 용이하며 동적으로 처리 로직을 변경할 수 있습니다. 단, 체인의 끝에서 요청이 처리되지 않는 경우를 염두에 두고 설계해야 합니다. 🔗

6. 관련 링크

반응형

+ Recent posts