YesCoding

Go to English
search:

TypeOrm how to soft delete data on cascade

thumbnail_typeORM

fk (foreign key) 둜 μ—°κ²°λ˜μ–΄ μžˆλŠ” 두 ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό ν•œ λ²ˆμ— TypeOrm 의 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ‚­μ œν•˜λŠ” 방법에 λŒ€ν•΄ μ •λ¦¬ν•œλ‹€.

상황

  1. user name, password λ“±μ˜ 정보λ₯Ό 담은 Users table 이 μžˆλ‹€. user_id κ°€ PK (primary key) 이닀.
  2. user 의 nickname, birth date 등을 담은 UserProfile table 이 μžˆλ‹€. Users table κ³ΌλŠ” OneToOne relationship 을 가지고 있고, 연결고리가 λ˜μ–΄μ£ΌλŠ” foreign key λŠ” users table 의 pk 인 users_id 이닀.
  3. νšŒμ›μ΄ νƒˆν‡΄λ₯Ό ν•΄μ„œ user 데이터λ₯Ό μ‚­μ œν•˜λ©΄ user profile 데이터도 ν•¨κ»˜ μ‚­μ œκ°€ λ˜μ–΄μ•Ό ν•œλ‹€.
  4. μ‚­μ œλŠ” μ™„μ „νžˆ DB μ—μ„œ row λ₯Ό μ—†μ• λ²„λ¦¬λŠ” hard delete κ°€ μ•„λ‹ˆλΌ, deleted_at ν•„λ“œμ˜ κ°’λ§Œ CURRENT_TIMESTAMP 둜 μ°μ–΄μ£ΌλŠ” soft delete 둜 ν•œλ‹€.

μœ„μ™€ 같은 μƒν™©μ—μ„œ 선택할 수 μžˆλŠ” 방법은 두 가지이닀.

  1. users Table μ—μ„œ μ‚­μ œν•˜κ³ μž ν•˜λŠ” user id 둜 데이터λ₯Ό μ°Ύμ•„λ‚΄ μ‚­μ œν•œ ν›„, μ„±κ³΅μ μœΌλ‘œ μ‚­μ œ λ˜μ—ˆμœΌλ©΄ user profile ν…Œμ΄λΈ”μ—μ„œλ„ user_id 둜 데이터λ₯Ό μ°Ύμ•„ μ‚­μ œν•΄μ£ΌλŠ” 방법
  2. users table μ—μ„œ user_id 둜 μ‘°νšŒν•΄ μ‚­μ œν•˜λ©΄, ν•΄λ‹Ή user_id λ₯Ό foreign key 둜 κ°€μ§€λŠ” user profile 이 μžλ™ μ‚­μ œλ˜λ„λ‘ on cascade λ₯Ό κ±Έμ–΄μ£ΌλŠ” 방법

TypeORM 은 2번의 방법을 맀우 μ‰½κ²Œ κ΅¬ν˜„ν•˜λ„λ‘ μ˜΅μ…˜μ„ λ§Œλ“€μ–΄ λ†“μ•˜λ‹€.

  1. 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 }
  1. μ‚­μ œ κ΅¬ν˜„ μ½”λ“œ

μ£Όμ˜ν•  점은, 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 값이 μ±„μ›Œμ Έ μžˆμŒμ„ 확인할 수 μžˆλ‹€.

Recommend Post
nestjs request dto and response dto
nestjs request dto and response dto
google social login ν•œ μœ μ €μ˜ 생년월일 κ°€μ Έμ˜€κΈ°
google social login ν•œ μœ μ €μ˜ 생년월일 κ°€μ Έμ˜€κΈ°
TypeORM soft delete on cascade
TypeORM soft delete on cascade
typeORM entity μ—μ„œ λΉ„λ°€λ²ˆν˜Έ hash ν•˜κΈ°
typeORM entity μ—μ„œ λΉ„λ°€λ²ˆν˜Έ hash ν•˜κΈ°
Β© Copyright 2022, YesCoding