View 테이블(구체화 뷰)

비구름·2025년 8월 10일

데이터베이스

목록 보기
7/8

View 테이블이란?

(view)는 관계 데이터베이스의 데이터베이스 언어 SQL에서 하나 이상의 테이블 (또는 다른 뷰)에서 원하는 모든 데이터를 선택하여, 그들을 사용자 정의하여 나타낸 것

위키 피디아에서 위와 같이 뷰 테이블을 선택합니다. 스터디를 같이한 분의 비유로는 단축키 개념으로 이해하면 편하다고 하였습니다.

View 테이블 문법

생성

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

위 문법은 MySQL의 공식 문서에서 가져왔습니다.

복잡한 것을 싹 지우고 간단하게 축약하면 아래와 같은 간단한 모양을 볼 수 있습니다.

CREATE VIEW 뷰이름 AS SELECT 구문;

SELECT 구문을 사용하여 View테이블에 담길 정보를 미리 지정합니다.

삭제

DROP VIEW 뷰이름;

기존 테이블을 삭제하는 것과 같은 문법을 가지고 있습니다.

사용 방법

SELECT [칼럼들] FROM 뷰이름;
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty  | price | value |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+

CREATE로 생성하고 기존 테이블을 사용하는 방법과 같이 SELECT ??? FROM 뷰이름을 넣으면 됩니다.

동작 방식

뷰 테이블을 사용하는 쿼리가 들어왔을 때 뷰 테이블의 쿼리를 실행하고 해당 테이블을 바탕으로 SELECT문을 실행합니다. 메모리 / 하드 디스크에 추가적인 저장은 하지 않습니다.

사용 이유

사용 이유에는 크게 5가지 이유가 존재합니다.

  1. 복잡한 로직의 단순화 - 만약 복잡한 조인/집계 쿼리를 작성한 경우 뷰 테이블로 생성하여 보다 간단한 쿼리문으로 작성이 가능합니다.
  2. 코드 재사용성 및 유지보수성 - 다양한 곳에서 사용되는 로직이 존재한다면 코드에서 함수로 만드는 것과 유사하게 뷰 테이블을 통해 다양한 곳에 일관된 로직을 사용할 수 있습니다.
  3. 보안 - 고객 정보 테이블을 제공할 경우 필요가 없는 민감한 정보를 제외한 뷰 테이블을 제공하여 보안을 챙길 수 있습니다.

데이터 수정

뷰 테이블은 기본적으로 데이터 수정, 삭제, 생성이 실제 테이블에 적용이 되지 않으며 불가능합니다. 하지만 읽기 전용 뷰 테이블이 아닌 수정이 가능한 뷰 테이블이 존재하는데 다음과 같은 조건이 갖추어져야 합니다.

  1. 집계 함수 또는 윈도우 함수 사용 시
    • SUM(), MIN(), MAX(), COUNT() 등.
  2. DISTINCT 사용 시
  3. GROUP BY 사용 시
  4. HAVING 사용 시
  5. UNION 또는 UNION ALL 사용 시
  6. SELECT 목록에 서브쿼리 포함 시
    • 비의존적(non-dependent) 서브쿼리: INSERT는 실패하지만 UPDATE, DELETE는 가능.
    • 의존적(dependent) 서브쿼리: 어떤 데이터 변경도 불가능.
  7. 특정 종류의 조인 사용 시
    • (뒤쪽 섹션에서 추가 설명)
  8. FROM 절에서 갱신 불가능한 뷰를 참조할 때
  9. WHERE 절의 서브쿼리가 FROM 절의 테이블을 참조할 때
  10. 리터럴 값만 참조할 때
    • 이 경우 실제로 업데이트할 기반 테이블이 없음.
  11. ALGORITHM = TEMPTABLE 로 생성한 뷰
    • 임시 테이블을 쓰면 항상 갱신 불가.
  12. 기본 테이블의 특정 컬럼을 다중 참조할 때
    • INSERT는 실패, UPDATE/DELETE는 가능.

위 조건은 SQL 공식 문서에 기재된 내용입니다. 위 내용을 확인해보면 실제 데이터와 1:1 매핑이 되는지 확인하고 매핑이 안되거나 추가적인 연산이 생겼다면 데이터 수정이 안되는 것으로 확인할 수 있습니다.

추가

스터디를 시작하기 전에 뷰 테이블에 대한 관점을 캐시와 유사하다라고 생각했습니다. 하지만 스터디를 진행하면서 잘못된 생각임을 깨닫게 되어 자료를 추가로 찾아보던 중 Materialized View이라는 뷰 테이블을 발견하였습니다.

Materialized View란?

쿼리의 결과를 담고 있는 데이터베이스 오브젝트라고 위키피디아에서 말하고 있습니다.

한글로 구체화된 뷰로 쿼리의 결과를 저장하고 호출 시 해당 쿼리의 결과를 제공합니다. 특정 주기마다 업데이트를 진행하거나 사용자가 원할 때 뷰 테이블을 업데이트 합니다.

생성 방법

CREATE MATERIALIZED VIEW sales_summary AS
SELECT region, SUM(sales) AS total_sales
FROM orders
GROUP BY region;

기본적으로 뷰 테이블 문법에서 앞에 MATERIALIZED 키워드를 넣어주면 완성됩니다.

업데이트 방법

REFRESH MATERIALIZED VIEW sales_summary;

REFRESH문법을 사용하여 데이터 업데이트를 진행할 수 있습니다.

참고 문헌

profile
기본부터 정리해나가는 기록용 블로그

0개의 댓글