inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

해결된 질문

194

이완수

작성한 질문수 4

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);
와 같이 자식을 삭제 후, 부모를 삭제하는 방향으로 구성할지,
아니면 근본적인 설계를 바꿔야하는지 많은 고민이생기네요.
어떠한 방향으로 나아갈지 조언 부탁드리겠습니다.

감사합니다.

JPA java spring spring-boot 웹앱

답변 1

1

김영한

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

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

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

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

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

 

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

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

 

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

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

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

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

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

감사합니다.

sdk 설정 오류

0

49

2

오탈자 - @Transactional

0

55

1

src/test/resources 테스트 경로 문제

0

50

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

64

1

MemberRepositoryTest 실행오류

0

81

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

183

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

137

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

51

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

71

1

기본 생성자

0

60

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

100

1

멤버서비스테스트 부분에서 막힙니다.

0

164

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

116

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

118

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

112

1

24분 27초 연관관계 편의 메서드 위치

0

113

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

108

2

빌드 툴, Gradle

0

59

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

76

2

Repository에서 EntityManager 주입 방식 차이

0

88

1

롬복과 사용자 정의 setter 메서드

0

71

1

주문 목록 조회 fetch join 질문드립니다

0

81

1

dirty checking 질문드립니다.

0

81

1

동시성 관련 질문입니다

0

74

1