뷰(view) 란?
뷰(view)는 데이터베이스 작업 시 기본 테이블에서 유도된 가상 테이블이다. 뷰 테이블 (view table)이라고도 한다. 뷰는 사용자에게 접근이 허용된 데이터만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도되며, 저장장치 내에 물리적으로 존재하지 않지만 사용자에게 있는 것처럼 간주되고 데이터 보정작업, 처리과정 시험 등 임시적인 작업을 위한 용도로 활용된다. 뷰는 조인문의 사용 최소화로 사용상의 편의성을 최대화한다.
데이터베이스에서 뷰(view)는 위와 같은 사전적인 의미를 갖는다. 위의 내용을 요약하면 아래와 같다.
- 데이터베이스에 존재하는 일종의 가상 테이블
- 실제 데이터베이스에 데이터를 적재하지 않음
- 실제 존재하는 테이블처럼 보임
뷰(view)의 주요 이점 중 하나는 데이터 보안이다. 뷰(view)를 사용하면 사용자에게 필요한 데이터만 노출시킬 수 있으며, 민감한 정보를 보호할 수 있다. 또한 복잡한 JOIN 연산에 대한 결과 값을 미리 생성해 복잡한 연산을 피할 수 있다.( 두 가지 예시에 대해서는 아래에 설명하겠다.)
뷰(view) 관련 쿼리(Query)
뷰(view)를 생성하는 SQL 문법은 데이터베이스 문법은 아래와 같다.
- 뷰(view) 생성
CREATE 생략가능[OR REPLACE] 생략가능[FORCE | NOFORCE] VIEW 뷰명
AS (SELECT문)
생략가능[WITH CHECK OPTION 생략가능[CONSTRAINT 제약조건명]]
생략가능[WITH READ ONLY 생략가능[CONSTRAINT 제약조건명]]
- 뷰(view) 삭제
DROP VIEW VIEWNAME [RESTRICT] or [CASCADE]
예시1)
위는 Salary라는 급여정보를 저장하는 예시 테이블이다. 여기서 뷰(view)를 사용해서 role의 값이 관리자(admin)가 아닌 고용인(employee)에 해당하는 정보만 표시할 수 있는 가상의 뷰(view) 테이블을 생성할 수 있다.
CREATE VIEW SalaryView AS
SELECT id, employee_name, salary FROM salary WHERE role = 'employee';
위와 같이 뷰(view)를 생성하는 SQL 문을 삽입 했을 때, 아래와 같이 데이터베이스 내에 views라는 가상의 테이블 폴더와 위 조건에 부합하는(role = 'employee')인 유저들만 표기되는 별도의 가상 테이블이 생성된 것을 확인할 수 있다.
이렇게 뷰(view)를 사용하면 위 예시와 같이, 특정 사용자에게 특정 열만 보이도록 허용하거나, 특정 행만 보이도록 제한할 수 있다. 이렇게 함으로써 접근 제어를 통한 보안을 높일 수 있다.
예시 2)
위는 간단한 예시로 Salary라는 급여정보 테이블과 Department라는 부서 테이블을 나타낸다. 급여정보 테이블이 부서 테이블을 참조하고 있다. 여기서 두 테이블을 한 번에 조회하기 위해서는 일반적으로 두 개의 테이블을 JOIN 해야된다. 이러한 조인(JOIN)을 뷰(view)로 정의하고 나면, 필요한 경우 두 테이블을 매번 조인할 필요 없이 뷰를 사용하여 직접 쿼리 할 수 있다.
CREATE VIEW EmployeeDepartmentView AS
SELECT s.id, s.employee_name, s.salary, d.department_name
FROM salary s
JOIN department d ON s.department_id = d.id;
SELECT * FROM EmployeeDepartmentView;
위와 같이 뷰(view)로 미리 JOIN 테이블을 만들어 두면, 이후에 JOIN 된 테이블에 접근할 때, 훨씬 빠르게 접근할 수 있고 복잡한 연산을 줄일 수 있는 장점이 있다.
뷰(view)의 단점
위 예시에서 설명했듯이 뷰(view)를 사용했을 때, 가저갈 수 있는 다양한 이점이 있다. 하지만 이와 반대로 단점도 존재한다.
- 뷰(view)로 생성된 테이블은 UNION, GROUP BY 등을 사용하는 복합 뷰(view)인 경우에 단순 조회가 아닌 INSERT, UPDATE, DELETE 구문이 불가능.
- 뷰(view)를 남발해서 생성한 테이블로 서비스를 구성한다면 서비스가 가상 테이블인 뷰(view)에 의존적일 수 있음.
- 독립적인 INDEX 사용불가
위와 같은 단점도 존재하기 때문에, 실 서비스에서 적절한 테이블에 뷰(view)를 생성해서 사용하는 게 바람직하다.
참고