spring-jdbc-plus icon indicating copy to clipboard operation
spring-jdbc-plus copied to clipboard

[기능제안1] soft delete 지원

Open sjh836 opened this issue 1 year ago • 3 comments

안녕하세요? spring data jdbc, naver jdbc plus 를 사용하고 있습니다. 기능을 구현하다보니, 반복되는 패턴들이 있어서, 몇가지 적어보려합니다.

  • soft delete : row 를 실제로 삭제하는 것 대신, flag 로 on/off 제어
  • WithSoftDelete 인터페이스에서 delete* 메소드들을 재정의
  • 가칭 @SoftDeleteFlag 어노테이션으로 flag 식별하여 sql 을 생성하고 Simple*Impl 에서 재정의
    • UPDATE ${table} SET ${softDeleteFlagVar} = false WHERE ${id} = :id
  • (find* 쪽에서는 ByIdAndActive 와 같은식으로 개발자가 알아서..)

감사합니다.

sjh836 avatar Feb 13 '24 07:02 sjh836

@sjh836 안녕하세요! 먼저 제안주셔서 감사합니다 혹시 현재 개별 구현하신게 많은 로직이 중복으로 들어가는 상황일까요?

우선 라이브러리 단 지원이 없는 상황에서 간단하게 생각하기로는 아래와 같은 커스텀 쿼리를 정의하는 방식이 가능할 것 같습니다

@Modifying
@Query(“UPDATE table SET state = 0 WHERE id = :id”)
int softDeleteById(String id)

말씀해주신대로 해당 패턴은 많이 사용되는 패턴이긴 해서, 지원을 고민해봤을 때 위의 예시에서 state 컬럼이 0, 1 이 아닌 다양한 상태를 가질 수 있는 경우도 있을 것 같습니다

chanhyeong avatar Feb 14 '24 07:02 chanhyeong

오우... 그럴수 있겠네요 저도 Boolean state 라서 써주신 경우와 동일합니다.

전제

  • delete 순방향만 지원
  • soft delete 특징 상, 원상복구가 쉽지만, 이것까진 jdbc-plus 에서 지원X (필요하면 custom query 로 각자 해결)
  • CrudRepository 가 지원하는 것만 재정의 : 결국 deleteById 만 하면 해결가능
    • void deleteById(ID id)
    • void delete(T entity)
    • void deleteAllById(Iterable<? extends ID> ids)
    • void deleteAll(Iterable<? extends T> entities)
    • void deleteAll()

delete flag 의 타입 case

  • @SoftDeleteFlag 이 선언된 필드가 Boolean 일 경우, (대다수는 이런 경우가 많을 듯)
    • true = 삭제X / false = 삭제O 가정 : SET state = false
    • @SoftDeleteFlag(true) : 기본값은 false 이지만, true 로 설정하면 Boolean deleted 같은 경우이므로 역방향도 지원
  • @SoftDeleteFlag 이 선언된 필드가 ENUM 일 경우,
    • @SoftDeleteFlag(YourEnum.DELETED) : SET state = DELETED
  • @SoftDeleteFlag 이 선언된 필드가 String 일 경우,
    • @SoftDeleteFlag("DELETED") : SET state = DELETED
  • 놓친 case 가 있을까요?
  • 특이case 로 timestamp, datetime 을 null 과 now() 로 넣을수도 있을듯은 한데.. 날짜,시간형이면 now() 를 지원한다거나..

고민함께 해주셔서 감사합니다 (_ _)

sjh836 avatar Feb 14 '24 15:02 sjh836

@sjh836

음 코멘트 주신 내용에서 생각해보니, 단순히 flag 만 수정하는게 아닌 마지막 수정 시간과 같은 컬럼도 같이 업데이트하는 경우도 있을 것 같습니다

flag 의 타입은 현재 추정하기로는 어노테이션에 맞는 값만 잘 넣어준다면 개별 타입에 맞는 컨버터를 탈 것 같아서 크게 문제되진 않을 것 같습니다

제안주신 내용은 조금 더 검토하여 지원하는 방향으로 진행해보겠습니다!

chanhyeong avatar Feb 15 '24 04:02 chanhyeong