[Django] 마이그레이션 파일에 초기 데이터 넣기
·
Django,Python
Django에서 마이그레이션 파일을 만들때  --empty 옵션으로 빈 마이그레이션 파일을 생성할 수 있다.공식문서: https://docs.djangoproject.com/en/5.0/topics/migrations/#data-migrationspython manage.py makemigrations --empty 생성된 마이그레이션 파일에 초기 데이터를 넣는 로직을 작성하면 된다.추가로, 마이그레이션을 되돌릴때 로직도 넣을 수 있다. 필수는 아니지만 작성하지 않으면 마이그레이션을 되돌릴때 에러가 발생한다. 그러므로 빠른 개발을 위해 넣어주는 것이 좋다.# Generated by Django 5.0.6 on 2024-07-23 06:47from django.db import migrationsfrom ..
[Django] 개발 서버는 멀티 스레드?
·
Django,Python
wsgiref내가 알기론, Django 내장 서버인 wsgiref는 한 번에 하나의 요청만 처리할 수 있는 싱글 스레드로 동작한다고 알고 있었다.하지만, locust를 사용해서 한 번에 수십개의 요청을 동시에 받는 상황을 재현해보니, 로그가 순서대로 찍히는 것이 아니라 뒤죽박죽 찍혀있는 것을 확인할 수 있었다. 멀티 스레드로 동작하는건가싶어 thread id를 콘솔에 출력해보았더니, 각 요청마다 다른 thread id가 찍혀있는 것을 확인할 수 있었다.예제 코드class ConcurrencyTestView(APIView): permission_classes = (AllowAny, ) def do_long_task(self): sum = 0 for i in range(0..
[Django] shell_plus로 개발 생산성 높이기
·
Django,Python
Django로 개발하다 보면 shell을 사용할 일이 자주 있는데, 그때마다 model들을 import 해주기가 정말 번거롭고 귀찮다.django-extensions라는 모듈에는 shell_plus 명령어가 있는데, shell_plus를 사용하면 model, db관련 객체들을 자동으로 import 해줘서 개발 생산성을 높일 수 있다.django-extensionspip install django-extensionsdjango-extensions를 설치하고나면, INSTALLED_APPS에 추가해준다.INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django..
[postgresql] postgresql의 Index Only Scan
·
데이터베이스
Postgresql은 Index Only Scan을 지원한다. Index Only Scan은 index에 필요로 하는 데이터가 있을때 인덱스 영역만 스캔하는 방식이다.Index Only ScanIndex Only Scan을 테스트 해보기 위해서 테이블에 100만개 정도의 더미 데이터를 넣고 테스트 해보았다.create table product( id bigint generated by default as identity primary key, created_at timestamp with time zone not null, updated_at timestamp with time zone not null, name varchar(60) ..
뮤텍스와 세마포어
·
기타
운영체제에서는 올바른 작업 수행을 위해 프로세스 실행 순서, 상호 배제를 하여 프로세스를 동기화 해줘야한다.프로세스 동기화 방법 중에 대표적인 것으로 뮤텍스 락과 세마포어가 있다.뮤텍스뮤텍스 락(mutex lock)은 하나의 공유자원에 하나의 스레드 or 프로세스만 접근가능한 동기화 기법이다.뮤텍스 락은 주로 탈의실 or 화장실에 비유하곤 한다.A가 탈의실을 사용하기 위해 key를 들고 탈의실을 이용한다.B가 탈의실을 사용하기 위해 탈의실 앞에 왔지만 key가 없기때문에 대기한다. A가 탈의실을 사용하고 나와서 key를 반납한다.B는 key를 들고 탈의실을 이용한다.여기서 탈의실은 공유자원이고 사람 A, B는 스레드 or 프로세스라고 볼 수 있다. 여기서 핵심은 key를 사용해서 자원에 접근한다는 것이며..
[Django] Django에서는 HTTP 요청을 어떻게 처리할까?
·
Django,Python
Django의 Request-Response CycleDjango에서는 HTTP 메시지로 요청이 들어오면 미들웨어를 거쳐 HttpRequest 객체를 만든다.settings.py에 있는 ROOT_URLCONF에서 urlpatterns를 순서대로 찾는다.ROOT_URLCONF = ".urls"request의 url과 일치하는 패턴이 있다면 찾기를 종료하고 (클래스 기반 뷰의 경우) as_view 함수를 실행한다. (request 인자를 넘겨준다.)# ~/login으로 찾는다면urlpatterns = [ path("register/", member_auth_views.MemberRegisterView.as_view()), path("login/", member_auth_views.MemberLoginVi..
Redis maxmemory와 eviction정책
·
기타
어느날, 회사 서비스에 장애가 발생했다. 고객에게 나가야할 알림톡이 나가지 않았고 그 외 몇몇 기능이 제대로 작동하지 않았다. 이유를 찾아보니 celery에서 task가 동시에 엄청나게 많이쌓여 Redis에서 OOM에러가 발생한걸 확인할 수 있었다. 일단 그 때는 팀에서 임시방편으로 메모리를 늘려서 해결했지만 평소에 redis메모리를 전혀 모니터링하지 못하고 있었던 점, 메모리 관리 정책에 대해 아는게 없어 부족함을 느꼈고, 이렇게 글로 정리하게 되었다.Redis의 메모리Redis는 In-memory DB이므로 당연히 물리적으로 사용가능한 메모리 이상 사용할 수 없다. 그러므로 운영할때 OOM 에러를 만날 수 있으므로 주의해야한다.maxmemory redis는 내부적으로 사용가능한 메모리를 설정할 수 있..
[Django] 동시성 고려하기(2) - optimistic lock 적용하기
·
Django,Python
optimistic lock이란?optimistic lock은 낙관적 락으로 실제로 DB에서 row에 lock을 거는것이 아닌, 어플리케이션 레벨에서 version 정보를 활용해서 수정 여부를 확인하는 방식이다.트랜잭션 대부분은 충돌이 발생하지 않을것이다라고 낙관적으로 가정해서 일단 수정하고 DB에 저장을 하려고 할때, 누가 이미 수정했는지 체크한다. 그래서 트랜잭션의 커밋이 끝나기 전에는 수정됐는지 확인할 수 없다.version이 뭐지?version은 이 row의 버전을 의미한다. version은 타임스탬프일수도 있고 Auto Increment 값일 수도 있다. version 정보를 활용해서 경쟁상태인지 체크하는 방법은 아래와 같다.하나의 row를 SELECT 해서 메모리에 가져온다. 여기엔 버전 정보..
Lambda@Edge + Typscript로 이미지 리사이징 적용하기
·
기타
서비스를 운영하다보면 이미지를 어떻게 처리할지 고민하게 된다. 보통은 S3 + CloudFront 조합으로 많이 구성하게 된다.모든 이미지를 원본 이미지를 사용해야만 하는 서비스이면 괜찮겠지만 보통은 원본 사이즈가 필요없는 경우가 거의 대부분이다.이미지 프로세싱을 구글에 검색하면 다양한 방법이 나오는데 요즘은 Lambda@Edge를 사용하여 프로세싱된 이미지를 보여주는 방식을 많이 사용한다.Lambda로 이미지 프로세싱S3 버킷에 이미지 업로드를 트리거로 람다 함수를 실행시켜 프로세싱된 이미지를 S3에 저장하는 방식이다.이 방법의 장점은 아래와 같다.기존 어플리케이션 코드의 수정 최소화S3 버킷에 오브젝트를 업로드할때만 실행되므로 비용 부담이 적음하지만 직접 개발해보니 아래와 같은 문제점이 있었다.같은 ..
[Django] 동시성 고려하기(1) - F 객체 사용하기
·
Django,Python
서비스를 운영하다보면 여러 사용자가 동시에 하나의 자원을 다루는 경우가 생긴다.예를 들어 상품을 구매해서 재고가 -n개 줄어든다거나, 자리 예매를 한다거나의 상황이 있을 수 있다.티켓팅처럼 2명 이상의 유저가 하나의 자원을 두고 경쟁하는 상태를 경쟁 상태라 한다. 오늘은 Django ORM의 기능인 F 객체로 경쟁 상태를 해소하는 방법에 대해 정리해보았다.F 객체란?장고 공식문서에 소개되어있듯이, F 객체를 사용하면 데이터를 직접 어플리케이션 메모리에 올리지 않고도 사용할 수 있다.예를 들어 상품을 구매하고 재고를 1개 차감할때, 재고 데이터를 메모리에 직접 불러오지 않고 값을 -1 할 수 있는것이다. django shell_plus를 사용해서 테스트해보았다.from django.db import mod..
togeepizza
Beyond the Now