인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

browoo님의 프로필 이미지
browoo

작성한 질문수

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

쿼리짜기 vs 연관관계로 값 얻기

해결된 질문

작성

·

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 쿼리가 발생하나요?

-> 제가 직접 정답을 알려드릴 수 도 있지만, 그러면 더 많은 것을 얻어가지 못합니다.

개발자는 궁금한 부분을 직접 코드로 테스트 해볼 때 가장 많이 배울 수 있습니다.

해당 부분을 코드로 직접 테스트해보시고, 그 결과를 공유해주세요. 그러면 함께 공부하는 분들께도 큰 도움이 될거에요.

그럼 테스트 해보시고 결과도 정리해서 공유 부탁드립니다.

감사합니다.

 

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

빠른 답변 감사드립니다. ㅎㅎ

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 도 하지 않고 값을 얻을 수 있는 건가요?

 

1

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

안녕하세요. browoo님

추가 쿼리가 발생해야 합니다.

아마도 comment가 영속성 컨텍스트에 남아있는 상태로 조회한 것 같아요.

데이터를 저장하는 부분과 조회하는 부분을 컨트롤러부터 분리해서 조회해보시면 조회 쿼리를 확인할 수 있을거에요.

감사합니다.

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

그렇군요! 답변 감사합니다!

 

-말씀해주신대로 분리해서 테스트해보니 추가로 쿼리가 발생하네요!

browoo님의 프로필 이미지
browoo

작성한 질문수

질문하기