라라벨 모델 Lazy Loading 연관 속성을 필요한 경우 미리 불러오기

문제 상황

라라벨 모델의 연관 프로퍼티 기능은 기본적으로 Lazy Loading입니다. 사용하기 전까지는 세팅되지 않습니다. 불필요한 쿼리를 날려 성능을 떨어뜨리지 않기 위한 조처죠.

그런데 toJson() 같은 메서드로 JSON으로 만들어야 한다거나, 객체를 리턴해 JSON으로 응답해야 하고 그 때 특정 연관 프로퍼티가 설정돼 있는 상황이라면 약간 난감합니다.

이럴 때는 그냥 코드에서 무의미하게 연관 프로퍼티를 호출해 줘도 되지만, 의도를 알 수 없는 코드가 되므로 주석이 필요해집니다.

$user->posts; // 연관 속성 로드를 위해서
$user->comments; // 연관 속성 로드를 위해서
echo $user->toJson();

여러 줄을 쓰는 것도 걸립니다. 연관 속성 내의 연관 속성까지 필요할 땐 이 방법으론 한계가 있습니다.

loadMissing()

이 때 간편하게 사용할 수 있는 메서드가 바로 loadMissing()입니다. 아래처럼 씁니다.

$users->loadMissing(['comments', 'posts']);

// Comment의 연관 속성 author까지 세팅해서 가져옵니다.
$users->loadMissing('comments.author');

여기서 더 나아가 조건을 걸어 연관 속성을 로드할 수도 있습니다.

$users->loadMissing(['comments', 'posts' => fn ($query) => $query->where('status', 'public')]);

이렇게 쓰면, 우선 연관 속성인 comments는 다 가져오는데, postsstatuspublic인 것만 가져오게 됩니다.

결론

연관 속성은 라라벨의 강력한 기능입니다. 그러나 영리하게 사용해야 합니다. 필요한 속성이 없는 채로 전달돼 골치가 아픈 경우도 있고, Eager Loading을 잘 모르고 사용하는 경우엔 사이트의 전반적인 성능을 떨어뜨릴 수도 있습니다.

loadMissing()은 그럴 때 가려운 곳을 긁어 주는 메서드입니다.

카테고리 글 목록 👉

대표글

댓글 남기기