Command Query Responsibility Segregation
명령 조회 책임 분리
CRUD에서 CUD와 R을 구분하자는 얘기
•
즉 Command와 Query를 구분하자
•
Database로부터 데이터를 읽어오고 처리를 하게될 경우, 그 사이에 데이터에 변경이 있을 확률이 높은데
•
이런 변경 가능성을 인정하고 Read와 CUD 사이에는 Delay가 존재할 수 있음을 인정하는 것
•
Domain 단위부터 분리하는 것?
Controller 단계에서 Command와 Query를 나눠서 개발
CQRS를 사용하면 얻는 이점
•
여러 사용자가 동일한 데이터에 동시에 액세스하는 공동 작업 도메인 수준에서 병합 충돌을 최소화하기 위해 충분한 세분성으로 명령을 정의할 수 있다
구현형태
•
같은 프로세스, 같은 DB
◦
가장 단순, 명령/쿼리 동일 데이터 보장
•
같은 프로세스, 같은 DB, 다른 테이블
◦
쿼리 전용 테이블 사용 ⇒ 조회를 뜻함
▪
최근 조회수 많은 글 목록 등
◦
명령이 쿼리 전용 데이터 변경 유발
•
같은 프로세스, 다른 DB
◦
상품 목록을 Redis에 캐싱하고 이를 쿼리
◦
명령에 따른 변경 내용을 Redis에 변경전파
•
다른 프로세스, 다른 DB
◦
명령에 따른 데이터 변경 내역을 쿼리쪽 DB에 전달해야 함
◦
마이크로 서비스 분류 체계에 따라 많이 만날 수 있음