JPA(Java Persistence API)에서 즉시 로딩(EAGER Loading)지연 로딩(LAZY Loading) 은 연관된 Entity를 데이터베이스에 로드하는 시점을 제어하는 로딩 전략이다.

2가지 fetch 전략을 설명하기 전 예제 Entity를 설정

@Entity
public class Author {
    @Id
    private Long id;
    
    @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
    private List<Book> books;
}

@Entity
public class Book {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;
}

즉시 로딩(EAGER Loading)

주 엔티티를 조회할 때 연관된 모든 엔티티를 함께 조회하여 메모리에 로드하는 방식

@Entity
public class Author {
    @Id
    private Long id;

    @OneToMany(mappedBy = "author", fetch = FetchType.EAGER)
    private List<Book> books;
}

@OneToMany 어노테이션에 fetch Type을 EAGER 로 설정하여 즉시로딩을 설정할 수 있다.

| 장점 | 연관된 데이터를 미리 로드하므로, 이후 접근 시 추가 쿼리가 발생하지 않는다. → N+1 문제를 방지할 수 있음 | | --- | --- | | 단점 | 항상 연관된 데이터를 함께 로딩하기 때문에 필요하지 않은 데이터까지 로드되어 성능에 부정적 대량의 데이터를 로드하면 메모리 사용량이 증가함 |

지연 로딩(LAZY Loading)

주 엔티티가 로드될 때 연관된 데이터는 로드되지 않고 프록시 객체로 대체됩니다.

연관된 엔티티에 실제로 접근할 때 데이터베이스에서 필요한 데이터를 로드함

@Entity
public class Author {
    @Id
    private Long id;

    @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
    private List<Book> books;
}

@OneToMany 어노테이션에 fetch Type을 LAZY 로 설정하여 지연로딩을 설정할 수 있다.