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

이완수님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

1:N 구조에서 Parent를 삭제할 경우에 대한 질문

해결된 질문

작성

·

159

0

안녕하세요. 항상 친절한 답변 감사합니다.

1:N 구조에서 Parent를 삭제할 경우에 대한 질문이 있습니다.
현재 제가 개발중인 엔티티 구조는 Parent-Child순으로 1:N 관계입니다.
Parent-Child와 Child-Child2는 @ManyToOne 단방향 매핑으로 이루어져있습니다.
비즈니스 로직상 Parent가 삭제되면 그 하위 엔티티는 의미가 없어져 삭제해야합니다.

따라서, Parent를 Delete를하는 레포지토리내 메소드를 개발하고있는데

public void deleteParent(Long parentId) {
		queryFactory.update(child).setNull(child.parent).where(child.parent.id.eq(parentId)).execute();
		queryFactory.delete(parent).where(parent.id.eq(parentId)).execute();
	}

위와 같이 일괄적으로 하위엔티티들이 참조중인 부모를 null로 변경해 연관관계를 지운 후, Parent를 지우는 방향으로 개발 중입니다.
delete가 아닌 update 쿼리를 한 이유는 사용자가 혹여나 실수로 부모를 지울 경우 하위엔티티가 다 제거되는 경우를 생각해 일단 null로 업데이트했습니다.

다만, 이러한 방식이 옳은 방법인지는 의문입니다. parent에 새로운 Child들이 생기면 매번 한줄씩 추가해줘야하는 부분도 거슬리고, Child에서 Parent뿐만아니라 추가적으로 다른 Entity를 참조할 경우가 생겨도 문제가 생길 것 같구요.

따라서 지금과 같이 Parent Delete메소드를 작성해야하는지,
혹은, ChildRepository 내 해당 Parent를 가진 Child들을 삭제하는 메소드를 따로 만들어,
도메인이 아닌 서비스 계층에서
childRepository.deleteByParent(parentId);
parentRepository.deleteById(parentId);
와 같이 자식을 삭제 후, 부모를 삭제하는 방향으로 구성할지,
아니면 근본적인 설계를 바꿔야하는지 많은 고민이생기네요.
어떠한 방향으로 나아갈지 조언 부탁드리겠습니다.

감사합니다.

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 이완수님^^

제가 내용을 쭉 읽어보았는데, 저도 좀 드는 고민이... 우선 JPA 답지 않게 삭제를 하셔서 그 의도가 궁금합니다.

단순히 쿼리로 update, delete를 하셔서요. JPA를 사용하면 엔티티 단위로 비즈니스 로직을 처리하셔야 합니다.

지금처럼 쿼리로 강제로 처리하는 방법은 최대한 하지 않아야 합니다.

(물론 성능 최적화를 위해서 지금과 같은 배치 쿼리를 사용하실 수 는 있지만요)

 

delete가 아닌 update 쿼리를 한 이유는 사용자가 혹여나 실수로 부모를 지울 경우 하위엔티티가 다 제거되는 경우를 생각해 일단 null로 업데이트했습니다.

-> 이 부분이 잘 이해가 안됩니다. 어떤 부분이 걱정이셔서 그런 것인지요. 말씀해주신 대로라면 @ManyToOne 관계만 되어있어서 Parent가 하위 엔티티를 모를 것 같아서요.

 

제가 도움을 드리고 싶은데, 좀 더 구체적인 코드를 예시로 만들어서 보여주셨으면 합니다.

엔티티3개를 예시로 만들고, 정확하게 매핑까지 완성해서 보여주세요^^

그리고 비즈니스 로직상 Parent가 삭제되면 그 하위 엔티티는 의미가 없어져 삭제해야합니다. -> 정확하게 어디까지 하위엔티티를 제거해야 하는지, Parent가 삭제되면, Child, Child2 모두 다 삭제되어야 하는 것 등등 비즈니스 요구사항을 좀 더 구체적으로 정리해서 알려주세요.

이렇게 비즈니스 요구사항과 동작하는 테스트 코드를 만들어서 전체 프로젝트를 압축해서 올려주세요.

그럼 제가 돌려보면서 도움을 드릴께요.

감사합니다.