Entity Embedding
여러 엔티티에서 공통적으로 사용되는 값 객체(Value Object)를 재사용할 수 있도록 도와준다.
예를 들어, 성(first)이나 이름(last) 같은 속성이 여러 엔티티에 필요할 경우, 이를 별도의 클래스로 정의하고 임베딩하여 사용한다.
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
export class Name {
@Column()
first: string;
@Column()
last: string;
}
@Entity()
export class StudentModel {
@PrimaryGeneratedColumn()
id: number;
@Column(() => Name)
name: Name;
@Column()
class: string;
}
@Entity()
export class TeacherModel {
@PrimaryGeneratedColumn()
id: number;
@Column(() => Name)
name: Name;
@Column()
salary: number;
}
Table Inheritance
상속 관계를 가진 엔티티들을 한 테이블(혹은 여러 테이블)에 저장함으로써, 공통 컬럼은 재사용하고 특정 엔티티만의 컬럼은 별도로 관리할 수 있도록 한다.
1. 기본 상속(Mapped Superclass 패턴)
여러 엔티티에서 공통적으로 사용하는 필드나 메서드를 하나의 베이스 클래스에 정의하고, 이를 상속받아 재사용하는 방식이다.
- 베이스 클래스 자체는 데이터베이스에 별도의 테이블로 생성되지 않는다.
- 각 자식 엔티티는 베이스 클래스에 정의된 컬럼들을 자신의 테이블에 포함시킨다.
- 단순히 코드 재사용과 공통 컬럼 정의를 목적으로 하며, 단일 테이블 상속처럼 하나의 테이블에 모두 저장되는 구조가 아니다.
import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from "typeorm";
export class BaseModel {
@PrimaryGeneratedColumn()
id: number;
@CreateDateColumn()
createdAt: Date;
@CreateDateColumn()
updatedAt: Date;
}
@Entity()
export class BookModel extends BaseModel {
@Column()
name: string;
}
@Entity()
export class CarModel extends BaseModel {
@Column()
brand: string;
}
BookModel과 CarModel 이 BaseModel을 상속받으면 위 사진과 같이 BoolModel, CarModel의 테이블에 BaseModel 컬럼들이 포함되게 된다.
2. 단일 테이블 상속 (Single Table Inheritance)
import { ChildEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
@Entity()
@TableInheritance({
column: {
name: 'type',
type: 'varchar',
}
})
export class SingleBaseModel {
@PrimaryGeneratedColumn()
id: number;
@CreateDateColumn()
createdAt: Date;
@CreateDateColumn()
updatedAt: Date;
}
@ChildEntity()
export class ComputerModel extends SingleBaseModel {
@Column()
brand: string;
}
@ChildEntity()
export class AirplaneModel extends SingleBaseModel {
@Column()
country: string;
}
단일 테이블 상속은 조금 복잡한 구조이다.
우선 부모가 될 클래스에 @Entity(), @TableInheritance() 를 붙인다.
@TableInheritance 내에는 자식이 될 테이블들을 구분 짓는 속성을 작성한다. name은 해당 속성의 이름, type은 어떠한 타입으로 구분지을지를 결정한다.
그리고 자식 클래스에는 @ChildEntity() 를 붙이면 된다.
그러면 자식 테이블은 온데간데 없고, 부모 클래스만 존재한다.
즉, 자식 클래스들을 부모 클래스의 '속성'으로 구분지어 어떤 테이블인지 결정짓게 하는 것이다.
대세는 기본 상속(또는 Mapped Superclass) 방식을 많이 선호한다.
엔티티 간 공통 로직이나 컬럼을 공유할 때, 불필요하게 모든 엔티티를 하나의 테이블에 묶지 않고 각 엔티티의 특성에 맞게 분리하는 방식이다.
특히, 데이터베이스 구조가 명확해지고 각 테이블의 크기나 관리가 용이해진다는 점에서 기본 상속 방식이 매우 유용하다.
'NestJS' 카테고리의 다른 글
TypeORM - 일대다, 다대일 관계 구현 (0) | 2025.02.24 |
---|---|
TypeORM - 일대일 관계 구현 (0) | 2025.02.24 |
TypeORM - Entity Column 탐구 (0) | 2025.02.24 |
TypeORM - Repository 주입하기 (0) | 2025.02.24 |
TypeORM - Entity로 테이블 생성하기 (0) | 2025.02.24 |