뷰(View)의 필요성
뷰는 데이터베이스에서 하나 이상의 테이블에 대한 가상 테이블을 의미한다. 실제로 데이터를 저장하지 않으며, 미리 정의된 SQL 쿼리로 만들어진 결과를 나타낸다. 이 가상의 테이블은 실제 테이블처럼 동일한 역할로써 사용되지만, 실제 테이블은 아니기 때문에 물리적인 저장 공간을 차지하지는 않고 실행할 때마다 쿼리가 처리된다. 복잡한 쿼리를 작성하지 않고 사용자에게 편리한 인터페이스를 제공한다는 특징을 가지고 있어, 데이터를 효율적으로 검색하고 조작할 수 있다.
예를 들어, 여러 테이블을 결합하여 복잡한 데이터를 조회해야 하는 경우, 그 복잡한 쿼리를 뷰로 정의해 둔다면 매번 그 쿼리를 직접 작성할 필요 없이 간단히 뷰에서 조회를 할 수 있다.
또한, 기본 테이블에서 필요한 데이터만을 사용자에게 보여줌으로써 사용자의 민감한 정보에 대해 보안적으로 강화할 수 있기도 하다. 우리는 뷰를 활용하여 편리성, 보안성 측면을 강화할 수 있다.
이번 글에서는 뷰를 활용하는 방법과 그 특징에 대해 이해해보고자 한다.
뷰의 주요 특징
뷰를 활용할 때 다음과 같은 특징을 볼 수 있다.
- 가상 테이블
뷰는 실제로 데이터를 저장하지 않으며, 데이터는 실제 테이블에만 존재한다. 사용자가 쿼리를 실행할 때마다 해당 데이터를 실시간으로 보여주는 역할만을 할 뿐이다.
- 단순화된 데이터 조회
뷰는 사용자에게 편리성을 제공한다고 했다. 복잡한 쿼리를 뷰로 만들어서, 나중에 사용자가 간단한 SELECT 문만으로 쉽게 데이터에 접근할 수 있도록 만들어주기 때문에, 이런 장점을 가질 수 있는 것이다.
- 보안 강화
뷰를 사용하면 테이블에서 일부 열 또는 행만을 선택하여 사용자에게 노출할 수 있다. 이를 통해 민감한 정보를 보호하는 데 활용할 수 있다.
아래와 같이 회원 테이블에 고객들의 개인정보(이름, 주소, 급여 등)이 포함된 경우, 급여 정보에 접근할 필요가 없는 사용자에게 이름과 주소만 제공하는 뷰를 만들어 보안성을 높일 수 있다.```sql
CREATE VIEW customer_info AS
SELECT customer_name, address
FROM customer;
```
- 독립성 유지
기본 테이블의 구조가 변경되더라도 뷰는 같은 구조로 그대로 남아 있어, 데이터를 사용하는 애플리케이션이 변경되지 않고 기존의 방식을 활용하여 끊김없이 작동할 수 있다. 예를 들어, 새로운 열이 추가되거나 삭제되어도 뷰에서 필요한 열만을 사용하므로, 기존 애플리케이션이 정상적으로 작동할 수 있다.
뷰의 장점
뷰를 활용하면 다음과 같은 장점을 기대할 수 있다.
- 복잡한 쿼리의 재사용
자주 사용하는 복잡한 쿼리를 뷰로 정의하면, 이후 동일한 데이터를 조회할 때 매번 복잡한 SQL을 작성하지 않아도 된다. 특히 여러 테이블을 조인하거나 조건이 복잡한 경우, 뷰를 사용하면 코드를 훨씬 간단하게 만들 수 있다.```sql
CREATE VIEW high_salary_customer AS
SELECT customer_name, salary
FROM customer
WHERE salary > 5000;
```
이후 이 뷰를 간단하게 조회할 수 있다.
```sql
SELECT * FROM high_salary_customer;
```
- 복잡한 논리 추상화
또한, 뷰는 복잡한 비즈니스 로직을 추상화할 수 있다. 여러 테이블에서 데이터를 가져와 집계나 계산을 수행한 결과를 뷰로 생성하면, 사용자는 복잡한 계산 로직을 이해할 필요 없이 간단한 쿼리로 집계된 데이터를 확인할 수 있다.
뷰의 단점
뷰를 활용하면 다음과 같은 단점이 존재한다.
- 성능 저하 가능성
뷰는 가상 테이블이기 때문에, 뷰에 정의된 쿼리가 복잡할수록 실행 속도가 느려질 수 있다. 특히 뷰가 여러 테이블을 조인하는 경우, 대량의 데이터를 처리할 때 성능 저하가 발생할 수 있다. 이런 경우 인덱스를 생성하여 성능을 튜닝해야 할 수도 있다.
이를 해결하기 위해 뷰의 성능을 향상 시키는 두 가지 방법이 존재한다. 우선, 인덱스 뷰(Materialized View) 는 일반 뷰와 달리, 물리적으로 데이터를 저장하는 뷰를 말한다. 기본 테이블에서 데이터를 실시간으로 가져오는 것이 아니라, 뷰가 정의된 데이터를 미리 계산하고 저장해두기 때문에, 조회 시 성능이 크게 향상된다. 하지만 기본 테이블의 데이터가 변경되면 뷰의 데이터를 갱신해야 한다는 단점이 존재한다. 다음으로는 가능하면 뷰를 단순한 쿼리로 유지하는 것으로 성능을 높일 수 있다. 여러 테이블을 조인하거나, 중복된 데이터를 제거하는 작업을 뷰에 포함시키면 성능이 떨어질 수 있다는 점을 이해해야 한다.
- 읽기 전용 문제
대부분의 뷰는 쓰기가 불가능한 읽기 전용이다. 즉, 뷰를 통해 데이터를 조회하는 것은 가능하지만, 데이터를 수정하거나 삭제하는 행동은 제한적이다. 일반적으로 뷰에 데이터를 삽입하거나 갱신하기 위해서는 기본 테이블을 직접 조작해야 한다는 불편함이 존재한다.
- 뷰의 유지 관리
기본 테이블이 변경되면 뷰 역시 수정해야 할 경우가 존재한다. 예를 들어, 뷰에서 사용된 열이 기본 테이블에서 삭제된다면, 해당 뷰는 오류가 발생하기 때문에 관련된 뷰를 새로 점검해야 한다.
결론
뷰는 데이터베이스의 성능을 직접적으로 튜닝하기 위한 도구로 사용되는 것이 아닌, 데이터 접근을 단순화하고 보안을 강화하는 목적으로 사용한다는 것을 이해해야 한다. 따라서, 성능 문제가 우려되는 경우 뷰 대신 물리적 테이블을 사용하거나 인덱스 뷰를 고려하는 것이 필요하며, 뷰가 실시간으로 데이터를 조회하지만, 데이터가 변경되는 빈도가 높을 때는 데이터의 일관성 문제가 발생할 수 있다. 이러한 두 가지 문제를 고민하며 우리는 적절한 상황에서 뷰를 사용하여 코드의 가독성을 높이고 유지보수성에 큰 기여를 할 수 있도록 노력해야 한다.
한 마디로 요약하면, 뷰는 반복되는 작업을 간단하게 만들 때 사용하는 것이지 성능을 높이려고 쓰는 건 아니다.