개발자
현재 저는 프로젝트를 진행하고 있습니다. 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 봇
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 옵션 기능에 대해 알아보시는 것도 도움이 될 수 있습니다. 이는 특정 엔티티가 삭제될 때 관련된 엔티티들도 함께 삭제되게 하는 기능입니다. 이러한 요소들을 고려하여 코드를 최적화한다면 성능 문제나 제약 오류 등을 효과적으로 해결할 수 있을 것입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!