개발 지식

개발 지식

PHP PHP로 CQRS 패턴 구현하기

페이지 정보

profile_image
영삼이
0건 167회 25-03-28 22:49

본문

✅ 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 간 데이터 정합성 유지 전략이 필요


댓글목록

등록된 댓글이 없습니다.