개발자

안녕하세요 HardDelete를 하는 과정속에서 궁금한 점이 생겨 이렇게 질문을 남깁니다.

2023년 12월 28일조회 59

현재 저는 프로젝트를 진행하고 있습니다. hard delete 특정 연관관계 칼럼까지 삭제를 해야 하는데 이에 있어 보통 어떻게 삭제하는지 궁금합니다. 저희는 프로젝트 용이기 때문에 매 년마다 HardDelete를 구현을 담당하고 있습니다.(내부적인 회의를 통해서 hard delete를 구현하기로 함) 근데 구현에 있어서는 스케줄러를 통해서 삭제를 할 예정이고(코드 참고) @Scheduled(cron = "0 */2 * * * ?") // test cron public void teamDisbandCheckAndDelete() { List<Long> teamIds = teamRepository.findIdsByIsDeleteIsTrue(); teamRepository.deleteAll(teamIds); // cascade remove } 할 생각이었지만 이는 성능상 이슈가 있을 것이라고 생각합니다. 그러한 이유는 팀을 하나만 삭제하는데 다른 연관 관계 테이블은 최소 10배가 최대 100배 넘는 데이터를 가지고 있을 것이라고 예상합니다. 이러한 관점에서 봤을 때 성능상 이슈가 있을 것이라고 예상하고 배치 delete를 구현하려고 했습니다. 근데 만약 이렇게 배치 delete를 아래와 같이 진행을 하려고 합니다.(예시 코드) // 연관된 데이터 삭제 // (예: TeamParticipants, SimpleSchedule, RepeatSchedule 등) teamParticipantsRepository.deleteByTeamIdIn(ids); simpleScheduleRepository.deleteByTeamIdIn(ids); repeatScheduleRepository.deleteByTeamIdIn(ids); // Team 엔터티 삭제 teamRepository.deleteAllByIdIn(ids); 근데 이렇게 삭제하는 게 최선인지도 궁금합니다. 여기서 문제점은 만약 다른 엔티티(TeamParticipants 등등) 삭제 시 제약조건 오류가 났을 때 그렇다면 그 해당 칼럼도 삭제를 해줘야 하는데 이렇게 구현하는 게 맞나?? 싶어서 이렇게 글을 남깁니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 0

답변이 없을 때 보이는 아이콘

첫 답변을 기다리고 있어요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 12월 28일

안녕하세요, 소프트웨어 엔지니어분. 질문에 대해 답변드리겠습니다. 당신이 접근하고 있는 방식은 기본적으로 알맞습니다. 하지만 제약 조건 오류에 관한 문제를 해결하기 위해서는 두 가지 선택 사항을 고려해 볼 수 있습니다. 1. 트랜잭션 관리: `@Transactional` 어노테이션을 메서드에 적용하여 연관된 모든 삭제 작업이 하나의 트랜잭션에서 실행되게 할 수 있습니다. 이는 실패 시 롤백 (rollback)이 가능하며 데이터 일관성을 유지하는 데 도움이 됩니다. 예: ``` java @Transactional public void deleteAllRelatedEntities(List<Long> ids) { teamParticipantsRepository.deleteByTeamIdIn(ids); simpleScheduleRepository.deleteByTeamIdIn(ids); repeatScheduleRepository.deleteByTeamIdIn(ids); teamRepository.deleteAllByIdIn(ids); } ``` 2. 순서 결정: 제약 조건 때문에 발생하는 에러를 방지하기 위해서, 삭제 순서를 차곡차곡 쌓여진 것처럼 구현할 수 있습니다. 예를 들어, 'team'가 삭제되기 전에 'teamParticipants'와 'schedule'들을 먼저 삭제하는 것입니다. 또한 말씀하신대로 성능 이슈가 있을 수 있는데, 이는 큰 양의 데이터를 한 번에 처리하기 때문입니다. 이 경우 일반적인 방법은 삭제 작업을 배치로 나누는 것입니다. 예를 들어, 리스트의 id들을 부분적으로 나누고 각 부분을 순차적으로 처리하면 됩니다. 마지막으로, JPA에서 제공하는 캐스케이드 타입 (CascadeType) 중 REMOVE 옵션 기능에 대해 알아보시는 것도 도움이 될 수 있습니다. 이는 특정 엔티티가 삭제될 때 관련된 엔티티들도 함께 삭제되게 하는 기능입니다. 이러한 요소들을 고려하여 코드를 최적화한다면 성능 문제나 제약 오류 등을 효과적으로 해결할 수 있을 것입니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!