CQRS

What is the CQRS?

CQRS는 -명령과 질의 책임의 분리(Command Query Responsibility Segregation)-를 의미하는 설계 패턴이다. 표현 그대로 읽기/쓰기 모델을 분리하여 설계하는 디자인으로, 마침 읽기 전용 인터페이스들의 재사용성 증대와 필요에 의한 격리화, 읽기/쓰기 모델 간의 부하 분산에 대한 설계를 고민하다 반짝 아이디어를 제공해 준 패턴이다. 이 패턴은 Martin Fowler의 글에 잘 설명되어 있다.
(* See Martin Fowler: CQRS)

Design

Command Query Separation 관점에 따르면 질의 모델은 읽기를 담당하고 명령 모델은 쓰기를 담당한다. 일반적인 정보계 시스템에서 질의는 -R-, 명령은 -C/U/D-에 해당된다. Martin Fowler는 다음과 같은 예로 CQRS를 설명하고 있다. CQRS

위 그림에서 핵심 바운더리는 쿼리와 커맨드 모델 영역이다. 두 모델은 논리적 혹은 물리적으로 분리될 수 있으며, 상호 보완적 또는 독립적으로 디자인할 수도 있다. 여기서 예측할 수 있는 장점은 몇 가지가 있다.

  • 각 모델 영역은 독립적인 크기를 가질 수 있다.
  • 각 모델 영역은 서로 다른 데이터베이스 접근 전략이나 최적화 전략을 구사할 수 있다.
  • 읽기와 쓰기 용도에 따른 데이터베이스 분리 구성이 용이하다. (e.g. Reporting Database, Replication Policy)
  • 데이터베이스 접근 계층을 투명하게 처리할 수 있다.

Conclusion

CQRS의 각 모델을 비지니스 단위로 본다면 오히려 복잡성을 더할 수도 있다. 비지니스 로직의 최소 단위는 적어도 읽기와 쓰기를 포함할 수 있고, 기능 단위로 쪼개어도 비지니스 계층의 일관적 디자인을 유지하기에 꽤 많은 수고가 필요하다. 이는 비단 계층형 아키텍쳐(Layered Architecture)에서의 문제만은 아니다. 따라서 Monolithic 개발 환경이라면 영속 계층에서 기능 단위로서 역할할 수 있는 디자인이 더 적합할 수 있으며, 아니면 두 모델 사이의 데이터 일관성을 보장할 수 있는 대안(e.g. Event Sourcing, Eventual Consistency)을 세워야만 한다. CQRS and Event Sourcing

  • 그림 2. CQRS 모델의 일관성 보장을 위한 예(Event Sourcing)

Conclusion

CQRS는 특정 도메인에 적합할 수 있지만, 도입시에 조금 고민이 필요해 보인다.

References

Comments