-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
어떤 경우에 양방향 연관관계를 사용하나요??
24.03.17 13:09 작성 조회수 78
0
[질문 내용]
제가 생각하는 양방향 연관관계를 사용하는 이유는 다음과 같습니다.
1) 조회 : team.getMembers().stream ...
근데 이러면 모든 Member 들이 DB에서 불러와지니까
만약 조회해야 할 대상이 많은 경우(members가 너무많아서 페이징 처리를 해야 하는 경우) 는 양방향 연관관계를 삭제하고 그냥 JpaRepository 에서 쿼리로 페이징 쿼리를 작성해야 한다.
2) CascadeType.all 혹은 orphanRemoval true 를 위한 매개체
1번, 2번 이외에는 쓸데없는 것 맞을까요??
특히 강조한 부분의 제 생각이 맞는지 궁금합니다.
답변을 작성해보세요.
0
김영한
지식공유자2024.03.17
안녕하세요. dionisos198님
JPA에서 성능을 최적화 하는 fetch join이라는 기술을 사용하려면 연관관계가 필수입니다.
강의 뒤에 나오는 fetch join을 공부해보시면 도움이 되실거에요.
감사합니다.
dionisos198
질문자2024.03.18
영한 선생님의 활용 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 를 냅두시는지 궁금합니다.
김영한
지식공유자2024.03.19
안녕하세요. dionisos198님
만약 select m from Member가 아니라 반대인 select t from Team을 조회해야 하는데, member와 패치 조인이 필요하다면 team -> member로의 연관관계가 필요합니다.
이런 경우에 양방향이 필요합니다.
저의 경우에는 다대일 단방향 관계를 선호하고, 이런 반대편으로의 탐색이 필요한 경우에 양방향 관계를 설정합니다.
감사합니다.
답변 1