resultFetch 테스트 시 em.flush()를 주석했는데도 insert 쿼리가 발생하는 이유
411
작성한 질문수 3
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
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. 영속성 관리 - 내부 동작 방식 의 플러시 부분을 학습해보시길 권해드립니다!
감사합니다.
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





