반응형

개발을 하다보면 기록을 남겨야 하기 때문에, 로그 말고도 Soft delete를 사용할 때가 있다.

 

Soft delete는 데이터베이스에서 데이터를 delete 할 때 실제로 delete 쿼리를 날려 삭제하는 것이 아니라,

deleted와 같은 column의 값을 false에서 true로 바꿔주는 update 쿼리를 날려 실제 데이터는 남겨놓으면서 삭제되었다고 알려주는 방식을 말한다.

 

실제 비즈니스 개발을 할 때는, 사용자가 삭제된 데이터를 다시 요청하는 경우도 있기 때문에 대부분의 경우 Soft delete를 사용한다고 배웠다.

 

JPA에서도 이런 Soft delete 방식을 편리하게 지원한다.

 

물론 update를 하는 방식을 계속 사용할 수는 있지만, 그래도 편리하게 다음과 같은 기능을 제공하니 알아보도록 하자.

 

  • @SQLDelete

우선 삭제를 위한 @이다.

@SQLDelete를 사용하면 JPA에서 Delete를 사용할 때 실제로 삭제하는 것이 아니라, 해당 update 쿼리를 날려서 update하게 된다.

 

@SQLDelete(sql = "UPDATE assignment SET deleted = true where id = ?")

 

이런식으로 사용하면 된다.

 

이러면 deleted의 값을 true로 변경해주게 된다.

 

  • @SQLRestriction

조회를 위한 @이다.

@SQLRestriction을 사용하면 JPA에서 findBy를 사용할 때, 해당 column까지 확인을 해서 데이터를 가져오게 된다.

만약 해당 데이터가 이곳의 명시된 값과 다르면 조회하지 않는 것이다.

 

@SQLRestriction("deleted = false")

 

이런식으로 deleted는 false라는 값의 제약을 주었다.

 

보통은 이 2개를 같이 사용하며, 그 예시는 아래와 같다.

 

@Entity
@SQLRestriction("deleted = false")
@SQLDelete(sql = "UPDATE assignment SET deleted = true where id = ?")
data class Assignment(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Int?,

    @Column(length = 200)
    var title: String?,

    @Column(length = 500)
    var description: String?,

    var score: Int,

    var startDate: LocalDate,

    var endDate: LocalDate,

    var deleted: Boolean = false,
)

 

 

+ Recent posts