DB

[MySQL] SELECT 쿼리를 VIEW로 추상화 (복잡한 SQL을 깔끔하게 관리)

인생아 2025. 6. 30. 12:21
반응형

MySQL에서 복잡한 SELECT 문을 반복해서 사용하다 보면 쿼리의 가독성이 떨어지고 유지보수가 어려워지는 문제가 발생한다. 이를 해결하는 가장 강력한 도구가 바로 VIEW(뷰)이다.

VIEW는 하나 이상의 테이블을 대상으로 작성된 SELECT 문을 가상의 테이블처럼 재사용할 수 있도록 해주는 기능이다. SQL 로직을 추상화하고 재사용성과 보안성을 동시에 높일 수 있기 때문에, 규모가 있는 프로젝트일수록 반드시 활용해야 할 기능이다.

✅ VIEW란 무엇인가?

VIEW는 데이터베이스 내에 논리적인 가상 테이블이다. 실제 데이터를 저장하지 않고, 미리 정의한 SELECT 문을 저장해두고 필요할 때마다 마치 테이블처럼 조회할 수 있다.

즉, 복잡한 SELECT 쿼리를 한 줄로 간결하게 대체할 수 있는 추상화 수단이다.

✅ VIEW의 기본 문법

CREATE VIEW view_name AS
SELECT column1, column2
FROM table_name
WHERE 조건;

조회는 일반 테이블처럼 가능하다.

SELECT * FROM view_name;
반응형

✅ VIEW 사용의 장점

  1. 복잡한 쿼리의 재사용
    동일한 SELECT 문을 반복 작성하지 않아도 된다.
  2. 보안성과 권한 제어
    테이블 전체를 노출하지 않고, 제한된 컬럼만 보여줄 수 있다.
  3. 비즈니스 로직 분리
    백엔드 코드에서 SQL 로직을 줄이고, DB 관리 측에서 유연하게 수정 가능하다.
  4. 유지보수 용이성
    테이블 구조가 바뀌어도 VIEW만 수정하면 전체 쿼리를 바꿀 필요가 없다.

✅ 실전 예제: 고객과 주문 데이터 통합 조회

기존 쿼리:

SELECT c.name, o.order_date, o.total_price
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.status = '완료';

위 쿼리를 뷰로 추상화:

CREATE VIEW completed_orders_view AS
SELECT c.name AS customer_name,
       o.order_date,
       o.total_price
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.status = '완료';

이제 다음과 같이 간단하게 사용할 수 있다.

SELECT * FROM completed_orders_view;

복잡한 JOIN 조건과 필터링이 한 줄로 추상화되므로 개발 생산성이 높아진다.

✅ 조건이 있는 VIEW 사용

CREATE VIEW vip_customers_view AS
SELECT id, name, total_spent
FROM customers
WHERE total_spent >= 1000000;

이 뷰는 VIP 고객 목록만 담고 있어, 권한을 이 뷰에만 부여하면 데이터 접근 통제가 쉬워진다.

반응형

✅ VIEW를 활용한 서브쿼리 단순화

CREATE VIEW recent_orders AS
SELECT *
FROM orders
WHERE order_date >= CURDATE() - INTERVAL 30 DAY;

이 뷰를 다른 쿼리에서 서브쿼리처럼 활용할 수 있다.

SELECT customer_id
FROM recent_orders
GROUP BY customer_id;

✅ VIEW 관리 명령어 정리

명령어 설명
CREATE VIEW 뷰 생성
DROP VIEW 뷰 삭제
ALTER VIEW 뷰 수정
SHOW FULL TABLES WHERE Table_type = 'VIEW'; 현재 DB의 모든 VIEW 목록 조회
SHOW CREATE VIEW view_name; 뷰 정의 확인
 

✅ VIEW 사용 시 주의사항

  • 뷰는 기본적으로 읽기 전용이다. 하지만 일부 조건이 맞으면 UPDATE, DELETE도 가능하다.
  • WITH CHECK OPTION을 사용하면 뷰의 WHERE 조건을 위배하는 수정이 불가능하다.
  • 뷰 안에서 사용하는 테이블이나 컬럼이 삭제되면 뷰가 동작하지 않는다.
CREATE VIEW adult_users AS
SELECT * FROM users WHERE age >= 20
WITH CHECK OPTION;

위 뷰를 통해 age < 20인 데이터는 삽입 또는 수정할 수 없다.

✅ 성능 이슈는 없을까?

  • 뷰는 결과를 저장하는 것이 아니라 실행 시 마다 SELECT 쿼리를 수행하므로, 쿼리 성능에 영향을 줄 수 있다.
  • 너무 많은 테이블을 JOIN하거나 중첩 뷰를 사용할 경우, 성능이 저하될 수 있으므로 적절한 인덱스 활용이 필수이다.

✅ 공식 가이드 문서 링크

반응형