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

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 전이(CASCADE)와 고아 객체

어떤 경우에 양방향 연관관계를 사용하나요??

작성

·

172

0



[질문 내용]

 

제가 생각하는 양방향 연관관계를 사용하는 이유는 다음과 같습니다.

 

1) 조회 : team.getMembers().stream ...

근데 이러면 모든 Member 들이 DB에서 불러와지니까

만약 조회해야 할 대상이 많은 경우(members가 너무많아서 페이징 처리를 해야 하는 경우) 는 양방향 연관관계를 삭제하고 그냥 JpaRepository 에서 쿼리로 페이징 쿼리를 작성해야 한다.

 

2) CascadeType.all 혹은 orphanRemoval true 를 위한 매개체

 

1번, 2번 이외에는 쓸데없는 것 맞을까요??

특히 강조한 부분의 제 생각이 맞는지 궁금합니다.

 

 

답변 1

0

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

안녕하세요. dionisos198님

JPA에서 성능을 최적화 하는 fetch join이라는 기술을 사용하려면 연관관계가 필수입니다.

강의 뒤에 나오는 fetch join을 공부해보시면 도움이 되실거에요.

감사합니다.

dionisos198님의 프로필 이미지
dionisos198
질문자

이미 페치조인을 학습한 상태입니다!!

단방향연관관계일때 @Query select m from Member m join fetch m.team t where t.id=:id 이런식으로 하면 성능최적화가 가능하지 않나요?

양방향연관관계를 통해 이득볼수있는 부분이 어디인가요!

1번, 2번 이라고 생각하는데 맞을까요?

dionisos198님의 프로필 이미지
dionisos198
질문자

영한 선생님의 활용 1편에서

Order OrderItem Item 을 Order 와 Item 의 다대다 관계를 OrderItem 으로 풀어내셨고

Order 에는 @OneToMany 를 사용하셨고 Item 에는 OneToMany 를 사용 하지 않으셨습니다.

그 이유는 Order 에서 OrderItem 을 조회할 일이 많지만 Item 에서 OrderItem 을 조회할 일이 없기 때문에 붙이지 않으셨던 걸로 기억합니다.

그런데 만약 User Reveiw Program 이렇게 Review 를 User 와 Program 의 다대다 중간 테이블로 설정한다면

 

User 에서 내가 쓴 리뷰를 조회할 일이 있다고 하면 User 에 @OneToMany 를 붙이는게 좋을 것 같아서 쓴 적이 있습니다.

 

근데 생각해보면 user.getReview 를 실행하면 쿼리가

select review from where userid=? 이런 식으로 나갑니다.

만약 내가 리뷰를 수백 수천개를 썼다면 그 모든 리뷰에 대한 정보가 DB를 통해 조회 될 것같다고 예상했습니다.

모든 리뷰를 가져오는게 싫기 때문에 직접 페이징 쿼리를 짠다고 하면

@Query("select r from Review r where r.user.id=:userId ")

메서드명 +++++= (@Param("userId") Long userId, Pageable pageable)

이런 식으로 짤 것입니다.

 

결국 내가 쓴 리뷰를 조회할 때 @OneToMany 를 이용하지 않습니다.

 

그럼 이럴 때는 영한님은 User 에서 리뷰리스트에 대한 @OneToMany 를 지우시나요?

아니면 내비 두시고

@OneToMany(casCadeType.all)

을 활용하기 위해서 즉 user.getReviews.add(newReivew) 이런 식으로 활용하기 위해서 @OneToMany 를 냅두시는지 궁금합니다.

 

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

안녕하세요. dionisos198님

만약 select m from Member가 아니라 반대인 select t from Team을 조회해야 하는데, member와 패치 조인이 필요하다면 team -> member로의 연관관계가 필요합니다.

이런 경우에 양방향이 필요합니다.

저의 경우에는 다대일 단방향 관계를 선호하고, 이런 반대편으로의 탐색이 필요한 경우에 양방향 관계를 설정합니다.

감사합니다.

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

질문하기