NestJS TypeORM의 Many to Many 구현 4- Join Table에 CASCADE적용하기(부모Record삭제시 자식 Record도 동시 삭제)

이전글 : NestJS TypeORM의 Many to Many 구현 3- Join Table 구성


안녕하세요. 이번에는 'CASCADE'를 JoinTable에 적용해 보도록 하겠습니다. 


사진1) userId 삭제할때 에러

위 SQL문에서 user 테이블의 id 2인 레코드를 지울려면 해당 JoinTable의 연관된 Record를 먼저 삭제를 해야 합니다. 이것을 삭제하고 진행을 할수 있지만 무척 번거로워 지겠죠. 

 좋은 방법중 하나는 user의 Record를 삭제하면 JoinTable의 연관된 Record도 자동으로 지워지는 것입니다. 그것이 CASCADE입니다.


// user_book_join.entity.ts : src/book/entities

import { User } from 'src/users/entities/user.entity';
import {
Column,
CreateDateColumn,
Entity,
ManyToOne,
PrimaryColumn,
} from 'typeorm';
import { Book } from './book.entity';

@Entity()
export class User_Book_Join {
// 여기서 PrimaryColumn은 userId와 bookId의 조합이다.
@PrimaryColumn({
nullable: false,
})
userId: number;

@PrimaryColumn({
nullable: false,
})
bookId: number;

@Column({
nullable: false,
})
book_review: string;

@CreateDateColumn({ readonly: true })
created_at: Date;

@ManyToOne(() => User, (user) => user.id, {
onDelete: 'CASCADE', // 해당 user레코드가 삭제시 CASCADE사용(연관 레코드 삭제)
})
user: User;

@ManyToOne(() => Book, (book) => book.id)
book: Book;
}


처음에 만든 User_Book_Join entity에서 @ManyToOne 부분에 추가로 들어가는 코드가 있습니다. 'onDelete: 'CASCADE''을 위 코드와 같이 추가하면 user테이블의 레코드가 삭제가 되면 해당 JoinTable도 적용이 됩니다.


사진2) JoinTable에 CASCADE적용

User_Book_Join entity를 DB에 적용후 다시 해당 유저를 삭제하면 사진2와 같은 결과가 나옵니다. user에 id 2인 레코드를 삭제했지만 JoinTable의 연관된 userId까지 갖이 삭제 된 것입니다.


매우 편리한 기능이긴 하지만 신중하게 사용해야 합니다. 자칫 잘못하다가 원치않는 레코드까지 지울수 있기 때문입니다.


위 예제 GitHub 링크 및 Branch : CASCADE


댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)