Lazy Loading과 Eager Loading

여준서·2024년 10월 4일
post-thumbnail

JPA에서 Lazy Loading과 Eager Loading의 차이점

Lazy LoadingEager Loading은 엔티티와 연관된 데이터의 로딩 방식을 결정하는 전략이다.

1. Lazy Loading

  • 데이터를 실제로 필요할 때까지 로드하지 않고, 연관된 엔티티를 지연 로딩하는 방식이다.

  • 기본적으로 프록시 객체를 사용해 필요할 때 데이터를 로드한다.

  • 장점:

  • 필요하지 않은 데이터를 불러오지 않아 메모리 사용과 성능을 최적화할 수 있다.

  • 초기 로딩 속도가 빠르다.

  • 단점 :

  • 데이터를 사용하려는 시점에서 추가적인 쿼리가 발생할 수 있어 성능 이슈를 초래할 수 있다.

  • N+1 문제 발생 가능성이 높다.

2. Eager Loading

  • 엔티티가 로드될 때 연관된 모든 데이터를 즉시 로드하는 방식이다.

  • 초기 로딩 시점에서 데이터를 모두 불러오기 때문에 연관된 엔티티를 즉시 사용할 수 있다.

  • 장점 :

    • 연관된 데이터가 이미 로드되어 있어 접근시 추가적인 쿼리가 발생하지 않는다.
    • 코드가 간단해지며 예상 가능한 쿼리의 수가 적어진다.
  • 단점 :

    • 불필요한 데이터를 미리 로딩하기 때문에 메모리와 네트워크 리소스를 낭비할 수 있다.
    • 초기 로딩 시간이 느려질 수 있다.

꼬리 질문 예상

1. Lazy Loading과 Eager Loading 중 어떤 경우에 각각 사용해야하나요?

  • Lazy Loading은 연관된 데이터가 항상 사용되지 않거나 , 필요할 때만 로드 하는것이 유리한 경우에 적합합니다. 예를 들어서 , 데이터 목록을 조회할 때 연관 된 엔티티의 상세 정보가 필요 없을 경우에 사용합니다.

  • Eager Loading은 연관된 데이터가 항상 필요하거나, 여러번의 쿼리를 줄여 성능을 최적화하고 싶은 경우에 유용합니다. 예를 들어, 한번의 쿼리로 여러 엔티티의 정보를 함께 불러와야할 때 사용합니다.

2. Lazy Loading의 N+1 문제는 무엇이고 어떻게 해결할 수 있나요?

  • N+1 문제는 Lazy Loading으로 인해 하나의 엔티티 조회 후 연관된 N개의 엔티티를 개별적으로 추가 쿼리로 로드 할 때 발생하는 문제입니다. 예를 들어 ,List<Parent>를 조회하고 각 Parent에 속한 child 엔티티들을 Lazy Loading 할 경우 1+N개의 쿼리가 발생합니다.

  • 이를 해결하는 방법으로는 @EntityGraph를 사용하거나 fetch join을 사용하는 방법이 있습니다. 이를 통해서 연관된 데이터를 한번의 쿼리로 가져올 수 있습니다.

3. Eager Loading으로 인해 발생하는 문제는 어떻게 해결하나요?

  • Eager Loading은 불필요한 데이터를 미리 로드하여 메모리 낭비와 로딩 속도 문제를 일으킬 수 있습니다. 이를 해결하기 위해 필요한 상황에서만 Eager Loading을 사용하고 , 대다수의 경우에는 Lazy Loading을 사용하여 필요한 데이터만 로드하도록 설계하는것이 좋습니다.

4. Hibernate에서 Lazy Loading과 Eager Loading의 기본 설정은 무엇인가요?

  • 기본적으로 @OneToOne@ManyToOne 연관 관계는 Eager Loading으로 설정되고, @OneToMany@ManyToMany 연관 관계는 Lazy Loading으로 설정됩니다. 이는 연관된 데이터의 양에 따라 성능을 고려한 기본 설정입니다.

5. 프록시 객체란 무엇인가요?

  • 프록시 객체Lazy Loading 시 실제 엔티티 대신 사용하는 가짜 객체입니다. 실제 데이터가 필요한 시점까지 지연 로딩이 이루어질 수 있도록 하며, 데이터 접근이 발생하면 데이터베이스에서 값을 가져옵니다.
profile
DevOps 전향을 준비 중인 인프라 지향형 주니어 개발자

0개의 댓글