✅ CQRS (Command Query Responsibility Segregation)
CQRS란?
명령(Command)과 조회(Query)의 책임을 분리하는 아키텍처 패턴입니다.
전통적인 CRUD 시스템은 읽기와 쓰기를 동일한 모델에서 처리하는데, CQRS는 이를 분리하여 각자 최적화할 수 있도록 합니다.
핵심 개념
Command: 데이터 변경 요청 (예: Create, Update, Delete)
Query: 데이터 조회 요청 (예: Read)
읽기 모델과 쓰기 모델을 별도로 설계하여 복잡성을 줄이고, 성능을 향상시킬 수 있습니다.
장점
읽기/쓰기 성능 최적화
비즈니스 로직의 명확한 분리
확장성 향상 (쓰기/읽기를 개별적으로 스케일링 가능)
복잡한 도메인 로직 처리에 유리 (DDD와 궁합이 좋음)
단점
시스템 구조가 복잡해짐
트랜잭션 관리 어려움 (동기화 이슈)
구현 난이도 상승
---
✅ 이벤트 소싱 (Event Sourcing)
이벤트 소싱이란?
데이터를 현재 상태로 저장하는 대신, 상태 변화의 이벤트(Event) 들을 순차적으로 저장하는 방식입니다.
현재 상태는 이벤트들을 재생(replay) 해서 복원합니다.
예시
은행 계좌: 계좌 생성됨, 1000원 입금, 500원 출금 같은 이벤트를 저장 → 이 이벤트들을 기반으로 현재 잔고 계산
장점
모든 변경 이력 보존 (감사 및 디버깅에 유리)
이벤트 스트리밍 시스템과 궁합 좋음
CQRS와 함께 사용할 때 강력한 시너지
단점
이벤트 저장소가 커질수록 리플레이 비용 증가
이벤트 스키마 변경 시 이슈
디버깅이 복잡할 수 있음
---
✅ CQRS + 이벤트 소싱 조합
둘은 자주 같이 사용됩니다:
역할 구현 방식
쓰기 (Command) 도메인 이벤트를 생성하고 저장
읽기 (Query) 이벤트로부터 생성된 뷰 모델(Read Model)을 조회
이점: 변경 이력은 이벤트로 추적하고, 읽기 모델은 그에 맞게 동기화 → 고성능 조회, 완전한 추적 가능
---
💡요약
항목 설명
CQRS 명령과 조회를 분리하여 최적화
이벤트 소싱 상태 변경을 이벤트로 저장하고 재구성
조합 복잡한 비즈니스 로직을 효율적으로 다루는 아키텍처
'Spring & Backend' 카테고리의 다른 글
| 자바에서 제네릭의 공변, 반공변, 무공변에 대해 설명해 주세요 (4) | 2025.07.14 |
|---|---|
| Cache-Control 헤더에 대해 설명해주세요 (2) | 2025.07.14 |
| 테스트하기 쉬운 코드의 조건들에 대해 설명해주세요. (6) | 2025.07.11 |
| 자료구조 트라이에 대해서 설명해주세요 (0) | 2025.07.11 |
| 자바에서 Object 타입인 value를 String으로 타입 캐스팅하는 것과 String.valueOf()를 사용하는 것의 차이점은 무엇인가요 (6) | 2025.07.10 |
