본문 바로가기
ORACLE/DB

[Oracle] 오라클 뷰(View) 사용법 및 정리 :: 마이자몽

by 🌻♚ 2020. 3. 22.

View 란?

View는 저장된 SELECT 문이다.

오라클에는 테이블말고도 데이터를 읽어 올 수 있는 오브젝트가 있습니다. FROM절에서 사용할 수 있는 것은 테이블만이 아니라는 것입니다. 대표적으로 View라는 오라클 오브젝트를 이용해서 데이터를 조회할 수 있고 실제로 현업에서도 많이 사용되는 오브젝트입니다. 그럼 View는 무엇이고 왜 사용하는 것 일까요?

 

 

 

"View는 저장된 SELECT 문"이라고 표현했습니다. 사전적 의미로 "데이터의 논리적 부분집합"이라고 하는데요, 실질적으로 View를 SELECT문을 이용해서 생성하기 때문에 위와 같이 표현했습니다. 그럼 데이터의 논리적 부분집합이라는게 무엇일까요?

 

데이터의 논리적 부분집합?

데이터의 논리적 부분집합이란 것은 물리적으로 존재하지 않는 테이블을 말합니다. 표현을 하자면 창문을 통해서 데이터를 바라보는 것입니다. 실제 테이블이 있다면 테이블을 SELECT문을 통해서 행, 열을 제거하거나 테이블들을 JOIN 시켜 1차례 가공된 데이터를 View라는 창문을 통해서 조회하는 것 입니다. 그냥 테이블을 조회해도 될텐데 그럼 왜 이런 VIEW를 사용하는 것일까요?

 

 

VIEW 왜 사용할까?

보안강화와 Query의 단순화. 두가지 이유로 VIEW를 사용합니다.

 

 

1. 보안 강화

 

예를들어 20번 부서 사원에 대한 정보를 20번 부서장에게 확인할 수 있는 권한을 주려고합니다. 이때 테이블 전체에 대한 권한을 줘도 상관없지만, 다른 부서사원들의 정보를 제공하거나 급여처럼 개인적인 정보를 같이 보여줄 필요가 없습니다. 이럴때 사용자에게 꼭 필요한 정보만 제공하도록 쿼리문을 작성하여 VIEW를 생성하고, 해당 VIEW에 대해 READ 할 수 있는 권한을 부여해 준다면 보안적인 측면을 강화 시킬 수 있습니다. 데이터의 Access를 제한하고 동인한 데이터의 다른 뷰를 제공하여 데이터의 독립성을 제공할 수 있습니다.

 

 

2. Query 단순화

보안적인 측면을 강화하는 것 뿐만 아니라, Query를 단순화 시켜 가독성을 높일 수 있습니다. 위의 예시에서는 하나의 테이블과 조인을 시켰지만, 다수의 테이블을 조인시키고 SubQuery까지 써가면서 필요한 데이터를 사용자에게 보여줘야하는 경우가 있습니다. 여기서 사용자는 화면으로 출력된 결과만 보는 사용자가 아니라 같이 일을 하는 동료나 협력업체, 개발자 등 쿼리를 직접 보고 작업을 해야하는 사용자라면 해당 스키마와 테이블에 대한 이해도 필요하고 Query 분석에도 시간을 투자해야합니다. 이러한 경우 명칭 만으로 어떤 데이터인지 알 수 있는 VIEW를 생성하여 제공하면 단순화된 쿼리로 작업시간도 단축 시킬 수 있습니다.

 

 

View Performance

View를 사용하면 몇가지 이점을 얻을 수 있는데 그렇다면 Performance적인 성능 측면에서는 어떨까요?

 

View 생성시 사용된 SELECT문을 그대로 이용하기 때문에 큰 차이는 없습니다.

 

다만, View 생성시 force 옵션을 사용하면 쿼리 컴파일하지 않고 View가 생성되기 때문에 컴파일 단계를 건너뛰어 미세하게 빠를 수는 있습니다. View는 Performance를 높이기 위해 사용되지 않습니다.

 

 

View 생성

CREATE 생략가능[OR REPLACE] 생략가능[FORCE | NOFORCE] VIEW 뷰명
AS (SELECT문)
생략가능[WITH CHECK OPTION 생략가능[CONSTRAINT 제약조건명]]
생략가능[WITH READ ONLY 생략가능[CONSTRAINT 제약조건명]]

View 생성 예제는 Oracle Scott 계정으로 진행했습니다.

1
GRANT CREATE VIEWS TO SCOTT;

 

SCOTT 계정에 VIEW를 생성하는 권한이 없다면 DBA권한의 계정에서 권한을 부여해줍니다.

 

20번 부서에 대한 정보담은 VIEW를 생성하겠습니다.

1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE VIEW EMP_DEPT20
AS
SELECT
    EMPNO
    ,ENAME
    ,JOB
    ,SAL
    ,DEPTNO
FROM EMP
WHERE DEPTNO = 20;

 

1
SELECT * FROM EMP_DEPT20;

 

FROM 절에서 테이블 대신 VIEW 명칭으로 데이터 조회가 가능합니다. WHERE 절을 사용하여 추가적인 조건을 걸어 줄 수도 있도 ORDER BY문으로 정렬도 가능합니다.

 

 

DATA DICTIONARY 확인

1
2
3
4
SELECT
    VIEW_NAME
    ,TEXT
FROM USER_VIEWS;

Data Dictionary를 통해 확인해보면 TEXT 칼럼에 View를 생성할때 사용한 SELECT문이 같이 저장됩니다.

 

MAIN QUERY에서 SELECT 문이 실행되었을때 FROM절에 테이블이 아니라는 것을 확인하고 VIEW로 검색을 합니다. 그 이후 FROM절에 저장되어 있는 SELECT문으로 실행이 됩니다.

 

 

VIEW 삭제

VIEW의 삭제는 DROP 명령을 통해서 할수 있습니다.

1
DROP VIEW EMP_DEPT20;

 

 

VIEW 수정

VIEW 오브젝트는 ALTER 명령이 없습니다. 그래서 DROP 이후 다시 생성해서 다시 만들 수도 있겠지만.... VIEW는 생성시 OR REPLACE 옵션을 추가하여 새로 변경하여 생성하는 것을 권장합니다.

 

DROP을 하게 되면 ORACLE 객체가 사라지니까 권한까지 삭제됩니다. OR REPLACE로 새로 생성하면 권한 그대로 남아 있고 해당 SELECT문만 변경됩니다.

 

실제 운영되는 서비스에서 VIEW를 사용하고 있는데 VIEW의 SELECT 문의 변경이 필요한 경우가 있습니다. 이때 DROP을 통해 삭제 후 생성하면 다시 권한을 부여해야하는 번거로움이 있습니다.

 

 

 

VIEW 생성 옵션

OR REPLACE

뷰가 존재하면 다시 생성합니다. 이때 뷰의 권한은 유지됩니다.

 

FORCE | NO FORCE(Default)

FORCE와 NO FORCE 옵션은 실제로 프로젝트에서 많이 사용되는 옵션입니다.

설계를하는 사람과 테이블을 만드는 사람은 실제 분리되어있기 때문에 설계를 하는 쪽에서 미리 테이블 정의서를 확인하고 VIEW를 만들어 놓기 위해 FORCE 옵션을 사용해서 테이블이 구축되기 이전에 생성합니다.

FORCE

 VIEW를 생성할 때 쿼리 컴파일하지 않고 만듭니다.

 

NO FORCE

VIEW를 생성할 때 쿼리 컴파일을 진행합니다. (기본값)

 

 

WITH CHECK OPTION

DML 작업이 뷰 영역에만 적용되도록 할 수 있습니다. 즉, 한번 생성된 뷰에서 데이터의 변경이 없도록 VIEW 단에서 CRUD가 불가능합니다.

 

WITH READ ONLY

DML 작업을 못하게하는 옵션입니다.

 

태그

댓글0