inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

결과 조회

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

411

da77777

작성한 질문수 3

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

java jpa

답변 1

1

y2gcoder

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

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

플러시에 대한 내용은

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

감사합니다.

SpringBoot 4.X에서의 Querydsl 설정

0

88

2

querydsl 오픈소스에 대한 질문

0

72

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

109

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

317

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

70

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

160

1

querydsl sum() 메서드 없어요.

0

159

2

build 디렉터리 생성

0

136

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

114

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

91

1

오타 제보 드립니다.

0

72

2

벌크 연산과 flush, clear

0

76

1

Run As Intellij 로 변경시 Q타입 import 불가

0

88

1

QHello import하기 문제 발생

0

147

2

등록된 함수 보는법(H2Dialect) 질문

0

68

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

196

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

200

1

querydsl 설정 문제

0

222

2

quey dsl 설정부분

0

158

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

89

2

(OrderSpecifier)관련 내용 어디있을가요

0

65

1

중급문법 벌크연산에서

0

81

2