티스토리 뷰
뷰(View)이란?
뷰는 가상의 테이블이다. 즉 데이터를 가지고 있지 않는다. 뷰는 데이터를 저장하는 테이블이 아니고, 복잡한 쿼리문 자체를 저장하고 있다.
뷰(View)를 사용하는 이유
- 편리성: 복잡한 쿼리를 단순화하여 쉽게 재사용 가능.
- 보안성: 원본 테이블에 대한 접근 권한을 주지 않고, 뷰를 통해서만 제한된 데이터에 접근하도록 허용할 수 있다.
- 논리적 독립성: 원본 테이블의 구조가 일부 변경 되더라도, 뷰의 정의만 수정하면 뷰를 사용하는 프로그램의 코드는 바꿀 필요가 없을 수도 있다.
뷰 생성
CREATE VIEW 뷰이름 AS SELECT 쿼리문;
DROP VIEW IF EXISTS v_category_order_status; -- 만약 뷰가 이미 존재한다면 제거
CREATE VIEW v_category_order_status AS
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;
뷰 조회하기
SELECT * FROM v_category_order_status;
-- WHERE 절이나 ORDER BY 사용 가능
SELECT *
FROM v_category_order_status
WHERE category = '전자기기';
뷰 수정하기
ALTER VIEW v_category_order_status AS
SELECT
p.category,
SUM(p.price * o.quantity) AS total_sales, -- 매출액 컬럼 추가!
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;
뷰 삭제하기
DROP VIEW v_category_order_status;
뷰를 삭제해도 원본 테이블의 데이터는 단 하나도 손상되거나 변경되지 않는다.
뷰(View)의 장점
- 편리성과 재사용성: 복잡한 SELECT 쿼리를 뷰 뒤에 숨길 수 있다.
- 보안성: 뷰는 데이터베이스에 대한 권한 제어를 가능하게 한다. 개인 정보 칼럼과 같은 민감한 정보에 대한 권한 제어가 가능하고, 특정 칼럼만 노출하게 할 수 있다.
- 논리적 데이터 독립성: 데이터베이스 구조가 변경되더라도 기존과 같은 형태의 뷰를 만들어 두면, 응용 프로그램은 실제 테이블 구조가 바뀐 것을 알 필요 없이 기존 코드 그대로 사용할 수 있다. 즉, 뷰는 내부 테이블 구조의 변화를 숨겨 주는 추상화 계층 역할을 한다.
뷰(View)의 단점
- 성능 문제: 뷰 안에 복잡한 쿼리가 있을 경우 사용자는 가벼운 쿼리라고 착각하지만 실제로는 시스템에 큰 부하를 주는 쿼리를 날리고 있을 수 있다.
- 업데이트 제약: 뷰는 INSERT, UPDATE, DELETE가 가능하지만 JOIN, 집계 함수, GROUP BY, DISTINCE 등을 사용한 복잡한 뷰에서는 불가능하다. 왜냐하면 뷰의 한 행을 수정하는 것이 원본 테이블들의 데이터를 어떻게 바꿔야 하는지에 대한 명확한 규칙을 특정할 수 없기 때문이다. 뷰가 오직 하나의 기본 테이블만을 참조하고, 뷰의 모든 컬럼이 기본 테이블의 실제 칼럼을 직접 참조하는 경우에는 뷰에 데이터를 추가/수정할 수 있다. 이 경우 원본 테이블의 값이 변경된다.
정리
뷰(View)는 하나 이상의 테이블로부터 생성되는 가상의 테이블이다. 실제 데이터를 저장하지 않으며 주로 SELECT 문을 통해 정의된다. 이를 통해 데이터 접근을 단순화하고 보안 및 데이터 독립성을 높일 수 있다.
본 포스팅은 “ 김영한의 실전 데이터베이스 기본편/인프런”를 학습한 내용을 정리한 것
댓글
