기능 수정을 하면서 최근에 DB의 뷰를 다뤄야 하는 일이 있었다.
기존 기능을 유지보수 하면서 DB의 쿼리를 변경 해서 조회 속도를 올리고자 하였는데, 기존 기능에서는 뷰를 통해 조회를 하고 있었다.
정보 처리 기사를 공부할 당시에 이론적으로만 뷰에 대해서 공부를 하였고, 내가 실제로 뷰를 사용 해본적은 없었는데 이번 기회를 통해 뷰에 대해서 알아보고자 한다.
뷰는 쿼리를 하나의 테이블처럼 사용할 수 있게 하는 기술이다.
위는 뷰에 대해서 정말 간단하게 요약한 문장이지만, 이게 사실 정답이다.
아래 사용법을 보면 볼수록 정말 간단하고 명료하게 정리가 된 문장이라는 생각이 들 것이다.
SELECT *
FROM EXAMPLE_TABLE et
WHERE 매우 복잡한 쿼리
LEFT JOIN ANOTHER_TABLE at1
LEFT JOIN ANOTHER_TABLE at2
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at4
LEFT JOIN ANOTHER_TABLE at5
LEFT JOIN ANOTHER_TABLE at6;
만약 위 복잡한 쿼리를 미리 뷰로 정의 해두지 않았다면 매번 위 쿼리를 아래와 같이 서브 쿼리 등으로 매번 사용해야 할 것이다.
첫번째 쿼리...
SELECT *
FROM EX_TABLE1
WHERE val1 = (
SELECT *
FROM EXAMPLE_TABLE et
WHERE 매우 복잡한 쿼리
LEFT JOIN ANOTHER_TABLE at1
LEFT JOIN ANOTHER_TABLE at2
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at4
LEFT JOIN ANOTHER_TABLE at5
LEFT JOIN ANOTHER_TABLE at6);
두번째 쿼리...
SELECT *
FROM EX_TABLE2
WHERE val1 = (
SELECT *
FROM EXAMPLE_TABLE et
WHERE 매우 복잡한 쿼리
LEFT JOIN ANOTHER_TABLE at1
LEFT JOIN ANOTHER_TABLE at2
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at4
LEFT JOIN ANOTHER_TABLE at5
LEFT JOIN ANOTHER_TABLE at6);
세번째 쿼리...
SELECT *
FROM EX_TABLE3
WHERE val1 = (
SELECT *
FROM EXAMPLE_TABLE et
WHERE 매우 복잡한 쿼리
LEFT JOIN ANOTHER_TABLE at1
LEFT JOIN ANOTHER_TABLE at2
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at3
LEFT JOIN ANOTHER_TABLE at4
LEFT JOIN ANOTHER_TABLE at5
LEFT JOIN ANOTHER_TABLE at6);
이러한 문제를 해결하는데 뷰가 사용될 수 있는데, 이러한 뷰의 특징에는 무엇이 있는지에 대해서 먼저 알아본 후 실제 뷰 문법에 대해서 알아보자.
뷰란 다른 테이블에서 파생된 테이블을 의미하며, 물리적으로 데이터가 저장되는 것이 아니라 논리적으로만 존재한다.
뷰를 사용한 질의 시에는 DBMS의 뷰의 정의를 잘 파악하고 필요시에 재 작성하여 수행해야 한다.
뷰의 장점과 특징에 대해서 그렇다면 정리를 해보자.
뷰의 장점은 아래와 같다.
뷰의 특징은 아래와 같다.
그렇다면 뷰를 실질적으로 어떻게 생성, 수정, 조회, 삭제 할 수 있을지에 대해서 알아보자.
이 때 문법은 Oracle 문법입니다.
뷰는 아래의 문법 통해서 생성, 수정 할 수 있다.
CREATE OR REPLACE VIEW [뷰 이름] AS [쿼리]
이를 위 예시에 대입해보면 아래와 같다.
CREATE OR REPLACE VIEW EXAMPLE_VIEW
AS
SELECT *
FROM EXAMPLE_TABLE et
WHERE 매우 복잡한 쿼리
LEFT JOIN ANOTHER_TABLE at;
LEFT JOIN ANOTHER_TABLE at1;
LEFT JOIN ANOTHER_TABLE at2;
LEFT JOIN ANOTHER_TABLE at3;
LEFT JOIN ANOTHER_TABLE at3;
LEFT JOIN ANOTHER_TABLE at4;
LEFT JOIN ANOTHER_TABLE at5;
LEFT JOIN ANOTHER_TABLE at6;
참고로 뷰는 create or replace를 통해 동일한 이름의 뷰가 이미 있다면 재생성하고, 없다면 생성할 수 있다.
뷰가 별도의 수정이 없는 이유는 뷰의 정의는 변경할 수 없기에 수정을 원한다면 삭제 후 재 생성을 해야 한다.
즉 create or replace를 통해 생성 또는 수정을 할 수 있다.
뷰는 아래의 문법 통해서 사용(=조회) 할 수 있다.
SELECT * FROM EXAMPLE_VIEW;
이를 통해서 위 예시에서 봤던 것 처럼 번거로이 복잡한 쿼리를 서브 쿼리등으로 사용 하는 일을 줄일 수 있다.
만약 뷰의 쿼리를 보고 싶다고 한다면 아래와 같이 조회를 하면 된다.
SELECT text FROM USER_VIEWS
WHERE view_name = '찾고자 하는 뷰 이름';
뷰는 아래의 문법 통해서 삭제 할 수 있다.
CREATE OR REPLACE VIEW [뷰 이름] AS [쿼리]
이 때 뷰 삭제 시에는 해당 쿼리에 대한 원천 데이터가 사라지는게 아니라 뷰만 삭제 처리 된다.