hayu's 개발 일지

[TIL]240430 즉시로딩 & 지연로딩 본문

프레임워크/spring

[TIL]240430 즉시로딩 & 지연로딩

hayu00 2024. 4. 30. 21:07

즉시로딩 & 지연로딩

  • 즉시로딩과 지연로딩은 데이터베이스에서 데이터를 조회하는 방식 중에 하나로, 객체 간의 연관관계를 어떻게 로딩하고 관리할 것인지에 대한 개념이다.

Fetch Type

  • Fetch Type은 JPA가 하나의 엔티티를 조회할 때 연관관계에 있는 객체들을 어떻게 가져올 것인지를 나타내는 설정값이다.

즉시 로딩(Eager Loading)

  • 엔티티를 조회할 때 자신과 연관되는 엔티티를 조인(join)을 통해 함께 조회하는 방식이다.

→ 해당 엔디디와 연관된 모든 엔티티를 동시에 조회하는 방식

예) A엔티티와 B엔티티가 연관되어 있을 때 A를 조회하면 B도 함께 조회된다. 이로 인해 객체 간의 관계를 필요한 시점에 바로 사용할 수 있다. 하지만 조인 등의 복잡한 쿼리가 생성될 수 있고, 불필요한 데이터 로딩으로 인해 성능 문제가 발생할 수 있다.

 

지연 로딩(Lazy Loading)

  • 자신과 연관된 엔티티를 실제로 사용할 때 연관된 엔티티를 조회(SELECT)하는 방식이다.

예) A엔티티를 조회해도 B엔티티는 초기에 조회되지 않고, B엔티티를 실제로 사용할 때 데이터 베이스에서 조회된다. 이를 통해 쿼리의 죄적화와 성능 향상을 이룰 수 있다. 하지만 연관 엔티티를 사용하는 과정에서 데이터 베이스 쿼리가 추가적으로 발생할 수 있다.

  • 대부분의 JPA 구현체에서 지원되는 기능이며, 엔티티 클래스의 연관 관계 필드에 @ManyToOne, @OneToMany, @OneToOne, @ManyToMany와 같은 어노테이션을 사용할 때 fetch 속성을 지정하여 조절할 수 있다.
  • 지연로딩을 사용하려면 데이터 베이스 트랜잭션 내에서 연관된 엔티티에 접근해야만 데이터 베이스 조회가 일어난다.

즉시 로딩을 선택하는 이유

  1. 객체 간의 관계를 활용하기 편리하다.
  • 즉시 로딩을 사용하면 객체를 조회할 때 연관된 모든 객체가 한번에 로딩되므고 객체 간의 관계를 편리하게 활용할 수 있다. 모든 연관된 데이터가 이미 로딩되어 있으므로 어떤 객체를 사용할 때 별다른 데이터 베이스 조회 없이 객체 그래프를 따라 이동할 수 있다.
  1. 복잡한 조회를 단순화할 수 있다.
  • 데이터 베이스에서 조인을 사용하여 복잡한 연관관계를 해결할 필요 없이 즉시 로딩으로 모든 데이터를 한번에 가져올 수 있다.

지연로딩을 선택하는 이유

성능 최적화

  • 즉시 로딩은 모든 연관된 데이터를 한번에 가져오기 때문에, 필요하지 않은 데이터까지 불필요하게 로딩될 수 있다. 이는 성능 저하를 야기할 수 있다. 지연 로딩은 필요한 시점에만 데이터를 로딩하기 때문에 성능을 최적화 할 수 있다.

데이터 접근 최적화

  • 사용자가 실제로 해당 데이터를 사용할 때만 로딩하므로 데이터 베이스 접근이 최적화된다. 따라서 시스템 전체적으로 데이터 로딩에 대한 부하가 분산될 수 있다.

순환 참조 방지

  • 지연 로딩을 사용하면 객체 간의 연관관계에서 순환 참조가 발생할 확률이 줄어든다. 객체를 조회할 때 실제로 필요한 데이터만 로딩되기 때문에 무한한 순환 참조를 방지할 수 있다.

메모리 사용 최적화

  • 즉시 로딩은 연관된 모든 데이터를 로딩하기 때문에 메모리를 많이 사용할 수 있다. 지연 로딩은 필요한 데이터만 로딩하기 때문에 메모리 사용을 최적화할 수 있다.