목록Programming/Django (19)
몰입공간

#1. 준비사항 파이썬으로 만들어진 어플리케이션은 대부분 정적 파일 및 프록시를 담당하는 Nginx와 Python 소스코드 그리고 이 사이에 웹 서버 인터페이스인 Gunicorn, uwsgi 혹은 uvicorn이 위치하는 형태로 이루어집니다. 이들을 활용한 프로덕션 서버 배포 가이드는 워낙 양질의 자료가 많기에, 개인적인 아카이빙 목적에 좀 더 염두하고 글을 공유합니다. 배포를 위한 제반사항은 다음과 같습니다. AWS EC2 (ubuntu 20.04) AWS RDS (MySql 8.0.33) AWS Secret Manger 완성된 Django 프로젝트 #2. EC2 설정 # 우분투 패키지 업데이트 및 파이썬 설치 sudo apt update && sudo apt upgrade sudo add-apt-re..

#1. 동시성 프로그래밍 파이썬에서 가장 최적의 비용으로 동시성을 개선시킬 수 있는 3대장이 있습니다. 멀티프로세싱 / 멀티쓰레딩 메모리 관리가 힘들다. 컨텍스트 스위칭에 따른 오버헤드가 발생하므로, 기능의 성격에 따라 성능이 더 안좋아질 가능성이 있다. Celery 등의 메시지 기반 비동기 큐 단일 어플리케이션에서 쓰기에는 조금 무거운 감이 있다. 비동기 프로그래밍 동기 프로그래밍에 비해 설계가 복잡하지만, 자원 사용이 매우 효율적이다. 어느 것이 무조건 좋다라고 말하기 힘들고, 보통 성능을 검증하는 과정을 통해 적절한 방법을 강구하는 것이 좋습니다. 파이썬 웹 프레임워크 신흥 강자인 FastAPI은 pydantic과 비동기 웹서버인 uvicorn을 사용함으로써 그 빠른 속도의 근거를 찾을 수 있고, ..

#1. 들어가며.. 대부분 Django를 사용하는 프로덕트팀이라면 여러번 고민했을 컨벤션에 대한 내용입니다. Django에서 비즈니스 로직을 정리하는 대표적인 구조는 다음과 같이 여러개 존재하며, 대부분 공통적으로 Fat Model을 지양하고, 종종 안티패턴으로도 해석되는 장고의 액티브 레코드 특성을 최대한 분리시켜 놓으려는 노력이 다분하다고 생각합니다. Proxy Model Custom QuerySet and Manager Behavior Mixin, Stateless helper Service Layer 어느 구조가 가장 완벽하다고 말할 수 없고, 명확하게 이 구조를 쓰라고 말하기도 쉽지 않습니다. 다만, 개인적인 공부와 프로젝트 그리고 실제 실무에서 각기 다르게 앱 구성을 했던 경험을 통해 한번쯤은..

#1. 미들웨어 (Middleware) 장고의 미들웨어(Middleware)는 HTTP 요청과 응답사이에 위치하여 여러 처리를 담당하는 일종의 인터페이스입니다. 커맨드로 프로젝트를 생성하게 되면 settings.py에서 다음과 같은 미들웨어 리스트를 볼 수 있습니다. 참고로 미들웨어 리스트에 적힌 path의 순서는 정해져있습니다. request가 들어오면 위에서 아래로 처리가 진행되고, response를 내보내는 과정에서 아래에서 위로 처리가 진행되어 나가기 때문에 미들웨어를 정하는 순서가 매우 중요합니다. #2. 미들웨어 작동원리 본래 웹서버와 파이썬 어플리케이션의 상호작용은 gunicorn이나 uWSGI와 같은 WSGI서버를 통해 이루어집니다. wsgi.py를 통해 callable한 WSGIHandl..

#1. 정규화 데이터베이스 정규화(DB normalization)에 익숙해질 것. 정규화에 관한 자세한 설명은 여기 충분한 시간을 가지고 이미 모델에 포함된 데이터들이 다른 모델에 중복되어 포함되지 않도록 하기. #2. 캐시와 비정규화 적절한 위치에서 캐시를 세팅하기 redis 등의 캐시서버 활용하기 캐시 관련 서드 파티 모듈 활용하기 #3. null and blank 보통 null값은 대부분의 필드에서 사용을 지양한다. (relation 필드나 숫자를 다루는 필드에서 사용은 가능하다.) blank는 대부분 사용가능하나 null 설정과 같이 설정해야하는 필드도 존재한다. #4. Binary 필드 Binary 필드는 다음의 상황에서 쓰일 수 있다. 메시지팩 형식의 콘텐츠 원본 센서 데이터 압축데이터 DB ..

#1. F() 객체와 annotation 이전에 F() 객체에 대한 포스팅에서 장고의 F()객체는 데이터베이스 레벨의 연산이 이루어진다고 소개했습니다. 때문인지, 장고의 F() 객체는 산술이 들어가는 filter 혹은 annotation 메서드와 같이 사용하면 매우 효과적입니다. F() 객체와 annotation 사용에 관한 공식문서 설명입니다. F() can be used to create dynamic fields on your models by combining different fields with arithmetic. #2. 예시 장고 관련 pybay 세미나를 보다가 관련하여 좋은 예시가 있어 소개합니다. from django.db.models import F, Count BloodBank.ob..

본 포스팅은 DJANGO ORM COOKBOOK 내용을 요약 및 정리한 내용입니다. #1. 장고 ORM 실제 쿼리 확인하기 str(queryset.query) >>> users = User.objects.all() >>> str(users.query) 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_us..

#1. Lazy evaluation / Lazy loading 장고 ORM의 QuerySet은 기본적으로 'Lazy' 합니다. Lazy 하다는 것은 장고 objects manager를 통해 '선언'한 쿼리를 바로 '호출'하지 않는다는 것을 의미합니다. 간단한 테스트 예시를 통해 살펴보면, def test_what_can_be_evaluated(self) -> None: # When with self.assertNumQueries(0): User.objects.all() User.objects.filter(id=1) User.objects.order_by('-id') 이 테스트는 실제 호출한 쿼리가 0이 되어야 통과하는 테스트입니다. 문제 없이 통과했습니다. 장고의 QuerySet은 실제로 SQL 쿼리를 ..

#1. F() expression 장고의 F() 객체는 SQL 쿼리의 '호출'을 파이썬 메모리에 가져오지 않고 순전히 데이터베이스 레벨에서만 처리하는 장고의 쿼리표현식 입니다. 즉, 모델의 필드값 조회나 변경을 데이터베이스 레벨에서 직접 연산할 수 있는 클래스입니다. F() 객체를 사용하는 이점으로 쿼리 수를 줄이는 것, 효율적인 메모리 사용등이 있지만 아무래도 경쟁조건(Race condition)을 피해 동시성을 해결하는 것이 가장 핵심일 듯 합니다. #2. 경쟁조건 (race condition) 제품을 나타내는 Product 모델이 있고, 그 제품의 주문수를 기록하는 필드를 따로 설정했다고 가정합니다. 일반적으로 주문의 횟수를 업데이트하는 방식은 다음과 같습니다. product = Product.ob..

#1. AbstratcBaseUser 장고에는 기본적으로 제공하는 유저 관리 모델에는 User, AbstractUser, AbstractBaseUser 3가지가 있습니다. 가장 기본적인 AbstractBaseUser에서 차례로 상속하여 내려가는 구조입니다. User 모델이나 AbstractUser 모델의 경우 대부분 필요한 기능들을 제공하지만 커스터마이징이 힘든 단점이 있습니다. 반면에 베이스 모델인 AbstractBaseUser 모델의 경우 password와 last_login 단 2개의 최소 필드를 제공하면서 시스템에 맞는 커스터마이징이 가능합니다. 로그인 수단으로 이메일을 사용하는 경우 혹은 소셜 로그인같은 경우 allauth 같은 서드파티모듈을 도입할 수 있지만 이 역시 커스터마이징이 쉽지는 않은..