[Nest.js] TypeORM 테이블 관계 정의하기

김지엽·2023년 12월 20일
0
post-thumbnail

1. 개요

이번에는 nest 프로젝트에 TypeORM을 사용해 Entity를 정의하고 관계를 정의하는 것을 공부해볼려고 한다.

2. One To One (1:1)

A와 B 테이블이 있다고 가정한다.

- Entity 관계 정의

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 데코레이터를 넣으면 된다.

3. One To Many (1:N)

A : B = 1 : N 관계라고 가정한다.

- Entity 관계 정의

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 테이블에 외래키가 생성될 것이다.

4. Many To Many (N:M)

A : B = N : M 관계라고 가정한다.

- Entity 관계 정의

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 데코레이터와 유사한 것으로 관계의 소유자를 분명하게 하기 위해 넣어주는 것을 추천한다.

참고

TypeORM npm 문서
nestJS 공식 문서

profile
욕심 많은 개발자

0개의 댓글