-
query builder big data set 작업시 지연 로드 lazy 와 lazyById 메서드백엔드/laravel 2024. 1. 14. 19:49
lazy 메서드와 lazyById 메서드는 Laravel의 쿼리 빌더에서 대량의 데이터를 처리할 때 메모리 부족 문제를 방지하기 위한 방법으로 사용됩니다.
lazy 메서드:
- lazy 메서드는 대량의 레코드를 메모리에 한꺼번에 로드하지 않고 필요한 시점에 청크 단위로 데이터를 검색하는 데 사용됩니다.
- lazy 메서드는 LazyCollection 인스턴스를 반환하며, 반복되는 동안 작은 청크 단위로 결과를 가져옵니다.
- 기본적으로 청크 크기는 1000입니다.
- each 메서드를 사용하여 데이터를 처리할 때 메모리 부족 문제를 방지할 수 있습니다.
$posts = DB::table('posts')->orderBy('id')->lazy();
$posts->each(function ($post) {
echo $post->title;
});lazyById 메서드:
- lazyById 메서드는 특정 ID에 해당하는 레코드를 메모리에 한꺼번에 로드하지 않고 필요한 시점에 청크 단위로 데이터를 검색하는 데 사용됩니다.
- 일반적으로는 특정 ID에 해당하는 레코드를 로드하고자 할 때 사용됩니다.
- first 메서드를 사용하여 첫 번째 레코드를 가져올 수 있습니다.
$post = DB::table('posts')->where('id', 1000)->lazyById()->first();
이러한 방법을 사용하면 대량의 데이터를 처리할 때 발생할 수 있는 메모리 소모 문제를 방지하면서 데이터를 효율적으로 검색 및 처리할 수 있습니다.
참고]LazyCollection은 Laravel의 컬렉션 클래스 중 하나로, 일반적인 Collection과 유사하지만 조금 다른 동작 방식을 갖습니다. LazyCollection은 데이터를 즉시 메모리에 로드하지 않고 필요한 경우에만 처리하는데 중점을 둔 클래스입니다.기본적으로 LazyCollection은 레코드를 청크 단위로 로드하며, 필요한 시점에서만 실제로 데이터를 검색합니다. 이는 대량의 데이터를 효율적으로 처리하고, 메모리 사용량을 최적화하는 데 도움이 됩니다. 특히, cursor 메서드를 사용하여 LazyCollection 인스턴스를 생성하면 이러한 동작이 기본적으로 활성화됩니다.
간단한 예시를 통해 설명하겠습니다. 아래의 코드에서는 LazyCollection을 사용하여 posts 테이블의 데이터를 처리합니다.
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Facades\DB;
$posts = DB::table('posts')->orderBy('id')->cursor();
$posts->each(function ($post) {
// 실제로 데이터를 처리하는 부분
echo $post->title;
});이 예시에서 cursor 메서드는 LazyCollection 인스턴스를 반환하며, each 메서드는 필요한 시점에서 각 레코드를 처리합니다. 이렇게 함으로써 대량의 데이터를 순회하면서 필요할 때만 메모리에 로드하게 되므로 효율적으로 작업할 수 있습니다.
'백엔드 > laravel' 카테고리의 다른 글
Query Builder orderBy, latest, 그리고 oldest 메소드 (0) 2024.01.15 Query Builder 직접 쿼리를 작성 (0) 2024.01.15 query builder big data set 분할 처리하는 chunk 메서드 (1) 2024.01.14 query builder Pessimistic Locking (0) 2024.01.14 query builder transaction (1) 2024.01.14