My Blog

즉시 로딩과 지연 로딩 본문

스프링부트/스프링부트 인프런 김영한님

즉시 로딩과 지연 로딩

JAESG 2023. 5. 29. 00:34

즉시 로딩 : EAGER LOADING이라고 불리며 @ManyToOne(fetch = FetchType.EAGER)로 설정하면 즉시 로딩을 하겠다고 스프링부트에게 알림

 

즉시 로딩이란 무엇인가 ? 

즉시 로딩은 데이터를 조회할 때 연관된 엔티티를 함께 조회하는 것

쉽게 말해서 

Entity는

public class Member{

@ManyToOne(fetch = FetchType.EAGER)

@JoinColumn(name ="TEAM_ID")

private Team team;

}

이라고 가정했을 때

 

Member member = em.find(Member.class, "member1");

을 실행하면 team이 연관되어 있으니 이 엔티티도 함께 조회가 된다.

이때 회원과 팀 두 테이블을 조회해야 하므로 쿼리를 2번 실행할 것 같지만, 대부분의 JPA구현체는 즉시 로딩을 최적화하기 위해 가능하면 조인 쿼리를 사용한다. 여기서는 회원과 팀을 조인해서 쿼리 한 번으로 두 엔티티를 모두 조회한다.

 

지연 로딩 : LAZY LOADING이라 불리며 @ManyToOne(fetch = FetchType.LAZY)로 설정하면 지연 로딩을 하겠다고 스프링부트에게 알림

 

Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); //객체 그래프 탐색
team.getName(); //팀 객체 실제 사용

쉽게 말해서 위 데이터를 조회할 때는 member를 조회하는데

team을 실제 사용하기 전까진 프록시 객체를 넣어둔다.

이 프록시 객체는 실제 사용될 때까지 데이터 로딩을 미룬다. 그래서 지연 로딩이라 한다.

 

하지만 이것은 영속성 컨텍스트에 없을 때 얘기이다.

만약 영속성 컨텍스트에 team이라는 객체가 있다면 프록시 객체를 사용하지 않는다.

 

즉시 로딩, 지연 로딩 정리

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

- 가끔 사용 되는 것

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

- 자주 함께 사용 되는 것 

 

여기서 즉시 로딩을 사용할 때 주의할 점이 있는데

1. 컬렉션을 하나 이상 즉시 로딩하는 것은 권장하지 않는다.

예를들어 한 테이블에 즉시 로딩을 해야하는 필드(컬렉션?)이 2개 이상이 있으면 그 테이블들을 다 조인하게 되어서 성능이 저하 될 수 있음.

 

2. 컬렉션 즉시 로딩은 항상 외부 조인을 사용한다.

이유는 데이터가 안나올 수도 있다는건데, 만약에 즉시 로딩을 하고 외부 조인을 걸지 않으면 데이터가 있어야 하는데 조회되지 않는 문제가 발생하기 때문이다.

 

JOIN 5줄 요약

  • 조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다.
  • INNER JOIN(내부 조인)은 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
  • OUTER JOIN(외부 조인)은 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
  • CROSS JOIN(상호 조인)은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다.
  • SELF JOIN(자체 조인)은 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.

 

추천하는 방법은 모든 연관관계에 지연 로딩을 사용하고 개발이 어느정도 끝났을때 실제 사용하는 상황을 보고 꼭 필요한 곳에만 즉시 로딩을 사용하도록 최적화하면 된다. 

  • @ManyToOne, @OneToOne
    • (optional = false) : 내부 조인
    • (optional = true) : 외부 조인
  • @OneToMany, @ManyToMany
    • (optional = false) : 외부 조인
    • (optional = true) : 내부 조인
728x90
Comments