DataBase/Mysql

[MySql] View Table 개념, 가이드, 성능, 조인 + Spring View Table 사용

민돌v 2022. 8. 3. 23:35

 

 

[목차]

  1. 뷰 테이블이란?
  2. 가상테이블이란
  3. 뷰 테이블의 데이터 동기화?
  4. 뷰 테이블 생성 및 조회 시 동작 과정
  5. 뷰테이블 쓰는 이유 및 뷰테이블 성능
  6. 복합 뷰 테이블 (view table join)
  7. 뷰 테이블 장, 단점
  8. 뷰테이블 유용하게 사용될 떄

 


 

1. SQL View Table 이란

  • 📌 뷰(View)란 데이터베이스에 존재하는 일종의 가상테이블입니다.
  • 가상 테이블이란 이름 그대로 실제 데이터를 가지고 있지않은 테이블 의미합니다.
  • 뷰 테이블은 데이터가 아닌, SQL 을 저장하고 있으며
  • 그렇기때문에, 이름 그대로 View, 즉 데이터를 보여주기만하는 테이블이다. 로 이해할 수 있을 것 같습니다.

 

 VIEW와 TABLE과의 차이점은 그냥 TABLE은 실질적인 데이터가 있지만 VIEW는 데이터가 없고 SQL만 저장한다. 입니다

 

💡 즉, 뷰 테이블이란, 실제 데이터를 저장하고 있지 않고 SQL 을 저장하고 있는, 보여주는 것 만을 목적으로하는 테이블입니다.

 


 

2. 가상테이블이란

  • 이름 그대로입니다. 실제로 존재하지않는 테이블입니다.

 

❓ 그럼 왜 굳이 실제가 없는데 테이블이라고 정의를 할까요?

  • ➡️ View 의 사용 목적이, 복잡한 쿼리문을 계속 계속 조회할거라면, 차라리 테이블처럼 관리하는게 편하겠다~ 이기 때문입니다.

 

 즉, 뷰의 사용 목적

  1. 복잡한 쿼리문의 간소화, 중복 발생하는 쿼리문의 관리라고 볼 수 있습니다.
  2. 보여주는 컬럼의 제한 (보안성) 또한 추가적인 목적이라고 할 수 있습니다,

 


 

3. View Table 데이터 최신화?

view 를 자세히 알기 전에,  " 기존 테이블이 업데이트되면 뷰 테이블도 업데이트가 될까? " 하는 의문이 있었습니다.

  --> 업데이트가 되는 것 같은데 왜 되지??? 가상테이블인데????? 미리 만들어진 미리보기 결과인데????

 

이제 뷰를 알고 난 후에는,

뷰를 조회할 때마다, 옵티마이저에서 뷰를 생성할 때, 저장해 놓은 Select 문이 날라가는 것이기 때문에 당연히, 사용자가 바로보는 가상 테이블의 데이터 또한 업데이트 되는 것이였습니당...ㅎㅎ

 

 

💡Table 과 가상 테이블의 속도 차이

사용하는 방법과 의도에 따라 다를 것 같습니다.

하지만, 근본적으로 뷰를 조회하 때 마다 똑같은 쿼리문이 날라가는 것이기 때문에 View 의 성능이라는 말이 맞지 않는다는 생각이 들었습니다.

  • sql 만 저장하는거라서 그냥 쿼리문 날리는거랑 속도차이가 나지 않는다는 말입니다!

 


 

4. 뷰 테이블 생성 및 조회 시 동작 과정

이제 MySql 에서 View 사용법을 정리해보겠습니다!

 

뷰의 종류는 단순뷰 와 복합뷰로 나눌 수 있는데, 저는 복합뷰로 사용을 해보았습니다.

 

💡 단순 뷰 vs 복합 뷰

단순 뷰 (Single View) 

  1. 하나의 테이블로 생성
  2. 그륩 함수의 사용이 불가능
  3. Distinct 사용이 불가능
  4. DML 사용이 가능

복합 뷰( Complex View)

  1. 여러개의 테이블로 생성 (join)
  2. 그륩 함수의 사용이 가능
  3. Distinct 사용이 가능
  4. DML 사용이 불가능

 

 


 

1. view table 생성하기 (복합 뷰)

원래 사용할려는 복잡한 Join 문 (안복잡한데 복잡하다고 해주세요)

select *
from A_db.photo e inner join B_db.user u on e.user_idx = u.idx;

 

Create View

Create View My_View AS
select *
from A_db.photo e 
	inner join B_db.user u 
	on e.user_idx = u.idx;

사실은 조인할 때, 중복된 컬럼 이름이 존재하면 안되서 별칭(AS) 를 사용하거나, 중복된 컬럼을 제거해주어야합니다.

ex) 예시

CREATE VIEW MyView AS

SELECT Name, ReserveDate, ReserveDate - Curdate() AS Dday

FROM Reservation;

Mysql View Create 공식 문법

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

 


 

2. 뷰 조회

📌 View 를 조회하면, select * from view_table_name 이 날라가지만, 실제로 아래의 sql 문이 저장되었다가 필요할 때 마다 날라가서 조회가 되는 것입니다.

 

 

실제 디비 옵티마이저에서는 저장된 sql 문이 쇼로록 날라감

 

 

https://stricky.tistory.com/323 : 뷰가 조회될 때, 실제 날라가는 쿼리

 


 

3. 뷰 수정 및 삭제

CREATE 문을 사용하여 생성된 뷰는 ALTER 문을 사용하여 수정할 수 있습니다.

ALTER VIEW 뷰이름 AS

SELECT 필드이름1, 필드이름2, ...

FROM 테이블이름

 

DROP 문을 사용하여 생성된 뷰를 삭제할 수 있습니다.

DROP VIEW MyView;

 


 

 

4. 뷰 특징

  • 뷰 update가 가능은 하지만 많은 제약조건이 존재합니다.
  • 뷰를 insert하는 것은 조건이 있습니 다.
    테이블의 모든 필드의 값을 넣어줘야하는데 일부만 넣어주게 되면 불가능. 그래서 넣으려면 전체를 다 넣거나 디폴트를 지정해줍니다.
  • 집계함수가 들어가는 뷰는 수정이 불가능합니다.
  • 자신만의 인덱스를 가질 수 없습니다. (뷰는 가상테이블이기 때문에, 바라보는 테이블의 인덱스를 가져가갑니다.)

 


5. Spring 에서의 View 사용하기

그냥 테이블을 사용할 때 와 똑같이 @Entity를 사용하면 됩니다.

다만, View Table이기에 조금 더 명확하고 명시적으로 데이터를 변경하지 않게다는 것을 위해 @Immutable 어노테이션을 사용하면 좋을 것 같습니다.

 

 

 

 

 

 


참고

View 문법 예시 : http://www.tcpschool.com/mysql/mysql_view_createReplace

MySql Docs : https://dev.mysql.com/doc/refman/8.0/en/create-view.html

View 조회 : https://stricky.tistory.com/323