Laravel 쿼리 최적화 전략
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- Laravel 개발자, 중급~고급 PHP 개발자*
- 난이도: 중급 (Eloquent ORM과 데이터베이스 최적화 기초 지식 필요)*
핵심 요약
- N+1 문제 방지를 위해
with()
사용:User::with('profile')->get()
- 필요한 필드만 선택하여 메모리 절약:
select('id', 'name')
- 대규모 데이터 처리 시
chunk(100)
사용, 인덱스 생성으로 쿼리 속도 향상 - 반복 쿼리는
Cache::remember()
로 캐싱, exists() 사용으로 불필요한get()
회피
섹션별 세부 요약
1. 관계 쿼리 최적화
with()
사용으로 N+1 문제 해결- 예:
User::with('profile')->get()
foreach
내부에서 관계 호출 시 성능 저하 발생
2. 필드 선택 최적화
select()
로 필요한 필드만 선택하여 메모리 사용량 감소- 예:
User::select('id', 'name')->get()
- 불필요한 데이터 전송으로 네트워크 부하 줄임
3. 대규모 데이터 처리
chunk()
사용으로 메모리 오버플로우 방지- 예:
User::chunk(100, function($users) { ... })
- 인덱스 생성:
WHERE
,ORDER BY
,JOIN
에 사용되는 컬럼에 인덱스 추가
4. 캐싱 전략
- 반복 쿼리 시
Cache::remember()
로 캐싱 - 예:
Cache::remember('users.all', 60, function() { return User::all(); })
- 캐시 키명 명확하게 지정하여 관리 용이
5. 복잡 쿼리 처리
DB::raw()
사용 시 SQL 인젝션 주의:User::select(DB::raw('count(*) as user_count, status'))->groupBy('status')
when()
메서드로 조건 분기 처리:$query->when($active, function($q) { $q->where('status', 'active'); })
6. 성능 모니터링
- Laravel DebugBar 또는
DB::listen()
사용:DB::listen(function($query) { logger($query->sql); })
- 실행 중인 쿼리 로그 확인으로 병목 지점 분석
7. 페이징 처리
paginate()
또는cursorPaginate()
로 무한 스크롤 구현:User::paginate(15)
- 대규모 테이블에서
cursorPaginate()
로 더 빠른 처리
8. 존재 여부 확인
exists()
메서드로get()
대체:User::where('email', $email)->exists()
- 불필요한 데이터 로드 방지
결론
- Laravel 쿼리 최적화는
with()
,chunk()
,select()
등의 Eloquent 기능과 인덱스, 캐싱 전략을 통해 효과적으로 수행할 수 있습니다. 성능 모니터링 도구를 활용해 병목 지점 파악 후, 복잡한 쿼리는DB::raw()
와when()
메서드로 유연하게 처리하세요. 페이징은paginate()
를, 존재 여부는exists()
로 최적화하세요.*