PHP PHP에서 커맨드 패턴 활용하여 서비스 분리하기
페이지 정보

영삼이
본문
✅ PHP에서 커맨드 패턴 활용하여 서비스 분리하기
**커맨드 패턴(Command Pattern)**은 요청을 객체로 캡슐화해 실행 로직을 분리하는 디자인 패턴입니다. PHP에서 이 패턴을 적용하면 복잡한 서비스 로직을 명확하게 분리하고, 큐 처리나 작업 로그, 재실행 구조까지 손쉽게 확장할 수 있습니다.
🎯 언제 커맨드 패턴이 유용한가?
-
사용자의 **행위(요청)**를 기록, 저장, 큐잉하고 싶을 때
-
서비스 내부 로직을 명령 단위로 분리하고 싶을 때
-
요청/응답 흐름을 유연하게 확장하고 싶을 때
🧩 기본 구조
구성요소 | 설명 |
---|---|
Command | 수행할 작업(명령)을 담는 객체 |
Handler | 명령을 처리하는 객체 |
Dispatcher | 명령을 받아 핸들러에게 위임 |
🧱 1. Command 클래스 정의
[code=php]
class RegisterUserCommand {
public function __construct(
public string $email,
public string $name
) {}
}
[/code]
🧰 2. Handler 클래스 정의
[code=php]
class RegisterUserHandler {
public function handle(RegisterUserCommand $command): void {
// 사용자 등록 로직
echo "사용자 등록됨: {$command->email}, {$command->name}";
}
}
[/code]
📦 3. Dispatcher 구현
[code=php]
class CommandBus {
private array $handlers = [];
public function register(string $commandClass, callable $handler): void {
$this->handlers[$commandClass] = $handler;
}
public function dispatch(object $command): void {
$class = get_class($command);
if (!isset($this->handlers[$class])) {
throw new Exception("핸들러 없음: {$class}");
}
$handler = $this->handlers[$class];
$handler($command);
}
}
[/code]
🚀 사용 예시
[code=php]
$bus = new CommandBus();
$bus->register(RegisterUserCommand::class, [new RegisterUserHandler(), 'handle']);
$cmd = new RegisterUserCommand('kim@example.com', 'Kim');
$bus->dispatch($cmd);
[/code]
📦 확장 활용 예시
-
명령을 파일/DB/큐에 저장하고 나중에 실행
-
실행 로그 남기기 (AOP처럼 로그 미들웨어 삽입)
-
Undo/Redo 명령 구현 (되돌리기 기능)
✅ 장점
항목 | 설명 |
---|---|
책임 분리 | 명령 → 로직 → 실행 계층 분리 |
재사용성 | 다양한 곳에서 동일 명령 객체 사용 가능 |
테스트 용이 | 각 Handler 단위로 테스트 가능 |
확장성 | 큐 처리, 로그 기록 등 추가 쉬움 |
🧠 요약
-
커맨드 패턴은 로직을 명령 단위로 캡슐화하고, 실행 책임을 핸들러에 위임하는 구조
-
실제 서비스 계층보다 한 단계 더 명확하게 책임을 나누는 아키텍처
-
CQRS, 메시지 큐, 백그라운드 작업 구조와도 궁합이 뛰어남
- 이전글PHP에서 데코레이터 패턴 실전 적용 팁 25.03.28
- 다음글PHP에서 캐시 전략 세분화 하기 (Opcode, DB, 파일 등) 25.03.28
댓글목록
등록된 댓글이 없습니다.