요약
- 엔티티를 그대로 반환하여 예상치않은 쿼리가 발생하였고, dto를 사용하여 문제를 해결하였다.
문제점
- 필요없는 쿼리가 발생함
- qna, bookmark, tag 관련 필요없는 쿼리
수정 전 생각
- responseDto를 사용한다.
- @OneToMany 는 기본적으로 fetchType이 Lazy이지만, dto를 사용하지 않고 conversation엔티티 그대로 응답해서 쿼리가 발생한 것으로 추정
과정
1
patchConversation기능을 실행하면 다음과 같은 쿼리가 발생한다.
Hibernate:
select
memberenti0_.id as id1_5_,
memberenti0_.avatar_link as avatar_l2_5_,
memberenti0_.created_at as created_3_5_,
memberenti0_.password as password4_5_,
memberenti0_.user_id as user_id5_5_,
memberenti0_.username as username6_5_
from
member memberenti0_
where
memberenti0_.username=?
Hibernate:
select
conversati0_.id as id1_2_0_,
conversati0_.activity_level as activity2_2_0_,
conversati0_.answer_summary as answer_s3_2_0_,
conversati0_.bookmarked as bookmark4_2_0_,
conversati0_.created_at as created_5_2_0_,
conversati0_.delete_status as delete_s6_2_0_,
conversati0_.member_id as member_14_2_0_,
conversati0_.modified_at as modified7_2_0_,
conversati0_.pinned as pinned8_2_0_,
conversati0_.published as publishe9_2_0_,
conversati0_.saved as saved10_2_0_,
conversati0_.tagged as tagged11_2_0_,
conversati0_.title as title12_2_0_,
conversati0_.view_count as view_co13_2_0_
from
conversation conversati0_
where
conversati0_.id=?
Hibernate:
update
conversation
set
activity_level=?,
answer_summary=?,
bookmarked=?,
created_at=?,
delete_status=?,
member_id=?,
modified_at=?,
pinned=?,
published=?,
saved=?,
tagged=?,
title=?,
view_count=?
where
id=?
// 아래부분은 필요없는 쿼리문
Hibernate:
select
qnalist0_.conversation_id as conversa5_6_0_,
qnalist0_.id as id1_6_0_,
qnalist0_.id as id1_6_1_,
qnalist0_.answer as answer2_6_1_,
qnalist0_.bookmark_status as bookmark3_6_1_,
qnalist0_.conversation_id as conversa5_6_1_,
qnalist0_.question as question4_6_1_
from
qna qnalist0_
where
qnalist0_.conversation_id=?
Hibernate:
select
categories0_.conversation_id as conversa3_3_0_,
categories0_.id as id1_3_0_,
categories0_.id as id1_3_1_,
categories0_.category_id as category2_3_1_,
categories0_.conversation_id as conversa3_3_1_,
category1_.id as id1_1_2_,
category1_.member_id as member_i2_1_2_,
category1_.name as name3_1_2_
from
conversation_category categories0_
left outer join
category category1_
on categories0_.category_id=category1_.id
where
categories0_.conversation_id=?
Hibernate:
select
tags0_.conversation_id as conversa4_4_0_,
tags0_.id as id1_4_0_,
tags0_.id as id1_4_1_,
tags0_.conversation_id as conversa4_4_1_,
tags0_.tag_id as tag_id2_4_1_,
tags0_.tag_name as tag_name3_4_1_
from
conversation_tag tags0_
where
tags0_.conversation_id=?
아래 3개의 쿼리문( select qna, select category, select tag)은 세션 제목을 수정하거나 pin설정을 수정하는 로직에서는 전혀 필요없다.
Conversation엔티티는 qna, category, tag와 @OneToMany 관계로 연결되어 있어 기본적으로 FetchType이 lazy이다. 하지만 ResponseEntity로 반환할 때 Conversation엔티티를 그대로 반환하여 위와 같이 쓸모없는 쿼리가 발생한 것으로 추정된다.
patch요청에 대한 responseDto클래스를 추가하고, mapper로 conversation을 dto로 변환시켜주었고, 쓸모없는 쿼리는 더이상 발생하지 않았다. 결과 쿼리는 다음과 같다.
Hibernate:
select
memberenti0_.id as id1_5_,
memberenti0_.avatar_link as avatar_l2_5_,
memberenti0_.created_at as created_3_5_,
memberenti0_.password as password4_5_,
memberenti0_.user_id as user_id5_5_,
memberenti0_.username as username6_5_
from
member memberenti0_
where
memberenti0_.username=?
Hibernate:
select
conversati0_.id as id1_2_0_,
conversati0_.activity_level as activity2_2_0_,
conversati0_.answer_summary as answer_s3_2_0_,
conversati0_.bookmarked as bookmark4_2_0_,
conversati0_.created_at as created_5_2_0_,
conversati0_.delete_status as delete_s6_2_0_,
conversati0_.member_id as member_14_2_0_,
conversati0_.modified_at as modified7_2_0_,
conversati0_.pinned as pinned8_2_0_,
conversati0_.published as publishe9_2_0_,
conversati0_.saved as saved10_2_0_,
conversati0_.tagged as tagged11_2_0_,
conversati0_.title as title12_2_0_,
conversati0_.view_count as view_co13_2_0_
from
conversation conversati0_
where
conversati0_.id=?
Hibernate:
update
conversation
set
activity_level=?,
answer_summary=?,
bookmarked=?,
created_at=?,
delete_status=?,
member_id=?,
modified_at=?,
pinned=?,
published=?,
saved=?,
tagged=?,
title=?,
view_count=?
where
id=?
'프로젝트' 카테고리의 다른 글
| JPA n+1 문제 (0) | 2023.06.21 |
|---|---|
| 지연 로딩(Lazy loading), 영속성 컨텍스트 (0) | 2023.06.18 |
| 대화방 생성 - 중복된 sql 쿼리문 (0) | 2023.06.12 |
| 프로젝트 개선 (0) | 2023.06.09 |