[NestJS] - 16. TypeORM View와 Raw Query, Index/Unique 제약조건 걸기

2023. 2. 25. 10:36
반응형

 

지금까지 TypeORM을 통해서 데이터베이스 연동하는 것을 다루면서 많은 기능들을 포스팅했었는데, 그 외에 알아두면 좋을 법한 기능과 데코레이더들 몇가지 소개하려고 한다.

 

 

 


VIEW Table

 

import { ViewColumn, ViewEntity } from 'typeorm';

@ViewEntity({
  expression: `
    SELECT p.id, p.name, p.description, p.price, pc.name as categoryName 
    from product p 
    left join product_category pc 
    on p.productCategoryId = pc.id
  `,
})
export class ProductView {
  @ViewColumn()
  id: number;

  @ViewColumn()
  name: string;

  @ViewColumn()
  description: string;

  @ViewColumn()
  price: number;

  @ViewColumn()
  categoryName: string;
}
  • 다음과 같이 VIEW 테이블을 만들 수 있다.
  • @ViewEntity 데코레이터를 통해 View 엔티티임을 알리며, expression에 뷰 테이블 생성 로우쿼리를 작성한다.
  • 컬럼은 @ViewColumn으로 표현한다.
  • 테이블 엔티티와 마찬가지로 Repository를 사용해서 뷰테이블을 Select할 수 있다.

 

 

 

 


Raw Query

const res = await queryRunner.manager.query(
  `select * from product_tag where id = ? and name = ?`,
  [6, '가전제품'],
);
  • SQL문을 그대로 사용하고 싶다면 다음과 같은 방법으로 직접 쿼리문을 날릴 수 있다.
  • Stored Procedure나 Function의 호출도 가능해진다.

 

 


 

Index / Unique

 

Select의 검색 속도와 관련이 있는 녀석들이다.

Index는 책갈피의 개념으로, 인덱스를 걸 시 조회속도가 빨라지지만, 등록이나 수정이 느려진다.(500페이지의 서류철에서 포스트잇을 보면서 찾으면 빠르지만, 포스트잇을 추가로 붙일 때에는 속도가 느린 것을 생각해보자.)

Unique한 컬럼은 DBMS에서는 자동으로 인덱스가 생성된다.

해당 내용들은 나중에 검색에 대해서 다루면서 상세하게 다루어볼 예정이다.

 

@Entity()
export class Product {
  //...

  @Index()
  @Column()
  name: string;
}
  • name 컬럼에 인덱스를 거는 방법이다.

 

@Entity()
@Unique(['name'])
export class Product {
  //...

  @Column()
  name: string;
}
  • name 컬럼에 고유키(Unique Key) 제약조건을 거는 방법이다.
  • 엔티티 테이블 전체에서 작성해야 한다.

 

 

@Entity()
@Index(['name'], { unique: true })
export class Product {
  //...

  @Column()
  name: string;
}
  • 엔티티 테이블 전체에서 인덱스를 작성하는 것도 가능하다.
  • 인덱스 옵션으로 고유키 제약조건 옵션을 추가할 수 있다.
반응형

BELATED ARTICLES

more