뷰는 DB 개체 중 하나이고 테이블과 아주 밀접한 관련이 있다.
VIEW는 한 번 생성하면 테이블이라고 생각하고 사용할 정도로 사용자들의 입장에서는 테이블과 거의 동일한 개체로 취급한다.
VIEW는 실제로 데이터를 갖고 있지는 않지만 VIEW에 접근하면 SELECT가 실행되어 그 결과가 화면에 출력되도록 한다.
VIEW는 단순 뷰와 복합 뷰로 나뉘는데, 단순 뷰는 하나의 테이블과 연관된 뷰를 말하며 복합 뷰는 2개 이상의 테이블과 연관된 뷰를 말한다.
VIEW는 SELECT로 호출해온 결과 또한 테이블과 유사한 모양을 가졌다는 아이디어에서 나왔다.
VIEW의 실체는 SELECT 문이며 실제로 이름을 구분하기 위해 앞에 V_ 로 이름을 붙여 구분한다.
CREATE VIEW V_이름
AS
SELECT 문;
뷰를 만든 후 접근하는 방식은 테이블과 동일하게 SELECT 문을 사용한다.
전체에 접근할 수도 있고, 필요에 따라 조건식도 테이블과 동일하게 사용할 수 있다.
SELECT 열_이름 FROM 뷰_이름
WHERE 조건
사용자는 아래와 같은 과정으로 VIEW에 접근한다.
1. VIEW 조회
2. VIEW의 쿼리 실행
3. VIEW로 쿼리의 결과값 전달
4. VIEW에서 사용자에게 결과값 전달
사용자는 1, 4번에서만 모두 처리된 것으로 이해할 수 있고, 실제로는 4가지 과정을 거친다.
뷰는 기본적으로 읽기 전용으로 사용되지만 뷰를 통해서 원본 테이블의 데이터를 수정할 수도 있다.
물론 몇가지 조건을 만족해야한다.
테이블에 직접 접근하지 않고 굳이 뷰를 사용하는 이유는 아래와 같다.
보안에 도움이 된다.
회원 테이블의 경우, 중요한 개인정보가 포함되지 않고 필요한 ID, 이름 등만 포함하도록 하는 뷰를 별도로 만든다면 사용자가 원본 테이블까지 접근할 필요 없이 뷰까지만 접근할 수 있도록 제한하며 원본에는 접근할 수 없도록 한다면 필요한 데이터만을 사용할 수 있다.
이러한 방식으로 DB도 사용자마다 접근 권한에 차별을 둬서 처리하도록 하고 있고, 사용자 별로 권한을 나누는 것이 DB 보안의 중요한 주제 중 하나라고 할 수 있다.
복잡한 쿼리를 단순하게 만들 수 있다.
길고 복잡한 쿼리를 자주 사용해야 한다면 사용자는 매번 복잡한 쿼리를 입력해야 한다.
이러한 경우 복잡한 쿼리 자체를 뷰로 만들고 사용자들은 해당 뷰에만 접근하도록 하여 필요한 결과 쿼리만 만들 수 있다면 복잡한 SQL을 일일이 입력할 필요가 없다.
뷰를 통해 데이터를 입력하기 위해서는 뷰가 참조하지 않는 테이블의 열에서 NOT NULL이 없어야 한다.
(참조하지 않는 열에는 원래 테이블에 값을 입력할 방법이 없으므로 NULL 값이 들어가기 때문이다.)
만약 참조하지 않는 열에 NOT NULL이 포함되어 있다면, 그 열을 포함하도록 뷰를 재정의하거나 원본 테이블의 열 속성을 NULL로 바꾸거나 DEFAULT를 지정해야한다.
VIEW를 통해 데이터를 입력하는 경우, 뷰의 조건에서 벗어나는 데이터를 입력하면 데이터 자체는 입력되나 뷰에서 조회할 수 없다.
이렇게 의도치 않은 입력을 방지하기 위해서는 VIEW에 WITH CHECK OPTION을 설정해서 뷰에 설정된 값의 범위를 벗어가는 값은 입력되지 않도록 한다.
하나의 테이블로 만든 뷰는 단순 뷰, 2개 이상의 테이블로 만든 뷰는 복합 뷰라고 한다.
여기서 복합 뷰는 두 테이블을 조인한 결과를 뷰로 만들 때 사용하는데, 복합 뷰는 읽기 전용 뷰이며 복합 뷰를 통해서는 원본 테이블에 데이터를 입력/수정/삭제 할 수 없다.
뷰가 따로 조회되지 않는 경우 CHECK TABLE 문으로 뷰의 상태를 확인할 수 있다.
참조 시 에러코드가 설명이 나오는데 그 설명을 참조해서 뷰를 적절히 수정하거나 테이블을 수정해 문제를 해결할 수 있다.