[Spring JPA] 연관관계(OneToMany, ...)의 즉시로딩과 지연로딩

류넹·2024년 3월 22일
1

Spring

목록 보기
47/50

지연로딩(FetchType.LAZY)

  • 실제 객체를 사용하는 시점에 데이터를 조회한다.

예시)

@Entity
public class Member {
	@Id
    Long id;
    
    String name;
    
    @ManyToOne(fetch = FetchType.LAZY)
    Team team;
}
  • Member를 조회하면 id와 name에는 MEMBER 테이블을 조회해서 획득한 데이터가 저장되어 있다.
  • team에는 프록시객체가 대입되어 있다. (Team객체가 대입되어 있지 않다.)
  • getTeam() 메소드를 실행해서 Team을 조회하면 프록시 객체가 반환된다.
  • getTeam().getXXX() 메소드를 실행하면 비로소 SQL을 실행해서 DB에서 데이터를 조회한다.
  • 위의 예시에서는 SQL이 2번 실행된다.
    select ...
    from member
    where ...

    select ...
    from team
    where ...




즉시로딩(FetchType.EAGER)

  • fetch타입을 EAGER로 설정하면 즉시 로딩으로 설정된다.
  • 데이터를 사용할 때 연관관계에 있는 테이블의 정보도 항상 같이 사용된다면 즉시로딩으로 설정할 수 있다.
  • 즉시로딩으로 지정하면 조인을 사용해 SQL을 한번만 실행해서 데이터를 한번에 조회한다.

예시)

@Entity
public class Member {
	@Id
    Long id;
    
    String name;
    
    @ManyToOne(fetch = FetchType.EAGER)
    Team team;
}
  • team에는 TEAM 테이블을 조회해서 획득한 팀정보가 저장된 Team객체가 대입되어 있다.
  • 조인을 사용해서 SQL이 1번 실행된다.
    select
    from member
    join on team
    where member.xxx = team.xxx




사용방법

  • 실무에서는 가급적(!!!무조건) 지연로딩(LAZY)만 사용
  • 즉시로딩은 N+1문제를 일으킨다.
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글