spring-jdbc-plus
                                
                                
                                
                                    spring-jdbc-plus copied to clipboard
                            
                            
                            
                        [기능제안1] soft delete 지원
안녕하세요? 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 안녕하세요! 먼저 제안주셔서 감사합니다 혹시 현재 개별 구현하신게 많은 로직이 중복으로 들어가는 상황일까요?
우선 라이브러리 단 지원이 없는 상황에서 간단하게 생각하기로는 아래와 같은 커스텀 쿼리를 정의하는 방식이 가능할 것 같습니다
@Modifying
@Query(“UPDATE table SET state = 0 WHERE id = :id”)
int softDeleteById(String id)
말씀해주신대로 해당 패턴은 많이 사용되는 패턴이긴 해서, 지원을 고민해봤을 때
위의 예시에서 state 컬럼이 0, 1 이 아닌 다양한 상태를 가질 수 있는 경우도 있을 것 같습니다
오우... 그럴수 있겠네요
저도 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같은 경우이므로 역방향도 지원
- true = 삭제X / false = 삭제O 가정 : 
 @SoftDeleteFlag이 선언된 필드가 ENUM 일 경우,@SoftDeleteFlag(YourEnum.DELETED):SET state = DELETED
@SoftDeleteFlag이 선언된 필드가 String 일 경우,@SoftDeleteFlag("DELETED"):SET state = DELETED
- 놓친 case 가 있을까요?
 - 특이case 로 timestamp, datetime 을 null 과 now() 로 넣을수도 있을듯은 한데.. 날짜,시간형이면 now() 를 지원한다거나..
 
고민함께 해주셔서 감사합니다 (_ _)
@sjh836
음 코멘트 주신 내용에서 생각해보니, 단순히 flag 만 수정하는게 아닌 마지막 수정 시간과 같은 컬럼도 같이 업데이트하는 경우도 있을 것 같습니다
flag 의 타입은 현재 추정하기로는 어노테이션에 맞는 값만 잘 넣어준다면 개별 타입에 맞는 컨버터를 탈 것 같아서 크게 문제되진 않을 것 같습니다
제안주신 내용은 조금 더 검토하여 지원하는 방향으로 진행해보겠습니다!