view란 DB의 가상 테이블을 의미한다.
뷰는 실제 데이터와 마찬가지로 column과 데이터를 보여주지만, 실제로 데이터를 저장하고 있지는 않다.
아래 캡처화면은 상품의 각종 정보를 특정 계산식으로 계산한 order_price와 purchase_cost를 보여주는 view이다.
마치 원래 있던 테이블 마냥 감쪽같다!
이 테이블을 볼때도 그냥 SELECT
문으로 불러올 수 있다.
SELECT *
FROM purchase_costs
SELECT
문을 사용하여 원하는 데이터 테이블 형태를 만든 후, 앞에 CREATE VIEW 뷰_이름 AS
만 붙여주면 된다. CREATE VIEW 뷰_이름 AS
SELECT ~~~~~
SELECT
문을 사용하여 데이터를 확인할 수 있다.ex) 상품 크기, 무게, 배송방법 등으로 배송비 계산하여 배송비 컬럼이 있는 view 만들어두기
- 기존 테이블에 배송비 컬럼을 만들어 둔다면?
관련된 데이터가 바뀔 때 무결성이 깨질 가능성이 있음
➡️ 요거 쿼리 실행 단계를 줄이는 방법은 좀 더 찾아봐야 할 것이다.
typeORM + NestJs를 사용하는 경우는 아래와 같이 entity를 만들 수 있다.
@ViewEntity('view_name')
데코레이터를 사용하여 View 엔티티를 정의한다.@ViewColumn()
데코레이터를 사용한다.@OneToOne
, @ManyToOne
등을 사용하여 추가해두기@ViewEntity('total_costs')
export class TotalCost {
@PrimaryColumn()
skuId: number;
@ViewColumn()
salesPrice: number;
@ViewColumn()
orderPrice: number;
@ViewColumn()
purchaseCost: number; //제품매입원가
@OneToOne(() => Sku, (sku) => sku.totalCosts)
sku: Sku;
}
사용해보니 편리하고 좋다...!
특히 데이터의 무결성을 유지하면서, 내가 원하는 정보를 한번에 볼 수 있다니..?
하지만 엄청난 쿼리 실행을 축소할 수 있는 방법을 찾아야 겠다.