🗄️ 데이터베이스

View

가상 테이블. 쿼리 결과를 테이블처럼 사용. 데이터 추상화.

📖 상세 설명

뷰(View)는 하나 이상의 테이블에서 데이터를 조회하는 SELECT 쿼리를 저장해두고, 마치 테이블처럼 사용할 수 있게 하는 가상 테이블입니다. 실제 데이터를 저장하지 않고 조회 시점에 기반 테이블에서 데이터를 가져옵니다.

뷰의 주요 용도는 복잡한 쿼리 단순화(자주 쓰는 조인을 뷰로 만들어 재사용), 보안(특정 컬럼만 노출), 데이터 추상화(기반 테이블 구조 변경 시 뷰만 수정), 비즈니스 로직 캡슐화 등입니다.

일반 뷰는 조회 시마다 쿼리를 실행하지만, 머티리얼라이즈드 뷰는 결과를 물리적으로 저장해 성능을 높입니다. 업데이트 가능 뷰(Updatable View)를 통해 데이터 삽입/수정도 가능합니다.

💻 코드 예제

-- 기본 뷰 생성: 활성 사용자만 조회
CREATE VIEW active_users AS
SELECT id, name, email, created_at
FROM users
WHERE status = 'active' AND deleted_at IS NULL;

-- 뷰 사용 (테이블처럼)
SELECT * FROM active_users WHERE created_at > '2024-01-01';

-- 복잡한 조인을 뷰로 단순화
CREATE VIEW order_summary AS
SELECT
    o.id AS order_id,
    c.name AS customer_name,
    SUM(oi.quantity * oi.price) AS total,
    o.created_at
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN order_items oi ON o.id = oi.order_id
GROUP BY o.id, c.name, o.created_at;

-- 보안용 뷰: 민감 정보 숨김
CREATE VIEW public_employees AS
SELECT id, name, department, hire_date
FROM employees;  -- salary, ssn 등은 제외

-- 업데이트 가능 뷰 (단일 테이블 기반)
CREATE VIEW pending_orders AS
SELECT * FROM orders WHERE status = 'pending';

UPDATE pending_orders SET status = 'processing' WHERE id = 123;

🗣️ 실무 대화 예시

주니어 개발자: "이 조인 쿼리가 여러 API에서 중복으로 쓰이는데 어떻게 하면 좋을까요?"

시니어 개발자: "뷰로 만들어두면 되겠네요. 한 번 정의해두면 테이블처럼 쓸 수 있어서 중복도 없애고 수정도 한 곳에서 하면 되니까요."

주니어 개발자: "성능에 문제는 없나요?"

시니어 개발자: "일반 뷰는 매번 쿼리 실행하는 거라 똑같아요. 성능이 중요하면 머티리얼라이즈드 뷰 고려하면 됩니다."

면접관: "뷰의 장단점과 사용 사례를 설명해주세요."

지원자: "장점은 복잡한 쿼리 재사용, 보안(컬럼 숨김), 테이블 구조 변경 시 영향 최소화입니다. 단점은 성능 오버헤드와 업데이트 제한입니다. 저는 BI 대시보드용 리포팅 뷰와 API별 권한 분리에 활용했습니다."

면접관: "뷰와 머티리얼라이즈드 뷰의 차이는요?"

지원자: "일반 뷰는 정의만 저장하고 조회 시 실행하지만, 머티리얼라이즈드 뷰는 결과를 물리적으로 저장해 빠르게 조회합니다. 대신 갱신이 필요합니다."

리뷰어: "이 뷰 조회하고 나서 추가로 WHERE 조건 거는 패턴이 많네요."

개발자: "네, 기본 뷰에 조건 추가해서 쓰고 있어요."

리뷰어: "뷰 안에 조건을 넣을 수 있으면 옵티마이저가 더 효율적으로 실행할 수 있어요. 자주 쓰는 필터는 뷰 정의에 포함하는 게 좋습니다."

개발자: "알겠습니다. 뷰를 좀 더 구체적으로 분리해보겠습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기