Byeonguk Kim

안녕하세요. 29살의 조금은 늦은 나이로 새롭게 개발자로 시작하는 신입 개발자입니다. 포트폴리오 [https://deaguowl.github.io]

프로젝트 09. filter에서 해당 모델의 user_id걸기

06 Jul 2019 » 프로젝트

2019.07.06 filter기능에서 한번에 user_id 걸기

문제의 시작

스크린샷 2019-07-06 오전 11 28 28

  • Connect 프로젝트의 오늘 연락할 인맥에 사람이 안나오기 시작했다.
  • 매일 5명이 보여져야 하는데(만약에 연락해야 될 사람들이 있다면) 어느 순간 연락해야 할 사람이 5명이 넘는데도, 그렇게 나오지 않는 문제가 발생했다.
  • filter기능을 통해 정확히 DB에서 가지고 오는데 forloop.counter <= 5를 설정해주었는데 왜 이 for문이 제대로 작동하지 않는지 이해가 되지 않았다.

해결을 위한 방법

  • 먼저 데이터가 잘 넘어가고 있는지에 대한 의문이 들었다.

스크린샷 2019-07-06 오전 11 29 47

  • 내가 뷰에서 작업한 화면이었고

스크린샷 2019-07-06 오전 11 30 16

  • 내가 템플릿에서 작업한 화면이었다.(원래는 forloop.counter가 5명이었으나 10명으로 늘려서 또 실험해보았다.)
  • 1명 나오던 것이 10명으로 늘리니 3명이 화면에 나왔다.
  • 무언가 object_list를 가지고 오는데 문제가 있다고 생각하였다.
  • 그렇게 나는 print를 통해 화면을 찍어보았다.

스크린샷 2019-07-06 오전 11 38 18

  • 뷰에서 context에 들어간 object_list에 대해서 얼마나 많은 데이터가 들어가 있는지 확인해보았다.

스크린샷 2019-07-06 오전 11 38 30

  • 나에게 넘어와야 할 데이터는 14명이었는데 34명이 들어가 있었다.
  • 그리고 여기서 넘어 온 데이터가 template에서 for문을 돌면서 나오고 있었는데, 문제점은 바로 템플릿에서의

스크린샷 2019-07-06 오전 11 30 16

  • 이 부분 이었다. 넘어온 object_list에서 해당 로그인한 사람의 아이디를 통해 한번 더 필터링 하였고, 그 정보에서 forloop.counter를 하니 사이사이에 다른 사람들의 friend가 들어오는 것이 문제였다.
  • view의 로직에서 처리해줄 방법이 필요했다.
  • 먼저 애초에 Friend에 대해 해당 user의 Friend만 넘겨주고
  • 또 forloop.counter가 아닌 객체 5개만을 넘겨주면 저 해당 코드 2줄을 깔끔하게 지울 수 있었다.

해결

스크린샷 2019-07-06 오전 11 44 48

  • filter 내부에 user_id =self.request.user.id를 추가하여 해당 Friend를 가지고 올 떄 한번 더 해당 user에 대해서 filter하도록 추가하였다.(굉장히 단순한 코드인데… 해결 방법을 알았음에도 어떻게 코드를 쳐야 할지 굉장히 고민하였다.)
  • 그리고 그렇게 filter된 값에 [:5] 인덱스를 이렇게 설정해줌으로서 5개만 가지고 오게 하였고
  • 해당 결과 print를 해보니 5명이 잘 넘어오는 것을 확인할 수 있었다.

개선 사항

  • 기존에 발생하였던 문제를 해결하였고
  • 기존에는 모든 사람들에게서 scheduled_connect가 오늘 날짜를 지난 사람들은 다 보내준 후에 template에서 랜더링 하였으나, 해당 문제에 대해서 view에서 처리하게 됨으로서 template 랜더링 시간이 훨씬 개선 되었을 거라 생각된다.