글 쓰기 전에.
제가 Django를 잘 해서가 아니고 저도 강의 들을 때까지는 몰랐는데 일하다가 알게 된 내용이 있어서 공유하는 것임을 밝힙니다.
Django에서 object 선택을 할 때 select_related라는 것과 prefetch_related라는 것이 있습니다.
select_related는 多대1, 또는 1대1의 관계에서 사용이 가능하며, 또는 우리가 에어비앤비 강의에서도 자주 썼던 ForeignKey(rooms와 user로 보면 room에서 user를 보는 '정참조' 관계)에서 사용 가능합니다.(라고 합니다.)
아래 코드는 제가 혼자 만든 Westa Clone(인스타클론 짭퉁)을 예로 들었습니다.
Post 모델이 있고 User 모델이 있는데 Post가 User를 ForeignKey로 user 필드를 갖고 있으므로 Post에서 User를 정참조 한다고 볼 수 있습니다.
여기에서 예를 들어 수많은 Post 중 첫번째 Post를 한 유저를 취득한다고 가정할 경우, 기존의 objects.get만을 이용한다면 (1)포스트 id가 1인 Post 모델의 오브젝트(first를 한 번 취득하고, (2)그 포스트의 user의 id와 같은 id를 가지는 User의 오브젝트를 찾아서 user에 저장하는 두 번의 과정을 거칩니다.
그러면 이 두 번의 과정을 한 번으로 줄이기 위해서 select_related라는 걸 사용해 봅니다.
post_sr(select_related를 줄인 이름)라는 변수에 Post모델 오브젝트에서 select_related로 'user'를 넣고 id가 1인 포스트를 취득합니다. 이 때는 id 1의 post에 대한 유저의 정보도 오브젝트 안에 함께 가져옵니다.
그러면 이미 오브젝트라서 더 이상 쿼리 실행을 하지 않고 post_sr의 오브젝트의 user 필드를 바로 출력해 볼 수 있습니다.
두 개를 한 개를 줄이는 건 별로 대단한 게 아니지만 보통 앱을 만들게 되면 post의 개수가 10개, 100개, 몇만개 등으로 크게 많아질 수 있으니 그 때 쿼리를 하나라도 줄일 수 있다면 앱의 성능이 크게 개선될 여지가 있다고 볼 수 있습니다(라고 합니다.)
끝.