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에서 기본 상속을 사용하여 공통 속성을 재사용하는 단순한 방식입니다. createdAt, updatedAt, **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 엔티티가 id, createdAt, updatedAt 필드를 자동으로 상속받습니다.
- 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은 단일 테이블 상속 전략을 사용하여 자식 엔티티(ComputerModel, AirplaneModel)가 하나의 테이블에 저장되도록 합니다.
- @TableInheritance 데코레이터의 column 옵션을 통해 구분 컬럼(type)을 정의하고, 각 자식 엔티티(ComputerModel, AirplaneModel)는 이 컬럼을 통해 구분됩니다.
- @ChildEntity() 데코레이터를 사용한 자식 엔티티들은 모두 SingleBaseModel이라는 하나의 테이블에 모여 저장됩니다.
예시: 생성되는 테이블 구조
이 경우 단일 테이블에 모든 자식 엔티티(ComputerModel, AirplaneModel)가 함께 저장되며, 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 |