Soft Delete / Hard Delete

이재하·2023년 10월 18일
0

항해99

목록 보기
40/48

웹소켓을 활용하여 실시간 채팅 기능을 구현하려는 계획 중에, 채팅 메시지의 효율적인 관리와 저장 전략의 중요성을 크게 느꼈다. 이러한 고민 속에서, 어떠한 데이터베이스를 선택할지는 매우 핵심적인 고려사항이다. 소프트 딜리트와 하드 딜리트의 전략에 대해 찾아보며 그 장단점과 각각의 특징에 대해 세밀하게 알아보고 있다. 또한, 다양한 데이터베이스 유형 별로 어떻게 소프트 딜리트를 효과적으로 구현할 수 있을지에 대한 검토를 진행 중이다. 이러한 탐색과 연구를 통해 웹소켓 기반의 실시간 채팅 서비스에서 데이터 관리의 복잡성과 그 중요성을 절감하게 되었다.


1. Soft delete(논리 삭제)와 Hard delete(물리 삭제)

Soft delete(논리 삭제):

실제 데이터를 데이터베이스에서 삭제하지 않고, 삭제되었다는 상태만을 표시하는 방법이다. 일반적으로 데이터의 속성 중 하나를 사용하여 데이터가 삭제되었는지 여부를 나타내며, 삭제 플래그 또는 삭제 시간 등의 칼럼을 사용한다.

Hard delete(물리 삭제):

실제로 데이터를 데이터베이스에서 완전히 삭제하는 것이다.


2. Soft delete(논리 삭제)를 사용하는 이유 및 장점

  1. 데이터 복구의 용이성: 데이터를 실수로 삭제한 경우, 논리 삭제된 데이터는 쉽게 복구할 수 있다.

  2. 데이터의 무결성 유지: 데이터베이스의 관계 무결성을 유지하면서도 데이터를 안전하게 '삭제'할 수 있다.

  3. 변경 이력 추적: 데이터의 변경 이력을 추적하고 싶을 때 논리 삭제는 매우 유용하다다. 삭제된 데이터에 대한 이력도 남겨져 있기 때문에, 언제 어떤 데이터가 삭제되었는지 추적이 가능하다.


3. Soft delete의 주된 단점은 무엇인가?

  1. 데이터베이스 용량 증가: 삭제되지 않은 데이터는 계속 데이터베이스에 저장되기 때문에, 물리적인 저장 공간이 점차 증가한다.

  2. 쿼리 복잡성: 데이터를 조회할 때마다 삭제되지 않은 데이터만을 조회하기 위한 추가적인 조건이 필요하다.

  3. 성능 저하 가능성: 특히 대량의 데이터가 논리적으로 삭제된 경우, 해당 데이터를 매번 건너뛰어야 하므로 성능에 영향을 줄 수 있다.


4. 그럼 언제 논리 삭제를 사용하고 물리삭제를 사용해야 할까?

  • 논리 삭제 사용 시기:
    • 데이터 복구의 필요성이 높을 때
    • 데이터의 변경 이력을 추적하고 싶을 때
    • 참조 무결성 문제를 피하고 싶을 때
  • 물리 삭제 사용 시기:
    • 데이터베이스의 저장 공간을 효율적으로 활용하고 싶을 때
    • 성능 최적화가 필요한 경우

5. 어떤 데이터베이스 선택해야 할까?

관계형 데이터베이스(RDBMS): 관계형 데이터베이스는 트랜잭션과 데이터 무결성이 중요한 경우에 유리하다. RDBMS에서는 Foreign Key 제약 조건 등으로 인해 물리 삭제가 복잡할 수 있으므로 Soft delete가 주로 사용된다.

NoSQL 데이터베이스: NoSQL 데이터베이스는 확장성과 높은 처리량을 중요시하는 경우에 유리하다. 이러한 데이터베이스는 스키마가 유연하므로 물리 삭제와 논리 삭제를 선택하는 기준은 주로 성능과 데이터 복구 요구사항에 기반한다.

시계열 데이터베이스: 이러한 데이터베이스는 시간 순서로 데이터를 저장하는 것이 특징이다. 논리 삭제는 시간의 연속성을 깨뜨릴 수 있으므로, 해당 데이터베이스에서는 물리 삭제가 더 일반적일 수 있다.


6. Spring에서 Soft delete 사용 시 많이 사용하는 방법들

  • @SQLDelete와 @Where 어노테이션 사용: Hibernate에서 제공하는 이 어노테이션들을 사용하여 논리 삭제를 구현할 수 있다.
  • JPA Entity Listener 사용: @PreRemove 어노테이션과 같은 JPA Entity Lifecycle 이벤트를 활용하여 논리 삭제를 처리한다.
  • QueryDSL과 같은 쿼리 라이브러리 활용: 특정 조건(예: isDeleted = false)을 기본 조건으로 쿼리를 작성할 수 있게 도와준다.

@SQLDelete와 @Where 사용 예제

가정: deleted라는 boolean 필드를 가진 Book 엔터티가 있다고 가정했다.

@Entity
@Table(name = "books")
@SQLDelete(sql = "UPDATE books SET deleted = true WHERE id = ?")
@Where(clause = "deleted = false")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String title;
    
    private boolean deleted;
    
    // getters, setters, etc.
}

@SQLDelete: 해당 엔터티에 대한 삭제 작업이 발생할 때 실행될 SQL 문을 지정한다. 여기서는 deleted를 true로 설정하는 것으로 논리 삭제를 수행하도록 지정했다.

@Where: 해당 엔터티를 조회할 때 적용되는 조건을 지정한다. 여기서는 삭제되지 않은(deleted = false) 데이터만을 기본적으로 조회하도록 설정했다.

이렇게 설정하면, Book 엔터티에 대한 삭제 작업은 실제로 데이터를 삭제하지 않고 deleted 필드를 true로 설정하는 논리 삭제로 수행된다. 또한, Book 엔터티를 조회할 때는 기본적으로 삭제되지 않은 데이터만을 조회하게 된다.


정리

데이터의 중요성, 복구 요구사항, 성능, 저장 공간 및 관리 복잡성 등의 여러 측면을 고려하여 애플리케이션에 가장 적합한 삭제 전략을 선택해야 한다. Soft delete는 데이터의 안전성 및 추적 가능성을 제공하는 반면, Hard delete는 물리적 저장 공간 및 성능 최적화에 이점이 있을 수 있다. 데이터베이스의 선택도 삭제 전략의 선택에 큰 영향을 미칠 수 있다. 따라서 애플리케이션의 요구 사항과 데이터베이스의 특성을 꼼꼼히 검토하여 가장 적합한 전략을 선정해야 한다.

0개의 댓글