본문 바로가기
nestJS

NestJS | TypeORM Entity Embedding

by 리잼 2024. 11. 12.
반응형

엔티티 임베딩(Entity Embedding) 이란?

  • 임베딩(Embedding)은 다른 클래스나 객체를 현재 엔티티에 포함시키는 방식
  • 임베딩된 클래스의 필드는 포함된 엔티티의 컬럼으로 확장된다.
  • 마치 상속을 사용하는 것처럼 보이지만, 데이터베이스 설계에서는 단일 테이블 내에 확장된 형태로 저장됨.

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()
  class: string;
  @Column()
  salary: number;
}

1. 임베딩 클래스 정의 (Name 클래스)

export class Name { @Column() first: string; @Column() last: string; }
  • Name 클래스는 first와 last라는 두 개의 string 타입 컬럼을 포함.
  • 이 클래스는 독립적인 엔티티가 아니며, 다른 엔티티에 포함(임베딩)되어 사용됨.

2. StudentModel 엔티티에서 임베딩 사용

@Entity() export class StudentModel { 
        @PrimaryGeneratedColumn() id: number; 
        @Column(() => Name) name: Name; @Column() class: string; 
}
  • @Column(() => Name) 데코레이터를 사용하여 name 필드에 Name 클래스를 임베딩
  • 결과적으로 StudentModel 테이블에는 다음과 같은 컬럼이 생성된다
    • id
    • nameFirst (Name 클래스의 first 필드)
    • nameLast (Name 클래스의 last 필드)
    • class

3. TeacherModel 엔티티에서 동일한 임베딩 사용

@Entity() export class TeacherModel { 
    @PrimaryGeneratedColumn() id: number; 
    @Column(() => Name) name: Name; 
    @Column() class: string; @Column() salary: number; 
}
 
  • TeacherModel에서도 동일하게 @Column(() => Name)으로 Name 클래스를 임베딩하여 사용
  • 결과적으로 TeacherModel 테이블에는 다음과 같은 컬럼이 생성됨
    • id
    • nameFirst (Name 클래스의 first 필드)
    • nameLast (Name 클래스의 last 필드)
    • class
    • salary

생성된 테이블 구조 예시

StudentModel 테이블

id name Firstname Lassclass
1 John Doe 3-A
2 Jane Smith 2-B

TeacherModel 테이블

id name Firstname Lastclass salary
1 Alice Johnson Math 50000
2 Bob Brown Science 55000

엔티티 임베딩의 장점

  1. 코드 재사용성: Name 클래스와 같은 공통 필드 그룹을 여러 엔티티에서 재사용 가능.
  2. 코드의 간결성: 중복된 코드 없이 필드 정의를 한 곳에서 관리.
  3. 유지보수 용이: 공통 필드 수정 시, 해당 필드를 사용하는 모든 엔티티에 자동 반영.

주의 사항

  • 임베딩된 클래스는 독립적인 테이블이 아닌, 임베딩된 엔티티의 일부로 확장.
  • 임베딩된 클래스 내부의 @Column 데코레이터는 여전히 필요하다.
  • 임베딩된 클래스의 이름과 필드 이름이 테이블 컬럼명으로 결합되기 때문에 컬럼 이름 충돌을 피하도록 주의해야 한다.

정리

TypeORM의 엔티티 임베딩은 공통적인 필드 그룹을 재사용하여 엔티티 설계를 단순화하고, 데이터베이스 테이블 구조를 더 효율적으로 관리할 수 있게 도와준다.
이를 통해 프로젝트의 확장성과 유지보수성을 높일 수 있다.

반응형

'nestJS' 카테고리의 다른 글

NestJS | Pipe  (0) 2024.11.20
NestJS | TypeORM Table Inheritance  (0) 2024.11.12
NestJS | TypeORM Column Annotation  (1) 2024.11.12
NestJS | Docker, TypeORM 설치  (0) 2024.11.12
NestJS | 의존성 주입, 제어의 역전  (0) 2024.11.06