개발 지식

개발 지식

PHP PHP에서 커맨드 패턴 활용하여 서비스 분리하기

페이지 정보

profile_image
영삼이
0건 200회 25-03-28 23:22

본문

✅ 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, 메시지 큐, 백그라운드 작업 구조와도 궁합이 뛰어남


댓글목록

등록된 댓글이 없습니다.