💡 개요
오늘은 이벤트 소싱에서 사용되는 CQRS에 대해 정리해 보자.
⚙️ 이벤트 소싱
이벤트 소싱(Event Sourcing)이란 애플리케이션의 모든 상태 변경을 이벤트(Event)로 기록하고, 이 이벤트들의 순서를 따라 현재 상태를 구성하는 방식이다.
말 그대로 데이터 자체를 변경하는 것이 아니라 데이터를 변경하려는 시도(이벤트)를 저장하는 것이다.
이 방식에서는 상태를 변경할 때마다 이벤트를 기록해야 하므로 리소스가 더 소모되긴 한다. 하지만 이로 인해 얻을 수 있는 장점도 명확하다.
가장 큰 장점은 데이터 변경을 직접 수행하지 않기 때문에 정합성 문제나 동시성 이슈 발생 가능성이 낮다는 점이다.
이벤트 소싱을 기반으로 한 시스템은 설계와 구현 난이도가 다소 높지만, 그만큼 더 안전하고 신뢰성 있는 서버 환경을 구축할 수 있다.
🛠️ CQRS (Command and Query Responsibility Segregation)
CQRS는 Command and Query Responsibility Segregation의 약자로, 단어 그대로 해석해 보면 명령(Command)과 조회(Query)의 책임을 분리하는 것이다.
여기서 말하는 명령(Command)는 데이터를 저장하는 행위를 말하고, 조회(Query)는 데이터를 조회하는 행위를 뜻한다.
이 둘을 분리하는 이유는 조회 작업에서 더 많은 최적화를 적용할 수 있기 때문이다.
예를 들어 자주 조회되는 데이터는 캐싱을 통해 지연 시간을 줄이고, 서버 자원도 절약할 수 있다.
하지만 데이터 저장과 조회가 하나의 컴포넌트에서 함께 이루어진다면, 어느 시점에 캐싱을 적용할지, 어떻게 동기화를 유지할지 결정하기 어려워진다.
반면, CQRS에서는 읽기 전용 컴포넌트가 명확하게 분리되어 있기 때문에 캐싱, 데이터 복제, 읽기 전용 데이터베이스 구성 등 다양한 최적화 전략을 쉽게 적용할 수 있다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.04.15 - 자바 vector (1) | 2025.04.15 |
---|---|
[개발 일기] 2025.04.14 - 스레드 로컬 (Thread Local) (0) | 2025.04.14 |
[개발 일기] 2025.04.12 - 프로세스 vs 스레드 (0) | 2025.04.12 |
[개발 일기] 2025.04.11 - String vs StringBuffer vs StringBuilder (1) | 2025.04.11 |
[개발 일기] 2025.04.10 - Spring Security Filter (0) | 2025.04.10 |