본문 바로가기
Laravel

Eloquent ORM - Lazy/Eager Loading

by Sein_ 2023. 9. 26.
728x90

지연 로딩(Lazy Loading): 필요한 시점에 관계 데이터를 로드하는 방식.

관계 데이터에 접근할 때까지 실제 데이터베이스 쿼리가 발생하지 않는다는 것을 의미합니다.

이 방식은 불필요한 데이터를 로드하지 않기 때문에 효율적일 수 있지만, 여러 관계에 대해 여러 번의 쿼리를 실행할 수 있어서 N+1 문제가 발생할 수 있습니다.


즉시 로딩(Eager Loading): 처음에 필요한 모든 관계 데이터를 로드하는 방식.

처음에 필요한 모든 관계 데이터를 로드하여 추가 쿼리를 방지합니다.

이 방식은 초기 쿼리가 약간 무거울 수 있지만, 추가 쿼리가 없기 때문에 대량의 데이터를 처리할 때 효율적입니다.

 

예시

 

users 테이블

| id | name  |
|----|-------|
| 1  | Alice |
| 2  | Bob   |

 

profiles 테이블

| id | user_id | phone    |
|----|---------|----------|
| 1  | 1       | 123-4567 |
| 2  | 2       | 987-6543 |

 

지연 로딩 (Lazy Loading)

$users = User::all();

foreach ($users as $user) {
    echo $user->name . "'s phone: " . $user->profile->phone . "<br>";
}
  1. SELECT * FROM users;
  2. SELECT * FROM profiles WHERE user_id = 1;
  3. SELECT * FROM profiles WHERE user_id = 2;

 

즉시 로딩 (Eager Loading)

$users = User::with('profile')->get();

foreach ($users as $user) {
    echo $user->name . "'s phone: " . $user->profile->phone . "<br>";
}
  1. SELECT * FROM users;
  2. SELECT * FROM profiles WHERE user_id IN (1, 2);

 

동일 결과

Alice's phone: 123-4567
Bob's phone: 987-6543

 

차이점 정리

지연 로딩 (Lazy Loading)
    - 먼저 `users` 테이블의 모든 데이터를 불러옵니다.
    - 각 `user`에 대해 연관된 `profile`을 가져오려고 할 때마다 별도의 쿼리가 실행됩니다. 따라서 여러 `user`를 순회하면서 그들의 `profile`에 접근할 때마다 데이터베이스에 추가적인 요청을 합니다.

즉시 로딩 (Eager Loading)
    - 먼저 `users` 테이블의 모든 데이터를 불러옵니다.
    - 그 다음, 로드한 `users`의 ID를 기반(실제로 불러온, 코드에서 필요로하는 users의 ID를 기반)으로 한번의 쿼리로 관련된 모든 `profiles`를 불러옵니다. 이 후, 각 `user`의 `profile`에 접근할 때 추가적인 데이터베이스 요청 없이 메모리에 저장된 `profile` 데이터를 사용합니다.

즉, 지연 로딩은 각 `user`의 `profile`에 접근할 때마다 별도의 데이터베이스 요청을 발생시키는 반면, 즉시 로딩은 처음에 모든 관련 데이터를 한번에 로드하여 추가적인 데이터베이스 요청을 방지합니다. 이러한 차이 때문에 여러 데이터와 관계를 처리할 때 즉시 로딩이 효율적일 수 있습니다.


적절한 로딩 전략을 선택하는 것은 응용 프로그램의 성능에 큰 영향을 미칠 수 있으므로 상황에 따라 적절한 방법을 선택하는 것이 중요합니다.

 

 

 

https://laravel.kr/docs/9.x/eloquent

 

라라벨 9.x - 시작하기

라라벨 한글 메뉴얼 9.x - 시작하기

laravel.kr

'Laravel' 카테고리의 다른 글

Artisan 콘솔(console) 로 실행 가능한 '사용자 명령'  (0) 2023.10.08
config 파일 내 변수정의 기준  (0) 2023.09.30
Helper 함수 - app()  (0) 2023.09.24
*Enum(enumeration) 열거형  (0) 2023.09.24
2차원 Json Response mapping  (0) 2023.09.23