👩🏻💻 Programming/SpringBoot
Soft delete와 Hard delete
한국의 메타몽
2021. 9. 26. 21:42
둘의 차이는?
방식 | 설명 |
Soft Delete (논리삭제) | 'UPDDATE table SET delete = 1 WHERE id = 2' 형태로 ROW가 삭제되지 않고 flag를 통한 제어 방식. 삭제여부를 알 수 있는 컬럼에 데이터가 삭제되었다는 값을 넣어서 표현한다. |
Hard delete (물리삭졔) | 'DELETE FROM table WHERE id = 2' 형태로 ROW가 실제로 삭제되는 방식 |
현업에서는 Hard delete보다 Soft delete를 보다 자주 사용한다.
예시
id | 회원 id | 회원 이름 | 삭제 여부 |
1 | 1 | 김가나 | 0 |
2 | 1 | 김가나 | 1 |
3 | 1 | 김가나 | 0 |
Soft delete의 경우, UPDATE 명령어를 이용하여 삭제 여부의 컬럼 값을 true로 바꿔준다.
결론적으로 실제 서비스에서 회원 정보의 삭제 여부가 '0'인 행만 보내준다.
논리삭제의 경우, 실제 데이터는 DB에 남아있고 사용자(클라이언트)에게 배송지 정보가 삭제된 것 처럼 보여주는 방법이다.
반대로 물리삭제의 경우, 실제로 DB에서 해당 행 자체를 삭제한다.
실제 코드
[book.java]
@Entity
@NoArgsConstructor
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Where(clause = "deleted = false") // 논리삭제
public class Book extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String category;
private Long authorId;
private boolean deleted; // 논리삭제여부
...
}
}
위 상황에서 deleted가 true인 코드는 데이터 조회시 해당 데이터는 없다는 결과가 반환된다.
[import.sql]
insert into book(`id`, `name`, `publisher_id`, `deleted`) values (1,'JPA 초격차 패키지', 1, false);
insert into book(`id`, `name`, `publisher_id`, `deleted`) values (2, 'Spring Security 초격차 패키지', 1, false);
insert into book(`id`, `name`, `publisher_id`, `deleted`) values (3, 'Spring 올인원 패키지', 1, true);
[BookRepositoryTest.java]
@Test
void softDelete(){
bookRepository.findAll().forEach(System.out::println);
}
[테스트 결과]
Book(super=BaseEntity(createdAt=null, updatedAt=null), id=1, name=JPA 초격차 패키지, category=null, authorId=null, deleted=false)
Book(super=BaseEntity(createdAt=null, updatedAt=null), id=2, name=Spring Security 초격차 패키지, category=null, authorId=null, deleted=false)
보다시피 3번 책에 대한 정보는 출려되지 않는다.