기술/Django
-
프로덕션의 마이그레이션은 검토가 필요합니다기술/Django 2024. 1. 18. 23:37
Django 를 쓰게되면 내부적으로 마이그레이션 도구를 사용하게 되는데 이걸 프로덕션까지 사용하여 반영하는 경우가 많은 것 같습니다. Django 의 마이그레이션은 상황에 따라 Down Time 이 발생할 수 있기 때문에 발생한 ORM 에 대해 검토가 반드시 필요합니다. 더 좋은 방법으로는 SQL 문을 한 줄씩 실행하는 것입니다. 개발자는 특정 쿼리에 대한 문제를 분리하여 문제를 정확하게 식별하고 해결할 수 있습니다. 이렇게 세분화된 문제 해결은 연쇄적인 장애를 방지하고 예기치 않은 동작의 근본 원인을 정확히 파악하는 데 큰 도움이 됩니다. 이 때 도움이 될만한 좋은 프로젝트가 있습니다. https://github.com/tbicr/django-pg-zero-downtime-migrations GitHu..
-
일반적인 Django 서비스는 단일 앱을 통해 개발해야합니다.기술/Django 2022. 12. 11. 20:22
Django의 프로젝트 구조 Django를 시작하면 아래와 같은 구조로 사용하게 됩니다. - project - namespace1 - models.py - migrations - urls.py - namespace2 - ... 네임스페이스를 하나 정의하고 해당 네임스페이스에서 사용되는 스키마, 뷰, URL를 정의하고 노출합니다. 이를 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 각 웹서버의 특징을 찾아봤습니다. 만약 웹서버를 선택해야하는 상..