Lazy loading vs Eager Loading

ding·2025년 1월 6일

Lazy Loading

정의

  • 연관된 데이터를 필요할 때 가져오는 방식
  • 처음에는 기본 데이터만 불러오고, 실제로 참조 데이터에 접근하는 순간 데이터베이스 쿼리가 발생

예시

# Book 문서를 가져오지만, author 데이터는 아직 불러오지 않음
book = await Book.find_one(Book.title == "어떤 제목")

# author 데이터에 접근하는 순간 쿼리 발생
author = await book.author.fetch()
print(author.name)

장점

  • 성능 최적화: 필요한 데이터만 불러와 초기 쿼리 성능이 좋다.
  • 메모리 절약: 불필요한 데이터 로딩을 방지할 수 있다.
  • 데이터베이스 부담 감소: 자주 사용되지 않는 연관 데이터에 대해 쿼리를 줄일 수 있다.

단점

  • 추가 쿼리 발생: 참조 데이터에 접근할 때마다 추가 쿼리가 발생한다.
  • N+1 문제 발생 가능: 다중 참조를 순환할 경우, 다수의 쿼리가 실행될 수 있다.
    예) 여러 개의 책에 대해 각각 author.fetch()를 호출하는 경우

사용

  • 초기 로딩 시간을 줄이고 싶을 때
  • 참조 데이터가 자주 사용되지 않을 때
  • 메모리 사용을 최소화하고 싶을 때

Eager Loading

정의

  • 연관 데이터를 초기 쿼리 시점에 한 번에 가져오는 방식
  • 한 번의 데이터베이스 쿼리로 기본 데이터와 참조 데이터를 모두 로딩한다.

예시

# Book과 author 데이터를 모두 한 번에 불러옴
book = await Book.find_one(Book.title == "어떤 제목", fetch_links=True)
print(book.author.name)  # 추가 쿼리 없이 바로 사용 가능

장점

  • 쿼리 수 감소: 한 번의 쿼리로 모든 데이터를 가져오므로, 추가 쿼리가 발생하지 않는다.
  • N+1 문제 방지: 연관 데이터를 한 번에 불러오므로 다중 쿼리 발생을 막을 수 있다.
  • 데이터 일관성 보장: 데이터베이스 상태가 변하지 않는 이상, 가져온 데이터는 항상 최신 상태를 유지한다.

단점

  • 과도한 데이터 로딩: 필요 없는 데이터까지 미리 불러올 수 있다.
  • 메모리 사용 증가: 불필요한 데이터를 로딩하여 메모리를 많이 차지할 수 있다.
  • 초기 성능 저하: 한 번의 쿼리에 많은 데이터를 가져오면 쿼리 시간이 오래 걸릴 수 있다.

사용

  • 참조 데이터를 자주 사용할 때
  • 데이터베이스 쿼리 수를 줄이고 싶을 때
  • N+1 문제를 방지하고 싶을 때

0개의 댓글