지연 로딩(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>";
}
- SELECT * FROM users;
- SELECT * FROM profiles WHERE user_id = 1;
- 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>";
}
- SELECT * FROM users;
- 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 |