[코팩] NestJs 엔티티 임베딩 해보기 (Entity Embedding)

Seong Hyeon Kim·2024년 3월 21일
0

NestJs

목록 보기
13/14

Entity Embedding

src/entity/person.entity.ts

@Entity()
export class Student{
    @PrimaryGeneratedColumn()
    id:number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    class: string;
}

@Entity()
export class Teacher{
    @PrimaryGeneratedColumn()
    id:number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    salary: number;
}

만약 학생과 선생님의 정보를 카진 칼럼들을 추가한 엔티티를 추가한다고 가정할때 간단 예시로 위와같이 사용이 작성할 수 있습니다.

이때 겹치는 firstName 과 lastName 을 하나의 클래스로 다시 묶어서도 사용이 가능합니다.

src/entity/person.entity.ts

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;
}

위와같이 코드를 변경한후 db 를 다시 생성해서 연결해보면

학생모델과 선생 모델에 각각 잘 추가된것을 볼 수 있습니다.





Table Inheritance

간단한 Inheritance

위에서 사용된 방식과는 조금 다르게 OOP 적으로 의존성을 주입해준게 Inheritance 입니다.

src/entity/inheritance.entitiy.ts

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

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

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updateAt: Date;
}


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

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

위에서 사용했던 방법과 달리 객체지향적으로 의존성을 주입한 간단한 예시라고 생각해주시면 됩니다.

실제로 db 를 새로고침 해보면 잘 생성된 것도 볼 수 있습니다.


single table Inheritance


@Entity()
export class SingleBaseModel{
    @PrimaryGeneratedColumn()
    id: string;

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updateAt: Date;
}


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


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

위 코드와 같은 클래스 형태의 Inheritance 을 말합니다.

이러한 형태는 많이 사용되지는 않지만,만약 기본 싱글베이스 형태에 컴퓨터모델타입과 공항모델타입 까지 총 3가지가 모두 합쳐진 형태를 원할때를 사용될 수 있습니다.

위 코드에서 조금 추가해서 완성본은 다음과 같습니다


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

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updateAt: Date;
}

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

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

먼저 컴퓨터모델과 공항모델을 @ChildEntity() 로 애노테이션을 추가해주고
마찬가지로 SingleBaseModel 역시 @TableInheritance 을 추가해준후 안에 칼럼을 한개 생성해서 그안에서 새롭게 생성될 무언가인 type 이란 값을 추가해주고,
그 type의 실제 타입이될 내용을 'varchar' 로 설정해줍니다.

src/app.module.ts


@Module({
  imports: [
    TypeOrmModule.forFeature([
      UserModel
  ]),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: '127.0.0.1',
      port: 5432,
      username: 'postgres2',
      password: 'postgres2',
      database: 'typeormstudy',
      entities: [
        UserModel,
        StudentModel,
        TeacherModel,
        BookModel,
        CarModel,
        ComputerModel,
        AirplaneModel,
        SingleBaseModel
      ],
      synchronize: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})

앱모듈로 돌아와서 엔티티에 추가를 해준 후

db 를 새로고침해보면 잘 생성된것을 볼 수 있고, 생성된것은 싱글베이스라는 한개의 테이블만 생성되었습니다.

기본베이스 모델의 컬럼들과 컴퓨터와 공항테이믈에 있던 값인 brand 와 country 컬럼이 추가되었고,

마지막으로 추가했던 type 컬럼까지 잘 추가된 것을 볼 수 있습니다.

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글