[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' } 옵션을 적용한 예제입니다.
이 경우 부모(게시물) 엔티티를 삭제하면 자식(댓글) 엔티티들도 모두 삭제됩니다.
'데이터베이스, ORM > TypeORM' 카테고리의 다른 글
[TypeORM] SQL 쿼리 튜닝 - 2. 외래키 정보 join없이 조회하기 (0) | 2024.12.02 |
---|---|
[TypeORM] SQL 쿼리 튜닝 - 1. findBy VS findOneBy 뭐가 더 좋을까? (0) | 2024.11.25 |
[TypeORM] @OneToMany, @ManyToOne - 옵션: eager / lazy (0) | 2024.11.23 |
[TypeORM] @OneToMany, @ManyToOne - 옵션: cascade (0) | 2024.11.23 |
[TypeORM]쉽고 빠르게 사용해보자 (0) | 2024.11.23 |