[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