CQRS

CQRS패턴 사용예시

25G 2023. 7. 21. 11:19

CQRS(Command Query Responsibility Segregation) 패턴을 PostgreSQL에서 사용하는 예시를 들어보겠습니다. 일반적으로 이 패턴은 읽기 및 쓰기 작업을 분리하여 성능을 개선하고 복잡성을 줄입니다.

스키마

우선, 다음과 같이 상품을 저장하는 테이블이 있다고 가정

CREATE TABLE products
(
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    quantity INT NOT NULL
);

쓰기 모델 (Command)

INSERT INTO products (name, price, quantity) 
VALUES ('Product A', 100.00, 50);

읽기 모델 (Query)

SELECT * FROM products WHERE name LIKE '%A%';

여기서 볼 수 있듯이, 읽기와 쓰기 작업은 완전히 분리되어 있습니다.

그러나 이 예제는 매우 기본적인 형태의 CQRS를 보여주는 것이며, 실제 CQRS 패턴을 PostgreSQL에서 구현하려면 더 많은 작업이 필요합니다. 예를 들어, 복잡한 읽기 쿼리를 위한 별도의 읽기 모델(read model)을 설계하고, 이를 쓰기 모델(write model)과 동기화하도록 이벤트 소싱 등을 사용해야 할 수 있습니다.

전통적인 CRUD 방식과 CQRS) 패턴의 차이점은 '읽기'와 '쓰기' 작업의 분리입니다.

  • CRUD 방식: CRUD 방식은 데이터에 대한 모든 작업(생성, 읽기, 업데이트, 삭제)이 하나의 동일한 데이터 모델을 통해 처리됩니다. 이 방식은 간단하고 일관성을 유지하는 데 효과적입니다. 그러나 데이터와 비즈니스 로직이 복잡해질수록 성능 최적화와 확장성에 문제가 발생할 수 있습니다.
  • CQRS 패턴: CQRS는 읽기와 쓰기 작업을 분리합니다. 각 작업은 별도의 데이터 모델과 인터페이스를 가지며, 이로 인해 성능 최적화와 확장성을 더욱 향상시킬 수 있습니다. 예를 들어, 읽기 작업에 최적화된 데이터베이스를 사용하고, 쓰기 작업에 최적화된 다른 데이터베이스를 사용할 수 있습니다. 또한, 복잡한 쿼리 로직과 쓰기 로직이 분리되어 코드의 가독성과 유지보수성이 향상됩니다.

다만 CQRS 패턴은 복잡한 시스템에서의 성능 개선과 유연성을 위한 것으로, 이를 도입하면 시스템 복잡도가 증가하고 데이터 일관성 유지에 추가적인 노력이 필요합니다. 따라서 CQRS는 대용량 데이터를 처리하거나 복잡한 비즈니스 로직을 가진 시스템에 적합합니다. 모든 시스템에 CQRS를 적용하는 것이 아니라, 그 필요성과 복잡성, 이로 인한 비용을 신중히 고려해야 합니다.

'CQRS' 카테고리의 다른 글

CQRS를 NestJs에서 사용예시  (0) 2023.07.21
CQRS패턴  (0) 2023.07.21