Laravel 애플리케이션에서 데이터베이스 쿼리를 90% 최적화한 방법
발행: (2025년 12월 22일 오전 09:48 GMT+9)
2 분 소요
원문: Dev.to
Source: Dev.to
배경
성능에 문제가 있던 Laravel 애플리케이션을 인수받았을 때, 사용자 대시보드에서 주문, 고객, 제품과 같은 관련 데이터를 로드하는 속도가 매우 느렸습니다. Laravel Debugbar를 사용해 쿼리를 분석한 결과, 전형적인 N+1 문제가 있음을 발견했습니다.
단계 1: Eager Loading
// Before: N+1 queries
$orders = Order::all();
foreach ($orders as $order) {
echo $order->customer->name; // New query each time!
}
// After: Optimized
$orders = Order::with(['customer', 'items.product'])->get();
단계 2: Query Scoping
public function scopeWithFullDetails($query)
{
return $query->with([
'customer.priceList',
'items.product.category',
'payments',
]);
}
단계 3: 전략적 캐싱
$products = Cache::remember('products.catalog', 3600, function () {
return Product::with('category')->get();
});
결과
- 페이지 로드 시간: 3–5 초 → 500 ms 이하
- 데이터베이스 쿼리: 100+ → 페이지당 10개 이하
- 서버 부하 크게 감소
- 사용자 경험 향상
주요 시사점
- 최적화 전에 항상 프로파일링 – 병목 현상이 어디인지 추측하지 마세요.
- Eager loading은 당신의 친구이지만, 모든 것을 과도하게 eager‑load 하는 것은 피하세요.
- 현명하게 캐시 – 실시간 데이터가 반드시 필요한 것은 아닙니다.
- 관계에 대해 생각하기 – 데이터가 어떻게 연결되는지를 기준으로 쿼리를 설계하세요.
- 성능 최적화는 마법이 아니라 체계적인 분석과 사려 깊은 해결책입니다.