[241118 TIL] AI 검증 비즈니스 프로젝트

Soft Delete 적용 - IsDeletedFalse 활용

Soft Delete 수정

✔️ BaseEntity & IsDeletedFalse 활용

  • 수정 전 예시
@SQLDelete(sql = "UPDATE p_reviews SET is_deleted = true WHERE id = ?")
@Where(clause = "is_deleted = false")
reviewRepository.deleteById(reviewId);
  • 수정 후
public void delete(Long userId) {
    this.deletedAt = LocalDateTime.now();
    this.deletedBy = userId;
    this.isDeleted = true;
}
review.delete(user.getId());
Optional<Review> findByIdAndIsDeletedFalse(UUID id);

List<Review> findAllByUserIdAndIsDeletedFalse(Long userId);

Page<Review> findAllByStoreIdAndIsDeletedFalse(UUID storeId, Pageable pageable);

 

  • @SQLDelete ➡️ BaseEntity 활용
    • deleteById ➡️ delete 함수 생성 후 Soft Delete 적용
  • @Where ➡️ IsDeletedFalse 활용

Soft Delete 구현

1) 어려웠던 점

  • 논리적 삭제 처리: 데이터를 물리적으로 삭제하지 않고 isDeleted 컬럼을 활용해 논리적으로 삭제 상태를 관리하고자 했습니다. 이는 삭제된 데이터 복구와 조회를 가능하게 하지만, 모든 조회 쿼리에 삭제 상태를 고려해야 한다는 어려움이 있었습니다.
  • 테이블 간 연관 관계: 테이블 간 연관 관계가 설정된 상태에서, 삭제된 데이터를 제외하고 연관 데이터를 조회하거나 처리하는 데에 복잡함이 있었습니다.

2) 해결 방안

  • isDeleted 컬럼 추가
    • 각 테이블에 isDeleted컬럼을 추가하여 논리적 삭제 여부를 관리했습니다.
    • 삭제 시 데이터를 물리적으로 제거하지 않고, 해당 컬럼 값을 true로 설정하여 삭제 상태를 표시하도록 구현했습니다.
  • JPA 메서드 조건 활용
    • JPA의 Spring Data 메서드 쿼리를 활용하여, isDeleted가 false인 데이터만 조회되도록 구현하였습니다.
    • 예: findByIdAndIsDeletedFalse
  • 연관 데이터 처리
    • 연관된 테이블 간 Soft Delete를 고려하여 데이터 무결성을 유지하였습니다.
    • 예: 리뷰 평점 계산 시 삭제 상태인 리뷰 데이터를 제외하고 평점을 계산하도록 구현

3) 더 효율적으로 하려면

  • 공통 처리 메서드화: Soft delete를 처리하는 로직을 각 엔티티의 서비스에서 반복적으로 작성하기보다, 공통적인 로직을 **AOP(Aspect-Oriented Programming)**나 BaseRepository를 사용 중복을 최소화할 수 있을 것 입니다.

+ Recent posts