본문 바로가기
Web 개발/FAST API (인프런 강의 내용)

5 기능 고도화 Lazy Loading / Eager Loading

by yororing 2024. 10. 18.

앞 단계 참조 링크:

 

00 개요

  • 앞서 실습에서 회원가입을 위한 user 테이블에 관하여, (orm.py 파일) user 테이블의 todos라는 속성을 연결해 줄 때 relationship() 함수의 lazy 키워드에 "joined"옵션을 줘서user가 조회될 때 자동으로 todo 테이블의 데이터가 함께 조회되도록 설정함 

  • 이 기능을 Eager Loading이라고 함 
  • ORM을 사용하면 개발자가 직접 SQL을 적지 않고 DB와 데이터를 주고 받는 부분이 라이브러리에 의해 처리됨
  • 이때 ORM은 Lazy Loading 또는 Eager Loading이라는 기술을 활용해서 데이터를 불러오는 시점을 조절하게 됨
  • Lazy Loading 또는 Eager Loading 둘 중 어느 것을 사용하는지에 따라 각각 장담점이 있음
  • Lazy Loading, Eager Loading에 대한 개념

 

01 Lazy Loading

1. Lazy Loading이란?

  • "Lazy하게 적재하다"
  • 지연 로딩
  • JOIN되는 (연관된) 데이터가 실제로 필요한 시점에 객체를 조회하는 방법
  • 코드가 실행되는 시점에 한 번의 데이터를 JOIN해서 가져오는 것이 아니라, Lazy하게 데이터를 처리한다는 의미

2. 장단점

장점 단점
첫 조회 속도가 더 빠름
(이유: JOIN 없이 데이터를 조회하기에)
불필요한 JOIN을 줄일 수 있음
N+1 문제 발생
(필요할 때마다 JOIN을 처리하기에 반복문을 통한 작업을 할 때 반복문의 횟수만큼 JOIN 발생) 
  • N+1 Problem: 반복문의 횟수만큼 JOIN이 추가로 발생하는 문제
for todo in todos:
    print(todo.user.username)
  • 설명:
    • todos라는 변수에 전체 ToDos를 조회하는 1번의 쿼리 횟수 + 전체 ToDos의 갯수 N번만큼 JOIN 쿼리 (Lazy Loading) 횟수 
    •  = N + 1

 

02 Eager Loading

1. Eager Loading이란?

  • "Eager하게 적재하다"
  • 즉시 로딩
  • 처음부터 데이터를 조회할 때 연관된 객체를 같이 읽어오는 방법
  • user 조회 시 user가 생성한 전체 todos를 함께 조회하는 

2. 장단점

장점 단점
연관된 객체 데이터를 사용하는 경우
더 효율적으로 가져올 수 있음
N + 1 문제 방지
꼭 필요하지 않은 객체 데이터까지 JOIN해서 가져올 수 있음

 

결론

  • 필요에 맞게 알맞은 Loading 방법을 사용하는 것이 지혜로움!