[DB]데이터베이스 개념노트 17편 - 뷰(View)

데이터베이스 개념노트 17편 - 뷰(View)

지난 글에서는 데이터를 빠르게 검색하기 위한 데이터베이스 객체인 인덱스(Index)에 대해 정리했습니다.

이번 글에서는 SELECT문을 더 편리하고 안전하게 사용할 수 있도록 도와주는 뷰(View)에 대해 정리해 보겠습니다.

뷰는 실제 테이블처럼 조회할 수 있지만, 일반적으로 데이터를 직접 저장하지는 않습니다. 복잡한 SELECT문을 하나의 가상 테이블처럼 사용할 수 있게 해주는 데이터베이스 객체입니다.


1. 뷰란?

뷰(View)는 하나 이상의 테이블을 기반으로 만든 가상의 테이블입니다.

는 SELECT문을 저장해두고, 사용자가 테이블처럼 조회할 수 있게 만든 데이터베이스 객체이다.

뷰는 실제 데이터를 직접 저장하는 테이블과 다릅니다. 일반적인 뷰는 데이터를 저장하지 않고, 뷰를 조회할 때 미리 정의된 SELECT문이 실행되어 결과를 보여줍니다.


2. 뷰를 쉽게 이해하기

뷰는 복잡한 SELECT문에 이름을 붙여둔 것이라고 생각하면 쉽습니다.

예를 들어 회원 테이블과 주문 테이블을 JOIN해서 회원별 주문 정보를 자주 조회한다고 해보겠습니다. 매번 긴 JOIN SQL을 작성하는 것은 번거롭습니다.

SELECT M.회원번호,
       M.회원명,
       M.회원등급,
       O.주문번호,
       O.주문금액,
       O.주문일자
FROM 회원 M
JOIN 주문 O
  ON M.회원번호 = O.회원번호;

이 SELECT문을 뷰로 만들어두면 다음부터는 간단히 조회할 수 있습니다.

SELECT *
FROM 회원주문뷰;

즉, 뷰는 복잡한 SQL을 단순하게 사용할 수 있도록 도와줍니다.


3. 뷰와 테이블의 차이

구분 테이블
데이터 저장 실제 데이터를 저장 일반적으로 실제 데이터를 저장하지 않음
기반 독립적인 데이터 저장 구조 하나 이상의 테이블 또는 다른 뷰를 기반으로 함
사용 방식 직접 조회, 입력, 수정, 삭제 가능 테이블처럼 조회 가능, 수정은 제한될 수 있음
목적 데이터 저장 조회 편의성, 보안, SQL 단순화

정리하면 테이블은 데이터를 저장하는 구조이고, 뷰는 테이블을 기반으로 만들어진 조회용 가상 테이블입니다.


4. 뷰가 필요한 이유

뷰를 사용하는 이유는 다양합니다.

  • 복잡한 SELECT문을 단순하게 사용할 수 있다.
  • 자주 사용하는 조회 SQL을 재사용할 수 있다.
  • 사용자에게 필요한 컬럼만 보여줄 수 있다.
  • 민감한 데이터를 숨겨 보안을 강화할 수 있다.
  • 원본 테이블 구조 변경의 영향을 줄일 수 있다.

특히 SQLD에서는 뷰의 장점으로 독립성, 편리성, 보안성을 기억하면 좋습니다.


5. 예제 테이블

이번 글에서는 다음 회원 테이블과 주문 테이블을 기준으로 예제를 살펴보겠습니다.

회원 테이블

회원번호 회원명 이메일 회원등급
M001 김지훈 jihoon@example.com 골드
M002 이수진 sujin@example.com 실버
M003 박민수 minsu@example.com 일반

주문 테이블

주문번호 회원번호 주문금액 주문일자
O001 M001 30000 2026-01-10
O002 M001 15000 2026-01-12
O003 M002 120000 2026-01-15

6. CREATE VIEW 기본 문법

뷰는 CREATE VIEW 문으로 생성합니다.

CREATE VIEW 뷰이름 AS
SELECT 컬럼명
FROM 테이블명
WHERE 조건;

뷰 이름 뒤에 AS를 쓰고, 그 뒤에 뷰로 저장할 SELECT문을 작성합니다.


7. 간단한 뷰 생성하기

회원 테이블에서 회원번호, 회원명, 회원등급만 보여주는 뷰를 만들어 보겠습니다.

CREATE VIEW 회원기본정보뷰 AS
SELECT 회원번호,
       회원명,
       회원등급
FROM 회원;

이제 회원기본정보뷰를 테이블처럼 조회할 수 있습니다.

SELECT *
FROM 회원기본정보뷰;

뷰를 조회하면 실제로는 회원 테이블을 기반으로 한 SELECT 결과가 반환됩니다.


8. 보안을 위한 뷰

뷰는 보안 목적으로도 사용할 수 있습니다. 예를 들어 회원 테이블에는 이메일 같은 개인정보가 있지만, 일반 조회 사용자에게는 이메일을 보여주고 싶지 않을 수 있습니다.

CREATE VIEW 회원공개정보뷰 AS
SELECT 회원번호,
       회원명,
       회원등급
FROM 회원;

사용자는 회원공개정보뷰만 조회하게 하고, 원본 회원 테이블에 대한 접근 권한은 주지 않으면 이메일 같은 민감한 컬럼을 숨길 수 있습니다.

GRANT SELECT
ON 회원공개정보뷰
TO USER_A;

이처럼 뷰는 사용자에게 필요한 데이터만 보여주는 보안 계층으로 활용할 수 있습니다.


9. JOIN을 이용한 뷰

뷰는 하나의 테이블뿐만 아니라 여러 테이블을 JOIN한 결과로도 만들 수 있습니다.

CREATE VIEW 회원주문뷰 AS
SELECT M.회원번호,
       M.회원명,
       M.회원등급,
       O.주문번호,
       O.주문금액,
       O.주문일자
FROM 회원 M
JOIN 주문 O
  ON M.회원번호 = O.회원번호;

이제 회원주문뷰를 조회하면 회원과 주문을 JOIN한 결과를 간단히 볼 수 있습니다.

SELECT *
FROM 회원주문뷰;

매번 JOIN문을 길게 작성하지 않아도 되므로 SQL 작성이 훨씬 간단해집니다.


10. 조건을 포함한 뷰

WHERE 조건을 포함한 뷰도 만들 수 있습니다. 예를 들어 골드 회원만 조회하는 뷰를 만들어 보겠습니다.

CREATE VIEW 골드회원뷰 AS
SELECT 회원번호,
       회원명,
       회원등급
FROM 회원
WHERE 회원등급 = '골드';

이 뷰를 조회하면 회원등급이 골드인 회원만 결과에 나타납니다.

SELECT *
FROM 골드회원뷰;

11. 집계 결과를 보여주는 뷰

GROUP BY와 집계 함수를 사용한 결과도 뷰로 만들 수 있습니다.

CREATE VIEW 회원별주문합계뷰 AS
SELECT M.회원번호,
       M.회원명,
       SUM(O.주문금액) AS 총주문금액,
       COUNT(O.주문번호) AS 주문건수
FROM 회원 M
LEFT OUTER JOIN 주문 O
  ON M.회원번호 = O.회원번호
GROUP BY M.회원번호, M.회원명;

이제 회원별 주문 합계를 간단히 조회할 수 있습니다.

SELECT *
FROM 회원별주문합계뷰
ORDER BY 총주문금액 DESC;

보고서나 통계성 조회에서 이런 뷰를 활용하면 SQL을 재사용하기 편리합니다.


12. CREATE OR REPLACE VIEW

이미 존재하는 뷰를 수정하고 싶을 때는 CREATE OR REPLACE VIEW를 사용할 수 있습니다.

CREATE OR REPLACE VIEW 회원기본정보뷰 AS
SELECT 회원번호,
       회원명,
       회원등급,
       이메일
FROM 회원;

위 SQL은 회원기본정보뷰가 없으면 새로 만들고, 이미 존재하면 기존 뷰 정의를 새 SELECT문으로 변경합니다.

뷰를 수정할 때는 해당 뷰를 사용하는 SQL이나 프로그램에 영향이 없는지 확인해야 합니다.


13. 뷰 조회하기

뷰는 테이블처럼 SELECT문으로 조회합니다.

SELECT *
FROM 회원기본정보뷰;

조건을 붙여 조회할 수도 있습니다.

SELECT 회원번호,
       회원명
FROM 회원기본정보뷰
WHERE 회원등급 = '골드';

뷰 위에 다시 WHERE, ORDER BY, GROUP BY 등을 사용할 수 있습니다.


14. 뷰 삭제하기

뷰를 삭제할 때는 DROP VIEW를 사용합니다.

DROP VIEW 회원기본정보뷰;

뷰를 삭제해도 원본 테이블의 데이터는 삭제되지 않습니다. 뷰 객체만 삭제됩니다.

삭제 대상 결과
삭제됨
원본 테이블 유지됨
원본 데이터 유지됨

15. 뷰의 장점

뷰를 사용하면 다음과 같은 장점이 있습니다.

장점 설명
편리성 복잡한 SELECT문을 간단히 재사용할 수 있다.
보안성 사용자에게 필요한 컬럼과 행만 보여줄 수 있다.
논리적 독립성 원본 테이블 구조 변경의 영향을 일부 줄일 수 있다.
재사용성 자주 사용하는 조회 로직을 뷰로 만들어 반복 사용할 수 있다.

16. 뷰의 단점

뷰는 편리하지만 단점도 있습니다.

  • 뷰가 복잡하면 성능이 저하될 수 있다.
  • 뷰 위에 또 다른 뷰를 여러 번 중첩하면 구조 파악이 어려워질 수 있다.
  • 일부 뷰는 INSERT, UPDATE, DELETE가 제한될 수 있다.
  • 원본 테이블이 변경되면 뷰가 영향을 받을 수 있다.

특히 복잡한 JOIN과 집계가 포함된 뷰를 무분별하게 사용하면 성능 문제를 만들 수 있습니다.


17. 뷰를 통한 데이터 변경

뷰는 조회용으로 많이 사용되지만, 조건에 따라 INSERT, UPDATE, DELETE가 가능할 수도 있습니다.

예를 들어 하나의 테이블을 기반으로 하고, 복잡한 집계나 DISTINCT가 없는 단순 뷰는 데이터 변경이 가능할 수 있습니다.

CREATE VIEW 회원단순뷰 AS
SELECT 회원번호,
       회원명,
       회원등급
FROM 회원;

이런 단순 뷰에서는 다음과 같은 UPDATE가 가능할 수 있습니다.

UPDATE 회원단순뷰
SET 회원등급 = 'VIP'
WHERE 회원번호 = 'M001';

이 경우 실제로는 원본 테이블인 회원 테이블의 데이터가 수정됩니다.


18. 변경이 어려운 뷰

모든 뷰에서 데이터 변경이 가능한 것은 아닙니다. 다음과 같은 뷰는 일반적으로 INSERT, UPDATE, DELETE가 제한될 수 있습니다.

  • GROUP BY를 사용한 뷰
  • 집계 함수를 사용한 뷰
  • DISTINCT를 사용한 뷰
  • 여러 테이블을 JOIN한 복잡한 뷰
  • 계산 컬럼을 포함한 뷰

예를 들어 회원별 주문 합계 뷰는 집계 결과를 보여주는 뷰입니다.

CREATE VIEW 회원별주문합계뷰 AS
SELECT 회원번호,
       SUM(주문금액) AS 총주문금액
FROM 주문
GROUP BY 회원번호;

이 뷰의 총주문금액은 실제 컬럼이 아니라 계산된 결과입니다. 따라서 이 값을 직접 UPDATE하는 것은 일반적으로 어렵습니다.


19. 단순 뷰와 복합 뷰

뷰는 구성 방식에 따라 단순 뷰와 복합 뷰로 나눌 수 있습니다.

구분 설명 데이터 변경 가능성
단순 뷰 하나의 테이블을 기반으로 단순 조회 가능할 수 있음
복합 뷰 JOIN, GROUP BY, 함수, DISTINCT 등을 포함 제한될 가능성이 높음

SQLD에서는 뷰가 항상 수정 가능한 것이 아니라, 뷰의 정의에 따라 수정 가능 여부가 달라진다는 점을 기억해야 합니다.


20. WITH CHECK OPTION

WITH CHECK OPTION은 뷰의 조건을 벗어나는 데이터 변경을 막기 위한 옵션입니다.

예를 들어 골드 회원만 보여주는 뷰를 만들었다고 해보겠습니다.

CREATE VIEW 골드회원뷰 AS
SELECT 회원번호,
       회원명,
       회원등급
FROM 회원
WHERE 회원등급 = '골드'
WITH CHECK OPTION;

이 뷰는 회원등급이 골드인 데이터만 보여줍니다. WITH CHECK OPTION을 사용하면 뷰를 통해 데이터를 변경할 때도 회원등급 = '골드' 조건을 만족해야 합니다.

예를 들어 골드회원뷰를 통해 회원등급을 일반으로 바꾸는 작업은 제한될 수 있습니다.

UPDATE 골드회원뷰
SET 회원등급 = '일반'
WHERE 회원번호 = 'M001';

이 변경을 허용하면 해당 행은 더 이상 골드회원뷰의 조건에 맞지 않게 됩니다. WITH CHECK OPTION은 이런 변경을 막는 역할을 합니다.


21. WITH READ ONLY

WITH READ ONLY는 뷰를 읽기 전용으로 만드는 옵션입니다.

CREATE VIEW 회원조회전용뷰 AS
SELECT 회원번호,
       회원명,
       회원등급
FROM 회원
WITH READ ONLY;

이 뷰는 SELECT 조회만 가능하고, INSERT, UPDATE, DELETE 같은 데이터 변경 작업은 할 수 없습니다.

조회 전용 화면이나 분석용 사용자에게 제공하는 뷰에 활용할 수 있습니다.


22. 뷰와 권한

뷰는 권한 관리와 함께 사용하면 보안성이 좋아집니다.

예를 들어 원본 회원 테이블에는 이메일, 전화번호, 주소 같은 민감한 정보가 있다고 해보겠습니다. 일반 사용자에게 원본 테이블 권한을 직접 주지 않고, 필요한 컬럼만 포함한 뷰 권한을 부여할 수 있습니다.

CREATE VIEW 회원공개뷰 AS
SELECT 회원번호,
       회원명,
       회원등급
FROM 회원;
GRANT SELECT
ON 회원공개뷰
TO USER_A;

이렇게 하면 USER_A는 회원공개뷰는 조회할 수 있지만, 원본 회원 테이블의 민감한 컬럼은 볼 수 없습니다.


23. 뷰와 논리적 독립성

뷰는 논리적 독립성을 높이는 데 도움을 줄 수 있습니다.

예를 들어 원본 테이블의 컬럼명이 변경되거나 테이블 구조가 일부 변경되더라도, 뷰를 통해 사용자에게 동일한 형태의 결과를 제공할 수 있습니다.

물론 모든 구조 변경을 뷰가 완전히 흡수할 수 있는 것은 아니지만, 사용자나 응용 프로그램이 원본 테이블 구조에 직접 의존하는 것을 줄일 수 있습니다.


24. 인라인 뷰란?

인라인 뷰(Inline View)는 FROM절 안에 작성하는 서브쿼리를 의미합니다.

SELECT A.회원등급,
       A.총주문금액
FROM (
  SELECT M.회원등급,
         SUM(O.주문금액) AS 총주문금액
  FROM 회원 M
  JOIN 주문 O
    ON M.회원번호 = O.회원번호
  GROUP BY M.회원등급
) A
WHERE A.총주문금액 >= 100000;

괄호 안의 SELECT 결과를 임시 테이블처럼 사용하고 있습니다. 이처럼 FROM절의 서브쿼리를 인라인 뷰라고 합니다.

인라인 뷰는 실제 데이터베이스 객체로 저장되는 뷰와 달리, SQL문 안에서 일시적으로 사용되는 조회 결과입니다.


25. 일반 뷰와 인라인 뷰 비교

구분 일반 뷰 인라인 뷰
정의 위치 CREATE VIEW로 데이터베이스에 생성 SELECT문의 FROM절 안에 작성
저장 여부 뷰 객체로 저장 SQL 실행 중에만 사용
재사용성 여러 SQL에서 재사용 가능 해당 SQL 안에서만 사용
예시 CREATE VIEW 회원뷰 AS ... FROM (SELECT ... ) A

26. 뷰와 머티리얼라이즈드 뷰

일반적인 뷰는 데이터를 직접 저장하지 않습니다. 반면 머티리얼라이즈드 뷰(Materialized View)는 조회 결과를 실제로 저장해두는 객체입니다.

구분 일반 뷰 머티리얼라이즈드 뷰
데이터 저장 일반적으로 저장하지 않음 조회 결과를 저장함
조회 방식 조회 시 SELECT문 실행 저장된 결과를 조회
성능 원본 테이블 조회 비용 발생 조회가 빠를 수 있음
데이터 최신성 원본 데이터 기준 갱신 시점에 따라 차이 가능

SQLD 기본 학습에서는 일반적인 뷰를 중심으로 이해하면 충분합니다. 머티리얼라이즈드 뷰는 성능 개선을 위해 조회 결과를 저장해두는 특수한 뷰라고 가볍게 알아두면 좋습니다.


27. 뷰 사용 시 주의사항

뷰를 사용할 때는 다음 사항을 주의해야 합니다.

  • 뷰가 복잡해질수록 성능 문제가 생길 수 있다.
  • 뷰 위에 뷰를 계속 쌓으면 SQL 구조를 파악하기 어려워진다.
  • 원본 테이블이 변경되면 뷰가 invalid 상태가 되거나 오류가 발생할 수 있다.
  • 뷰를 통해 데이터 변경이 항상 가능한 것은 아니다.
  • 보안 목적으로 사용할 때 원본 테이블 권한도 함께 확인해야 한다.

뷰는 편리하지만 무조건 많이 만드는 것보다 목적을 분명히 하고 사용하는 것이 좋습니다.


28. 뷰에서 자주 하는 실수

실수 주의할 점
뷰가 실제 데이터를 저장한다고 생각함 일반적인 뷰는 SELECT문 정의를 저장하고 조회 시 원본을 참조함
뷰를 삭제하면 원본 테이블도 삭제된다고 생각함 DROP VIEW는 뷰만 삭제하고 원본 테이블은 유지함
모든 뷰에서 UPDATE가 가능하다고 생각함 GROUP BY, DISTINCT, JOIN 등이 있으면 변경이 제한될 수 있음
보안용 뷰를 만들고 원본 테이블 권한도 그대로 부여함 원본 테이블 권한까지 열려 있으면 보안 효과가 줄어듦
뷰를 과도하게 중첩함 성능과 유지보수성이 떨어질 수 있음

29. SQLD 관점에서 꼭 기억할 내용

이번 글에서 SQLD 공부를 위해 꼭 기억해야 할 내용은 다음과 같습니다.

  • 뷰는 하나 이상의 테이블을 기반으로 만든 가상 테이블이다.
  • 일반적인 뷰는 실제 데이터를 직접 저장하지 않는다.
  • 뷰는 SELECT문을 저장해두고 테이블처럼 조회할 수 있게 한다.
  • 뷰는 복잡한 SQL을 단순화하고 재사용성을 높일 수 있다.
  • 뷰는 필요한 컬럼이나 행만 보여주어 보안성을 높일 수 있다.
  • DROP VIEW를 해도 원본 테이블과 데이터는 삭제되지 않는다.
  • 단순 뷰는 데이터 변경이 가능할 수 있지만 복합 뷰는 제한될 수 있다.
  • WITH CHECK OPTION은 뷰 조건을 벗어나는 변경을 막는다.
  • WITH READ ONLY는 뷰를 조회 전용으로 만든다.
  • 인라인 뷰는 FROM절 안에 작성하는 서브쿼리이다.

30. 핵심 요약

개념 핵심 내용
SELECT문을 기반으로 만든 가상 테이블
CREATE VIEW 새로운 뷰를 생성한다.
CREATE OR REPLACE VIEW 뷰가 있으면 수정하고, 없으면 생성한다.
DROP VIEW 뷰 객체를 삭제한다.
단순 뷰 하나의 테이블 기반 단순 조회 뷰
복합 뷰 JOIN, GROUP BY, DISTINCT, 함수 등을 포함한 뷰
WITH CHECK OPTION 뷰의 조건을 벗어나는 데이터 변경을 제한한다.
WITH READ ONLY 뷰를 조회 전용으로 만든다.
인라인 뷰 FROM절에서 사용하는 서브쿼리

31. 마무리

이번 글에서는 SELECT문을 더 편리하게 사용할 수 있도록 도와주는 뷰에 대해 정리했습니다.

뷰는 실제 테이블처럼 조회할 수 있지만, 일반적으로 데이터를 직접 저장하지 않고 원본 테이블을 기반으로 결과를 보여주는 가상 테이블입니다. 복잡한 SELECT문을 단순화하고, 자주 사용하는 조회 로직을 재사용하며, 사용자에게 필요한 데이터만 보여주는 보안 수단으로도 활용할 수 있습니다.

SQLD에서는 뷰의 개념과 장점, 뷰와 테이블의 차이, 뷰 삭제 시 원본 테이블이 유지된다는 점, 단순 뷰와 복합 뷰의 변경 가능성 차이를 잘 기억해두면 좋습니다.

다음 글에서는 SQLD에서 자주 출제되는 서브쿼리(Subquery)에 대해 정리해 보겠습니다.