Django ORM N+1 쿼리와 Lazy Loading, select_related vs prefetch_related 가이드

개요 N+1 쿼리 문제는 ORM에서 자주 발생하는 성능 이슈로, 기본 쿼리 1회 이후 연관 데이터를 접근하는 시점마다 추가 쿼리가 N회 발생하는 상황을 의미함 Django ORM은 기본적으로 lazy-loading 전략을 사용하므로 관계 필드 접근 시점에 쿼리가 실행됨 이 글에서는 N+1의 동작 맥락과 lazy-loading의 특성, 그리고 select_related와 prefetch_related로 N+1을 예방하는 방법을 정리함 N+1 쿼리 문제 예시 방문 기록 Visitor와 방문자 정보 Person이 외래키로 연결된 상황 가정 visitors = Visitor.objects.filter(visit_date__year=2022) for v in visitors: print(v.person.name, v.visit_date)위 코드는 다음 흐름으로 동작함 ...

March 7, 2026