TypeORM에서 연관된 엔터티 간의 작업을 관리하는데 사용되는 옵션 중 하나입니다. Cascade 설정을 통해 부모 엔터티와 연관된 자식 엔터티에 대한 일부 작업을 자동으로 처리할 수 있습니다.
예를 들어 저희 프로젝트에서, User Entity 에 Story Entity 가 OneToMany관계로 매핑 되어 있는데 유저 Entity를 불러올 때 Story Entity를 연관시켜 불러오고, 해당 스토리를 변경시키면 실제 DB 테이블에 저장되어 있는 Story를 변경 시킬 수 있습니다. 이를 적용함으로서 코드를 조금 더 객체 지향적으로, 편리하게 작성할 수 있었습니다.
@Entity()
export class User {
@PrimaryGeneratedColumn()
@ApiProperty({ description: 'User Column을 식별하기 위한 userId' })
userId: number;
@OneToMany(() => Story, (story) => story.user, {
cascade: true,
})
stories: Promise<Story[]>;
...
}
위와 같이 설정에서 { cascade: true }
을 적용하면 됩니다.
public async mention(user: User, comment: Comment) {
user.mentions.push(comment);
return await this.userRepository.save(user);
}
위 코드는 사용자가 댓글을 통해 누군가를 Mention할 때 실행되는 로직입니다. User와 Mention 필드는 Cascade 옵션이 적용되어 있기에, Mention 필드에 값을 추가할 시 자동으로 반영되도록 하였습니다. 따로 mention에 대한 Repository를 불러올 필요가 없기에 코드가 간소화 되었습니다.
Cascade를 적용하면 분명 편리하지만 이와 상충하는 문제가 몇 가지 있었습니다.