CQRS는 명령(Commands)과 쿼리(Queries) 간의 책임을 분리하는 패턴입니다. 명령은 시스템의 상태를 변경하고, 쿼리는 데이터를 읽기만 합니다. 이러한 작업을 위해 주로 서로 다른 데이터 모델과 별도의 인터페이스가 설계됩니다.
CQRS의 장점: 데이터에 대한 읽기 및 쓰기 접근 과정을 별도로 최적화할 수 있어 복잡한 시스템의 성능을 높이고, 확장성 및 다양한 부하 시나리오에 대한 최적화를 용이하게 합니다.
예제 코드(C#을 이용한 CQRS):
interface ICommand { } interface IQuery<TResult> { } class CreateOrderCommand : ICommand { public int OrderId { get; set; } } class GetOrderQuery : IQuery<Order> { public int OrderId { get; set; } } class OrderCommandHandler { public void Handle(CreateOrderCommand command) { // DB에 변경 사항 적용 } } class OrderQueryHandler { public Order Handle(GetOrderQuery query) { // 변경 없이 DB에서 데이터 읽기 return new Order(); } }
주요 특징:
CQRS는 두 개의 클래스에 나누어진 CRUD의 버전인가요?
아니요, CQRS는 단순히 메소드를 분리하는 것 이상입니다. 일반적으로 읽기와 명령 부분 각각에 대해 별도의 모델, 데이터 구조 및 인터페이스를 생성하며, 종종 서로 다른 데이터베이스가 사용됩니다.
모든 프로젝트에 CQRS가 적합한가요?
아니요. CQRS 도입은 복잡하고 확장 가능한 시스템에서 성능과 처리 독립성이 높은 요구 사항이 있을 때만 의미가 있습니다. 소규모 프로젝트의 경우 자주 과도한 선택이 됩니다.
CQRS가 최종 일관성(eventual consistency)의 보장인가요?
반드시 그런 것은 아닙니다. CQRS는 분산 시스템에서 최종 일관성과 함께 구현될 수 있지만, 패턴 자체는 이러한 보장을 제공하지 않습니다.