이번에는 nest 프로젝트에 TypeORM을 사용해 Entity를 정의하고 관계를 정의하는 것을 공부해볼려고 한다.
A와 B 테이블이 있다고 가정한다.
A 테이블 (소유자)
@OneToOne(type => B, (b) => (b.a))
@JoinColumn()
b: Relation<B>;
B 테이블 (피소유자)
@OneToOne(type => A, (a) => (a.b), {
nullable: false, // 설정 안할시 기본값 true
onDelete: "CASCADE",
})
@JoinColumn()
a: Relation<A>;
TypeORM 모듈의 경우 Sequelize와 다르게 자동으로 CASCADE 설정을 해주지 않아 수동으로 해줘야 했다. 예를들어 B가 A에게 종속된다고 가정할때 A가 삭제된다면? B도 같이 삭제가 되어야 한다. 따라서 피소유자인 B는 onDelete: "CASCADE"를 통해서 A가 삭제될때 B도 같이 삭제됨을 정의해주는 것이다.
nullable: false의 경우, 설정해주지 않으면 null이 허용된다, 즉 B를 생성할때 A와의 관계가 없어도 생성할 수 있다는 것이다. 이는 상황에따라 true일수도 있고, false일수도 있다. 기본값은 true이다.
One To One의 경우 JoinColumn 데코레이터가 없으면 테이블에 ForeignKey를 생성하지 않는다. 예를 들어 B 테이블이 A 테이블에 하나 종속되는 상황이라면 A 테이블에만 JoinColumn 데코레이터를 넣으면 된다.
A : B = 1 : N 관계라고 가정한다.
A 테이블 (소유자)
@OneToMany(type => B, (b) => (b.a))
bs: Relation<B>[];
B 테이블 (피소유자)
@ManyToOne(type => A, (a) => (a.b), {
nullable: false, // 설정 안할시 기본값 true
onDelete: "CASCADE",
})
a: Relation<A>;
1 : N 관계의 경우 관계의 종속이 분명하기에 N에 해당하는 테이블에 외래키가 생성된다. 위와 같은 경우에서는 B 테이블에 외래키가 생성될 것이다.
A : B = N : M 관계라고 가정한다.
A 테이블
@ManyToMany(type => B, (b) => (b.as))
@JoinTable()
bs: Relation<B>[];
B 테이블
@ManyToMany(type => A, (a) => (a.bs))
as: Relation<A>[];
N : M 관계의 경우 다른 관계들 처럼 기존의 테이블에 외래키가 형성되는 것이 아니라 TypeORM에서 두 테이블을 이어주는 중간다리 테이블을 생성하여 해당 테이블에서 외래키를 생성한다.
JoinTable 데코레이터는 One To One의 JoinColumn 데코레이터와 유사한 것으로 관계의 소유자를 분명하게 하기 위해 넣어주는 것을 추천한다.