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

da77777님의 프로필 이미지
da77777

작성한 질문수

실전! Querydsl

결과 조회

resultFetch 테스트 시 em.flush()를 주석했는데도 insert 쿼리가 발생하는 이유

작성

·

321

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

안녕하세요.

fetch 테스트 관련해서 제가 맞게 이해한 건지 확인차 질문 드립니다.

resultFetch() 테스트를 해봤을 때, before()에서 flush를 주석하고 실행했는데도 insert쿼리가 발생했고, 그 insert 쿼리가 select 쿼리 직전에 실행되는 걸 확인했습니다.

이렇게 되는 이유가, em.persist로 인해 쓰기 지연 저장소에 들어있던 insert 쿼리가 JPQL에 의해 flush 된 거라고 생각이 되는데 맞게 이해한 걸까요?

 

@SpringBootTest
@Transactional
@Commit
class MemberTest {

  @PersistenceContext
  EntityManager em;

  JPAQueryFactory query;

  @BeforeEach
  void before() {
    query = new JPAQueryFactory(em);
    Team teamA = new Team("teamA");
    Team teamB = new Team("teamB");
    Member member1 = new Member("1", 10, teamA);
    Member member2 = new Member("2", 20, teamA);

    Member member3 = new Member("3", 30, teamB);
    Member member4 = new Member("4", 40, teamB);

    em.persist(teamA);
    em.persist(teamB);
    em.persist(member1);
    em.persist(member2);
    em.persist(member3);
    em.persist(member4);

//    em.flush();
//    em.clear();

  }
  @Test
  void resultFetch() {
    List<Member> fetch = query.selectFrom(member).fetch();
    Member fetchOne = query.selectFrom(member).where(member.id.eq(1L)).fetchOne();
    Member fetchFirst = query.selectFrom(member).fetchFirst();
    Long totalCount = query.select(member.count()).from(member).fetchOne();
  }

}
2024-01-17T23:34:46.349+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* insert for
        com.querydsl.entity.Team */insert 
    into
        team (name, id) 
    values
        (?, ?)
2024-01-17T23:34:46.355+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* insert for
        com.querydsl.entity.Team */insert 
    into
        team (name, id) 
    values
        (?, ?)
2024-01-17T23:34:46.356+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* insert for
        com.querydsl.entity.Member */insert 
    into
        member (age, team_id, username, id) 
    values
        (?, ?, ?, ?)
2024-01-17T23:34:46.357+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* insert for
        com.querydsl.entity.Member */insert 
    into
        member (age, team_id, username, id) 
    values
        (?, ?, ?, ?)
2024-01-17T23:34:46.358+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* insert for
        com.querydsl.entity.Member */insert 
    into
        member (age, team_id, username, id) 
    values
        (?, ?, ?, ?)
2024-01-17T23:34:46.360+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* insert for
        com.querydsl.entity.Member */insert 
    into
        member (age, team_id, username, id) 
    values
        (?, ?, ?, ?)
2024-01-17T23:34:46.402+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* select
        member1 
    from
        Member member1 */ select
            m1_0.id,
            m1_0.age,
            m1_0.team_id,
            m1_0.username 
        from
            member m1_0
2024-01-17T23:34:46.473+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* select
        member1 
    from
        Member member1 
    where
        member1.id = ?1 */ select
            m1_0.id,
            m1_0.age,
            m1_0.team_id,
            m1_0.username 
        from
            member m1_0 
        where
            m1_0.id=?
2024-01-17T23:34:46.477+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* select
        member1 
    from
        Member member1 */ select
            m1_0.id,
            m1_0.age,
            m1_0.team_id,
            m1_0.username 
        from
            member m1_0 
        fetch
            first ? rows only
2024-01-17T23:34:46.512+09:00 DEBUG 23204 --- [           main] org.hibernate.SQL                        : 
    /* select
        count(member1) 
    from
        Member member1 */ select
            count(m1_0.id) 
        from
            member m1_0

답변 1

1

안녕하세요. da77777님, 공식 서포터즈 y2gcoder입니다.

말씀하신 것이 맞습니다! 간단하게 말씀드리면 JPA가 기본적으로 JPQL 쿼리 실행 시 flush 를 자동으로 호출하기 때문입니다! QueryDsl도 결국 내부적으로는 JPQL을 사용하고 있습니다 :)

플러시에 대한 내용은

자바 ORM 표준 JPA 프로그래밍 - 기본편섹션 3. 영속성 관리 - 내부 동작 방식 의 플러시 부분을 학습해보시길 권해드립니다!

감사합니다.

da77777님의 프로필 이미지
da77777

작성한 질문수

질문하기