안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 7-1. 뷰(VIEW) 소개를 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번에 진행할 강좌는 뷰(VIEW) 소개입니다.
TL;DR
뷰는 SQL 쿼리로 정의하는 가상 테이블로, 테이블의 데이터를 원하는 대로 다양한 목적에 맞게 거울처럼 비추는 역할을 합니다. 뷰를 사용해 민감한 정보를 보호하거나, 복잡한 JOIN 구문을 단순화시킬 수 있으며, 뷰 정의를 통해 테이블 접근 권한을 제어할 수 있습니다.
뷰는 SQL 쿼리로 정의하는 특수한 가상 테이블입니다. 간략히, 뷰는 테이블을 비추는 거울입니다. 거울이지만, 테이블을 원하는 대로 다양한 목적에 맞춰 비출 수 있습니다.
뷰 예제를 보면서 말씀드리겠습니다.
SQL 쿼리로 뷰 생성
USE AdventureWorks; GO -- employee 테이블 생성 CREATE TABLE Employee ( emp_num INT PRIMARY KEY, emp_login_pwd NVARCHAR(15), emp_name NVARCHAR(10), email NVARCHAR(15), emp_salary BIGINT ); GO -- employee 테이블에 예제 데이터 삽입 INSERT INTO Employee (emp_num, emp_login_pwd, emp_name, email, emp_salary) VALUES (1, N'password1234', N'김대우', N'kdw@example.com', 20000000), (2, N'password!@#$', N'손석구', N'ssk@example.com', 100000000), (3, N'asdfqwer!@#$', N'박은빈', N'peb@example.com', 120000000); GO -- 테이블 직접 조회 SELECT * FROM Employee; GO
실행해 보면, 데이터베이스 사용자 또는 개발자가 업무를 보면서 Employee 테이블에 접근이 가능하다면, 개인정보나 연봉 데이터 등 큰 문제가 됩니다. 물론 비밀번호는 당연히 Hash 암호화되어 있겠지만, 연봉 정보나 개인정보를 볼 수 있다면 여러 문제가 발생할 수 있습니다. 그렇다고, 업무를 보거나, 개발을 하는데, Employee 테이블 접근을 막을 수도 없습니다. 어떻게 해야 할까요?
이럴 때 뷰가 유용합니다. Employee 테이블에 접근을 막고, 뷰를 생성해 뷰에 접근 권한을 허가합니다. 뷰 생성 구문을 확인해 보겠습니다.
-- 뷰를 생성해서 비밀번호나 연봉 같은 민감한 정보로부터 보호 -- v_Employee 뷰를 생성 CREATE VIEW v_Employee AS SELECT emp_num, emp_name, email FROM Employee; GO -- 뷰 조회 SELECT * FROM v_Employee; GO
이렇게 생성한 뷰는 민감한 정보를 보호할 수 있습니다.
앗, 뷰가 바라보는 Employee 테이블에 로우 데이터가 추가되거나
삭제되면 뷰는 어떻게 되나요?
뷰는 거울입니다. 그대로 정의에 따라 테이블 데이터를 반영합니다.
-- employee "테이블"에 데이터 추가 INSERT INTO Employee (emp_num, emp_login_pwd, emp_name, email, emp_salary) VALUES(4, N'zxcvasdf', N'김우빈', N'kwb@example.com', 130000000); GO -- 뷰 조회 SELECT * FROM v_Employee; GO
Employee 테이블의 최신 데이터를 그대로 반영합니다.
복잡한 테이블을 뷰로 생성해 단순화 가능
뷰를 이용해 개발자와 사용자 모두에게, 꼭 필요한 데이터만 초점을 맞출 수 있도록 설정할 수 있습니다. 예를 들어, 세 개의 테이블을 JOIN 하는 SQL 구문을 매번 사용한다면 쿼리가 길고 번잡할 수 있습니다. 이럴 경우 뷰로 생성하고, 필요한 컬럼만 SELECT 절에 리스트 하면 더 단순화시킬 수 있습니다.
다음과 같은 제품, 고객, 주문 테이블을 뷰로 생성합니다.
-- 테이블이 존재하면 삭제 IF OBJECT_ID(N'dbo.orders', N'U') IS NOT NULL DROP TABLE dbo.orders; IF OBJECT_ID(N'dbo.customers', N'U') IS NOT NULL DROP TABLE dbo.customers; IF OBJECT_ID(N'dbo.products', N'U') IS NOT NULL DROP TABLE dbo.products; -- customers 테이블 생성 CREATE TABLE customers ( customer_id INT PRIMARY KEY, customer_name NVARCHAR(10), email NVARCHAR(15) ); GO -- products 테이블 생성 CREATE TABLE products ( product_id INT PRIMARY KEY, product_name NVARCHAR(10), price DECIMAL(10, 0) ); GO -- orders 테이블 생성 CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, product_id INT, order_date DATE, total_amount DECIMAL(10, 0), FOREIGN KEY (customer_id) REFERENCES customers (customer_id), FOREIGN KEY (product_id) REFERENCES products (product_id) ); GO -- customers 테이블에 데이터 삽입 INSERT INTO customers (customer_id, customer_name, email) VALUES (1, N'김대우', N'kdw@example.com'), (2, N'손석구', N'ssk@example.com'), (3, N'박은빈', N'peb@example.com'); GO -- products 테이블에 데이터 삽입 INSERT INTO products (product_id, product_name, price) VALUES (1, N'초코파이', 1200), (2, N'칸쵸', 800), (3, N'포테토칩', 1800), (4, N'꼬북칩', 1300); GO -- orders 테이블에 데이터 삽입 INSERT INTO orders (order_id, customer_id, product_id, order_date, total_amount) VALUES (1, 1, 1, '2022-01-01', 100.50), (2, 1, 3, '2022-02-05', 75.20), (3, 2, 2, '2022-03-10', 150.80), (4, 2, 2, '2022-04-15', 200.00); GO -- 자주 봐야 하는 복잡한 세 개 테이블 JOIN 구문 SELECT products.product_name, customers.customer_name, orders.order_date, orders.total_amount FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id INNER JOIN products ON products.product_id = orders.product_id; GO
이렇게 세 개의 테이블을 JOIN 하는 긴 SQL 구문이 자주 발생합니다. 이럴 경우 복잡한 JOIN 구문을 사용하기보다는 뷰를 생성해 조회하는 것도 한 방법입니다.
-- 복잡한 SQL 구문을 뷰로 생성해 처리. v_Orders 뷰를 생성 CREATE VIEW v_Orders AS SELECT products.product_name, customers.customer_name, orders.order_date, orders.total_amount FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id INNER JOIN products ON products.product_id = orders.product_id; GO -- v_Orders 뷰 조회 SELECT * FROM v_Orders; SELECT * FROM v_Orders WHERE customer_name LIKE N'손석구';
이렇게 뷰를 조회하는 루틴으로 복잡한 SQL 쿼리를 단순화시킬 수 있습니다.
뷰의 정의만 잊지 마세요.
뷰는 SQL 쿼리로 정의하는 특수한 가상 테이블입니다. 간략히, 뷰는 테이블을 비추는 거울입니다. 거울이지만, 테이블을 원하는 대로 다양하게 목적에 맞춰 비출 수 있습니다.
다음 강좌에서 뷰에 대해 좀 더 살펴보겠습니다.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.