목록Programming (38)
몰입공간
#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. JWT JWT(Json Web Token)는 토큰 인증 방식 중 아마 가장 널리 쓰이는 라이브러리입니다. 관련 커뮤니티도 활발하고, 자체적으로 사용법에 대한 E-BOOK도 제공하는 것으로 알고 있습니다. JWT가 인기있는 인증 모듈로 각광을 받게된건 다음과 같은 이유라고 생각합니다. 확장이 용이하다. (Scalability) 사용하기 편하다. (Simplicity) 서버에 저장하지 않는다. (Stateless) 어쩌다보니 3S를 맞추려고 어거지로 작성한 느낌이 있는데 결국 다 연관있는 이야기입니다. 이런 인기와 맞물려 무분별하게 JWT를 쓰는 경향과 이에 따른 보안이슈에 대해 목소리를 내는 개발자들이 많은 걸 보았습니다. 실제로 "한물간" 세션 인증방식으로 회귀해야한다고 주장하는 경우가 대부분인데..
#1. 개요 거의 모든 웹어플리케이션이 필수적으로 적용하는 기능이 회원과 로그인 입니다. 많은 프로젝트에서 User 관련 기능을 구현해보고, 세션 및 토큰 기반의 인증 방식을 모두 구현하거나 리팩토링한 적이 있음에도 불구하고, 방식에 대한 깊은 이해가 수반되지 않음을 반성하며 학습 내용을 포스팅합니다. 또한 염두해두지 않았던 토큰 방식(JWT)의 보안적인 문제와 HTTP header에 관해 별도의 포스팅으로 다룰 예정입니다. #2. HTTP는 stateless 하다. 인증 방식에 대해 논하기 전에 stateless(무상태) 한 HTTP 특성에 대해 먼저 알아야합니다. HTTP는 stateless한 프로토콜 입니다. stateless 하다는 것은 서버가 클라이언트의 상태를 기억하지 않는다는 것입니다. 이러..
#1. sort() sort() 메서드는 사본을 만들지 않고 리스트 내부를 변경해서 정렬합니다. fruits = 'pineapple apple peach pear banana'.split() print('original_fruits:', fruits) # ['pineapple', 'apple', 'peach', 'pear', 'banana'] print('fruits.sort():', fruits.sort()) # None 반환 print('sort()_fruits:', fruits) # ['apple', 'banana', 'peach', 'pear', 'pineapple'], 기존 리스트가 변경 #2. sorted() sorted() 메서드는 새로운 리스트를 생성하여 반환합니다. money = [500..
#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..