TypeOrm / / 2024. 11. 8. 04:17

TypeOrm Inheritance

import { ChildEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, TableInheritance, UpdateDateColumn } from "typeorm";

export class BaseModel {
    @PrimaryGeneratedColumn()
    id: number;

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;
}

@Entity()
export class BookModel extends BaseModel {
    @Column()
    name: string;
}

@Entity()
export class CarModel extends BaseModel {
    @Column()
    brand: string;
}

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

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;
}

@ChildEntity()
export class ComputerModel extends SingleBaseModel{
    @Column()
    brand: string;
}

@ChildEntity()
export class AirplaneModel extends SingleBaseModel{
    @Column()
    country: string;
}

위 코드에서 **BaseModel**과 **SingleBaseModel**로 상속하는 방식은 서로 다른 목적을 가지고 있으며, TypeORM에서 상속을 활용하는 두 가지 방법을 보여줍니다. 이 두 가지 방식의 차이점을 이해하면 코드의 구조와 동작 방식을 명확하게 파악할 수 있습니다.

1. 기본 상속 (BaseModel)

**BaseModel**은 TypeORM에서 기본 상속을 사용하여 공통 속성을 재사용하는 단순한 방식입니다. createdAtupdatedAt, **id**와 같은 속성을 여러 엔티티에서 공통으로 사용하고 싶을 때 유용합니다.

export class BaseModel {
    @PrimaryGeneratedColumn()
    id: number;

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;
}

@Entity()
export class BookModel extends BaseModel {
    @Column()
    name: string;
}

@Entity()
export class CarModel extends BaseModel {
    @Column()
    brand: string;
}
  • 기본 상속 방식에서는 BaseModel 클래스를 단순히 상속함으로써 **BookModel**과 CarModel 엔티티가 idcreatedAtupdatedAt 필드를 자동으로 상속받습니다.
  • BookModel 테이블과 CarModel 테이블은 각각 독립적인 테이블로 생성되며, BaseModel 클래스는 테이블로 생성되지 않습니다.
  • 이는 JavaScript의 일반 상속과 유사하게 작동하며, 여러 엔티티에서 중복되는 공통 필드를 코드에서 재사용하도록 도와줍니다.

예시: 생성되는 테이블 구조

이 방식에서는 **BookModel**과 **CarModel**이 각각 독립된 테이블로 생성됩니다.

BookModel 테이블

id createdAt updatedAt name
1 2024-01-01 12:00:00 2024-01-02 13:00:00 "Book 1"

CarModel 테이블

id createdAt updatedAt name
1 2024-01-01 12:00:00 2024-01-02 13:00:00 "Car 1"

2. 단일 테이블 상속 (@TableInheritance와 @ChildEntity를 사용한 상속)

**SingleBaseModel**은 단일 테이블 상속을 위해 사용되며, 이를 통해 여러 자식 엔티티를 하나의 테이블에 저장할 수 있습니다. @TableInheritance 데코레이터와 @ChildEntity 데코레이터를 조합하여 구현합니다.

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

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;
}

@ChildEntity()
export class ComputerModel extends SingleBaseModel {
    @Column()
    brand: string;
}

@ChildEntity()
export class AirplaneModel extends SingleBaseModel {
    @Column()
    country: string;
}
  • SingleBaseModel은 단일 테이블 상속 전략을 사용하여 자식 엔티티(ComputerModelAirplaneModel)가 하나의 테이블에 저장되도록 합니다.
  • @TableInheritance 데코레이터의 column 옵션을 통해 구분 컬럼(type)을 정의하고, 각 자식 엔티티(ComputerModelAirplaneModel)는 이 컬럼을 통해 구분됩니다.
  • @ChildEntity() 데코레이터를 사용한 자식 엔티티들은 모두 SingleBaseModel이라는 하나의 테이블에 모여 저장됩니다.

예시: 생성되는 테이블 구조

이 경우 단일 테이블에 모든 자식 엔티티(ComputerModelAirplaneModel)가 함께 저장되며, type 컬럼을 통해 각 행이 어느 엔티티에 속하는지 구분합니다.

SingleBaseModel 테이블

id createdAt updatedAt type brand country

1 2024-01-01 12:00:00 2024-01-02 13:00:00 "computer" "Dell" NULL
2 2024-01-01 12:00:00 2024-01-02 13:00:00 "airplane" NULL "USA"
  • type 컬럼의 값으로 **computer**와 **airplane**이 들어가며, 이를 통해 **ComputerModel**과 **AirplaneModel**을 구분합니다.
  • **brand**와 country 컬럼은 해당 자식 엔티티에서만 사용하는 컬럼입니다. 따라서 ComputerModel 인스턴스에는 **country**가 **NULL**로 설정되고, AirplaneModel 인스턴스에는 **brand**가 **NULL**로 설정됩니다.

두 방식의 차이점 정리

특징 기본 상속 (BaseModel) 단일 테이블 상속 (SingleBaseModel)

상속 목적 공통 필드 재사용 여러 유형을 하나의 테이블에 저장
테이블 생성 방식 자식 엔티티별 개별 테이블 생성 단일 테이블에 자식 엔티티 모두 저장
구분 컬럼 필요 여부 필요 없음 **type**과 같은 구분 컬럼으로 식별
용도 데이터가 독립적일 때 사용 다양한 유형을 하나의 테이블에 저장하고 싶을 때 사용

두 방식은 데이터 저장 방식에 차이가 있으므로, 데이터의 성격과 프로젝트 요구사항에 따라 적합한 상속 방식을 선택하면 됩니다.

'TypeOrm' 카테고리의 다른 글

TypeOrm FindManyOptions  (0) 2024.11.11
TypeOrm Relationship  (0) 2024.11.09
TypeOrm Embedded Entity  (0) 2024.11.08
TypeOrm 엔티티 옵션  (0) 2024.11.08
TypeOrm이 기본 개념  (1) 2024.11.08
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유