Published on

200525 TIL

Authors
img

TIL : Django와 DRF !

TIL이란 Today I Learn의 줄임말로 일기처럼 오늘 배운 내용을 정리하는 것을 말한다. TIL이란 단어를 페이스북 타임라인에서 언뜻 스쳐 지나가듯이 본 뒤로 나도 써야지 써야지 미루다가 처음으로 쓰게 되었다. 가장 따끈따끈한 배움부터 정리 !! (TIL에 관한 문서)

DRF + ModelSerializer로 만들어진 api가 느린 경우에 범인을 찾습니다.

  1. 쿼리
    • 문제: 장고 쿼리셋은 기본적으로 lazy하게 작동합니다. lazy는 보통 좋은 성능을 내지만 쿼리가 복잡해지면 우리가 예상한 대로 동작하지 않습니다. 예를 들어 A와 연관된 B테이블의 값을 구할 때, A의 id를 한번 구해놓고 그와 연관된 B를 부를 때 쓰면 되는데, lazy하게 제일 마지막에 쿼리를 작동시키다 보니, 매번 A의 id를 join해서 값을 가져오게 됩니다. 그러니까 엄청 느려진다는 뜻입니다.
    • 해결: 쿼리셋은 foreign key를 부를 때 항상 select_related를 지정하고, object의 related field를 여러 번 사용할 경우 prefetch_related를 꼭 사용합니다.
  2. DRF ModelSerializer
    • 문제 : 응답을 구현하기 위해서 아무 생각 없이 4번 중첩된 Serializer를 사용하였는데요, 36개짜리 list를 돌려주는데, 8초에 달하는 시간이 필요했습니다. (....)
    • 다른 장고 개발자에게 조언을 구해 보니 DRF Serializer는 몹시 느립니다. https://hakibenita.com/django-rest-framework-slow 항상 read_only를 붙이되 최대한 중첩하지 않고 사용하도록 합니다. 다른 글을 찾아보니 DRF를 상속받아서 필요한 crud를 뜯어서 쓰는 것을 추천한다고 합니다. DRF에 근본적인 문제가 있다고 하니, 직접 Serializer를 만들어서 써야 하나 고민 중입니다. 해결책을 찾으면 다음 TIL이나 Post로 작성 !!ㅋㅋㅋ

역시 TIL은 오늘 배운걸 써야 한다. 벌써 이걸 어디 썼는질 까먹었다 ㅠㅠ 여튼 annotate-count로 dinstinct-field 가져오기 를 통해서 model에 related된 다른 model이 몇개씩 있는지 가져올 수 있다. 게시글에 몇 명의 유저가 댓글을 달았는지 (몇 개 말고)와 같이 응용할 수 있을 것 같다.

p = Project.objects.all().annotate(Count('informationunit__username', distinct=True))

django shell과 친해지기

  • 문제 : 회사에서 본격적으로 장고 서버를 개발하게 되었다. rails에서 shell을 써서 개발했던 터라 rails를 따라 만든 django도 당연히 있을 거라고 생각! 그리고 당연히 있었다. shell은 너무 사랑스러운 게, 뭘 만들든 일단 켜서 투닥투닥하다 보면 보통 만들어져 있다. 스크립트 언어 짱.
  • 관련 링크 : https://wayhome25.github.io/django/2017/03/04/django-06-poll-project-3-shell/

django orm에서 null=true 와 blank=true의 차이점

  • 문제 : model을 설계하다 보면 null=true인 경우가 자주 생긴다. 하지만 요렇게 해놓으면 admin에서 blank로 입력하려면 에러가 파팍 뜬다. 간단한 내용이지만 잊지 말도록 하자.
  • 해결 : https://django-orm-cookbook-ko.readthedocs.io/en/latest/null_vs_blank.html (특이한 점: 불리언 필드(BooleanField)에 NULL을 입력할 수 있도록 하려면 null=True 를 설정하는 것이 아니라, 널 불리언 필드(NullBooleanField)를 사용해야 합니다.)

회고

요렇게 4가지 배운 점을 정리해 봤다. 간단해 보이지만 기초를 단단하게 다져야 레벨업을 할 수 있다는 것을 느끼고 있다. (날림으로 장고를 쓰고있다는 이야기) 시간날 때마다 document를 읽는 습관을 들여야겠다.

최근에 부쩍 코드를 많이 만들어 내고 있다. 그런데 작동은 잘 하지만 느리다던지, 예외 처리를 잊는다던지 하는 경우가 생기고 있다. 속도를 조금 더 늦게 개발하더라도, 차분하게, 더 큰 그림으로 개발하기 위해서 노력해야겠다. 그리고 조급하지 않게 미리미리 일정을 잘 세팅해 놓는 것도 잊지 말자.