작성
·
360
·
수정됨
0
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를 하는것은 아닙니다