반응형
Chain of Responsibility Pattern(책임 연쇄 패턴) 은 요청을 처리할 수 있는 여러 객체들이 체인 형태로 연결되어, 요청이 처리될 수 있는 객체에게 전달되도록 하는 행동 디자인 패턴입니다. 요청자는 누가 그 요청을 처리하는지 알 필요가 없습니다.
🧱 Chain of Responsibility Pattern이란?
이 패턴은 여러 처리 객체(Handler)를 연결된 체인으로 구성하고, 요청을 순차적으로 전달하여 처리 가능한 객체가 처리하도록 합니다. 각 객체는 다음 처리자에 대한 참조를 가지고 있으며, 처리 불가능할 경우 이를 다음 객체로 넘깁니다.
class Handler {
setNext(handler) {
this.next = handler;
return handler;
}
handle(request) {
if (this.next) {
return this.next.handle(request);
}
return null;
}
}
class AuthHandler extends Handler {
handle(request) {
if (request.user === "admin") {
console.log("인증 성공");
return super.handle(request);
}
console.log("인증 실패");
return "권한 없음";
}
}
class DataHandler extends Handler {
handle(request) {
if (request.type === "data") {
console.log("데이터 처리 완료");
return "데이터 응답";
}
return super.handle(request);
}
}
const auth = new AuthHandler();
const data = new DataHandler();
auth.setNext(data);
const request = { user: "admin", type: "data" };
console.log(auth.handle(request));
✅ 장점
- 객체 간 결합도 낮음: 요청 처리자가 명확히 지정되어 있지 않음
- 유연한 구조: 처리자의 추가, 제거, 순서 변경이 쉬움
- 책임 분리: 각 처리자는 자신의 역할만 수행
❌ 단점
- 디버깅 어려움: 요청이 어디서 처리되었는지 추적이 복잡할 수 있음
- 성능 저하 우려: 처리자가 많을 경우 전달 시간이 증가
- 필수 처리자 누락 가능성: 모든 요청이 처리되지 않을 수도 있음
🛠️ 실전 예시: 결제 처리 체인
class PaymentHandler {
setNext(handler) {
this.next = handler;
return handler;
}
handle(method) {
if (this.next) {
return this.next.handle(method);
}
return "결제 수단을 찾을 수 없습니다.";
}
}
class CardPayment extends PaymentHandler {
handle(method) {
if (method === "card") {
return "카드 결제가 진행됩니다.";
}
return super.handle(method);
}
}
class KakaoPay extends PaymentHandler {
handle(method) {
if (method === "kakao") {
return "카카오페이 결제가 진행됩니다.";
}
return super.handle(method);
}
}
const card = new CardPayment();
const kakao = new KakaoPay();
card.setNext(kakao);
console.log(card.handle("kakao")); // 카카오페이 결제가 진행됩니다.
🧩 결론
Chain of Responsibility Pattern은 요청의 처리 책임을 유연하게 위임할 수 있어 복잡한 분기 로직, 유효성 검사, 결제 처리, 이벤트 필터링 등에 효과적입니다. 객체 간 결합도를 낮추고 책임을 분산시켜 구조적으로 안정된 설계를 가능하게 해줍니다.
반응형
'Programing > javascript' 카테고리의 다른 글
한글만 입력 가능한 입력 필터링 jQuery (한글 + 영문 추가) (1) | 2025.04.21 |
---|---|
자바스크립트 Flyweight Pattern (1) | 2025.04.19 |
자바스크립트 Bridge Pattern (0) | 2025.04.19 |
자바스크립트 Composite Pattern (0) | 2025.04.19 |
자바스크립트 Iterator Pattern (0) | 2025.04.19 |
자바스크립트 State Pattern (1) | 2025.04.19 |
자바스크립트 Strategy Pattern (0) | 2025.04.19 |
자바스크립트 Command Pattern (0) | 2025.04.19 |