티스토리 뷰
728x90
CQRS 패턴이란?
Command Query Responsibility Segregation
: 명령(Command)과 질의(Query)의 책임을 분리하는 패턴
Command 명령
- 시스템 데이터 변경 (ex. 주문 취소, 배송 완료)
- create, update, delete
Query 질의
- 시스템 데이터 조회 (ex. 주문 목록, 상품 상세)
- read
Responsibility 책임
- 구성요소의 역할
- 구성 요소 (모델)
- 클래스, 함수
- 모듈/패키지
- 웹서버/DB
분리 Segregation
- 역할에 따라 구성요소 나누기
명령과 질의에 단일 모델을 사용할 경우

- 코드 역할/책임 모호
- 요구사항이 늘어가면서 Member객체에 주문테이블, 로그인 히스토리 테이블 등과의 결합도가 증가
- 의미/가독성 등 나빠짐
- 유지보수성 떨어짐
명령과 질의를 구분하는 이유
- 명령과 질의는 다루는 데이터가 다름
- 명령 : 한 영역의 데이터
- (ex. 주문처리 - 주문테이블, 배송완료처리 - 배송테이블)
- 질의 : 여러 영역의 데이터
- (ex. 주문 목록 조회 - 주문, 유저, 상품 테이블이 엮임)
- 명령과 쿼리는 코드 변경 빈도/사용자가 다름
- 기능마다 성능 요구가 다름
- 사용자의 상품목록조회는 빨라야 하지만, 백오피스의 판매수치 조회는 좀 느려도 괜찮다
- 기능마다 서로 다른 성능 향상 방법 필요
- 단일 모델로는 다양한 성능 향상 기법 적용이 어려울 수 있음
CQRS 패턴의 장점
- 모델의 모호함이 없어진다
- 명령 영역의 모델과 쿼리 영역의 모델이 무엇을 표현하는 지가 명확해진다
- 코드 가독성과 유지보수성이 좋아질 가능성이 높아진다
- 질의쪽엔 캐시를 적용하고 명령은 비동기로 처리하는 등 기능에 따른 성능 향상 기법 적용이 용이해진다
CQRS패턴을 사용하는 경우
- 많은 사용자가 동일한 데이터에 병렬 액세스하는 경우
- Read 수가 Write 수보다 훨씬 큰 경우
- 시스템 확장성을 고려하는 경우
참고자료
728x90
'기초지식' 카테고리의 다른 글
[OS] 프로세스/스레드 동기화 - 모니터 (0) | 2024.05.31 |
---|---|
Dockerfile, Docker Compose 간단 정리 (0) | 2024.01.07 |
대규모 데이터를 다루기 위한 기초지식 - OS 캐시 (0) | 2022.08.17 |
CPU bound, IO bound (0) | 2022.08.15 |
우선순위 큐(Priority Queue)와 힙(Heap) 자료구조 (0) | 2022.06.23 |
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- laravel
- Infra
- Spring
- mockery
- laravel 테스트코드
- springboot
- 대규모 데이터 처리
- php
- 카프카
- index
- Container
- mongoDB
- 몽고디비
- JUnit
- devops
- AOP
- kafka
- docker
- 분산처리
- 스프링
- NoSQL
- k8s
- 라라벨
- 샤딩
- kubernetes
- 쿠버네티스
- MySQL
- phpUnit
- java
- database
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함