티스토리 뷰

현재 블로그 만들기를 개인 프로젝트로 진행하고 있습니다. 

 

어느정도 기능은 거의 완성되어서 서버를 돌려 확인해보고 글 목록을 조회하는 부분에서 쿼리가 어마어마하게 나가는 것을 확인했습니다.

어마어마한 쿼리....


원인

Board 엔티티를 조회했는데 Board 엔티티를 응답 DTO로 변환하는 과정에서 발생하는 BoardTag와 Tag 엔티티에 대한 지연로딩 때문에 발생하는 쿼리들이 위의 어마어마한 쿼리들의 원인이였습니다.

 

아래의 수행시간을 보면 115.2036ms 정도가 측정되었습니다.

 

확인해 보니 제가 작성한 JPQL에 fetch join을 적용하지 않고 단순히 Board 엔티티만을 가져왔었습니다.


해결

그래서 저는 fetch join을 적용해 보았습니다.

위 사진은 BoardTag 엔티티에 대해 fetch join을 적용한 뒤의 결과입니다. 확실히 BoardTag엔티티를 가져오는 보이지 않습니다. 조회된 Board 엔티티와 관련된 BoardTag 엔티티들이 모두 영속성컨텍스트에 저장되어 별다른 조회쿼리가 나가지 않는 것이였습니다. 

 

수행시간도 약 115ms에서 95ms로 줄어들었습니다.

 

하지만 Tag엔티티를 가져오는 쿼리들을 그대로 DB로 나갔습니다. 만약 모든 게시글에 등록된 태그가 모두 다르고 그 태그의 개수가 많다면 태그 조회쿼리만 어마어마하게 나가게 되고 성능이 엄청 저하될 것입니다.

 

그래서 Tag 엔티티까지 fetch join을 적용했습니다.

해결된 결과

조회된 Board 엔티티와 관련된 BoardTag 엔티티들을 fetch join하고 이 BoardTag와 관련된 Tag 엔티티들도 fetch join을 함으로서 지연로딩에 의한 쿼리는 날라가지 않는 것을 볼 수 있습니다.

 

수행시간도 보면 18ms로 성능이 개선된 것을 확인할 수 있습니다.


부족한 부분

컬렉션을 fetch join 하면 페이징이 메모리에서 진행된다고 합니다. 

그래서 위의 로그 사진을 보면 노란색글씨로 WARN이라고 써져있는 것을 확인할 수 있습니다. 

 

조회된 데이터가 많지 않다면 큰 문제가 되지 않겠지만 많다면 Out of Memory가 발생할 수도 있는 상황입니다.

 

다음에는 이 부분을 개선해 보겠습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함