• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

JPA auditing 및 SOFT DELETE

20.05.28 21:01 작성 조회수 2.68k

5

안녕하세요 선생님 오랫만에 질문 올려보니다.  JPA 사용할때마다 기억안나는 부분을 다시 항상 찾아보며 공부하고 있습니다. 그런던 중 궁금한게 생겨 질문 드립니다.

1.혹시 선생님은 soft delete 는 어떻게 구현하시는 지 궁금합니다.보통 (State 변수추가,deleteAt 컬럼으로 삭제 날짜 추가,deleted flag 변수 추가) 이 세가지인데 어느 방식을 선호하시는지요?

2 해당 구현은 repository 단에서 deleteById 이렇게 호출되면 엔티티를 조회한되  해당 값들을 업데이트 해주시나요?(@PreRemove 애노테이션을 사용해서나, createdAt 이나 lastModifiedAt처럼 Jpa Auditing을 활용해서 가능한가요?그리고 이렇게 하는게 더 깔끔할까요?

3.현재 Table A 의  생성,변경,삭제내역을 담은 Table History가 있다고 하고 일대다 관계로 아래처럼 되어있다고 하면

class Table A {

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)

List<History> history;

}

생성시  history.add(new History("생성"))

변경시  history.add(new History("변경"))

삭제시  history.add(new History("삭제"))

이러한 로직들은 생성은 생성자 안에, 변경은 변경을 하는 메서드 안에, 삭제는 soft delete시 수행되는 로직과 함께 두는게 나을까요 아님 @PrePersist @preUpdate 이러한 에노테이션을 붙혀서 Table A 안에 메서드를 만드는게 나을까요?

답변 4

·

답변을 작성해보세요.

5

실제 데이터를 지우는 것은 repository를 통해서 하는 것이 맞다고 생각합니다.

반면에 softdelete는 실제 데이터를 삭제하는 기능이 아니라 사실상 내부 필드를 변경하는 것이기 때문에 일반적인 데이터 변경 프로세스인 변경감지로 처리하는게 맞다 생각합니다. 그래서 entity.delete()를 호출하고, 변경감지로 처리하는 것이지요^^

감사합니다.

2

asdkfur님의 프로필

asdkfur

질문자

2020.05.29

그렇군요 요즘 질문의 많아 바쁘실텐데 감사합니다. ㅎㅎㅎ 

1

asdkfur님의 프로필

asdkfur

질문자

2020.05.28

항상  바쁘신 와중에도 이렇게 답변해주셔서 감사합니다. ㅎㅎ 

혹시 2번에 사항에 대해 추가 질문 들이자면 그러면 delete 요청이 들어 왔을때 repository.delete(entity) 를 한 다음 delete 안에서 softdelete 처리보다는 repository를 거치지않고 예를 들어 entity.delete()을 서비스 레이어에서 바로 호출해 변경감지로 업데이트 하신다는 말씀이시죠?  

이유는 실용성 측면에서 불필요하다 정도 일까요?

감사합니다. 

1

반갑습니다. asdkfur님^^

1.혹시 선생님은 soft delete 는 어떻게 구현하시는 지 궁금합니다.보통 (State 변수추가,deleteAt 컬럼으로 삭제 날짜 추가,deleted flag 변수 추가) 이 세가지인데 어느 방식을 선호하시는지요?

-> state 또는 deleted flag를 사용합니다.

2 해당 구현은 repository 단에서 deleteById 이렇게 호출되면 엔티티를 조회한되  해당 값들을 업데이트 해주시나요?(@PreRemove 애노테이션을 사용해서나, createdAt 이나 lastModifiedAt처럼 Jpa Auditing을 활용해서 가능한가요?그리고 이렇게 하는게 더 깔끔할까요?

-> JPA의 변경감지를 사용합니다. 단순히 엔티티의 컬럼을 변경한다는 뜻입니다. (deleted = true)

3.현재 Table A 의  생성,변경,삭제내역을 담은 Table History가 있다고 하고 일대다 관계로 아래처럼 되어있다고 하면

-> 저는 이벤트 보다는 좀더 직관적으로 메서드 안에서 처리하는 것을 선호합니다. 물론 이벤트를 사용해도 무관합니다.

감사합니다.