같은 PK로 조회시 쿼리가 2번 나가는 이유
463
작성한 질문수 74
Pk값으로 조회하는 메서드를 MemberRepository 에 생성하였습니다.
public interface MemberRepository extends JpaRepository<Member,Long> {
List<Member> findListById(Long id);}그 다음 같은 PK값으로 조회하는 테스트를 만들었습니다.
@Test
public void returnType(){
Member aaa = new Member("AAA", 10);
Member bbb = new Member("BBB", 20);
memberRepository.save(aaa);
memberRepository.save(bbb);
List<Member> listById1 = memberRepository.findListById(0L);
List<Member> listById2 = memberRepository.findListById(0L); }저는 같은 트랜잭션에서 영속성컨테스트에 같은 PK를 조회하니까 쿼리가 한번만(초기 조회만) 나간다고 생각이 들었는데 2번 나가는것을 확인했습니다.
findListById 및 다른 스프링데이터 JPA를 통한 메서드는 메서드를 호출할때마다 내부적으로 em.flush(), em.clear(), em.close를 자체적으로 하는 건가요??
답변주시면 정말 감사하겠습니다.
답변 1
1
대신 답변을 드려보자면 기본적으로 JpaRepository Interface의 target인 SimpleJpaRepository에서의 findById에서는 내부적으로 em.find를 통해서 조회를 합니다.
그러나 위에서 보이는 JpaRepository에서의 Method Naming Query의 경우 em.find로 조회하는 것이 아닌 JPQL로 조회를 하기 때문에 Direct로 DB에 쿼리가 날라가게 됩니다
대신 DB에서 Direct로 가져온 Entity가 이미 영속성 컨텍스트에서 관리되고 있다고 판단되면 Direct로 가져온 엔티티는 버리고 영속성 컨텍스트에서 이미 관리되고 있는 Entity를 응답하게 됩니다
말씀하신 em.flush()의 경우에도 FlushOption자체를 건드리지 않은 기본 옵션의 경우 JPQL이 날라가기 전에 내부적으로 flush를 진행하게 됩니다
메소드가 호출될때마다 clear & close를 하는것은 아닙니다
existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?
0
69
1
existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?
0
107
3
MemberRepository 구현체
0
58
1
pdf 표현 질문드립니다.
0
62
1
로그가 남지 않는 문제.
0
81
1
테스트 라이브러리가 강의는 junit4가 맞나요??
0
70
2
pdf 파일과 차이점이 있는 것같은데 문제 없나요?
0
72
2
@PrePersist, @PreUpdate 호출 시점 질문드립니다.
0
91
2
Sort 인터페이스는 잘 사용 안하나요?
0
52
1
스캔대상 질문드립니다.
0
46
1
하이버네이트6에서의 최적화에 이은 질문
0
85
1
save() vs saveAndFlush DB 통신 횟수
0
53
1
순수 JPA 리포지토리 코드 수정부분
0
86
2
bulk연산 후 flush하는 이유를 모르겠어요
0
152
3
bulk insert 질문입니다.
0
178
2
교만했던 것 같아요.
0
147
1
RESTful 강의는 안하시는 건지 궁금합니다.
0
147
2
동적 테이블에 대한 질문
0
86
1
영속성 전이와 연관관계
0
130
2
강의 10:25 질문
0
74
1
단건 update 질문
0
95
2
엔티티 와 도메인의 경계
0
127
1
UsernameOnlyDto 타입 type mismatch 오류
0
119
1
Projection 개념과 데이터 전달과정에 대해 질문 있습니다.
0
136
1





