본문 바로가기

Oracle

Oracle 뷰(View) 이해 및 활용 가이드

데이터베이스에서 뷰(View)는 가상의 테이블로, 복잡한 쿼리를 숨기고 보안을 강화하며 재사용성을 높여줍니다. 본 포스트에서는 뷰 개념부터 생성·수정·활용 예제까지 단계별로 정리했습니다.


1. 뷰(View)란?

  • 실제 데이터를 저장하지 않는 가상의 테이블
  • 뷰 내부에 저장된 SQL이 실행되어 결과를 반환
  • 주요 장점
    • 편리성: 복잡한 쿼리를 간결한 뷰 이름으로 대체
    • 보안성: 민감 데이터를 숨기거나 특정 사용자에게만 공개

2. 뷰 생성 문법

CREATE [OR REPLACE] VIEW 뷰_이름 AS
SELECT 컬럼1, 컬럼2, …
FROM 테이블명
WHERE 조건;
  • OR REPLACE: 기존 뷰를 수정할 때 사용
  • 뷰 생성 후 SELECT * FROM 뷰_이름;으로 조회

3. 뷰 활용 예제

3.1. 남/여 사원 전용 뷰

CREATE OR REPLACE VIEW sawon_man_view AS --sawon_man_view가 있다는 전제 하에, 'OR REPLACE'가 추가됨
SELECT * FROM sawon WHERE sasex = '남자'; 

CREATE OR REPLACE VIEW sawon_woman_view AS
SELECT * FROM sawon WHERE sasex = '여자';

3.2. 입사 정보 확장 뷰

CREATE OR REPLACE VIEW sawon_view AS
SELECT
  s.*,
  TO_NUMBER(TO_CHAR(sahire,'YYYY')) AS hire_year,
  TO_NUMBER(TO_CHAR(sahire,'MM'))   AS hire_month,
  CASE FLOOR(TO_NUMBER(TO_CHAR(sahire,'MM'))/3)
    WHEN 1 THEN '봄'
    WHEN 2 THEN '여름'
    WHEN 3 THEN '가을'
    ELSE '겨울'
  END AS hire_season
FROM sawon s;
  • hire_year, hire_month로 기간 정보 추출
  • 분기를 계산해 hire_season 컬럼 생성

4. 뷰로 뷰 생성하기

뷰는 다른 뷰를 기반으로도 생성할 수 있습니다.

CREATE OR REPLACE VIEW gogek_view3 AS
SELECT
  gv2.gobun,
  gv2.goname,
  gv2.goaddr,
  gv2.godam,
  SUBSTR(gv2.gojumin,1,8) || '******' AS gojumin,
  TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) - gv2.goborn AS goage,
  CASE MOD(gv2.goborn,12)
    WHEN 1 THEN '닭'
    WHEN 2 THEN '개'
    WHEN 3 THEN '돼지'
    WHEN 4 THEN '쥐'
    WHEN 5 THEN '소'
    WHEN 6 THEN '호랑이'
    WHEN 7 THEN '토끼'
    WHEN 8 THEN '용'
    WHEN 9 THEN '뱀'
    WHEN 10 THEN '말'
    WHEN 11 THEN '양'
    ELSE '원숭이'
  END AS goganji,
  (SUBSTR('경신임계갑을병정무기', MOD(gv2.goborn,10)+1,1) ||
   SUBSTR('신유술해자축인묘진사오미',MOD(gv2.goborn,12)+1,1)) AS goddi,
  CASE 
    WHEN TO_NUMBER(SUBSTR(gv2.gojumin,9,2)) BETWEEN 0 AND 8 THEN '서울'
    WHEN TO_NUMBER(SUBSTR(gv2.gojumin,9,2)) BETWEEN 9 AND 12 THEN '부산'
    WHEN TO_NUMBER(SUBSTR(gv2.gojumin,9,2)) BETWEEN 14 AND 15 THEN '인천'
    -- 이하 생략 --
    ELSE '미상'
  END AS goborncity
FROM gogek_view2 gv2;

5. 뷰를 활용한 고급 예제

5.1. 고객 개인정보 뷰

CREATE OR REPLACE VIEW gogek_view AS
SELECT
  gobun, goname, goaddr, godam,
  SUBSTR(gojumin,1,8) || '******' AS masked_jumin
FROM gogek;
SELECT * FROM gogek_view;
  • 주민등록번호 뒷자리를 마스킹
  • 민감 정보 노출 방지

5.2. 퇴직금 계산 뷰

퇴직금 계산 방식

  • 퇴직금1 = (근속년수 × 월급) + (잔여월수/12 × 월급)
  • 퇴직금2 = (총근무월수 × 월급) / 12
CREATE OR REPLACE VIEW sawon_view2 AS
SELECT
  sv1.*,
  FLOOR(sv1.근속총월수/12) AS 근속년수,
  MOD(sv1.근속총월수,12)  AS 잔여월수,
  TRUNC((MOD(sv1.근속총월수,12)/12*sv1.월급 + FLOOR(sv1.근속총월수/12)*sv1.월급),2) AS 퇴직금1,
  TRUNC((sv1.근속총월수*sv1.월급)/12,2) AS 퇴직금2
FROM (
  SELECT
    sv.*,
    TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE(sahire,'YYYY-MM-DD'))) AS 근속총월수,
    sapay/12 AS 월급
  FROM sawon_view sv
) sv1;
SELECT * FROM sawon_view2;

6. 뷰 보안 설정

  1. 사용자 계정 생성
    CREATE USER test9 IDENTIFIED BY test9;
    GRANT CONNECT TO test9;
    
  2. 뷰 접근 권한 부여
    GRANT SELECT ON gogek_view TO test9;
    
  3. 접속 후 확인
    CONNECT test9/test9;
    SELECT * FROM test.gogek_view;
    

7. 팁 & 주의사항

  • 뷰 내부 SQL이 복잡해지면 성능 저하 가능
  • DML(INSERT/UPDATE/DELETE)은 제한적
  • 데이터 변경이 잦은 테이블은 뷰로 처리할 때 주의
  • 정기적으로 뷰 사용 현황 및 성능 모니터링 권장