피드로 돌아가기
Dev.toBackend
원문 읽기
불필요한 DB 쿼리 제거 및 Memoization을 통한 Laravel 성능 최적화
A Day of Performance Hardening: Hunting N+1s and Killing Wasted Queries in Laravel
AI 요약
Context
Eloquent ORM의 Lazy Loading으로 인한 N+1 문제와 사용되지 않는 Eager Load 쿼리가 누적된 레거시 환경. 요청당 중복 계산되는 로직과 대시보드의 개별 Metric 쿼리로 인한 DB 부하 가중 상태.
Technical Solution
- Local 환경에
laravel-query-detector를 도입하여 런타임 시 N+1 패턴을 즉각 식별하는 가시성 확보 - View 레이어 분석을 통해 사용되지 않는
with()관계 로드를 제거하여 불필요한 Hydration 비용 절감 - 요청 생명주기 내 동일 값 유지를 위해
??=연산자를 활용한 Per-request Memoization 적용 - 개별
count()쿼리를 단일 Grouped Query로 통합하여 테이블당 DB Round-trip 횟수 최소화 - 데이터 최신성 허용 범위 내에서
Cache::remember를 적용하여 대시보드 읽기 부하 분산 - Pest 테스트 프레임워크의
getQueryLog()를 활용해 쿼리 실행 횟수 상한선을 설정하는 Regression Test 구축
실천 포인트
- 개발 환경 전용 N+1 탐지 도구를 설정하여 런타임 쿼리 누수 상시 모니터링 - Eager Load 설정 시 실제 View에서 사용 여부를 검증하는 Audit 주기 설정 - 상태가 변하지 않는 Resolver나 설정값은 클래스 프로퍼티에 Memoize 하여 재계산 방지 - 대시보드 집계 쿼리는 Group By 통합 및 단기 캐싱 전략 우선 고려 - 성능 최적화 후에는 쿼리 카운트 Assertion 테스트를 추가하여 성능 퇴보 방지