Materialized View의 정의
일반적으로 데이터베이스에서 사용하는 View는 SQL 쿼리를 저장해두고, 조회할 때마다 그 쿼리를 다시 실행해서 결과를 보여주는 방식입니다. 반면 Materialized View는 쿼리의 실행 결과 자체를 물리적으로 저장해두는 뷰입니다. 즉, 매번 계산하지 않고 미리 계산된 값을 디스크나 캐시에 저장해뒀다가 조회 시 바로 꺼내주는 방식입니다.
비유하자면, 일반 View는 매번 손님이 주문할 때마다 처음부터 요리하는 식당이고, Materialized View는 미리 만들어둔 반찬을 냉장고에 보관했다가 바로 꺼내주는 식당이라고 볼 수 있습니다. 손님 입장에서는 후자가 훨씬 빠르게 음식을 받을 수 있습니다.
동작 원리와 예시
Materialized View는 한 번 생성되면 그 시점의 데이터 결과를 스냅샷처럼 저장합니다. 예를 들어 매출 집계처럼 복잡한 JOIN과 GROUP BY 연산이 포함된 쿼리가 있다고 가정해봅시다.
- 일반 View: 조회할 때마다 JOIN, GROUP BY 연산을 처음부터 다시 수행
- Materialized View: 미리 계산된 집계 결과를 저장해두고, 조회 시 단순 SELECT만 수행
PostgreSQL을 예로 들면 다음과 같이 생성할 수 있습니다.
CREATE MATERIALIZED VIEW sales_summary AS SELECT product_id, SUM(amount) FROM orders GROUP BY product_id;
이렇게 만들어두면 이후 SELECT * FROM sales_summary만으로 결과를 즉시 가져올 수 있습니다. 다만 원본 테이블(orders)이 변경되어도 Materialized View는 자동으로 갱신되지 않습니다. 따라서 REFRESH MATERIALIZED VIEW sales_summary 명령어로 주기적으로 데이터를 갱신해줘야 최신 상태를 유지할 수 있습니다.
실무에서 왜 사용하는가
Materialized View는 복잡한 연산이 반복적으로 필요하지만, 실시간으로 최신 데이터가 필수는 아닌 상황에서 특히 유용합니다. 대시보드 통계, 일일 매출 리포트, 추천 시스템의 사전 계산된 점수 등이 대표적인 사례입니다.
매번 무거운 쿼리를 실행하면 DB 서버에 부하가 크고 응답 속도도 느려지지만, Materialized View를 활용하면 조회 성능을 크게 개선할 수 있습니다. 대신 데이터 신선도(freshness)와 성능 사이의 트레이드오프를 고려해서 갱신 주기를 적절히 설정하는 것이 중요합니다. 실시간성이 중요한 서비스라면 REFRESH 주기를 짧게, 그렇지 않다면 배치 작업으로 새벽에 한 번씩 갱신하는 식으로 운영 전략을 세우는 경우가 많습니다.