티스토리 뷰

책임 연쇄 패턴이란?

책임 연쇄 패턴은 클라이언트의 요청에 대한 처리를 하기 위해 여러 개의 처리 객체들로 나누고, 이들을 chain 마치 사슬처럼 연결해 집합 안에서 연쇄적으로 처리하도록 하는 패턴이다. 이러한 처리 객체들을 핸들러(handler)라고 부르는데, 요청을 받으면 각 핸들러는 요청을 처리할 수 있는지, 없으면 체인의 다음 핸들러로 처리에 대한 책임을 전가한다. 한마디로 책임 연쇄라는 말은 요청에 대한 책임을 다른 객체에 떠넘긴다는 소리이다.

책임 연쇄 패턴 사용법

 

  • Handler : 요청을 수신하고 처리 객체들의 집합을 정의하는 인터페이스
  • ConcreteHandler : 요청을 처리하는 실제 처리 객체
    • 핸들러에 대한 필드를 내부에 가지고 있으며 메서드를 통해 다음 핸들러를 체인시키고 다음  바라본다.
    • 자신이 처리할 수 없는 요구가 나오면 바라보고 있는 다음 체인의 핸들러에게 요청을 떠넘긴다.
    • ConcreteHandler1 - ConcreteHandler2 - ConcreteHandler3 - ... 이런식으로 체인 형식이 구성되게 된다.
  • Client : 요청을 Handler 전달한다
public interface Handler{
	void setNextChain();
    void operation();
}

public class ConcreteHandler1 implements Handler{
	private Handler chain;
    
    @Override
    public void setNextChain(Handler nextChain){
    	this.chain=nextChain;
   	}
    
    @Override
    public void operation(){} //기능 구현
    
 }
 
 public class ConcreteHandler2 implements Handler{
	private Handler chain;
    
    @Override
    public void setNextChain(Handler nextChain){
    	this.chain=nextChain;
   	}
    
    @Override
    public void operation(){} //기능 구현
    
 }
public class Main{

	public static void main(String[] args){
    	Handler handler1=new ConcreteHandler1();
        Handler handler2=new ConcreteHandler2();
        Handler handler3=new ConcreteHandler1();
        
        handler1.setNext(handler2);
        handler1.operation();
        //요청에 대한 처리가 handler1의 operation-> handler2의 operation으로 순차적으로 적용 
}

패턴 사용 시기

  • 특정 요청을 2개 이상의 여러 객체에서 판별하고 처리해야 할때
  • 특정 순서로 여러 핸들러를 실행해야 하는 경우
  • 프로그램이 다양한 방식과 종류의 요청을 처리할 것으로 예상되지만 정확한 요청 유형과 순서를 미리 알 수 없는 경우
  • 요청을 처리할 수 있는 객체 집합이 동적으로 정의되어야 할 때 (체인 연결을 런타임에서 동적으로 설정)

패턴 장점

  • 클라이언트는 처리 객체의 체인 집합 내부의 구조를 알 필요가 없다.
  • 각각의 체인은 자신이 해야하는 일만 하기 때문에 새로운 요청에 대한 처리객체 생성이 편리해진다.
  • 클라이언트 코드를 변경하지 않고 핸들러를 체인에 동적으로 추가하거나 처리 순서를 변경하거나 삭제할 수 있어 유연해진다
  • 요청의 호출자(invoker)와 수신자(receiver)  분리시킬 수 있다. 
    • 요청을 하는 쪽과 요청을 처리하는 쪽을 디커플링 시켜 결합도를 낮춘다
    • 요청을 처리하는 방법이 바뀌더라도 호출자 코드는 변경되지 않는다.

패턴 단점

  • 실행 시에 코드의 흐름이 많아져서 과정을 살펴보거나 디버깅 및 테스트가 쉽지 않다.
  • 충분한 디버깅을 거치지 않았을 경우 집합 내부에서 무한 사이클이 발생할 수 있다.
  • 요청이 반드시 수행된다는 보장이 없다. (체인 끝까지 갔는데도 처리되지 않을 수 있다)
  • 책임 연쇄로 인한 처리 지연 문제가 발생할 수 있다. 다만 이는 트레이드 오프로서 요청과 처리에 대한 관계가 고정적이고 속도가 중요하면 책임 연쇄 패턴 사용을 유의하여야 한다.