인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

코딩먹는하마님의 프로필 이미지
코딩먹는하마

작성한 질문수

실전! 스프링 데이터 JPA

@EntityGraph

findById 쿼리 질문

작성

·

289

·

수정됨

0

    @Test
    public void findMemberLazy(){
        //given
        //member1 -> teamA
        //member2 -> teamB
        Team teamA = new Team("teamA");
        Team teamB = new Team("teamB");
        teamRepository.save(teamA);
        teamRepository.save(teamB);
        memberRepository.save(new Member("member1", 10, teamA));
        memberRepository.save(new Member("member2", 20, teamB));
       
        //when
        Optional<Member> byId = memberRepository.findById(1L);
}

위와 같은 코드가 있을때 memberRepository.findById(1L); 를 하면 저는 em.find를 통해서 영속성컨테스트를 조회하기 때문에 select쿼리가 안나간다고 생각이 들었습니다.

하지만 출력결과

   select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0 
    where
        m1_0.member_id=?

select 쿼리가 나가는 것을 확인했습니다.

https://www.inflearn.com/questions/1014206/%EA%B0%99%EC%9D%80-pk%EB%A1%9C-%EC%A1%B0%ED%9A%8C%EC%8B%9C-%EC%BF%BC%EB%A6%AC%EA%B0%80-2%EB%B2%88-%EB%82%98%EA%B0%80%EB%8A%94-%EC%9D%B4%EC%9C%A0

제 예전 질문에서는 JpaRepository에서의 Method Naming Query의 경우 JPQL로 조회를 하기 때문에 실행전 em.flush()가 일어나서 Direct로 DB에 쿼리가 날아가고 findById는 JpaRepository Interface의 target인 SimpleJpaRepository에 있기 때문에 em.find를 한다고 보았는데

왜 select 쿼리가 나갔는지 궁금합니다.

답변 1

0

안녕하세요. 코딩먹는하마님, 공식 서포터즈 y2gcoder입니다.

혹시 해당 테스트가 @Transactional 이 걸려 있을지 궁금합니다! 걸려있지 않다면 @Transactional을 걸어도 동일한 결과가 나올까요?

감사합니다.

해결했습니다 감사합니다.

코딩먹는하마님의 프로필 이미지
코딩먹는하마

작성한 질문수

질문하기