Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[기능제안1] soft delete 지원 #123

Closed
sjh836 opened this issue Feb 13, 2024 · 3 comments · Fixed by #148
Closed

[기능제안1] soft delete 지원 #123

sjh836 opened this issue Feb 13, 2024 · 3 comments · Fixed by #148
Assignees

Comments

@sjh836
Copy link
Contributor

sjh836 commented Feb 13, 2024

안녕하세요? 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 와 같은식으로 개발자가 알아서..)

감사합니다.

@chanhyeong
Copy link
Collaborator

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

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

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

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

@sjh836
Copy link
Contributor Author

sjh836 commented Feb 14, 2024

오우... 그럴수 있겠네요
저도 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() 를 지원한다거나..

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

@chanhyeong
Copy link
Collaborator

@sjh836

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants