카테고리 없음

[DB] View 테이블이란?

딤섬뮨 2023. 11. 3. 21:46
728x90
요즘 회사에서 레거시 시스템을 typescript와 Nest JS를 가지고 마이그레이션을 하고있다.
예전 레거시 시스템을 파헤치다가 처음 보는 view로 이루어진 테이블이 있어 작성해본다.

 

view 테이블이란?

하나의 가상 테이블이라고 생각하면 된다. 물리적으로 존재하지 않는다

조회는 가능하지만, 삽입/갱신/삭제에는 제약이 따름

특정 뷰가 다른 뷰를 참조하여 생성 가능하다

뷰가 참조하는 기본 테이블이 삭제되면 같이 삭제 됨.

실제 데이터가 저장되는 것이 아니다. 뷰를 통해 데이터를 관리할 수 있다.

독자적인 인덱스 불가

 

view 의 사용 목적

  • 복잡한 쿼리문의 간소화, 중복 발생하는 쿼리문의 관리(사용자 편의)
  • 보여주는 컬럼의 제한 (보안성) 또한 추가적인 목적(데이터베이스 보안)

쿼리

CREATE 생략가능[OR REPLACE] 생략가능[FORCE | NOFORCE] VIEW 뷰명
AS (SELECT문)
생략가능[WITH CHECK OPTION 생략가능[CONSTRAINT 제약조건명]]
생략가능[WITH READ ONLY 생략가능[CONSTRAINT 제약조건명]]

or replace view : 해당 구문 사용하면 뷰를 수정할 떄 drop없이 수정 가능

with check option : 주어진 제약 조건에 맞는 입력

with read only : select만 가능

 

뷰 생성 쿼리

--학교 테이블에서 학년이 3인 학생들의 성명과 학번을 학교뷰테이블이라는 뷰로 만드는 쿼리
CREATE OR REPLACE VIEW 학교뷰테이블(성명, 학번)
AS SELECT 성명, 학번
FROM 학교
WHERE 학년 ='3';

 

view 사용 이유?

한개의 뷰로 여러 테이블에 대한 데이터를 검색할 수 있다.

뷰를 통해서만 데이터에 접근하게 되면 뷰에 없는 데이터를 안전하게 보호할 수 있다.

매번 join 을 통해서 가져오기에 번거로우니..뷰를 만들어서 이를 한번에 조회할 수 있도록 합니다.


TypeORM 에서는 이 view를 어떻게 제공하고 있을까?

  • View Entity

여러개의 column 중 조회 결과에 몇개의 column 만 사용된다면 해당 Column들을 가지고 view table을 구성할 수 있다.

expression을 통해 저장할 sql을 작성하면 되는데 이때 넣는 expression은 RAW sql도 가능고, queryBuilder도 된다.

전반적으로는 그냥 entity랑 다를건 없다

import { ViewColumn, ViewEntity, DataSource } from 'typeorm';
import { User } from './user.entity';

// 어떤 쿼리를 가지고 이 테이블을 생성할 것인지
@ViewEntity({
    expression: (dataSource: DataSource) =>
        dataSource
        .createQueryBuilder()
        .select("user.id", "id")
        .addSelect("user.nickname", "nickName")
        .from(User, 'user'),
})

// 접근하는 법
export class UserView {
    @ViewColumn()
    id: string;

    @ViewColumn({
        name: 'nickname'
    })
    nickName: string;
}

sql문

  • IFNULL(target,100) target이 null이면 100을 반환
  • UNIONALL 두 개 이상의 select문의 결과를 하나의 결과 집합으로 결합하는 역할

union은 조회한 다수의 select문을 하나로 합치고 싶을 때, 유니온을 사용할 수 있다.

728x90