Node.js

[NestJs]Model간 Relationship 설정 + Relation Options

무서운승태 2023. 12. 22. 18:16
728x90

OneToOne

테이블 간 1:1 관계일 때 사용한다. 이 예시에선 유저와 유저 프로필에 대한 예제를 이용하겠다.

// User Entity
@OneToOne(() => ProfileModel, (profile) => profile.user)
profile: ProfileModel

// ProfileEntity
@OneToOne(() => UserModel, (user) => user.profile)
@JoinColumn()
author: UserModel
  1. UserModel에서 ProfileModel 타입의 profile을 만든다.
  2. @OneToOne() 어노테이션을 적어준다.
    1. 첫 번째 인자는 콜백함수 형태로 ProfileModel을 받아준다.
    2. 두 번째 인자는 콜백함수 형태로 해당 profile의 user라는 칼럼과 연결해 준다.
  3. 1:1 관계는 서로 동등한 관계이기 때문에 반대쪽 Model에서도 동일하게 작성한다.
  4. @JoinColumn 어노테이션을 입력하면 해당 칼럼에서 userId를 참조키를 받는다. 

OneToMany

1:N 관계일 때 사용한다. 유저와 게시글에 대한 예시로 작성해 보겠다.

// UserModel
@OneToMany(() => PostModel, (post) => post.author)
posts: PostModel[]

// PostModel
@ManyToOne(() => UserModel, (user) => user.posts)
author: UserModel
  1. 1 인 쪽은 OneToMany 어노테이션을 N인쪽은 ManyToOne 어노테이션을 사용한다.
  2. 인자값은 위 사례와 동일하다.
  3. 게시글은 유저가 여러 개를 작성할 수 있기 때문에 PostModel [] 배열형태로 선언한다.

ManyToMany

N:N 관계일 때 사용한다. 게시글을 작성할 때 태그를 작성할 수 있다. 이 게시글과 태그는 서로 N:N의 관계를 가지고 있다.

// PostModel
@ManyToMany(() => TagModel, (tag) => tag.posts)
tags: TagModel[]

// TagModel
@ManyToMany(() => PostModel, (post) => post.tags)
posts: PostModel[]

 

 

관계 설정 시 옵션

   // UserModel
   @OneToOne(() => ProfileModel, (profile) => profile.user, {
        eager: false,
        cascade: true,
        nullable: true,
        onDelete: 'CASCADE',
    })
    profile: ProfileModel;

이 옵션들은 모든 관계설정시 사용가능한다.

  • eager : true or false
    • select를 할 때 find 옵션에서 relations 옵션을 주지 않아도 자동으로 관계를 맺은 테이블의 정보를 가져온다.
  • cascade: true or false
    • 데이터를 저장할 때 관계로 설정된 데이터를 한 번에 저장할 건지에 대한 여부
    • ex) 유저 정보를 등록할 때 유저 프로필도 함께 저장이 된다. 
  • nullable: true or false
    • null 값이 허용되는지 여부
    • false면 해당 값이 Null 일수 없다.
  • onDelete: 'CASCADE' or 'NO ACTION' or 'SET NULL' or 'SET DEFAULT' or 'RESTRICT' 
    • 해당 데이터가 삭제될 때 어떻게 처리할 건지에 대한 옵션이다
    • CASCADE : 참조하고 있는 row도 같이 삭제한다
    • NO ACTION : 아무 동작도 하지 않는다.
    • SET NULL : 해당 칼럼을 null로 세팅한다.
    • SET DEFAULT : default 값이 있다면 default 값으로 설정한다.
    • RESTRICT : 해당 row가 다른 곳에서 참조 중이면 삭제가 불가능하다.