deleted_at
을 사용하여 삭제된 날짜를 기록할 것이다.# 삭제
UPDATE user SET deleted_at = LocalDateTime.now() WHERE id = ?
# 조회
SELECT * FROM user WHERE deleted_at = null
# 복원
UPDATE user SET deleted_at = null WHERE id = ?
# 삭제
DELETE user FROM table WHERE id = ?
# 조회
SELECT * FROM user
@SQLDELETE(sql = "UPDATE user SET deleted_at = LocalDateTime.now() WHERE id = ?")
-> 이 퀴리를 통해 데이터 삭제시 deleted_at의 값을 현재시간으로 update 시킬 수 있다.
@Entity
@Getter
@SQLDelete(sql = "UPDATE user SET deleted_at = LocalDateTime.now() WHERE id = ?")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class user extends BaseEntity {
.
.
.
}
@Where(clause = "deleted_at IS NULL")
-> deleted_at이 NULL인 경우 삭제되지 않은 값으로 확인하여 해당 값을 사용할 수 있는 것이다.
@Override
@Transactional
public void delete(User user) {
User target = getUser(user.getId());
target.delete();
friendRepository.findAllByUserId(target.getId())
.forEach(Friend::delete);
friendRepository.findAllByTargetId(target.getId())
.forEach(Friend::delete);
cooldownRepository.findByUserId(target.getId())
.ifPresent(Cooldown::delete);
}
-> service에서 해당 delete 함수 실행시 user entity에 delete 함수가 실행된다.
public void delete() {
this.deletedAt = LocalDateTime.now();
this.point = 0;
}
-> deletedAt을 현재시간으로 설정하고 포인트 또한 0으로 바꾼다.
문제 발생
[A]
friendRepository.findAllByUserId(target.getId())
.forEach(Friend::delete);
[B]
@Where(clause = "deleted_at IS NULL")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Friend extends AuditingTimeEntity {
public void delete() {
this.deletedAt = LocalDateTime.now();
}
public void renew() {
this.deletedAt = null;
}
}
[C]
public void renew() {
this.deletedAt = null;
}