관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

테이블과 뷰 4 - 가상의 테이블 <뷰> 본문

알고리즘 및 자료 관리/SQL

테이블과 뷰 4 - 가상의 테이블 <뷰>

huenuri 2024. 10. 22. 05:01

어제 이 단원까지 공부하려 했으나 너무 졸려서 처음 부분만 하다 다음날 새벽 3시 반에 일어나서 이어서 해본다.

 

뷰는 한 마디로 '가상의 테이블'이라고 부른다. 일반 사용자 입장에서는 테이블과 동일하게 보이기 때문이다. 그렇다면 테이블이 있는데 왜 뷰를 사용할 까? 뷰를 사용하면 사용자에게 테이블의 필요한 내용만 보이도록 할 수 있다.

 

시작하기 전에

뷰는 데이터베이스 개체 중 하나이다. 모든 데이터베이스 개체는 테이블과 관련이 있지만, 특히 뷰는 테이블과 아주 밀접하게 연관되어 있다. 뷰는 한 번 생성해 놓으면 테이블이라고 생각하고 사용해도 될 정도로 사용자 입장에서는 테이블과 거의 동일한 개체로 취급한다.

뷰는 테이블처럼 데이터를 가지고 있지 않다. 뷰의 실체는 SELECT 문으로 만들어져 있기 때문에 뷰에 접근하는 순간 SELECT가 실행되고 그 결과가 화면에 출력되는 방식이다.

 

뷰는 단순 뷰와 복합 뷰로 나뉘는데, 단순 뷰는 하나의 테이블과 연관된 뷰를 말하고, 복합 뷰는 2개 이상의 테이블과 연관된 뷰를 말한다.

 

 

 


 

 

 

뷰의 개념

먼저 '인터넷 마켓' 데이터베이스를 생성한 후 진행하겠다.

 

뷰의 기본 생성

간단히 회원 테이블을 조회해 본다. SELECT 문으로 아이디, 이름, 주소를 가져와서 출력한 결과이다.

 

뷰는 바로 이런 개념이다. SELECT 문으로 실행해서 나온 결과가 뷰이기에 뷰의 실체는 SELECT 문이 되는 것이다. 뷰는 이름만 보고도 알아볼 수 있도록 이름 앞에 v_를 붙이는 게 일반적이다.

 

뷰를 만드는 형식은 다음과 같다.

 

 

이제 회원 테이블의 아이디, 이름, 주소에 접근하는 뷰를 생성해 보겠다.

 

 

뷰를 새로운 테이블로 생각하고 접근하면 된다. 

 

 


 

 

 

뷰의 작동

사용자가 뷰에 접근하는 방식은 다음 그림과 같다.

 

사용자는 뷰를 테이블이라고 생각하고 접근한다.  그러면 MySQL이 뷰 안에 있는 SELECT를 실행해서 그 결과를 사용자에게 보내주므로 사용자 입장에서는 ①번과 ④번만, 즉 뷰에서 모두 처리된 것으로 이해한다.

뷰는 수정이 가능할까? 뷰는 기본적으로 '읽기 전용'으로 사용되지만, 뷰를 통해서 원본 테이블의 데이터를 수정할 수도 있다.


 

 

 

 

뷰를 사용하는 이유

뷰를 사용해서 얻을 수 있는 장점은 여러 가지가 있다.

 

1. 보안에 도움이 된다.

앞의 예에서 만든 뷰에는 사용자의 아이디, 이름, 주소만 있을 뿐 사용자의 중요한 개인 정보인 연락처, 평균 키, 데뷔 일자 등의 정보는 들어있지 않다. 예를 들어 작업량이 너무 많아서 아르바이트생에게 요청하려고 할 때 아이디, 이름, 주소만 보이는 뷰를 생성할 수 있다. 그러면 아르바이트생은 회원 테이블에 접근하지 못하도록 권한을 제한하고, 뷰에만 접근할 수 있도록 권한을 준다.

 

데이터베이스 보안

데이터베이스에서 '보안'은 상당히 중요한 주제이다. 우리는 MySQL 워크벤치를 실행할 때 계속 root 사용자로 접속했다. root 사용자는 모든 권한이 있는 관리자로 못하는 작업이 있다. 테이블의 생성, 삭제는 물론 데이터를 마음대로 조작할 수 있는 막강한 권한이 있다. 만약 은행에서 일하는 모든 직원에게 root의 권한을 부여한다면, 고의든 실수든 고객의 예금을 마음대로 사용할 수 있게 된다. 큰 사고가 일어날 수 있는 상황이다.

이런 사고를 미연에 방지하기 위해 직원의 등급에 따라 고객 정보에 접근할 수 있는 권한을 차등해서 부여한다. 


 

 

이런 방식으로 데이터베이스도 사용자마다 테이블에 접근하는 권한에 차별을 둬서 처리하고 있으며, 사용자별 권한이 데이터베이스 보안의 중요한 주제 중 하나이다.

 

 

2. 복잡한 SQL을 단순하게 만들 수 있다.

 

내용이 길고 복잡하다. 만약 이 쿼리를 자주 사용해야 한다면, 사용자들은 매번 위와 같은 쿼리를 입력해야 한다. 하지만 이 SQL을 뷰로 생성해 놓고 사용자들은 해당 뷰에만 접근하도록 하면 복잡한 SQL을 입력할 필요가 없어진다.

 

 

 

이제부터는 v_memberbuy를 테이블이라 생각하면 접근하면 된다. 필요하면 WHERE 절도 사용할 수 있다.

 

 


 

 

 

 

 

뷰의 실제 작동

뷰의 단순한 형태에 대해 살펴보았는데, 실무에서는 좀 더 복잡하게 사용한다. 실제로 사용하는 방법을 익혀보겠다.

 

뷰의 실제 생성, 수정, 삭제

기본적인 뷰를 생성하면서 뷰에서 사용될 열 이름을 테이블과 다르게 지정할 수 있다. 별칭을 사용하면 되는데, 중간에 띄어쓰기 사용이 가능하다. 별칭은 열 이름 뒤에 작은따옴표 또는 큰따옴표로 묶어주고, 형식상 AS를 붙여준다.

단, 뷰를 조회할 때는 열 이름에 공백이 있으면 백틱(`)으로 묶어줘야 한다.

 

 

뷰를 생성할 때 뷰의 열 이름을 테이블과 다르게 지정할 수 있으며, 띄어쓰기나 한글도 가능하다. 뷰의 수정은 ALTER VIEW 구문을 사용하며, 열 이름에 한글을 사용해도 된다.

 

 

 

열 이름이 이렇게 한글로 변경되었다. 열 이음레 한글을 사용하면 한글 운영체제 외에는 인식되지 않을 수 있으므로 권장하지는 않는다.

 

 

 

이렇게 뷰를 삭제할 수도 있다.


 

 

 

 

뷰의 정보 확인

기존에 생성된 뷰에 대한 정보를 확인할 수 있다. 우선 간단한 뷰를 다시 생성해 보겠다.

 

 

 

CREATE OR REPLACE VIEW

뷰를 생성할 때 CREATE VIEW는 기존에 뷰가 있으면 오류가 발생하지만, CREATE OR REPLACE VIEW는 기존에 뷰가 있어도 덮어쓰는 효과를 내기 때문에 오류가 발생하지 않는다. 즉, DROP VIEW와 CREATE VIEW를 연속으로 작성한 효과를 갖는다.

 

 

DESCRIBE 문으로 기존 뷰의 정보를 확인할 수 있다. DESCRIBE는 줄여서 DESC라고 써도 된다. 뷰도 테이블과 동일하게 정보를 보여준다. 주의할 점은 PRIMARY KEY 등의 정보는 확인되지 않는다.

 

 

여기 보면 mem_id가 PRI로 지정되어 있음을 볼 수 있다.

 

 

 

오른쪽에 Form Editor를 클릭하면 소스 코드의 전체를 확인할 수 있다.


 

 

 

뷰를 통한 데이터의 수정/삭제

뷰를 통해 테이블의 데이터를 수정할 수도 있다. v_member 뷰를 통해 데이터를 수정해 보겠다.

 

 

 

데이터도 입력해 본다.

 

v_member(뷰)가 참조하는 member(테이블)의 열 중에서 mem_number 열은 NOT NULL로 설정되어서 반드시 입력해줘야 한다. 하지만 현재의 v_member에서는 mean_number 열을 참조하고 있지 않으므로 값을 입력할 방법이 없다.

만약 v_member 뷰를 통해서 member 테이블에 값을 입력하고 싶다면 v_member에 mem_number 열을 포함하도록 뷰를 재정의하거나, 아니면 member에서 mem_number 열의 속성을 NULL로 바꾸거나 기본값을 지정해야 한다.

 

 

이번에는 지정한 범위로 뷰를 생성해 보겠다.

 

 

평균 키가 167 이상만 조회되었다.

 

 

키가 167 미만인 데이터는 없기 때문에 0개 삭제되었다고 나온다.


 

 

 

뷰를 통한 데이터의 입력

키가 167 미만인 데이터를 입력해 보겠다.

 

이 뷰는 키가 167 이상만 보이도록 만든 뷰이지만, 167 미만인 데이터가 입력되었다. 뷰를 확인해 보면 다음과 같다.

 

 

167 이상만 조회되므로 방금 전에 입력한 티아라 데이터는 보이지 않는다.

이럴 때는 예약어 WITH CHECK OPTION을 통해 뷰에 설정된 값의 범위가 벗어나는 값은 입력되지 않도록 할 수 있다.

 

 

 

167 이상의 데이터만 입력된 것을 볼 수 있다.


 

 

단순 뷰와 복합 뷰

하나의 테이블로 만든 뷰를 단순 뷰, 두 개 이상의 테이블로 만든 뷰를 복합 뷰라고 한다. 복합 뷰는 주로 두 테이블을 조회한 결과를 뷰로 만들 때 사용한다.

 

 

복합 뷰는 읽기 전용이다. 복합 뷰를 통해 테이블에 데이터를 입력/수정/삭제할 수 없다.


 

 

 

 

뷰가 참조하는 테이블의 삭제

 

두 개의 테이블을 삭제한 후 연관 뷰를 조회하자 없다는 오류 메시지가 뜬다. 관련 뷰가 있더라도 테이블이 쉽게 삭제된다.

 

 

뷰가 조회되지 않으면 CHECK TABLE 문으로 뷰의 상태를 확인해 볼 수 있다.

 

하지만 뷰가 참조하는 테이블이 없어서 오류가 발생하는 것을 볼 수 있다.


 

 

 

 

단원 마무리하기

 

 

 

 

 

 

 

 

 

 

 

5번 문제에서 뷰의 소스 코드를 확인하는 것이 SHOW CREATE VIEW이고, 뷰의 상태를 확인하는 것이 CHECK TABEL이다. 둘을 바꿔서 썼다.

 


 

 

 

학습을 마치고

오늘 새벽에 1시간 반 동안 뷰에 대해서 학습해 보았다. 뷰를 통해 원하는 컬럼만 가져올 수 있는 매우 유용한 기능이었다. 이제 SQL 단원도 얼마 남지 않았다. 인덱스까지만 학습하고 나머지 단원은 엘리스로 심화 SQL 공부를 마치고 하려고 한다.