해결된 질문
작성
·
224
0
안녕하세요.
jpa 공부하던 중 궁금한 점이 생겨 질문드립니다.
후에 dto를 구성할 때 값을 얻는 방식에 대한 질문인데요.
예를 들어 댓글 리스트를 출력하는 로직에서 댓글에 대한 정보와 글쓴이 이름, 프로필 사진을 가지는 댓글dto 필요로 할 경우
글쓴이 이름, 프로필 사진은 댓글 엔티티에 얻기 때문에 Member 엔티티에서 값을 얻어와야 하는데
1. 양방향 연관관계를 통해 엔티티 정보를 가져오는 방식
2. join를 사용한 jpql 쿼리 사용하여 가져오는 방식 중
어느 방식을 선택해야 할 지 고민입니다.
만약 양방향 연관관계를 통해 가져오는 엔티티를 다른 비즈니스 로직에서 가져올 필요 유무에 따라
FetchType = LAZY를 선택한 경우 -> 1. 방식 선택
FetchType = EAGER 선택한 경우 -> 2. 방식 선택
로 선택하면 될까요?
join을 사용한 jpal 쿼리 사용하는 법은 db에 쿼리를 한 번만 전송하기 때문에 성능면에서 좋을 것 같고,
양방향 연관관계를 통해 엔티티 정보를 가져오는 방식은 좀 더 객체지향적으로 코드를 짤 수 있는 장점이 있는 것 같습니다.
어느 것을 선택하는 것이 좀 더 나은 방식인지 고민이 됩니다.
또 한가지 궁금한 점은 만약 FetchType = LAZY 로 선택한 엔티티를 comment.getChildList().size() 이런 식으로 값을 얻으려 할 때에도 추가 sql 쿼리가 발생하나요?
답변 2
2
안녕하세요. browoo님^^
1. 궁금하신 내용은 활용2편에서 코드를 통해 단계별로 자세히 설명드립니다^^
(성능에 대한 부분은 비즈니스 상황에 따라 다르지만, 일반적으로 쿼리 수를 줄이는 것은 중요합니다.)
(추가로 강의에서 말씀드리는 부분이기는 한데, 실무에서 FetchType은 항상 LAZY를 사용해야 합니다.)
2. 또 한가지 궁금한 점은 만약 FetchType = LAZY 로 선택한 엔티티를 comment.getChildList().size() 이런 식으로 값을 얻으려 할 때에도 추가 sql 쿼리가 발생하나요?
-> 제가 직접 정답을 알려드릴 수 도 있지만, 그러면 더 많은 것을 얻어가지 못합니다.
개발자는 궁금한 부분을 직접 코드로 테스트 해볼 때 가장 많이 배울 수 있습니다.
해당 부분을 코드로 직접 테스트해보시고, 그 결과를 공유해주세요. 그러면 함께 공부하는 분들께도 큰 도움이 될거에요.
그럼 테스트 해보시고 결과도 정리해서 공유 부탁드립니다.
감사합니다.
빠른 답변 감사드립니다. ㅎㅎ
1. 활용 2편에 대한 내용이였군요! 얼른 활용 2편도 완강하도록 노력겠습니다.
2. 또 한가지 궁금한 점은 만약 FetchType = LAZY 로 선택한 엔티티를 comment.getChildList().size() 이런 식으로 값을 얻으려 할 때에도 추가 sql 쿼리가 발생하나요?
---------------------------------------------------------------------------------
실제로 직접 코트를 실제로 테스트 해보았는데요.
meeting.getCommentList.size() 이 부분인데
근데 희한하게도 처음 쿼리 실행문에도 comment 엔티티와 join 된 쿼리가 실행되지 않았고
meeting.getCommentList.size() 이 코드에서 추가로 지연로딩 쿼리문도 실행되지 않았습니다.
<Meeting - 엔티티 설계>
<처음 쿼리>
<궁금한 코드>
<처음 조회 쿼리 출력> - Comment 엔티티와 join 되지 않음
<추카 쿼리 실행 되지 않음>
<dto 출력 결과> - 원하는 meeting.getComment.size() - 댓글 카운트 값은 들어와 있음.
이렇게 코드가 실행되었는데요.
meeting.getComment.size() 이 코드는 결국 join 도 하지 않고 값을 얻을 수 있는 건가요?