데이터베이스, ORM/TypeORM

[TypeORM] @OneToMany, @ManyToOne - 옵션: onDelete / onUpdate

SparkIT 2024. 11. 23. 07:17
[TypeORM] @OneToMany, @ManyToOne - 옵션: cascade
[TypeORM] @OneToMany, @ManyToOne - 옵션: eager / lazy
[TypeORM] @OneToMany, @ManyToOne - 옵션: onDelete / onUpdate

 

typeorm 사용해서 1:N 관계, N:1 관계를 구현할 때 사용되는 eager / lazy 옵션에 대한 설명입니다.

 


onDelete / onUpdate

설명에 앞서 설명에서 사용될 용어들을 미리 설명하고 가겠습니다.

  • 부모(엔티티)
    1:N 관계에서 1 쪽 엔티티를 의미. 게시물과 댓글 관계에서 게시물이 부모 역할을 한다.
  • 자식(엔티티)
    1:N 관계에서 N 쪽 엔티티를 의미. 게시물과 댓글 관계에서 댓글이 자식 역할을 한다.

 정의

외래 키에 대한 작업 설정 옵션입니다. 자식 엔티티에서 설정하는 옵션입니다. cascade 옵션과 비슷해서 헷갈릴 수 있습니다. 이때 cascade는 부모 엔티티에 설정하는 옵션이고 큰 다른점 중 하나가 cascade 옵션과 다르게 어플리케이션 레벨에서의 쿼리를 통한 관리가 아니라는 것입니다. 연관된 데이터를 삭제해야하는 상황이 발생했다고 가정하면 cascade는 DELETE 쿼리를 실행시켜 데이터를 삭제하는 반면 onDelete 옵션을 이용하게되면 데이터베이스 상 제약조건에 onDelete 옵션을 설정한 것이라 애플리케이션에서 삭제가 진행되는 것이 아니라 데이터베이스 자체에서 삭제가 진행됩니다.

 

📄 설정값

 

  • onDelete / onUpdate
    • CASCADE : 부모 엔티티가 삭제/수정되면 관련된 자식 엔티티도 삭제됩니다.
    • SET NULL : 부모 엔티티가 삭제/수정되면 자식 엔티티의 외래 키 값이 NULL로 설정됩니다.
    • RESTRICT : 부모 엔티티가 삭제/수정되지 않도록 제약을 설정합니다.
    • NO ACTION : 삭제/수정이 자식 엔티티에 영향을 미치지 않도록 설정합니다.

 

 

🔍  예제

# 게시물

@Entity()
export class Post {
  @OneToMany(() => Comment, (comment) => comment.post)
  comments: Comment[];
}
# 댓글

@Entity()
export class Comment {
  @ManyToOne(() => Post, (post) => post.comments, { onDelete: 'CASCADE' })
  post: Post;
}

댓글(Comment) 엔티티에서 @ManyToOne 설정한 게시물 변수(post)에 { onDelete:'CASCADE' } 옵션을 적용한 예제입니다.

이 경우 부모(게시물) 엔티티를 삭제하면 자식(댓글) 엔티티들도 모두 삭제됩니다.