커맨드 패턴
- 요청을 객체로 캡슐화하여 다양한 요청, queueing 작업, 로깅 등을 매개변수화 할 수 있게 지원
- 요청을 캡슐화하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴
- 명령어의 실행 취소(undo) 기능 또한 지원
- 해당 패턴은 실행될 기능을 메서드 매개변수화시키고 이 기능을 객체 내 메서드 호출로 변경할 수 있도록 지원
주요 구성 요소
1. Command
- 명령을 실행할 메서드 정의하는 인터페이스
2. ConcreteCommand
- Command 인터페이스 구현체
- 실제 명령을 수행하는 역할
3. Invoker
- 명령을 실행할 때 사용할 인터페이스 제공
4. Receiver
- 명령을 수행하는 실제 객체
Command 패턴 구현 예시
1. Recevier
2. Command 인터페이스
3. ConcreteCommand
4. Invoker
5. 클라이언트 코드
커맨드 패턴 장단점
장점
- 기존 코드를 변경하지 않고 새로운 커맨드 추가 가능 (SOLID의 OCP 원칙)
- 수신자의 코드가 변경되어도 호출자의 코드는 변경되지 않음 (SOLID의 SRP 원칙)
- 커맨드 객체를 로깅, DB에 저장, 네트워크로 전송 등 다양한 방법으로 활용 가능
단점
- 커맨드 클래스가 늘어남에 따라 코드 복잡성이 올라감
실무에서 쓰이는 커맨드 패턴
1. 자바 Runnable
- Runnable 인터페이스는 단일 메서드인 run()을 가지고 있으며, 이는 Command 패턴의 execute() 메서드와 유사
- 이를 통해 특정 작업을 객체로 캡슐화하여 다른 쓰레드에서 실행 가능
- 쓰레드는 Invoker 역할을 수행하며 Thread 클래스는 Runnable 객체를 받아서 start() 메서드를 호출함으로써 run() 메서드를 실행
- 정리하자면 Runnable 인터페이스는 Command 패턴의 핵심 아이디어인 `명령을 객체로 캡슐화하여 실행을 지연시키거나 다른 컨텍스트에서 실행할 수 있게 하는 것`을 구현
2. 스프링 SimpleJdbcInsert, SimpleJdbcCall
- 스프링 프레임워크의 SimpleJdbcInsert와 SimpleJdbcCall은 데이터베이스 작업을 단순화하는 데 사용되는 Helper 클래스이며 JDBC API를 쉽게 사용할 수 있도록 추상화하여 데이터베이스 작업을 더 명확하고 직관적으로 수행할 수 있도록 지원
- SimpleJdbcInsert는 데이터베이스에 레코드를 삽입하는 작업을 단순화
- SimpleJdbcCall은 데이터베이스 저장 프로시저 호출을 단순화
2.1 SimpleJdbcInsert
- Command 인터페이스: 명시적으로 존재하지 않지만, execute 메서드가 Command 인터페이스의 역할
- Concrete Command 클래스: SimpleJdbcInsert 클래스 자체가 구체적인 명령을 수행하는 클래스
- Invoker: 클라이언트 코드에서 execute 메서드를 호출하여 명령을 실행
- Receiver: 데이터베이스, 실제로 명령이 수행되는 대상
* SimpleJdbcCall도 유사하기 때문에 생략
참고
코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님
반응형
'Design Pattern' 카테고리의 다른 글
[디자인 패턴] 옵저버 패턴 (Observer Pattern) (0) | 2024.07.02 |
---|---|
[디자인 패턴] 메멘토 패턴 (Memento Pattern) (1) | 2024.06.30 |
[디자인 패턴] 이터레이터 패턴 (Iterator Pattern) (0) | 2024.06.30 |
[디자인 패턴] 인터프리터 패턴 (Interpreter Pattern) (0) | 2024.06.30 |
[디자인 패턴] 중재자 패턴 (Mediator Pattern) (0) | 2024.06.30 |