포시코딩

2월28일 - entity cascade 옵션 추가하기 본문

TIL

2월28일 - entity cascade 옵션 추가하기

포시 2023. 2. 28. 14:20
728x90

개요

FK 종속 관계를 부여해놓은

Meetup, Join 라는 이름의 두 entity가 있는데

 

Meetup(모임)을 만들 때 Join(참가)에 작성자 id를 같이 넣는 로직이 있어

Meetup 데이터를 새로 만들 경우 만든 Meetup의 PK를 FK로 갖는 Join 데이터가 만들어지는 구조이다.

 

이번에 softDelete 없이 Meetup을 삭제하는 API를 만드는 과정에서 테스트 도중

위와 같은 에러가 발생했는데

entity를 세팅할 때 CASCADE 옵션을 주지 않았기 때문에 

delete or update를 할 수 없다고 알려주고 있었다.

 

그래서 이번엔 예전에 해야되겠네 하고 잊었던 CASCADE 옵션을 추가해볼 것이다.

 

적용 방법

기존 코드

meetup.entity.ts

// ...생략
@Entity({ schema: 'chalkak', name: 'meetup' })
export class Meetup {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  // ...생략

  @OneToMany(() => Join, (join) => join.meetup)
  joins: Join[];
}

 

join.entity.ts

// ...생략
@Entity({ schema: 'chalkak', name: 'join' })
export class Join {
  @PrimaryColumn()
  meetupId: number;

  // ...생략

  @ManyToOne(() => Meetup, (meetup) => meetup.joins)
  meetup: Meetup;
}

보다싶이 CASCADE 옵션이 없는 상태다. 이제 적용하면 다음과 같다.

 

CASCADE 적용 코드

meetup.entity.ts

// ...생략
@Entity({ schema: 'chalkak', name: 'meetup' })
export class Meetup {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  // ...생략

  @OneToMany(() => Join, (join) => join.meetup, {
    cascade: true,  // 추가된 부분
  })
  joins: Join[];
}

 

join.entity.ts

// ...생략
@Entity({ schema: 'chalkak', name: 'join' })
export class Join {
  @PrimaryColumn()
  meetupId: number;

  // ...생략

  @ManyToOne(() => Meetup, (meetup) => meetup.joins, {
    onDelete: 'CASCADE',  // 추가된 부분
  })
  meetup: Meetup;
}

설정 뒤 meetup을 삭제하면 FK로 연결된 join 데이터도 삭제되는 것을 확인할 수 있다.

 

 

 

 

참고한 곳

https://velog.io/@jeong3320/typeorm-cascade옵션

 

typeorm cascade옵션

onDelete:'CASCADE' 옵션을 주면 Author가 삭제될시 관련된 Book도 같이 삭제됨 cascade:true옵션은 author에 책이 추가되고 author가 저장될때 book또한 반드시 db에 저장된다.cascade:true옵션이 없을시 위의 코드

velog.io

728x90