데이터를 삭제하는 방법에는 두가지 방법이 있다.
deleted
와 같은 컬럼을 true
로 updateHard delete의 경우 'Delete from member where id = 1'와 같은 쿼리를 날려서 데이터를 삭제하는것이고 Soft delete의 경우에는 'Update member set deleted = true where id = 1'을 통해 실제로 데이터를 삭제하지 않지만 deleted 컬럼을 true로 업데이트 해줌으로써 삭제되었다고 표시하는 것이다.
먼저 Soft delete를 왜 사용하는지에 대해서 알아보자.
개인적인 의견이지만 Soft delete를 통해서 데이터를 삭제할때 update 쿼리를 사용하면 코드의 가독성이 떨어지고 직관적이지 못하는것같다.
JPA의 구현체인 Hibernate에는 2가지 기능이 존재한다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@SQLDelete(sql = "UPDATE couple SET deleted = true, deleted_date = CURRENT_DATE, couple_status = 'BREAKUP' WHERE id = ? and version = ?")
@Where(clause = "deleted = false")
public class Couple extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "boy_id")
private Long boyId;
@Column(name = "girl_id")
private Long girlId;
@Column(name = "meet_day")
private LocalDate meetDay;
@Column(name = "invitation_code")
private String invitationCode;
@Column(name = "temperature")
private Float temperature;
@Version
private Long version;
@Column(name = "deleted")
private boolean deleted = Boolean.FALSE;
@Column(name = "deleted_date")
private LocalDate deletedDate;
@Column(name = "couple_status")
@Enumerated(value = EnumType.STRING)
private CoupleStatus coupleStatus;
@Column(name = "re_couple_requester_id")
private Long reCoupleRequesterId;
}
위 코드는 우이삭 프로젝트의 couple엔티티의 일부이다.
@Column(name = "deleted")
private boolean deleted = Boolean.FALSE;
couple엔티티에서 삭제 여부를 나타내는 필드는 deleted로 하였고, couple엔티티를 생성하면 기본값은 FALSE
이다. 이는 삭제되지 않은 상태를 나타낸다.
@SQLDelete(sql = "UPDATE couple SET deleted = true, deleted_date = CURRENT_DATE, couple_status = 'BREAKUP' WHERE id = ? and version = ?")
이다. 이는 엔티티를 삭제할 경우 위에 지정해준 쿼리가 날라가는것을 확인할 수 있다.
데이터를 삭제할 경우 실제 날라간 쿼리를 확인해보았다.
11-30 23:35:34 [http-nio-8080-exec-9] INFO c.l.b.c.l.PrepareStatementInspector - sql=UPDATE couple SET deleted = true, deleted_date = CURRENT_DATE, couple_status = 'BREAKUP' WHERE id = ? and version = ?
update쿼리가 날라간것을 로그에서 확인할 수 있다.
@Where(clause = "deleted = false")
couple 엔티티 관련해서 조회를 할 경우 select 구문 뒤에 where delete = false가 자동으로 추가되어 조회한다.
이는 soft delete되지 않은 데이터들을 조회하는것을 의미한다.