1. 소프트 삭제(Soft Delete)란?
소프트 삭제는 데이터를 실제 삭제하지 않고 삭제된 것으로 표시만 하는 방법입니다. 이는 데이터를 삭제한 후에도 복구하거나 삭제 시점을 추적할 수 있는 장점이 있습니다. 소프트 삭제를 구현하는 방법 중 하나는 데이터베이스 테이블에 isDeleted와 같은 플래그를 추가하고, 해당 값을 true 또는 1로 설정하여 삭제된 레코드를 표시하는 것입니다.
2. Hibernate에서 소프트 삭제 구현
Hibernate에서는 소프트 삭제를 쉽게 구현할 수 있는 기능을 제공합니다. 주로 **@SQLDelete**와 @Where 어노테이션을 사용하여 데이터를 물리적으로 삭제하는 대신, 논리적으로 삭제된 것으로 처리할 수 있습니다.
3. @SQLDelete 어노테이션 사용
@SQLDelete 어노테이션을 사용하면, delete 관련 메서드가 호출될 때 실제로 데이터베이스에서 레코드를 삭제하는 대신, **isDeleted**와 같은 필드를 업데이트하는 쿼리를 실행할 수 있습니다. 예를 들어, 다음과 같은 쿼리를 통해 소프트 삭제를 구현할 수 있습니다:
@SQLDelete(sql = "UPDATE DOWNLOAD_FOLDER SET IS_DELETED = 1 WHERE DOWNLOAD_FOLDER_ID = ?")
이렇게 설정하면 deleteById 메서드가 호출될 때, 해당 폴더의 IS_DELETED 값을 1로 설정하여 삭제된 것으로 표시합니다. 실제 데이터는 삭제되지 않고, isDeleted = true 상태로만 변경됩니다.
4. @Where 어노테이션 사용
@Where 어노테이션은 조회 쿼리에서 삭제된 항목을 제외하도록 필터링할 수 있습니다. 예를 들어, IS_DELETED가 0인 항목만 조회하도록 설정할 수 있습니다:
@Entity @SQLDelete(sql = "UPDATE DOWNLOAD_FOLDER SET IS_DELETED = 1 WHERE DOWNLOAD_FOLDER_ID = ?") @Where(clause = "IS_DELETED = 0") // 삭제되지 않은 항목만 조회 public class DownloadFolder { @Id private String downloadFolderID; private String folderName; private boolean isDeleted = false; // getters and setters }
이 설정은 **IS_DELETED = 1**인 항목을 조회에서 제외하여, 삭제된 항목이 쿼리 결과에 나타나지 않도록 합니다.
5. 소프트 삭제를 사용할 때의 장점
- 데이터 복구 가능: 실제 데이터를 삭제하지 않기 때문에, 복구가 가능합니다.
- 삭제 시점 추적: 언제, 어떤 이유로 데이터가 삭제되었는지를 추적할 수 있습니다.
- 트랜잭션 안전성: 삭제 작업을 isDeleted 상태 변경으로 처리하므로, 트랜잭션 중에 문제가 발생해도 데이터를 잃어버릴 걱정이 없습니다.
6. 소프트 삭제 예시 코드
@Entity @SQLDelete(sql = "UPDATE DOWNLOAD_FOLDER SET IS_DELETED = 1 WHERE DOWNLOAD_FOLDER_ID = ?") @Where(clause = "IS_DELETED = 0") public class DownloadFolder { @Id private String downloadFolderID; private String folderName; private boolean isDeleted = false; // getters and setters }
위와 같이 설정하면, deleteById 메서드가 호출될 때 실제로 삭제되지 않고 IS_DELETED 값을 1로 업데이트하여, 논리적으로 삭제된 상태로 관리됩니다.
7. 실제 삭제 대신 isDeleted 처리
deleteById 메서드를 호출하면, 실제로 데이터를 삭제하지 않고 IS_DELETED 값만 변경됩니다. 아래는 deleteById 메서드를 사용할 때의 예시입니다:
public DownloadFolderDTO.DownloadFolderUpdateRes deleteFolder(String folderID) { downloadFolderRepository.findById(folderID) .orElseThrow(() -> new NotFoundElementException("folder not found.")); // 실제 삭제가 아닌 isDeleted 필드를 true로 설정 downloadFolderRepository.deleteById(folderID); // 소프트 삭제 처리 return DownloadFolderDTO.DownloadFolderUpdateRes.builder() .downloadFolderID(folderID) .build(); }
이처럼 소프트 삭제는 실제로 데이터를 삭제하지 않고, 논리적으로 삭제된 것으로 표시하는 방식으로, 데이터의 복구 가능성과 추적성을 보장할 수 있습니다.
'공부 > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크(Collections Framework) (0) | 2024.05.22 |
---|---|
[Java] Iterator와 Comparable (0) | 2024.05.21 |
[Java] DS vs. ADT (자료 구조 vs. 추상 데이터 타입) (0) | 2024.05.17 |
[Java] Array 비슷한 용어 정리(Arrays vs. ArrayList vs. Array vs. List) (0) | 2024.05.17 |
[Java] Object 클래스 (0) | 2024.03.30 |