이벤트 중심 아키텍처(EDA)는 시스템을 분리하고 이벤트에 응답하여 시스템을 더욱 유연하고 확장 가능하며 유지 관리 가능하게 만드는 데 중점을 둡니다. PHP에서는 EDA에서 자주 사용되는 두 가지 중요한 패턴은 이벤트 소싱과 CQRS(Command Query Responsibility Segregation)입니다. 다음은 실습 예제와 함께 PHP를 사용하여 구현하는 단계별 가이드입니다.
명령:
이벤트:
모델 읽기:
디렉토리 구조 만들기:
event-driven-php/ ├── src/ │ ├── Commands/ │ ├── Events/ │ ├── Handlers/ │ ├── Models/ │ └── ReadModels/ ├── tests/ └── vendor/
종속성 설치(예: Symfony/event-dispatcher):
composer require symfony/event-dispatcher
명령은 상태를 변경하는 작업을 나타냅니다. 예: PlaceOrderCommand.php.
// src/Commands/PlaceOrderCommand.php class PlaceOrderCommand { public string $orderId; public string $customerId; public function __construct(string $orderId, string $customerId) { $this->orderId = $orderId; $this->customerId = $customerId; } }
이벤트는 시스템에서 발생한 일을 설명합니다. 예: OrderPlacedEvent.php.
// src/Events/OrderPlacedEvent.php class OrderPlacedEvent { public string $orderId; public string $customerId; public function __construct(string $orderId, string $customerId) { $this->orderId = $orderId; $this->customerId = $customerId; } }
명령 핸들러는 실제 비즈니스 로직을 수행하고 이벤트를 발생시킵니다. 예: PlaceOrderHandler.php.
// src/Handlers/PlaceOrderHandler.php use Symfony\Component\EventDispatcher\EventDispatcher; class PlaceOrderHandler { private EventDispatcher $eventDispatcher; public function __construct(EventDispatcher $eventDispatcher) { $this->eventDispatcher = $eventDispatcher; } public function handle(PlaceOrderCommand $command) { // Business logic (e.g., check stock, validate order) // Emit the event $event = new OrderPlacedEvent($command->orderId, $command->customerId); $this->eventDispatcher->dispatch($event, 'order.placed'); } }
이벤트 핸들러는 특정 이벤트를 수신하고 읽기 모델을 업데이트합니다. 예: OrderProjection.php.
// src/ReadModels/OrderProjection.php class OrderProjection { private array $orders = []; public function onOrderPlaced(OrderPlacedEvent $event) { // Save or update read model with necessary data $this->orders[$event->orderId] = [ 'orderId' => $event->orderId, 'customerId' => $event->customerId, 'status' => 'placed' ]; } public function getOrder(string $orderId) { return $this->orders[$orderId] ?? null; } }
use Symfony\Component\EventDispatcher\EventDispatcher; // Bootstrapping the system $dispatcher = new EventDispatcher(); $orderProjection = new OrderProjection(); // Register event listeners $dispatcher->addListener('order.placed', [$orderProjection, 'onOrderPlaced']); // Create the command and command handler $command = new PlaceOrderCommand('123', 'cust_001'); $handler = new PlaceOrderHandler($dispatcher); // Handle the command (Place the order) $handler->handle($command); // Query the read model for the order $order = $orderProjection->getOrder('123'); print_r($order);
출력:
Array ( [orderId] => 123 [customerId] => cust_001 [status] => placed )
전체 이벤트 소싱을 위해 이벤트 저장소를 구현하여 이벤트를 데이터베이스에 보관할 수도 있습니다.
class EventStore { private array $storedEvents = []; public function append(Event $event) { $this->storedEvents[] = $event; } public function getEventsForAggregate(string $aggregateId): array { return array_filter($this->storedEvents, function($event) use ($aggregateId) { return $event->aggregateId === $aggregateId; }); } }
이 예는 PHP에서 CQRS 및 이벤트 소싱을 간단히 적용하는 방법을 보여줍니다. 이러한 패턴을 사용하면 강력한 감사 기능과 유연한 읽기/쓰기 처리 기능을 제공하면서 확장성과 유지 관리가 용이한 시스템을 구축할 수 있습니다. 추가 예측, 더욱 복잡한 이벤트 처리, 메시징 대기열이나 타사 알림과 같은 외부 통합을 통해 아키텍처가 확장될 수 있습니다.
위 내용은 PHP에서 이벤트 기반 아키텍처 구현: 이벤트 소싱 및 CQRS에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!