본문 바로가기
프로젝트

대화방 제목/pin 수정 - fetchType과 DTO

by backwards 2023. 6. 14.

요약

  1. 엔티티를 그대로 반환하여 예상치않은 쿼리가 발생하였고, dto를 사용하여 문제를 해결하였다.

 

 


 

문제점

  1. 필요없는 쿼리가 발생함
    • qna, bookmark, tag 관련 필요없는 쿼리

수정 전 생각

  1. 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