9-1-1. VIEW


대부분의 DBMS는 뷰(View)라는 기능의 객체(Object)를 지원한다. 뷰는 가상의 테이블이다. 테이블에는 실제 데이터가 저장되어 있지만, 가상의 테이블인 뷰에는 실제 데이터는 없고 뷰를 생성할 때 정의한 SQL만 DBMS 내부적으로 보관하고 있다.

아래는 상품(Item)의 모든 정보를 조회하는 SQL이다. 상품카테고리(ItemCat)와 기준코드(BaseCd)까지 조인해 관련 명칭도 가져오도록 처리하고 있다.

-- [SQL-9-1-1-a]
SELECT  T1.ItemId ,T1.ItemNm
        ,T1.ItemCat ,T2.ItemCatNm
        ,T1.ItemSizeCd ,T3.BaseCdNm ItemSizeCd_NM
        ,T1.HotColdCd ,T4.BaseCdNm HotColdCd_NM
FROM    startdb.Item T1
        INNER JOIN startdb.ItemCat T2
          ON (T2.ItemCat = T1.ItemCat)
        LEFT OUTER JOIN startdb.BaseCd T3
          ON (T3.BaseCdDv = 'ItemSizeCd' AND T3.BaseCd = T1.ItemSizeCd)
        LEFT OUTER JOIN startdb.BaseCd T4
          ON (T4.BaseCdDv = 'HotColdCd' AND T4.BaseCd = T1.HotColdCd);

상품 정보를 조회할 때마다 위와 같이 조인을 작성해야 한다면 번거로울 수 있다. 번거로움을 피하기 위해 아래와 같은 뷰를 만들어 볼 수 있다. 아래 SQL을 실행하면 vw_ItemFull이라는 뷰가 만들어진다.

-- [SQL-9-1-1-b]
DROP VIEW IF EXISTS startdb.vw_ItemFull;

CREATE VIEW startdb.vw_ItemFull AS
SELECT  T1.ItemId ,T1.ItemNm
        ,T1.ItemCat ,T2.ItemCatNm
        ,T1.ItemSizeCd ,T3.BaseCdNm ItemSizeCd_NM
        ,T1.HotColdCd ,T4.BaseCdNm HotColdCd_NM
FROM    startdb.Item T1
        INNER JOIN startdb.ItemCat T2
          ON (T2.ItemCat = T1.ItemCat)
        LEFT OUTER JOIN startdb.BaseCd T3
          ON (T3.BaseCdDv = 'ItemSizeCd' AND T3.BaseCd = T1.ItemSizeCd)
        LEFT OUTER JOIN startdb.BaseCd T4
          ON (T4.BaseCdDv = 'HotColdCd' AND T4.BaseCd = T1.HotColdCd);

만들어진 뷰는 아래와 같이 FROM 절에 테이블처럼 사용할 수 있다.

-- [SQL-9-1-1-c]
SELECT  T1.*
FROM    startdb.vw_ItemFull T1
WHERE   T1.ItemId = 'AMB';

뷰를 사용한 위 SQL은 DB 내부적으로 다음과 같이 실행된다. 뷰를 만들 때 사용한 SQL에 ItemId 조건이 추가되어 실행이 되는 것이다.

-- [SQL-9-1-1-d]
SELECT  T1.ItemId ,T1.ItemNm
        ,T1.ItemCat ,T2.ItemCatNm
        ,T1.ItemSizeCd ,T3.BaseCdNm ItemSizeCd_NM
        ,T1.HotColdCd ,T4.BaseCdNm HotColdCd_NM
FROM    startdb.Item T1
        INNER JOIN startdb.ItemCat T2
          ON (T2.ItemCat = T1.ItemCat)
        LEFT OUTER JOIN startdb.BaseCd T3
          ON (T3.BaseCdDv = 'ItemSizeCd' AND T3.BaseCd = T1.ItemSizeCd)
        LEFT OUTER JOIN startdb.BaseCd T4
          ON (T4.BaseCdDv = 'HotColdCd' AND T4.BaseCd = T1.HotColdCd)
WHERE   T1.ItemId = 'AMB'; -- > 뷰에 대한 조건이 뷰로 파고들어 SQL이 만들어져 실행된다.

뷰는 실제 데이터가 아닌 SQL만 저장되어 있으며, 실행 시점에 정의된 SQL이 실행되는 방식입니다. 추가로 오라클에는 Materialized View라는 실제 데이터를 저장하는 방식의 뷰도 있다. Materialized View는 데이터 변경, 입력시 뷰가 갱신되는 부담이 있으므로 성능적으로 철저한 검증과 함께 사용해야 한다.

뷰의 장점으로 다음과 같은 것들을 이야기 해볼 수 있다.