본문 바로가기
BackEnd/Spring

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

by ryuneng 2025. 1. 19.
반응형

지연로딩(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문제를 일으킨다.

 


< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >

🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-연관관계OneToMany-...의-즉시로딩과-지연로딩