PHP PHP로 CQRS 패턴 구현하기
페이지 정보

영삼이
본문
✅ PHP로 CQRS 패턴 구현하기
**CQRS(Command Query Responsibility Segregation)**는 읽기(조회)와 쓰기(명령) 책임을 분리하여 성능과 확장성을 높이는 설계 패턴입니다. PHP에서도 이 패턴을 적용하면 복잡한 도메인을 깔끔하게 나눌 수 있습니다.
📌 핵심 개념
-
Command: 상태를 변경하는 작업 (예: 유저 등록, 글 수정)
-
Query: 상태를 조회하는 작업 (예: 유저 목록 보기)
읽기와 쓰기를 아예 다른 객체나 레이어로 분리하는 게 핵심입니다.
📁 디렉토리 구조 예시
src/
├── Command/
│ ├── RegisterUserCommand.php
│ └── RegisterUserHandler.php
├── Query/
│ ├── GetUserListQuery.php
│ └── GetUserListHandler.php
├── Domain/
│ └── User.php
├── Repository/
│ └── UserRepository.php
🧩 Command 예제: 사용자 등록
Command 객체
[code=php]
namespace App\Command;
class RegisterUserCommand {
public function __construct(
public string $email,
public string $name
) {}
}
[/code]
Command 핸들러
[code=php]
namespace App\Command;
use App\Domain\User;
use App\Repository\UserRepository;
class RegisterUserHandler {
public function __construct(private UserRepository $repo) {}
public function handle(RegisterUserCommand $command): void {
$user = new User($command->email, $command->name);
$this->repo->save($user);
}
}
[/code]
🔍 Query 예제: 사용자 목록 조회
Query 객체
[code=php]
namespace App\Query;
class GetUserListQuery {
// 조건이 필요한 경우 추가 가능
}
[/code]
Query 핸들러
[code=php]
namespace App\Query;
use App\Repository\UserRepository;
class GetUserListHandler {
public function __construct(private UserRepository $repo) {}
public function handle(GetUserListQuery $query): array {
return $this->repo->findAll();
}
}
[/code]
⚙️ 사용 예시
[code=php]
$commandHandler = new RegisterUserHandler($repo);
$command = new RegisterUserCommand('kim@example.com', 'Kim');
$commandHandler->handle($command);
$queryHandler = new GetUserListHandler($repo);
$users = $queryHandler->handle(new GetUserListQuery());
[/code]
✅ 장점
-
읽기/쓰기 트래픽을 분리하여 성능 튜닝 가능
-
비즈니스 복잡도를 줄이고 유지보수 용이
-
핸들러 단위로 테스트 및 확장하기 쉬움
⚠️ 주의할 점
-
단순한 프로젝트에 적용하면 오히려 구조만 복잡해질 수 있음
-
Command와 Query 간 데이터 정합성 유지 전략이 필요
- 이전글PHP + Symfony 컴포넌트만으로 경량 프레임워크 만들기 25.03.28
- 다음글PHP에서 클린 아키텍처 적용하기 25.03.28
댓글목록
등록된 댓글이 없습니다.