반응형
엔티티 임베딩(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 |
엔티티 임베딩의 장점
- 코드 재사용성: Name 클래스와 같은 공통 필드 그룹을 여러 엔티티에서 재사용 가능.
- 코드의 간결성: 중복된 코드 없이 필드 정의를 한 곳에서 관리.
- 유지보수 용이: 공통 필드 수정 시, 해당 필드를 사용하는 모든 엔티티에 자동 반영.
주의 사항
- 임베딩된 클래스는 독립적인 테이블이 아닌, 임베딩된 엔티티의 일부로 확장.
- 임베딩된 클래스 내부의 @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 |