• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

left outer join 쿼리가 생략되는 이유

23.08.02 09:08 작성 23.08.02 09:55 수정 조회수 354

0

@SpringBootTest
@Slf4j
@Transactional
class JpqlApplicationTests {

	@Autowired
	EntityManager em;

	@Test
	@Rollback(false)
	void contextLoads() {

	   Team team = new Team();
	   team.setName("맨유");
	   em.persist(team);

	   Member member1 = new Member();
	   member1.setUsername("박지성");
	   member1.setAge(20);
           member1.setTeam(team);

	   Member member2 = new Member();
	   member2.setUsername("드록바");
	   member2.setAge(24);
	  

	   em.persist(member);
	   em.persist(member2);

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

	   List<Member> resultList =
      em.createQuery("select m from Member m left outer join m.team t", Member.class)
				.getResultList();
	}
}

member와 team이 다대일 연관관계입니다.

member1은 team과 연결해주었고 member2는 연결해주지않았습니다.

inner join 쿼리는 잘나가나 left outer join을 하면 쿼리가 아래와 같이 나갑니다.

    select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0

<질문>

제 생각에는 left outer join 은 어떻게 보면 member만 조회하는 것이랑 같은 결과니까 JPA가 자가판단해서 그냥 member만 조회하는 쿼리만 보낸다고 생각이드는데 맞게 생각한 것인지 모르겠습니다.

<참고>

on t.name='맨유' 를 추가하면 쿼리가 잘 나갑니다.

List<Member> resultList = 
em.createQuery("select m from Member m left join m.team t on t.name='맨유'", Member.class)
      .getResultList();
select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0 
    left join
        team t1_0 
            on t1_0.team_id=m1_0.team_id 
            and t1_0.name='맨유'

답변 주시면 정말 감사하겠습니다.

답변 2

·

답변을 작성해보세요.

1

codesweaver님의 프로필

codesweaver

2023.08.06

안녕하세요. 코딩먹는하마님, 공식 서포터즈 코즈위버입니다. AI 답변에 더하여 답변 드립니다.

생각하신 내용이 맞습니다. Team에 있는 값을 사용하지 않아도 된다면 join 할 필요 없이 member 만 조회하는 것과 동일하기에 left outer join 을 생략합니다. (이후 Team의 값이 필요해질 때 lazy loading 하면 되므로). 그러나 쿼리에 Team의 값을 알아야만 하는 상황이라면 반드시 join 을 해야 하지요 :)

감사합니다.


0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.04

안녕하세요, 인프런 AI 인턴이에요. left outer join 쿼리가 생략되는 이유에 대해서 설명해드릴게요.

left outer join은 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 매칭되는 레코드를 가져오는 조인 방식입니다. 그러나 샘플 코드를 보면 member2는 team과 연결되지 않았기 때문에 null 값이 될 수 있는데요. 이런 경우, 조인이 발생할 때 nullable한 컬럼인 member2의 관련 정보도 함께 가져올 수 있도록 left outer join을 사용해야 합니다.

하지만 샘플 코드에서는 member2와 team이 연결되지 않았기 때문에 해당 데이터가 존재하지 않는 것으로 판단하고, left outer join을 생략하고 member만 조회하는 쿼리를 보냅니다. 따라서 member1만 조회되는 쿼리가 실행됩니다.

만약 left outer join을 수행하고 싶다면, member2도 team과 연결해주어야 합니다. 예를 들면, member2.setTeam(team); 코드 등을 추가해주셔야 합니다.

이 부분을 참고하시고, left outer join을 수행하려면 연결되지 않은 데이터에 대해서도 처리를 해주셔야 함을 알려드립니다. 추가적인 질문이 있으면 언제든지 물어보세요. 감사합니다~!