[NestJS] - 11. TypeORM Delete, 실제 삭제와 소프트 삭제
바로 이어서 데이터베이스에서 로우를 삭제하고, 선택해보는 것까지 알아보자!
Delete
remove()
▶ products.service.ts
async remove(id: number): Promise<Product> {
const product = await this.productRepository.findOne({
where: { id: id },
});
const result = await this.productRepository.remove(product)
return result
}
- remove(삭제할 모델)는 데이터베이스 테이블에서 인수로 전달받은 모델과 일치하는 로우를 삭제한다.
- 해당 메서드는 삭제한 엔터티 모델을 반환한다.
delete()
▶ products.service.ts
async delete(id: number): Promise<boolean> {
const result = await this.productRepository.delete({ id: id });
return result.affected ? true : false; //행이 영향을 받았는지 확인
}
- delete(조건 모델)는 데이터베이스 테이블에서 조건에 해당하는 로우를 삭제한다.
- 해당 메서드는 삭제 성공 여부 객체를 반환한다.
실제 삭제 vs 소프트 삭제
위의 ORM 기능들은 실제로 데이터베이스 테이블상의 로우를 삭제한다. 그렇지만 실무에서 하드하게 삭제하게 되면 사용 히스토리 추적이나 에러 트래킹이 어려워질 수 있다. 따라서 중요도가 떨어지거나, 저장공간 문제 등 필요에 따라서 실제로 삭제하는 경우도 있으나, 소프트 삭제를 주로 사용하게 된다.
소프트 삭제는 실제 삭제하는 것이 아닌 deletedAt 타임스탬프를 갱신하는 방식으로, TypeORM에서는 Select 등의 질의 시 deletedAt 여부를 판단하여 자동으로 제외하고 쿼리를 날리는 기능이 있다. 그래서 삭제된 것 처럼 보이나 실제 데이터는 남아있어 히스토리를 추적할 수 있는 것이다.
데이터 복원에도 유리하며, TypeORM에서 원한다면 deletedAt이 있더라도 쿼리 대상에 포함시킬 수도 있다.
SoftDelete
softRemove()
▶ products.service.ts
async remove(id: number): Promise<Product> {
const result = await this.productRepository.softRemove({id: id});
return result
}
- softRemove(조건 모델)는 데이터베이스 테이블에서 인수로 전달받은 조건과 일치하는 로우를 소프트 삭제한다.
- 해당 메서드는 삭제한 엔터티 모델을 반환한다.
- 아래의 softDelete와 달리 PK 조건을 통해서만 삭제 가능하다.
softDelete()
▶ products.service.ts
async delete(id: number): Promise<boolean> {
const result = await this.productRepository.softDelete({ id: id });
return result.affected ? true : false; //행이 영향을 받았는지 확인
}
- softDelete(조건 모델)는 데이터베이스 테이블에서 조건에 해당하는 로우를 삭제한다.
- 해당 메서드는 삭제 성공 여부 객체를 반환한다.
- 위의 softRemove와 달리 다른 조건을 통해서도 삭제 가능하다.
위와 같이 소프트삭제 결과 DELETE문이 실행되는 것이 아닌 UPDATE문이 실행되는 것을 로그상으로 확인할 수 있으며,
타임스탬프가 갱신되었다는 것을 확인할 수 있었다.
다음 장에서는 Select에 대해서 포스팅해보겠다.
해당 강의를 들으면서 학습한 내용을 바탕으로 저만의 프로젝트를 만드는 과정을 기록하여 남기는 것을 목표로 하고 있습니다.
주관적인 생각이 들어가 있을 수 있으므로 혹시 틀린 내용이 있다면 피드백 부탁드립니다.
'Backend > Node.js (NestJS)' 카테고리의 다른 글
[NestJS] - 13. TypeORM 관계 테이블 Insert/Update (1) | 2023.02.23 |
---|---|
[NestJS] - 12. TypeORM Select (0) | 2023.02.23 |
[NestJS] - 10. TypeORM Insert / Update (0) | 2023.02.23 |
[NestJS] - 9. Pipe와 Validator, 요청 데이터 사전 검문하기 (0) | 2023.02.23 |
[NestJS] - 8. 데이터베이스 관계와 TypeORM 데이터베이스 관계 매핑 (0) | 2023.02.22 |