https://orkhan.gitbook.io/typeorm/docs/entity-inheritance
엔티티 상속 방식
1. 구체적인 테이블 상속
2. 싱글 테이블 상속
3. 임베디드 사용
Concrete Table Inheritance
엔티티 상속 패턴을 통해 코드를 줄일 수 있다. 가장 쉽고 효과적인 방법은 구체적 테이블 상속이다.
예를 들어 Photo, Question, Post 엔티티가 있다고 해보자.
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
@Column()
size: string
}
@Entity()
export class Question {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
@Column()
answersCount: number
}
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
@Column()
viewCount: number
}
이러한 엔티티는 동일 칼럼(id, title, description)을 가지고 있는데 반복을 줄이고, 추상화를 위해
Content라는 베이스 클래스를 만든다.
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
}
상속된 모든 칼럼들(관계, 임베디드 등)은 마지막 엔티티내에서 생성이 된다.
이 예시에서는 photo, question, post 테이블이 만들어진다.
// 부모에서 받은 객체를 따로따로 테이블로 만든다는 것인데, 김영한님이 말씀하신 내용과 충돌하는 부분이 있다.
// 자식 테이블을 통합해서 쿼리하는 경우가 어렵고 자식 테이블을 같이 조회할 때 복잡해서 쓰지 않는 것을 추천하셨다.
// 근데 TypeORM에서는 가장 쉽고 효과적인 방법이라고 되어 있다. TypeORM에서 effective하다는 이야기는 있는데, 왜 효과적인지에 대한 근거는 없다. 걸러서 듣는 것이 좋을 듯 하다. (근거 부족)
Single Table Inheritance
TypeORM은 싱글 테이블 상속을 지원한다. 각각의 속성들을 가진 클래스들이 있을 때 하나의 테이블로 만들어 낸다.
@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
}
이는 Content라 불리는 싱글 테이블을 생성한다. 또한 photo, question, posts는 모두 이 테이블 내에 저장된다.
Using Embedded
// 문서에서 임베디드 사용도 언급을 하고 있는데, 솔직히 임베디드를 상속이라고 보기는 어렵다고 생각한다.
// 정확히 표현하면 공통 모듈을 뺴서 테이블에 추가하는 개념에 가깝다.
// JPA에서 있던 Join 전략 방식은 언급되어 있지 않다.
'프로그래밍 > TypeORM' 카테고리의 다른 글
[TypeORM] Caching queries (0) | 2023.08.31 |
---|---|
[TypeORM] Active Record vs Data Mapper (0) | 2023.08.31 |
[TypeORM] Embedded Entities (0) | 2023.08.31 |
[TypeORM] Eager and Lazy Relations (0) | 2023.08.31 |
[TypeORM] What is EntityManager and Repository (0) | 2023.08.31 |
댓글