본문 바로가기

JPA

8.2 즉시로딩과 지연로딩

프록시 객체는 주로 연관된 엔티티를 지연로딩 할때 사용한다.

 

- 즉시로딩 : 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다.

- 설정방법 : @ManyToOne(fetch = FetchType.EAGER)

 

- 지연로딩 : 연관된 엔티티를 실제 사용할 때 조회한다.

- 실제 사용하는 시점에 JPA가 SQL을 호출해서 팀엔티티를 조회한다.

- 설정방법 : @ManyToOne(fetch = FetchType.LAZY)

 

8.2.1 즉시로딩

@Entity
public class Member {
	@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

 

 

대부분의 JPA구현체는 즉시 로딩을 최적화하기 위해 가능하면 조인 쿼리를 사용한다.

 

NULL 제약조건과 JPA 조인 전략

- 즉시 로딩 실행 SQL에서 JPA가 내부조인(INNER JOIN)이 아닌 외부조인(LEFT OUTER JOIN)을 사용한다.

- 회원 테이블에 TEAM_ID는 NULL값을 허용하고 있다. 따라서 팀에 소속되지 않은 회원이 있을 가능성이 있다. -> 따라서 외부조인을 사용한다. 

- 하지만, 내부조인이 외부조인보다 성능과 최적화에서 유리하다.

- 따라서 @JoinColumn에 nullable = false을 설정해서 NULL값을 허용하지 않는다면 외부조인 대신에 외부조인을 사용한다.

@Entity
public class Member {
	@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "TEAM_ID", nullable = false)
    private Team team;
}

nullable 설정에 따른 조인 전략

- @JoinColumn(nullable = true) : NULL 허용(기본값). 외부 조인 사용

- @JoinCloumn(nullable = false) : NULL 허용하지 않음. 내부 조인 사용

 

또는 @ManyToOne.optional = false로 설정해도 내부 조인을 사용한다.

@Entity
public class Member {
	@ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

 

8.2.2 지연로딩

@Entity
public class Member {
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

- 지연로딩으로 설정하면 회원만 조회하고 팀은 조회하지 않는다. 대신에 프록시 객체를 할당한다. 하지만 영속성 컨텍스트에 이미 할당 되어 있으면 프록시가 아닌 실제 엔티티를 사용한다.

 

8.2.3 정리

 

- 지연로딩 : 연관된 엔티티를 프록시로 조회한다. 프록시를 실제 사용할 때 초기화하면서 데이터베이스를 조회한다.

- 즉시로딩 : 연관된 엔티티를 즉시 조회한다. 하이버네이트는 가능하면 SQL 조인을 사용해서 한 번에 조회한다.

'JPA' 카테고리의 다른 글

8.4 영속성 전이: CASCADE  (0) 2021.01.16
8.3.1 프록시와 컬렉션 래퍼  (0) 2021.01.16
08 프록시 객체  (0) 2021.01.15
6.1 다대일  (0) 2021.01.11
7.3 복합키와 식별관계 매핑  (0) 2021.01.10