이 쿼리를 우리 쇼핑몰의 재무팀, 마케팅팀, 운영팀에서 매일 아침 확인해야 하는 핵심 지표라고 가정해 보자.
SELECT
p.category,
COUNT(*) AS total_orders,
SUM(CASE WHEN o.status = 'COMPLETED' THEN 1 ELSE 0 END) AS completed_count,
SUM(CASE WHEN o.status = 'SHIPPED' THEN 1 ELSE 0 END) AS shipped_count,
SUM(CASE WHEN o.status = 'PENDING' THEN 1 ELSE 0 END) AS pending_count
FROM
orders o
JOIN products p ON o.product_id = p.product_id
GROUP BY p.category
이때 아래와 같은 문제가 발생한다.
- 복잡성
- 이 쿼리는 너무 길고 복잡하다. SQL에 익숙하지 않은 직원이 이 쿼리를 매번 실수 없이 정확하게 입력하기란 거의 불가능에 가깝다
- 재사용성
- 여러 팀의 여러 사람이 이 쿼리를 사용하려면, 각자 이 긴 쿼리문을 어딘가에 저장해두고 복사-붙여넣기를 해야 한다.
- 만약 보고서의 로직이 변경되면(예: '반품 완료' 상태 추가), 모든 사람이 각자 저장해 둔 쿼리를 수정해야 하는 끔찍한 상황이 발생한다.
- 보안
- 이 쿼리를 실행하려면, 사용자는 원본 테이블인 "orders"와 "products"에 직접 접근할 수 있는 권한(SELECT 권한)이 있어야 한다.
- 하지만 운영팀 직원에게는 고객의 개인정보나 상품의 원가 같은 민감한 정보가 담겨있을 수 있는 원본 테이블 전체를 보여주고 싶지 않다. 딱 이 요약된 보고서 내용만 보게 하고 싶다.
뷰(VIEW)의 개념
뷰(View)는 실제 데이터를 가지고 있지 않은 "가상의 테이블"이다. 그 실체는 데이터베이스에 이름과 함께 저장된 하나의 "SELECT"쿼리문이다.
- 뷰는 그 자체로 데이터를 저장하는 테이블이 아니다. 단지 복잡한 "SELECT" 쿼리문 자체를 저장하고 있다.
- 우리는 복잡한 쿼리를 실행할 필요 없이, "SELECT * FROM 나의_바로가기_뷰;"라는 간단한 명령만으로 그 복잡한 쿼리의 결과를 얻을 수 있다.
뷰(VIEW)의 동작 원리
사용자가 "v_category_order_status"라는 뷰를 조회하면, 데이터베이스 내부에서는 다음과 같은 일이 일어난다.
- 사용자가 "SELECT * FROM v_category_order_status;"라는 쿼리를 실행한다.
- 데이터베이스는 "v_category_order_status"라는 이름의 실제 테이블을 찾지 않는다. 대신, 이 뷰에 정의된(저장된) 원래의 긴 "SELECT"쿼리문을 찾아낸다.
- 데이터베이스는 그 저장된 "SELECT" 쿼리문(우리가 위에서 만든 복잡한 쿼리)을 그 순간에 실행한다.
- 실행 결과가 사용자에게 반환된다. 사용자는 마치 그냥 테이블을 조회한 것처럼 느끼게 된다.
뷰는 데이터를 저장하지 않기 때문에, 우리가 뷰를 조회할 때마다 항상 최신 상태의 원본 테이블 (orders, products)을 기준으로 쿼리가 실행된다는 것이다. 따라서 뷰의 데이터는 항상 최신 상태를 유지한다.
뷰(VIEW)를 사용하는 이유
- 편리성: 복잡한 쿼리를 단순화하여 쉽게 재사용할 수 있다.
- 보안성: 사용자에게 원본 테이블에 대한 접근 권한을 주지 않고, 뷰를 통해서만 제한된 데이터(특정 행이나 특정 컬럼)에 접근하도록 허용할 수 있다. 민감한 정보를 숨기는 데 매우 효과적이다.
- 논리적 독립성: 만약 나중에 원본 테이블의 구조가 일부 변경되더라도, 뷰의 정의만 수정하면 뷰를 사용하는 응용 프로그램은 코드를 바꿀 필요가 없을 수도 있다. 뷰가 중간에서 변화를 흡수하는 "추상화 계층" 역할을 하기 때문이다.
'데이터 베이스 > 데이터베이스 기본' 카테고리의 다른 글
| Ch06. 뷰 - 뷰의 장점과 단점 (0) | 2026.06.03 |
|---|---|
| Ch06. 뷰 - 생성, 조회, 수정, 삭제 (0) | 2026.06.03 |
| Ch05. CASE문 - 조건부 집계 (0) | 2026.06.02 |
| Ch05. CASE문 - 그룹핑 (0) | 2026.06.02 |
| Ch05. CASE문 - CASE문 기본 (0) | 2026.06.02 |