본문 바로가기
TypeScript

[TypeORM] 데코레이터 - Entity

by yonikim 2022. 9. 19.
728x90

Entity 

데이터베이스 테이블을 정의하기 전에 실행해야 하는 데코레이터이다. 테이블명을 따로 지정하지 않으면 클래스명으로 매핑한다.

@Entity("USER")
export class User ()

 

추가적으로 지정할 수 있는 인자값에는 다음과 같이 있다.

  • name: 테이블명
  • database: 데이터베이스명
  • schema: 스키마명
  • engine: 테이블 생성 중에 설정할 수 있는 DB 엔진명
  • synchronise: false 로 설정할시 스키마 싱크 생략
  • orderBy: `QueryBuilder` 와 `find` 를 실행할 때 엔티티의 기본 순서를 지정
@Entity({
  name: 'USER',
  engine: 'MyDatabase',
  database: 'DEV_CUSTOMER',
  schema: 'SCHEMA_WITH_TABALES',
  synchronize: false,
  orderBy: {
    id: 'ASC',
    name: 'DESC',
  },
})
export class User {}

 

공통으로 사용되는 컬럼이 있을 경우 Entity 마다 작성해주는 방법도 있지만, 이는 가독성을 떨어지게 한다. 필드들을 중복 없이 DRY 하게 바꿔주는 3가지 패턴을 알아보자. 

 

1. 추상 클래스 이용

export abstract class Content {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  description: string;
}

@Entity()
export class Photo extends Content {
  @Column()
  size: string;
}

@Entity()
export class Question extends Content {
  @Column()
  answersCount: number;
}

@Entity()
export class Post extends Content {
  @Column()
  viewCount: number;
}

 

2. `TableInheritance` 이용 

@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export class Content {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  description: string;
}

@ChildEntity()
export class Photo extends Content {
  @Column()
  size: string;
}

@ChildEntity()
export class Question extends Content {
  @Column()
  answersCount: number;
}

@ChildEntity()
export class Post extends Content {
  @Column()
  viewCount: number;
}

 

3. 이름이 비슷하고 타입이 같은 컬럼들을 묶는 패턴

export class Name {
  @Coulmn()
  first: string;

  @Column()
  last: string;
}

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: string;

  @Column((type) => Name)
  name: Name;

  @Column()
  isActive: boolean;
}

결과물은 아래와 같이 생성될 것이다. 

+-------------+--------------+----------------------------+
|                          user                           |
+-------------+--------------+----------------------------+
| id          | int(11)      | PRIMARY KEY AUTO_INCREMENT |
| nameFirst   | varchar(255) |                            |
| nameLast    | varchar(255) |                            |
| isActive    | boolean      |                            |
+-------------+--------------+----------------------------+

 

 

ViewEntity

view 는 하나의 가상 테이블로, 구조가 복잡하고 여러군데에서 호출하는 데이터의 경우 만들어주면 좋을 것 같다.

 

지정할 수 있는 인자값에는 다음과 같이 있다.

  • name: 테이블명
  • database: 데이터베이스명
  • schema: 스키마명
  • expression: view 를 정의하는 것으로, 필수 인자값이다. SQL 쿼리문이나 `queryBuilder` 체이닝 메서드가 들어갈 수 있다.
@ViewEntity({
  expression: `
        SELECT "post"."id" AS "id", "post"."name" AS "name", "category"."name" AS "categoryName"
        FROM "post" "post"
        LEFT JOIN "category" "category" ON "post"."categoryId" = "category"."id"
    `,
})
export class PostCategory {
  @ViewColumn()
  id: number;

  @ViewColumn()
  name: string;

  @ViewColumn()
  categoryName: string;
}

 

 

(참고: https://yangeok.github.io/orm/2020/12/14/typeorm-decorators.html)

728x90