강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

이상훈님의 프로필 이미지
이상훈

작성한 질문수

스프링부트로 엔티티 삭제로직 구현하는 방법 질문

해결된 질문

작성

·

321

0

조인으로 연관관계가 설정된 엔티티를 삭제할 때 데이터의 정합성을 유지하는 것에 대해 고민하는 도중...

 

아래의 방법1을 사용하면 무조건 양방향 설정이 필요하다고 생각했습니다. 제일 깔끔하지만 양방향 매핑은 최대한 지양하고 단방향 매핑을 하라는 말과 조인연산이 많은 부하를 준다는 말을 듣고 방법1이 사용하지 말아야하는 방법인지 궁금해졌습니다. 주관적인 조언 부탁드립니다!

 

추가로 밑의 3가지 방법말고 효율적인 삭제프로세스가 있다면 알려주세요

 


 

방법1 : 양방향 JOIN과 CascadeType.REMOVE, orphanRemoval = true 설정을 통해 자식 엔티티를 삭제하기

방법2 : 논리적 삭제(soft delete : 삭제시간을 표시해서 삭제한걸로 인식)를 구현하고 트래픽이 적은 시간 때에 스프링 배치 혹은 벌크성 삭제연산을 통해 실제 물리적으로 삭제하기

방법3 : 서비스층에서 삭제하려는 엔티티(ex. User)의 자식 엔티티들(ex. Post, Comment)을 삭제를 하고 엔티티(ex. User)를 삭제하게 하기

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

이상훈님, 엔티티 삭제 로직에 관한 고민을 가득 담은 질문 감사합니다. 엔티티 삭제 처리는 데이터의 무결성 유지가 중요하므로, 다양한 요소를 고려하여 결정해야 합니다. 아래의 방법들과 추가적인 관점을 공유드리겠습니다.

방법1은 편리함을 제공하지만, 양방향 매핑이 가져올 수 있는 복잡성 증가와 성능 문제를 신중히 고려해야 합니다. 여러 연관 관계가 있는 경우 유지 보수의 어려움이 있을 수 있습니다.

방법2는 데이터 정합성을 유지하면서 즉시 삭제가 필요하지 않은 상황에서 유용할 수 있습니다. 삭제된 엔티티가 여전히 시스템 내에 존재하므로, 데이터 분석 등에 활용할 수 있습니다. 후속 처리가 필요하다는 점도 유의해야 합니다.

방법3은 조금 더 명시적으로 삭제 프로세스를 제어할 수 있는 장점이 있습니다. 여기서는 트랜잭션이 관리되고 있는지 확인해야 합니다. Spring Data JPA에서는 @Transactional 어노테이션을 이용하여 트랜잭션 범위를 선언할 수 있습니다. Spring Data JPA - Reference Documentation

위의 방법들 외에도 Spring Data JPA에서 제공하는 Derived Delete Queries(파생 삭제 쿼리)를 사용할 수 있습니다. 이 방법을 사용하면 JPQL 쿼리를 명시적으로 작성하지 않고도 entity를 삭제할 수 있으며, 프레임워크가 제공하는 delete(...) 메소드와 일관성 있는 동작을 기대할 수 있습니다. 예를 들어, deleteByRoleId(...)는 엔티티를 조회한 후 각 인스턴스를 삭제하여 @PreRemove 콜백을 호출할 수 있도록 합니다. Spring Data JPA - Reference Documentation

많은 방법이 있지만 상황에 맞는 최적의 방법을 선택하는 것이 중요합니다. 데이터의 크기, 제약 조건, 일관성, 트랜잭션, 애플리케이션의 성능 요구 사항 등 다양한 요소를 고려해야 하며, 때로는 여러 접근법을 혼합하여 사용해야 할 수도 있습니다. 결국 선택한 전략이 비즈니스 요구 사항을 충족하면서도 시스템의 성능과 유지 보수성을 높일 수 있는 방향이어야 합니다.

추가적인 도움이 필요하신 경우, 언제든 문의해주세요.

이상훈님의 프로필 이미지
이상훈
질문자

감사합니다!

이상훈님의 프로필 이미지
이상훈

작성한 질문수

질문하기