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

김민지열심히해님의 프로필 이미지
김민지열심히해

작성한 질문수

실전! 스프링 데이터 JPA

예제 도메인 모델과 동작확인

강의 15분경 즉시로딩 실행결과 질문입니다.

작성

·

370

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

MemberTest 테스트클래스

testEntity() 코드입니다.

        Team teamA  = new Team("teamA");
        Team teamB = new Team("teamB");
        em.persist(teamA);
        em.persist(teamB);

        Member member1 = new Member("member1", 10, teamA);
        Member member2 = new Member("member2", 20, teamA);
        Member member3 = new Member("member3", 30, teamB);
        Member member4 = new Member("member4", 40, teamB);


        em.persist(member1);
        em.persist(member2);
        em.persist(member3);
        em.persist(member4);
       //초기화
        em.flush();

        em.clear();
    List<Member> members = em.createQuery("select m from Member  m ", Member.class)
                .getResultList();

        for (Member member : members) {
            System.out.println("member = " + member);
            System.out.println("-> member.team = " + member.getTeam());
        }

처음에 즉시로딩 실행결과로

멤버 조회 쿼리 하나랑

각각 팀 조회 쿼리 +N번 (여기서는 2번) 나가는 것을 확인했습니다.

 

지연로딩으로도 쿼리실행시점 문제만 다르지 똑같이 member.getTeam() 할때 team쿼리가 나가는 것을 확인했습니다.

 

N+1문제를 해결하기 위해 페치조인을 한다는것은 강의와 학습을 통해 알게되었습니다.

 

질문이있는데요

처음에 즉시로딩할때 조인쿼리가 안나가고

왜 따로 member, team쿼리가 나간것일까요?

 

즉시로딩도 N+1문제가 발생하는것이 맞나요?

 

 


 수정

단건조회 시 즉시로딩으로 left outer join 으로 member와 team이 함께 조회되는것을 확인했습니다.

단건조회가 아니라 memberRepository.findAll() 메소드나 JPQL (select m from Member m) 인경우에는 member와 team이 같은 한 쿼리가 아니라

따로 조회되는 것인가요? 왜 List를 조회할때에는 같이 join해서 쿼리를 날리지않는것일까요?

답변 2

0

안녕하세요. ktk7167님, 공식 서포터즈 David입니다.

아래 글 답변을 참고해 주세요:)

https://www.inflearn.com/questions/39516

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요.

  1. 강의 내용과 관련된 질문인가요? (예/아니오)
  • 예, 강의 내용과 관련된 질문이네요.
  1. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
  • 예, 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?
  1. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
  • 예, 질문 잘하기 메뉴얼을 읽어보셨나요?

아래는 제가 하실 질문 내용에 대한 답변입니다.

다음과 같이 MemberTest 클래스의 testEntity() 코드가 있습니다.

Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);

Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);

em.persist(***기존 코드 누락됨***)

위 코드에서 em.persist() 메서드로 Member 객체를 영속화 하는 부분이 누락되어 있습니다.

수정된 코드는 아래와 같이 em.persist() 메서드로 Member 객체를 영속화 하시면 됩니다.

em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);

이렇게 수정하신 후 실행하시면 원하시는 결과를 얻으실 수 있을 거예요. 추가적인 질문이 있으시면 언제든지 물어보세요.

em.persist(member1)~em.persist(member4) 코드다있습니다!

김민지열심히해님의 프로필 이미지
김민지열심히해

작성한 질문수

질문하기