앞 단계 참조 링크:
- 상태 코드: 2024.03.26 - [Web 개발/FAST API (인프런 강의 내용)] - 1 FastAPI 알아보기
- 프로젝트 소개 및 환경 구축: 2024.04.05 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습1 GET API 전체조회
- 1 실습1 GET API ToDo 전체 조회: 2024.04.05 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습1 GET API 전체조회
- 1 실습2 GET API ToDo 단일 조회: 2024.04.09 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습2 GET API 단일조회
- 1 실습3 POST API ToDo 생성: 2024.04.15 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습3 POST API todo 생성
- 1 실습4 PATCH API ToDo 수정: 2024.04.16 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습4 PATCH API todo 수정
- 1 실습5 DELETE API ToDo 삭제: 2024.04.17 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습5 DELETE API todo 삭제
- 1 실습6 ERROR 처리: 2024.04.18 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습6 ERROR 처리
- 2 데이터베이스: 2024.04.24 - [Web 개발/FAST API (인프런 강의 내용)] - 2 데이터베이스
- 2 실습1 MySQL 컨테이너 실행 (docker): 2024.04.24 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습1 MySQL 컨테이너 실행 (docker)
- 2 실습2 MySQL 접속 및 사용: 2024.04.25 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습2 MySQL 접속 및 사용
- 2 실습3 데이터베이스 연결: 2024.04.25 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습3 데이터베이스 연결
- 2 실습4 ORM 모델링: 2024.05.02 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습4 ORM 모델링
- 2 실습5 ORM GET 전체조회 API: 2024.05.03 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습5 ORM 적용 - GET 전체조회 API
- 2 실습6 ORM HTTP Response 처리: 2024.05.10 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습6 ORM 적용 - HTTP Response 처리
- 2 실습7 ORM GET 단일조회 API: 2024.05.14 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습7 ORM 적용 - GET 단일조회 API
- 2 실습8 ORM Refactoring: 2024.06.01 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습8 ORM 적용 - Refactoring
- 2 실습9 ORM POST API: 2024.06.01 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습9 ORM 적용 - POST API
- 2 실습10 ORM PATCH API: 2024.06.01 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습10 ORM 적용 - PATCH API
- 2 실습11 ORM DELETE API: 2024.06.01 - [Web 개발/FAST API (인프런 강의 내용)] - 2 실습11 ORM 적용 - DELETE API
- 3 테스트 코드 PyTest: 2024.06.01 - [Web 개발/FAST API (인프런 강의 내용)] - 3 테스트 코드 PyTest
- 3 실습1 PyTest 세팅: 2024.07.22 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습1 PyTest 세팅
- 3 실습2 테스트 코드 GET 전체조회 API: 2024.08.01 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습2 테스트 코드 - GET 전체조회 API
- 3 실습3 테스트 코드 PyTest Mocking: 2024.08.02 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습3 테스트 코드 - PyTest Mocking
- 3 실습4 테스트 코드 PyTest Fixture: 2024.08.03 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습4 테스트 코드 - PyTest Fixture
- 3 실습5 테스트 코드 GET 단일조회 API: 2024.08.05 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습5 테스트 코드 - GET 단조회 APIsf
- 3 실습6 테스트 코드 POST API: 2024.08.05 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습6 테스트 코드 - POST API
- 3 실습7 테스트 코드 PATCH API: 2024.08.05 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습7 테스트 코드 - PATCH API
- 3 실습8 테스트 코드 DELETE API: 2024.08.07 - [Web 개발/FAST API (인프런 강의 내용)] - 3 실습8 테스트 코드 - DELETE API
- 4 실습1 Refactoring FastAPI Router: 2024.08.08 - [Web 개발/FAST API (인프런 강의 내용)] - 4 실습1 Refactoring - FastAPI Router
- 4 실습2 Refactoring 의존성 주입: 2024.08.08 - [Web 개발/FAST API (인프런 강의 내용)] - 4 실습2 Refactoring - Dependency Injection 의존성 주입
- 4 실습3 Refactoring 레포지토리 패턴: 2024.08.08 - [Web 개발/FAST API (인프런 강의 내용)] - 4 실습3 Refactoring - Repository Pattern 레포지토리 패
- 5 기능 고도화 SQL JOIN: 2024.08.11 - [Web 개발/FAST API (인프런 강의 내용)] - 5 기능 고도화 SQL JOINㄹ
- 5 실습1 User 테이블 모델링: 2024.08.12 - [Web 개발/FAST API (인프런 강의 내용)] - 5 실습1 기능 고도화 User 모델링
- 5 실습2 User 테이블 생성: 2024.08.15 - [Web 개발/FAST API (인프런 강의 내용)] - 5 실습2 기능 고도화 User 테이블 생성
- 5 실습3 ORM JOIN: 2024.10.16 - [Web 개발/FAST API (인프런 강의 내용)] - 5 실습3 ORM JOIN
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 방법을 사용하는 것이 지혜로움!
'Web 개발 > FAST API (인프런 강의 내용)' 카테고리의 다른 글
5 실습5 회원가입 API 구현 (0) | 2024.10.18 |
---|---|
5 실습4 회원가입 API 생성 & 비밀번호 암호화(bcrypt) (1) | 2024.10.18 |
5 실습3 ORM JOIN (1) | 2024.10.16 |
5 실습2 기능 고도화 User 테이블 생성 (0) | 2024.08.15 |
5 실습1 기능 고도화 User 모델링 (0) | 2024.08.12 |