라라쇼츠

N+1 문제 원천 차단

라라벨 v9.35 에 추가된 Model::preventLazyLoading() 메서드를 이용해서 N+1 문제를 원천 차단하는 방법을 소개합니다.

 컨트롤러로부터 $posts 를 넘겨 받아서 뷰에서 작성자의 이름을 출력한다고 가정해봅시다.

@foreach($posts as $post)
    <p>{{ $post->user->name }}</p>
@endforeach

이 코드는 지금은 문제가 되지 않지만 데이터가 많아지면 심각한 성능 문제를 일으킬 수 있습니다. 일명 N+1 문제라고 하는데요.

라라벨 9.35에서 추가된 엘로퀀트 엄격함(Eloquent Strictness) 설정 기능을 이용하면 N+1 문제를 미리 발견할 수 있습니다.

AppServiceProvider 에서 Model::preventLazyLoading() 을 호출해주면 

// app/Providers/AppserviceProvider.php

public function boot()
{
    Model::preventLazyLoading();
}

아까와 달리 예외가 발생해서 레이지 로딩, 즉 N+1 문제가 발생했다는 것을 알 수 있게 됩니다. 

개발 중에는 괜찮지만 이 기능 때문에 프러덕션 환경에서 안나던 예외가 갑자기 발생하기 시작하면 난감해지겠죠. 파라미터를 이용해서 이 기능을 제어할 수 있습니다. 

이런식으로 해주면 프러덕션 환경이 아닌 경우에만 기능이 활성화됩니다.

// app/Providers/AppserviceProvider.php

public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

 

관련 메뉴얼 위치

영문: https://laravel.com/docs/9.x/eloquent#configuring-eloquent-strictness

한글: https://laravel.kr/docs/9.x/eloquent#configuring-eloquent-strictness

댓글

댓글 본문