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. 관련 링크
반응형
'Workspace > Design Pattern' 카테고리의 다른 글
메멘토 패턴 (Memento Pattern): 객체의 상태를 안전하게 저장하고 복구하기 (0) | 2025.01.24 |
---|---|
방문자 패턴 (Visitor Pattern): 유연한 확장을 돕는 디자인 패턴 (0) | 2025.01.24 |
브리지 패턴 (Bridge Pattern): 구조를 분리해 유연성을 극대화하기 (0) | 2025.01.22 |
컴포지트 패턴 (Composite Pattern): 객체를 트리 구조로 구성하여 복잡성을 줄이기 (0) | 2025.01.22 |
상태 패턴 (State Pattern): 객체의 상태에 따라 행동을 다르게 구현하기 (2) | 2025.01.22 |