• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

페치 조인1 강의에 대한 질문있습니다.

23.07.30 11:42 작성 23.07.30 11:43 수정 조회수 264

0

try {
            Team teamA = new Team();
            teamA.setName("팀A");
            em.persist(teamA);

            Team teamB = new Team();
            teamB.setName("팀B");
            em.persist(teamB);

            Member member1 = new Member();
            member1.setUsername("회원1");
            member1.setTeam(teamA);
            em.persist(member1);

            Member member2 = new Member();
            member2.setUsername("회원2");
            member2.setTeam(teamA);
            em.persist(member2);

            Member member3 = new Member();
            member3.setUsername("회원3");
            member3.setTeam(teamB);
            em.persist(member3);

            em.flush();
            em.clear();

            String query = "select m from Member m";

            List<Member> result = em.createQuery(query, Member.class)
                    .getResultList();

            for (Member member : result) {
                System.out.println("member = " + member.getUsername() + ", " 
                        + member.getTeam().getName());
            }
Hibernate: 
    /* select
        m 
    from
        Member m */ select
            member0_.id as id1_0_,
            member0_.age as age2_0_,
            member0_.TEAM_ID as team_id5_0_,
            member0_.type as type3_0_,
            member0_.username as username4_0_ 
        from
            Member member0_
Hibernate: 
    select
        team0_.id as id1_3_0_,
        team0_.name as name2_3_0_ 
    from
        Team team0_ 
    where
        team0_.id in (
            ?, ?
        )
member = 회원1, 팀A
member = 회원2, 팀A
member = 회원3, 팀B

회원1을 조회하면서 회원과 팀에 대한 select 쿼리가 나가고 회원1을 조회하면서 teamA가 영속성 컨텍스트에 올라갔으니 회원2는 1차 캐시에서 가져온다고 했습니다. 그러면 teamB는 영속성 컨텍스트에 없기 때문에 team에 대한 쿼리가 발생해야 하는데 발생하지 않습니다.

 

왜 강의와 다르게 쿼리가 발생하는지 궁금합니다.

답변 2

·

답변을 작성해보세요.

0

David님의 프로필

David

2023.08.01

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

강의와 완전히 동일하게 코드를 작성하셨는지 알 수 없지만

팀을 조회하는 쿼리를 보시면 in 절에 물음표가 2개 포함된 것을 볼 수 있습니다.

따라서, 팀 조회 쿼리에서 팀 A, B가 모두 조회 되었기 때문에 팀B를 찾는 추가 쿼리가 발생하지 않습니다.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.01

안녕하세요, 인프런 AI 인턴이에요. 페치 조인1 강의에 대한 질문이 있으신가요?

위 코드는 JPA를 사용하여 Member와 Team 엔티티를 조인하는 예제인 것 같습니다. 모든 Member와 연관된 Team 정보를 조회하는 코드입니다.

em.createQuery(query, Member.class).getResultList()를 호출하여 Member 엔티티의 모든 정보를 조회하고, for문을 통해 결과를 출력하는 부분입니다.

Member 엔티티와 Team 엔티티가 다대일(Many-to-One) 관계로 매핑되어 있다고 가정할 때, 이 코드는 Member의 팀 정보를 함께 조회하는 방법인 페치 조인을 사용하고 있습니다.

페치 조인은 연관된 엔티티를 함께 로딩하여 N+1 문제를 해결할 수 있습니다. 위 예제에서는 Member와 연관된 Team 정보도 함께 조회하여 성능을 최적화하고 있습니다.

출력 결과는 Member의 getUsername() 메소드와 getTeam().getName() 메소드를 통해 회원 이름과 소속된 팀 이름을 출력하고 있습니다.

참고로, Hibernate 쿼리 로그인 “Hibernate: select …” 부분은 실제 실행된 쿼리문을 나타내는 것입니다.

페치 조인1 강의와 관련된 질문이 있다면 더 자세하게 알려주세요. 전 질문에 대한 답변을 도와드릴게요.