작성
·
320
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. 영속성 관리 - 내부 동작 방식 의 플러시 부분을 학습해보시길 권해드립니다!
감사합니다.