[java] 자바 ORM에서의 지연 로딩과 즉시 로딩의 차이

자바 ORM(Object-Relational Mapping)을 사용하다보면 지연 로딩과 즉시 로딩에 대한 이해가 중요합니다. 이 두 가지 방식은 데이터베이스와의 상호작용에서 중요한 차이를 가지고 있습니다. 이번 포스트에서는 지연 로딩과 즉시 로딩의 차이점을 살펴보고 어떤 상황에서 사용해야 하는지 알아보겠습니다.

지연 로딩(Lazy Loading)

지연 로딩은 필요한 시점에 연관된 객체를 로딩하는 방식입니다. 예를 들어, @ManyToOne 어노테이션으로 매핑된 객체를 조회할 때, 해당 객체의 필드를 실제로 사용할 때에야 데이터베이스에서 로딩됩니다. 지연 로딩은 객체의 연관 관계를 최초에 모두 로딩하지 않고, 실제로 필요할 때 데이터베이스 조회를 수행하므로, 성능상의 이점을 가질 수 있습니다.

@Entity
public class Book {
    // ...
    
    @ManyToOne(fetch = FetchType.LAZY)
    private Author author;
    
    // ...
}

위의 예시에서 fetch = FetchType.LAZY를 사용하여 지연 로딩을 설정할 수 있습니다.

즉시 로딩(Eager Loading)

반면에 즉시 로딩은 연관된 객체를 한꺼번에 로딩하는 방식입니다. 매핑된 객체를 조회할 때, 연관된 객체들도 함께 로딩됩니다. 이는 데이터베이스 쿼리를 통해 연관된 모든 객체를 모두 가져오기 때문에, 성능에 영향을 줄 수 있습니다.

@Entity
public class Book {
    // ...
    
    @ManyToOne(fetch = FetchType.EAGER)
    private Author author;
    
    // ...
}

위의 예시에서 fetch = FetchType.EAGER를 사용하여 즉시 로딩을 설정할 수 있습니다.

어떤 상황에서 어떤 것을 사용해야 하는가?

일반적으로 지연 로딩을 권장합니다. 필요한 시점에 데이터를 로딩하여 성능을 향상시킬 수 있기 때문입니다. 그러나 경우에 따라서는 즉시 로딩이 필요할 수도 있습니다. 특정 상황에서만 사용되는 경우나, 연관된 객체가 항상 함께 사용되는 경우에는 즉시 로딩을 고려할 수 있습니다.

따라서, 개발자는 프로젝트의 요구 사항과 성능, 메모리 사용 등을 고려하여 적절한 로딩 전략을 선택해야 합니다.

이러한 지연 로딩과 즉시 로딩의 차이를 이해하고 적절한 상황에 따라 적용함으로써, 효율적이고 성능 좋은 애플리케이션을 개발할 수 있을 것입니다.

참고 자료

이번 글에서는 자바 ORM에서의 지연 로딩과 즉시 로딩에 대해 알아보았습니다. 어떠한 상황에서 어떤 로딩 전략을 선택해야 하는지 파악할 수 있었을 것입니다.