[prisma] Cascade

DaeChan Jo·2023년 9월 14일
1

데일리삽질

목록 보기
3/8

프로젝트를 리펙토링 하던중 충격적인 사실을 알아버렸다..

그동안 삭제 서비스로직 코드를 작성할 때 코드가 상당히 괴랄해졌었는데
Prisma 에서 제공하는 Cascade 전략을 이제야 알았다..눙물이앞을가림
프로젝트를 진행하던 와중에 급작스럽게 ORM을 변경하게되면서 프리즈마를 처음 써보면서 겪은 해프닝이랄까


눈물나는 나의 코드를 보자..

  1. 그룹을 삭제하고싶어
  2. 그럼 그룹과 관련된 게시글도 삭제되어야 겠네
  3. 그럼 그룹 이미지와 그룹 게시글에 작성된 이미지도
  4. 그럼 그 게시글에 달린 댓글도 지워져야지!
  5. 그리고 그룹에 가입한 유저들도 탈퇴처리해야돼

이런 스토리를 코드로 작성하게되면 대충 이렇게 되었었다

끝도안보임....

Cascade

프리즈마에서는 관계를 가진 레코드를 삭제할 여러가지 onDelete 전략을 사용할 수 있다. 여기서는 Cascade만 알아보자...

cascade 전략은 부모 필드가 삭제될 때 관려된 자식 필드들도 모두 삭제하는 방법이다. 만약 아래와같이 Group필드가 삭제될 때 GroupUser라는 관계필드를 가지고 있다 가정하면, 해당 관계에 onDelete: Cascade 를 사용하면 된다

model Group {
	id           Int          @id @default(autoincrement())
	manager      User         @relation(fields: [managerId], references: [id], onDelete: Cascade)
	managerId    Int
	posts        Post[]
	certposts    CertPost[]   @db.VarChar(1000)
	memberLimit  Int          @default(50)
	groupUser    GroupUser[]
	groupImage   GroupImage[]
  	...
}

model GroupUser {
	user       User    @relation(fields: [userId], references: [id], onDelete: Cascade)
	userId     Int
	group      Group   @relation(fields: [groupId], references: [id], onDelete: Cascade)
	groupId    Int
	isAdmin    Boolean @default(false)
	isAccepted Boolean @default(false)

	@@id([userId, groupId])
}
 
...

이런식으로 관계설정에 onDelete를 추가해주면 상위 테이블의 필드가 삭제될 때, 하위테이블의 필드를 어떻게 할지 정할 수 있고, 장황한 삭제쿼리가 엄청나게 단순화 된다... 위에서 봤던 토나오는 삭제로직이 단 한줄로 변하는 매직...

await prisma.group.deleteMany({ where: { id: groupId } });

현타와서 오늘은 못하겠고 내일부터 다시 리펙토링을 해야겠따..

profile
BackEnd Developer

0개의 댓글