Design Pattern

[디자인 패턴] 커맨드 패턴 (Command Pattern)

꾸준함. 2024. 6. 30. 14:36

커맨드 패턴

  • 요청을 객체로 캡슐화하여 다양한 요청, queueing 작업, 로깅 등을 매개변수화 할 수 있게 지원
  • 요청을 캡슐화하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴
  • 명령어의 실행 취소(undo) 기능 또한 지원
  • 해당 패턴은 실행될 기능을 메서드 매개변수화시키고 이 기능을 객체 내 메서드 호출로 변경할 수 있도록 지원

 

https://www.geeksforgeeks.org/command-pattern/

 

주요 구성 요소

 

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의 디자인 패턴 - 백기선 강사님

 

반응형