핵심 인사이트 (3줄 요약)
- 실행될 '요청(Request)'을 객체로 캡슐화하여, 요청자와 수신자의 결합도를 제거함.
- 요청을 큐(Queue)에 저장하거나 로깅할 수 있으며, 실행 취소(Undo)와 재실행(Redo) 기능을 지원함.
- 기존 코드를 수정하지 않고 새로운 명령 객체를 추가할 수 있는 높은 확장성을 제공함.
Ⅰ. 개요 (Context & Background)
특정 객체에 명령을 내릴 때, 호출자가 수신자의 내부 메서드를 직접 호출하면 두 객체 간 강한 결합이 생긴다. **커맨드 패턴(Command Pattern)**은 "무엇을 할지"에 대한 요청 자체를 독립된 객체로 분리하여 관리한다. 이를 통해 호출자는 어떤 명령인지 상세히 알 필요 없이 단순히 명령을 실행(execute)만 시키면 되며, 이는 비동기 처리나 작업 취소(Undo) 등의 복잡한 요구사항을 유연하게 처리하게 해준다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
커맨드 패턴은 Command(커맨드 인터페이스), ConcreteCommand(구체 커맨드), Invoker(호출자), **Receiver(수신자)**의 4개 핵심 요소로 구성된다.
[ Invoker ] ---------> [ <<Interface>> Command ]
| - command: Command | + execute() |
| + setCommand() | + undo() |
+----------------------+ +----------------------+
^
|
[ Client ] ----> [ ConcreteCommand ] --------> [ Receiver ]
| - receiver: Receiver | | + action() |
| + execute() { receiver.action() }| +------------+
+----------------------------------+
- Command: 모든 명령 객체가 구현해야 할 인터페이스를 정의한다. (주로
execute()메서드) - ConcreteCommand: Receiver와 연결되어 실제 동작을 수행하며,
execute()메서드에서 Receiver의 기능을 호출한다. - Invoker: 명령 객체를 보관하며, 적절한 시점에 명령의
execute()를 호출한다. (전등 스위치, 리모컨 등) - Receiver: 실제 비즈니스 로직을 수행하는 대상 객체이다. (전등, 에어컨 등)
Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)
| 비교 항목 | 커맨드 패턴 (Command) | 전략 패턴 (Strategy) | 옵저버 패턴 (Observer) |
|---|---|---|---|
| 핵심 의도 | "요청"을 객체로 만들어 전달 및 관리 | "알고리즘"을 객체로 만들어 교체 | "상태 변화"를 객체들에게 통지 |
| 작업 단위 | 개별적인 동작(Action) 단위 | 전체적인 로직(Policy) 단위 | 데이터/상태 동기화 단위 |
| 부가 기능 | Undo/Redo, 로깅, 큐 작업 지원 | 런타임 알고리즘 변경 지원 | 다대다(M:N) 객체 간 통신 지원 |
| 주요 활용 | 트랜잭션 시스템, 매크로, GUI 버튼 | 결제 방식 선택, 정렬 방식 선택 | 이벤트 핸들링, 실시간 알림 |
Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)
- 적용 시점: 실행 취소(Undo) 기능이 필수적일 때, 작업 수행을 지연시키거나 큐에 넣어야 할 때, 매크로(명령어 조합) 기능이 필요할 때 적용한다.
- 기술사적 판단: 커맨드 패턴은 **"SRP(단일 책임 원칙)"**를 실천하는 좋은 사례이다. 호출자는 요청 발송만 책임지고, 수신자는 동작 수행만 책임지며, 명령 객체는 둘 사이의 연결만 책임진다. 특히 대규모 분산 시스템에서 명령을 이벤트로 저장하는 '이벤트 소싱(Event Sourcing)' 아키텍처의 근간이 되기도 한다.
Ⅴ. 기대효과 및 결론 (Future & Standard)
커맨드 패턴을 통해 시스템은 요청의 발행 시점과 실행 시점을 완전히 분리(Decoupling)할 수 있다. 이는 로그 기반의 장애 복구, 다중 명령의 원자적 처리 등 고급 기술 구현을 가능케 한다. 앞으로 서버리스 환경에서 함수(Function)를 트리거하는 이벤트 메시징 구조 등에서 커맨드 사상은 더욱 중요해질 전망이다.
📌 관련 개념 맵 (Knowledge Graph)
- Undo / Redo Stack: 이전 명령 객체를 스택에 저장하여 상태를 되돌림.
- Composite Pattern: 여러 커맨드를 묶어 '매크로 커맨드'를 구성할 때 사용.
- Memento Pattern: 명령 취소(Undo) 시 객체의 상태를 이전 스냅샷으로 복원하기 위해 협력.
👶 어린이를 위한 3줄 비유 설명
- '식당 리모컨 벨'을 누르는 것과 같아요.
- 손님이 벨을 누르면 주방에는 '띵동' 소리와 함께 '주문서(커맨드)'가 도착하죠.
- 요리사는 손님이 누구인지 몰라도 '주문서'만 보고 음식을 만들면 되는 편리한 방법이랍니다.