티스토리 뷰

개요

도메인 주도 설계 첫걸음을 재독 중인데 명확히 하고픈 용어를 정리해둔다.

구체화 뷰(Materialized View)

1. 개념

구체화 뷰(Materialized View)는 쿼리 결과를 미리 계산하여 실제 테이블처럼 저장해 두는 뷰이다.

일반 뷰(View)는 매번 쿼리를 실행할 때 원본 테이블에서 데이터를 가져오지만, 구체화 뷰는 쿼리 결과를 디스크에 저장하므로 조회 성능이 매우 빠르다.

2. 동작 방식

  • 생성 시점: 정의된 SELECT 쿼리를 실행하고 그 결과를 물리적으로 저장
  • 조회 시점: 저장된 결과를 바로 반환 → 반복 조회 시 성능 이점
  • 갱신(Refresh): 원본 데이터가 바뀌더라도 자동 반영되지 않으므로, 주기적으로 REFRESH를 실행하거나 트리거로 동기화해야 한다

3. 장단점

  • 장점
    • 복잡한 조인, 집계 쿼리를 미리 계산 → 조회 속도 비약적으로 향상
    • 분석/리포팅 시스템에서 유용
  • 단점
    • 원본 데이터와 동기화 비용 발생 (실시간 반영 아님)
    • 저장 공간 필요

4. 예시 (PostgreSQL)

-- 구체화 뷰 생성
CREATE MATERIALIZED VIEW user_order_summary AS
SELECT u.id, u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;

-- 구체화 뷰 조회 (테이블처럼 사용 가능)
SELECT * FROM user_order_summary;

-- 원본 데이터 변경 후 갱신
REFRESH MATERIALIZED VIEW user_order_summary;

5. 활용 사례

  • 데이터 웨어하우스 / BI 대시보드: 복잡한 집계를 미리 계산해 빠른 응답 제공
  • 검색 최적화: 빈번히 사용되는 조인/필터 결과를 미리 저장
  • CQRS 패턴의 Projection: 이벤트 소싱에서 읽기 모델을 미리 계산해 저장하는 용도로 활용

구체화 뷰 마무리

구체화 뷰는 “미리 계산된 뷰”로서, 읽기 성능 최적화에 강력하지만, 동기화와 저장공간 비용을 고려해야 한다.

CQRS의 프로젝션

구현 방식은 동기와 비동기 모두 가능하지만, 실무에서는 확장성과 유연성 때문에 비동기 방식이 더 흔하게 쓰인다. 비동기 방식에서 CQRS의 프로젝션(Projection)은 **“이벤트 소스로부터 읽기 모델을 만들어내는 과정”**을 의미한다.

1. 기본 아이디어

  • CQRS(Command Query Responsibility Segregation) 에서는 쓰기 모델(Write Model)읽기 모델(Read Model) 을 분리한다.
  • 쓰기 모델은 도메인 규칙과 불변성을 엄격하게 지키며 이벤트를 발생시킨다.
  • 읽기 모델은 조회 성능을 위해 단순화된 구조를 가진다.
  • 프로젝션은 바로 이 읽기 모델을 만드는 메커니즘이다.

2. 프로젝션 과정

  1. 도메인 이벤트 발생
  2. 예: “주문이 생성되었다(OrderCreated)”, “상품이 추가되었다(ProductAdded)”
  3. 이벤트 저장(Event Store 저장)
  4. 모든 이벤트는 append-only 로그(예: Kafka, EventStoreDB, DynamoDB Streams)에 기록된다.
  5. 프로젝터(Projection Handler) 실행
    • 이 컴포넌트는 단순히 이벤트를 보고, 읽기 모델 DB를 갱신한다.
  6. 이벤트를 구독하는 별도의 컴포넌트가 해당 이벤트를 수신한다.
  7. 읽기 모델 업데이트 예시
    • RDBMS 테이블을 업데이트 (집계값을 캐싱)
    • ElasticSearch 인덱스를 갱신 (검색 최적화)
    • Redis 같은 캐시에 반영 (실시간 조회)
  8. 최종 사용자 조회
  9. 클라이언트는 복잡한 조인을 거치지 않고 Projection이 유지하는 읽기 모델을 바로 조회한다.

3. 예시 (주문 시스템)

  • 이벤트: OrderPlaced { orderId=123, customerId=77, items=[...] }
  • 프로젝션 핸들러: 이 이벤트를 보고 orders_read_model 테이블에 한 줄 INSERT.
  • 읽기 모델: 고객 주문 내역 화면에서 SELECT * FROM orders_read_model WHERE customerId=77 으로 즉시 조회.

4. 특징

  • 비동기적: 쓰기 모델에서 이벤트 발생 후, 읽기 모델 반영은 나중에 일어나므로 약간의 지연(Latency)이 존재할 수 있다.
  • 여러 프로젝션 가능: 하나의 이벤트 스트림에서 서로 다른 읽기 모델(예: 통계 집계, 검색용, 사용자 UI용)을 동시에 생성할 수 있다.
  • 복잡도 트레이드오프: 읽기 성능은 뛰어나지만, 최종 일관성(Eventual Consistency)을 수용해야 한다.

CQRS 프로젝션 마무리

프로젝션은 이벤트를 “구독”해서 읽기 모델을 “업데이트/재구성”하는 과정이고, 결국 “쓰기 모델의 이벤트 → 읽기 모델” 이라는 파이프라인으로 볼 수 있다. 구현 방식은 동기와 비동기 모두 가능하지만, 확장성과 유연성 때문에 실무에서는 비동기 방식이 더 흔하게 쓰인다.

반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2026/02   »
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
글 보관함