Programming/JPA(KYH)

JPA - 페치 조인 (2)

잇(IT) 2023. 7. 19. 17:24

- 페치 조인 DISTINCT

Team team1 = new Team();
            team1.setName("팀A");
            em.persist(team1);

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

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

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

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

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

//            //컬렉션 패치 조인
            String query = "select distinct t From Team t join fetch t.members";
            System.out.println("===========================================111");
            List<Team> result = em.createQuery(query, Team.class)
                    .getResultList();
            System.out.println("===========================================222");
            for (Team team : result) {
                System.out.println("===========================================333");
                System.out.println("team = " + team.getName() + "| members = " + team.getMembers().size());
                System.out.println("===========================================444");
                for (Member member : team.getMembers()) {
                    System.out.println("-> member = " + member);
                }
            }

 

1. SQL의 DISTINCT는 중복된 결과를 제거하는 명령을 내린다.

1.1. 단, DB에서 DISTINCT는 결과가 완벽하게 일치해야 중복을 제거한다.

2. JPA는 같은 식별자를 가진 엔티티를 제거한다.

* 하이버네이트6부터는 DISTINCT 명령어를 사용하지 않아도 애플리케이션에서 중복이 자동으로 제거된다.


- 페치 조인과 일반 조인의 차이

1. 일반 조인

[JPQL]
select t
from Team t join t.members m
where t.name = ‘팀A'

[SQL]
SELECT T.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID 
WHERE T.NAME = '팀A'

----------------------------------------

2. 페치 조인

[JPQL]
select t 
from Team t join fetch t.members
where t.name = ‘팀A'

[SQL]
SELECT T.*, M.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID 
WHERE T.NAME = '팀A'

- 일반 조인

1. 일반 조인은 실행시 연관된 엔티티를 함께 조회하지 않는다.

2. JPQL은 결과를 반환할 때 연관관계를 고려하지 않는다.

3. SELECT절에 지정한 엔티티만 조회한다.

4. 일반 조인은 팀 엔티티만 조회하고 회원 엔티티는 조회하지 않는다.

 

- 페치 조인

1. 페치 조인은 사용할 때만 연관된 엔티티도 함께 조회한다.(즉시 로딩)

2. 페치 조인은 객체 그래프를 SQL 한번에 조회하는 개념이다.


- 페치 조인의 특징과 한계

- 한계

1. 페치 조인 대상에는 별칭을 줄 수 없다.

2. 둘 이상의 컬렉션은 페치 조인 할 수 없다.

2. 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다.

-특징

1. 연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화

2. 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선함

3. 실무에서 글로벌 로딩 전략은 모두 지연 로딩

4. 최적화가 필요한 곳은 페치 조인 적용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 김영한 (자바 ORM 표준 JPA 프로그래밍 - 기본편)

728x90

'Programming > JPA(KYH)' 카테고리의 다른 글

JPA - 벌크 연산  (0) 2023.07.19
JPA - 엔티티 직접 사용  (0) 2023.07.19
JPA - 페치 조인 (1)  (0) 2023.07.19
JPA - 경로 표현식  (0) 2023.07.18
JPA - 기본 문법 (조건식(CASE 등등), JPQL 함수)  (0) 2023.07.18