기술/Django
-
Django 에서 N+1 쿼리 문제 예방, 발견하기기술/Django 2022. 1. 25. 22:18
N+1 이란? 쿼리를 한번으로 N건 가져왔는데, 관련 컬럼을 얻기 위해 N번의 쿼리를 추가수행하는 문제는 N+1 문제라고 합니다. 간단한 예시를 통해 N+1 이 발생하는 원리를 알아봅시다. class PressGroup(models.Model): name = models.CharField(max_length=64) class Reporter(models.Model): full_name = models.CharField(max_length=64) press_group = models.ForeignKey(PressGroup, on_delete=models.CASCADE) class Article(models.Model): headline = models.CharField(max_length=64) conte..
-
Django Application 의 메모리 누수 해결하기기술/Django 2022. 1. 25. 20:00
원본: https://adamj.eu/tech/2019/09/19/working-around-memory-leaks-in-your-django-app/ Working Around Memory Leaks in Your Django Application - Adam Johnson Working Around Memory Leaks in Your Django Application 2019-09-19 Several large Django applications that I’ve worked on ended up with memory leaks at some point. The Python processes slowly increased their memory consumption until crashing. No..
-
Django Rest Framework 의 APITestCase 에서 API 를 요청할 때 Body 데이터를 보내는 두가지 방법기술/Django 2021. 9. 24. 20:17
APITestCase 에서 POST, PATCH, PUT 을 사용하여 데이터를 보낼 때는 보내는 데이터가 multipart 가 아니면 반드시 content_type 을 지정해주어야 합니다. 이 때 내부 동작을 살펴보며 왜 기본이 multipart 가 선택되는지, 다른 두가지 방법은 어떻게 동작하는지에 대해 설명합니다. APITestCase 에서 API 를 요청하는 두가지 방법 rest framework 에서 API 를 테스트를 할 때는 APITestCase 를 상속받아 client 를 통해 아래와같이 호출하게 됩니다. self.client.post(revese('post-list'), data=data) 이 때 self.client 는 rest_framework.test.APIClient 의 인스턴스 입..
-
Django 에서 Jupyter Notebook 을 사용할 때 서브 디렉터리를 기본으로 설정하는 방법기술/Django 2021. 9. 24. 20:12
장고에서 django-extensions 를 설치했다면 아래의 명령어를 수행하여 Jupyter notebook 에서 Django 를 로딩할 수 있습니다. $ python manage.py shell_plus --notebook 이 때 노트북이 로딩되는 기본 폴더를 서브디렉터리로 할 경우 Django 를 제대로 로딩할 수 없는 문제가 있습니다. 방법 프로젝트 레이아웃 장고 프로젝트의 구조가 현재 아래와 같이 되어있을 때 project/notebooks 폴더를 노트북을 켰을 때 기본으로 설정하고 싶다고 가정합니다. /project /users /notebooks # 이 폴더를 노트북의 기본 폴더로 설정하고 싶습니다. SampleNotebook.ipynb manage.py settings.py django-e..
-
Traefik vs Caddy기술/Django 2021. 9. 24. 19:53
개인 프로젝트에서 사용할 Web Server 를 선택하기 위해 django template 을 찾아보면서 유명한 프로젝트의 설정을 찾아보았습니다. 그 중 가장 유명한 cookiecutter-django 는 traefik 을 wemake-django-template 은 caddy 를 선택하였습니다. 여기에서 있었던 이슈와 선택에 이유에 대해 정리하고자 합니다. Web Server 왜 Web Server 를 사용하나요? 보안 - 내부 서버로의 직접 접근을 허용하지 않음 분산처리 - 백엔드 서버가 여럿일 경우 트래픽을 분산 가용성 - 문제 발생 시 다른 서버가 처리 성능 - 정적 파일의 서빙을 대신함 Nginx vs Caddy vs Traefik 각 웹서버의 특징을 찾아봤습니다. 만약 웹서버를 선택해야하는 상..
-
django 에서 select_related, prefetch_related 에서 추가적인 ORM 을 사용하기기술/Django 2021. 9. 24. 19:49
Django 의 ORM 을 사용하면서 select_related, prefetch_related 를 쓸 때 성능상의 이점을 위해 테이블을 복잡하게 다룰 필요가 있을 때가 자주 존재합니다. 그 때 사용하기 유용한 FilteredRelation 과 Prefetch 를 소개하고자 합니다. FilteredRelation FilteredRelation 은 Django ORM 에서 JOIN 절에 추가적인 조건을 줄 수 있는 방법입니다. 만약 OUTER JOIN 하는 테이블의 크기가 크다면 FilteredRelation 을 사용하여 성능을 개선할 수 있습니다. Filter 의 위치 Where vs Join OUTER JOIN 을 사용할 때 Where 절을 사용한다면 OUTER JOIN 을 완성한 다음 필터링을 합니다..
-
django-filters 를 사용하여 복잡한 환경에서 OrderingFilter 사용하기기술/Django 2021. 9. 24. 19:43
django-filters 를 사용한다면 OrderingFilter 를 FilterSet 쪽에 붙이는 것이 더 직관적이고 편할 수 있습니다. django-filters 라이브러리에서 OrderingFilter 에 대해 간단한 설명이 있지만 조금 더 복잡하게 사용할 필요가 있었기 때문에 어떻게 사용했는지 공유하고자 합니다. 기본 사용법 OrderingFilter 를 한 키로 정의하고 그 안에 fields 속성에 Ordering 에 사용할 필드들을 나열합니다. 위 처럼 작성하면 ?ordering=username,-first_name 와 같이 QueryString 에 포함시킬 수 있습니다. 대부분의 간단한 정렬은 가능하지만, 예외 케이스가 몇개 존재합니다. class UserFilter(FilterSet): ..