TypeOrm how to soft delete data on cascade
fk (foreign key) λ‘ μ°κ²°λμ΄ μλ λ ν μ΄λΈμ λ°μ΄ν°λ₯Ό ν λ²μ TypeOrm μ λ©μλλ₯Ό μ¬μ©ν΄ μμ νλ λ°©λ²μ λν΄ μ 리νλ€.
μν©
- user name, password λ±μ μ 보λ₯Ό λ΄μ Users table μ΄ μλ€. user_id κ° PK (primary key) μ΄λ€.
- user μ nickname, birth date λ±μ λ΄μ UserProfile table μ΄ μλ€. Users table κ³Όλ OneToOne relationship μ κ°μ§κ³ μκ³ , μ°κ²°κ³ λ¦¬κ° λμ΄μ£Όλ foreign key λ users table μ pk μΈ users_id μ΄λ€.
- νμμ΄ νν΄λ₯Ό ν΄μ user λ°μ΄ν°λ₯Ό μμ νλ©΄ user profile λ°μ΄ν°λ ν¨κ» μμ κ° λμ΄μΌ νλ€.
- μμ λ μμ ν DB μμ row λ₯Ό μμ λ²λ¦¬λ hard delete κ° μλλΌ, deleted_at νλμ κ°λ§ CURRENT_TIMESTAMP λ‘ μ°μ΄μ£Όλ soft delete λ‘ νλ€.
μμ κ°μ μν©μμ μ νν μ μλ λ°©λ²μ λ κ°μ§μ΄λ€.
- users Table μμ μμ νκ³ μ νλ user id λ‘ λ°μ΄ν°λ₯Ό μ°Ύμλ΄ μμ ν ν, μ±κ³΅μ μΌλ‘ μμ λμμΌλ©΄ user profile ν μ΄λΈμμλ user_id λ‘ λ°μ΄ν°λ₯Ό μ°Ύμ μμ ν΄μ£Όλ λ°©λ²
- users table μμ user_id λ‘ μ‘°νν΄ μμ νλ©΄, ν΄λΉ user_id λ₯Ό foreign key λ‘ κ°μ§λ user profile μ΄ μλ μμ λλλ‘ on cascade λ₯Ό κ±Έμ΄μ£Όλ λ°©λ²
TypeORM μ 2λ²μ λ°©λ²μ λ§€μ° μ½κ² ꡬννλλ‘ μ΅μ μ λ§λ€μ΄ λμλ€.
- entity λ₯Ό λ§λ€ λ, parent entity μμ relation μ μΈ μ μ΅μ μ cascade: true λ₯Ό κ±Έμ΄μ€λ€.
cascade μλ boolean,("insert" | "update" | "remove" | "soft-remove" | "recover")[]
λ₯Ό λ£μ μ μλλ°, default κ°μ false μ¬μ μ무 cascade λ μΌμ΄λμ§ μκ² λμ΄ μλ€.
true λ‘ λ£μ΄μ£Όλ©΄ insert, update, remove, soft-remove, recover λͺ¨λ cascade λ₯Ό νμ©ν΄μ€λ€λ λ»μ΄λ€.
ν΄λΉ case μμλ soft-remove νΉμ true λ₯Ό λ£μ΄μ£Όλ©΄ λλ€.
src/domain/user/users.entity.ts @Entity() export class Users { @PrimaryGeneratedColumn() user_id: number @Column() name: string @OneToOne(() => UserProfile, (profile) => profile.user, { cascade: true or soft-remove }) @JoinColumn() profile: Profile } src/domain/user/user-profile.entity.ts @Entity() export class UserProfile { ... @OneToOne(() => Users, (user) => user.profile) user: Users }
- μμ ꡬν μ½λ
μ£Όμν μ μ, cascade μ΅μ μμ μ μ μλ―μ΄, typeORM μμ μ§μνλ cascade delete λ softDelete κ° μλλΌ softRemove μ΄λ€. softRemove λ₯Ό ν΄μ£Όλ €λ©΄ entity λ₯Ό ν΅μ±λ‘ λ겨주μ΄μΌ νλ€.
src/domain/user/service.ts async deleteUser (userId: string) { const user = await this.userRepository.findOne({ user_id }) await this.userRepository.softRemove(user) }
μ΄λ κ² κ΅¬ννκ³ λμ deleteUser(32) λ₯Ό ν΄λ³΄λ©΄,
Users DB 32λ² μ§Έ user μ deleted_at μ κ°κ³Ό, UserProfile DB 32λ² μ§Έ user profile μ deleted_at κ°μ΄ μ±μμ Έ μμμ νμΈν μ μλ€.