프로젝트를 리펙토링 하던중 충격적인 사실을 알아버렸다..
그동안 삭제 서비스로직 코드를 작성할 때 코드가 상당히 괴랄해졌었는데
Prisma 에서 제공하는 Cascade 전략을 이제야 알았다..눙물이앞을가림
프로젝트를 진행하던 와중에 급작스럽게 ORM을 변경하게되면서 프리즈마를 처음 써보면서 겪은 해프닝이랄까
눈물나는 나의 코드를 보자..
이런 스토리를 코드로 작성하게되면 대충 이렇게 되었었다
끝도안보임....
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 } });
현타와서 오늘은 못하겠고 내일부터 다시 리펙토링을 해야겠따..