본문 바로가기
Design Pattern

[Design Pattern] 커맨드 패턴(Command Pattern)에 대해 알아보자

by 개발자J의일상 2022. 7. 4.
반응형

Definition

커맨드 패턴(Command Pattern)을 사용하면 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있다. 이러면 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다.

 

Situation

- Request는 변형 시간 또는 변형 주문으로 지정, 대기 및 실행해야 한다.

- Request들의 히스토리가 필요할 때 

- 호출자는 호출을 처리하는 객체에서 분리되어야 한다.

- 이를 통해 대기열 및 콜백과 같은 기존의 객체 기반 관계에서 요청을 처리할 수 있다.

- 스레드 큐에서 커맨드를 하나씩 제거하면서 커맨드의 execute() 메소드를 호출한다. 메소드 실행이 끝나면 다시 큐에서 새로운 커맨드 객체를 가져간다.

- 리모컨의 각 슬롯에 명령을 할당. 리모컨이 인보커가 됨, 사용자가 버튼을 누르면 그 버튼에 맞는 커맨드 객체의 execute() 메소드가 호출되고, 리시버에서 특정 행동을 담당하는 메소드가 실행됨

- 객체를 작업들로 매개변수화할 때

- 작업을 대기열에 넣거나 실행을 예약하거나 원격으로 실행하려는 경우

- 되돌릴 수 있는 작업을 구현하려는 경우 (e.g. Undo 기능) -> 일부가 private일 수 있기 때문에 application의 상태를 저장하는 것은 쉽지 않다. Memento 패턴으로 완화 가능

 

Structure

https://refactoring.guru/design-patterns/command

Pros

- 단일 책임 원칙. 이러한 작업을 수행하는 클래스에서 작업을 호출하는 클래스를 분리할 수 있다.

- 개방/폐쇄 원칙. 기존 클라이언트 코드를 손상시키지 않고 앱에 새 명령을 도입할 수 있다.

- 실행 취소/다시 실행을 구현할 수 있다.

- 지연된 작업 실행을 구현할 수 있다.

- 간단한 명령 세트를 복잡한 명령으로 조합할 수 있다.

Cons

- 발신자와 수신자 사이에 완전히 새로운 계층을 도입하기 때문에 코드가 더 복잡해질 수 있다.

비슷한 패턴

- Chain of Responsibility, Command, MediatorObserver는 요청의 발신자와 수신자를 연결하는 다양한 방법을 다룬다:

  • Chain of Responsibility는 잠재적 수신자 중 하나가 처리할 때 까지 잠재적 수신자의 동적 사슬을 따라 순차적으로 요청을 전달한다.
  • Command는 발신자와 수신자간의 단방향 연결을 설정한다.
  • Mediator는 발신자와 수신자 간의 직접 연결을 제거하여 중재자 객체를 통해 간접적으로 통신한다.
  • Observer를 사용하면 수신기가 수신 요청을 동적으로 구독 및 구독 취소할 수 있다.

- Chain of Responsibility의 핸들러는 Command로 구현할 수 있다. 이 경우 요청으로 표시되는 동일한 컨텍스트 객체에 대해 다양한 작업을 실행할 수 있다. 

  그러나 요청 자체가 Command 객체인 또 다른 접근 방식이 있다. 이 경우 체인에 연결된 일련의 서로 다른 컨텍스트에서 동일한 작업을 실행할 수 있다.

- "실행 취소"를 구현할 때 CommandMemento를 함께 사용할 수 있다. 이 경우 Command는 대상 객체에 대해 다양한 작업을 수행하는 역할을 하는 반면, Memento는 명령이 실행되기 직전에 해당 객체의 상태를 저장한다.

- CommandStrategy는 둘 다 일부 작업으로 객체를 매개변수화할 수 있기 때문에 비슷해 보일 수 있다. 그러나 이것들은 매우 다른 관심을 가지고 있다.

  • Command를 사용하여 모든 작업을 객체로 변환할 수 있다. 작업의 매개변수는 해당 객체의 필드가 된다. 변환을 통해 작업 실행을 연기하고, 대기열에 넣고, 명령 기록을 저장하고, 원격 서비스에 명령을 보내는 등의 작업을 수행할 수 있다.
  • 반면에 Strategy는 일반적으로 동일한 작업을 수행하는 다른 방법을 설명하므로 단일 컨텍스트 클래스내에서 이러한 알고리즘을 교환할 수 있다.

- Prototype은 명령 사본을 기록에 저장해야 할 때 도움이될 수 있다.

- VisitorCommand 패턴의 강력한 버전으로 취급할 수 있다. 해당 객체는 다른 클래스의 다양한 객체에 대해 작업을 실행할 수 있다.

 

300x250

댓글