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 를 다시 생성해서 연결해보면
학생모델과 선생 모델에 각각 잘 추가된것을 볼 수 있습니다.
위에서 사용된 방식과는 조금 다르게 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 를 새로고침 해보면 잘 생성된 것도 볼 수 있습니다.
@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 컬럼까지 잘 추가된 것을 볼 수 있습니다.