본문 바로가기
프로그래밍/TypeORM

[TypeORM] Entity Inheritance

by YuminK 2023. 8. 31.

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

댓글