django 10

개발시에 발생하는 DRF의 몇몇 문제점들

1. 서론학교를 다니면서 Python으로 서버를 개발하면서 프로젝트를 적지만 몇 번 진행한 경험이 있다. 그때마다 난 DRF를 사용해 왔다.사실 클라이언트와 서버를 동시에 개발하지 않는 이상 Django를 쓴다고 하면 보통 DRF를 사용한다는 걸 말하는 것 같다.진행한 프로젝트들은 보통은 간단한 프로젝트이거나 MSA에선 Python이 사용되는 도메인의 크기가 크지 않아서 장고 프로젝트가 부담스럽게 커지진 않는 것 같다.하지만 큰 프로젝트를 DRF로 개발하게 되면 몇 가지 문제가 생기는 것 같다. 2. DRF 프로젝트Django 프로젝트는 App이라는 단위로 나누어진다. 개인적으로 App으로 프로젝트가 구성되는 건 좋게 느껴진다. 기능별로 직관적으로 나눌 수 있고, 새로운 도메인이 추가되며 확장하는 경우엔..

django 2025.02.04

Django - Throttling

스로틀링은 클라이언트가 api에 요청할 수 있는 속도를 제한하는 데 사용된다. django에서는 권한에 따라 인증되지 않는 사용자에게는 제한적으로 스로틀링을 적용할 수 있고, 분당 몇 회의 요청을 제한하는 bust throttling과 하루 요청 제한을 제한하는 sustained throttling을 적용할 수 있다.또한 각각 api 마다 다른 스로틀링을 적용할 수 있고, burst와 sustained 스로틀링을 동시에 적용할 수도 있다. 예시로 분당 30회, 하루 1000회로 동시에 제한이 가능하다.애플리케이션단의 스로틀링은 브루트포스 공격이나 ddos 공격을 막기 위한 방법으로 사용하면 안된다. 공격자는 항상 ip스푸핑이 가능하고 django의 스로틀링은 원자성이 보장되게 속도가 계산되지 않기 때문에..

django 2025.01.18

Django - Inverted Index로 검색하기

1. filter로 검색 시의 문제점장고 프로젝트에서 어떤것을 검색하는 것을 구현해야 할 때 filter()를 많이 사용하고, 가장 편한 방법이다.하지만 이런 방식은 많은 문제점이 있다.db index 사용 불가능filter() 에서 __contains를 사용하게 되면 LIKE 문이 실행되는데 이 경우는 Full Scan을 한다.LIKE% (__startwith)를 사용하는 경우는 제외제대로 된 검색이 불가능쿼리 한 키워드가 완벽히 일치해야지 검색된다.단어별로 검색이 불가능여러 가지 이유로 검색엔진을 구현해서 검색기능을 사용하는 게 좋은 방법이다.검색엔진에선 대표적으로 역인덱스(inverted index)를 사용하는 방법이 있다. 2. 역인덱스역인덱스란, 각 단어들이 어떤 문서에 저장되어 있는지를 나타내..

django 2024.12.29

Django - squashmigrations

이번 글에서는 django의 마이그레이션과 squashmigrations 명령어에 대해서 작성해 보았습니다.1. migration이란Django는 개발자가 모델링을 하면, 개발자가 작성한 models.py과 실제 db와 같은 상태를 유지하기 위해 django orm은 plan을 작성하며 관리합니다.이런 plan을 생성하기 위해 makemigrations 명령어를 사용합니다. 이렇게 해서 새로 생성된 plan은 myapp/migrations 안에 xxxx_변경내용.py로 저장되게 되며 이런 파일을 마이그레이션 파일이라고 합니다.마이그레이션 파일은 현재 migrations에 저장되어 있는 파일들을 기반으로 models.py 파일의 변경사항들이 작성됩니다.코드로 예시를 들어보면,class Food(models..

django 2024.12.16

Django - Trailing Slash

장고는 path를 라우팅 할 때 urlpatterns을 사용해서 라우팅 합니다.그리고 정해진 패턴들은 기본적으로 마지막에 슬래시가 추가되어 있습니다. 이런 슬래시를 Trailing Slash라고 부릅니다.장고는 기본적으로 해당 방식을 사용합니다. 장고는 왜 이런 방식을 채택했을까요? 1. /board/ vs /boardhttps://www.google.com -> Ohttps://www.google.com/ -> X도메인 뒤에는 기본적으로 슬래시가 붙습니다.크롬 urls 창에서는 기본적으로 트레일링 슬래시가 안 보이게 되어있지만 실제로 요청이 보내질 때에는 슬래시가 붙여집니다.그 이유는 http header에 루트는 슬래시가 포함되기 때문입니다. 하지만 도메인 뒤에 붙는 슬래시가 아닌 path에 붙는 ..

django 2024.12.02

Django - DB Connection

db 서버와 클라이언트(서버 애플리케이션) 과는 서로 쿼리를 날리고, 데이터를 조회하며 통신합니다.통신하기 위해서는 서로 연결이 되어야 하는데, db가 통신하는 방식은 tcp 프로토콜을 사용해서 통신합니다. 이 과정에서 3 way handshak가 필요한데 이 모든 과정을 쿼리를 날릴 때마다 하는 건 매우 비효율적입니다. 그래서 db 커넥션을 관리를 해야 할 필요가 있습니다. 이번 글에선 디비 커넥션을 관리하는 방식을 알아보고 장고에선 어떤 방식으로 처리하는지 알아보겠습니다. 1. DB Connection Pool커넥션 풀은 애플리케이션이 시작되는 시점에 커넥션을 충분히 만들어 둡니다.애플리케이션은 커넥션이 필요할때마다 커넥션 풀에서 커넥션을 요청하고 커넥션 풀이 전달해 준 커넥션을 사용해서 db와 통신..

django 2024.10.27

Django core - WSGI

1. WSGI서버에 요청이 들어오면 nginx나 apache와 같은 웹 서버들은 애플리케이션을 호출해야 합니다.하지만 보통의 웹 서버들은 애플리케이션을 이해하고 호출하는 기능이 없기 때문에 중간에 중개해 주는 무엇이 필요합니다.WSGI는 pep 333을 기반으로 만들어진 웹 서버와 파이썬 애플리케이션을 하나의 체인으로 연결해 통신하게 하는 인터페이스입니다.먼저 클라이언트에서 온 요청이 웹 서버가 받고, 그 요청을 WSGI에 전달합니다. 서버단에서 작업이 필요한 경우에는 WSGI가 애플리케이션에 요청을 전송하고 애플리케이션에서 로직이 처리된 후에 WSGI middleware을 통해 응답됩니다. 2. WSGI middlewareWSGI middleware은 WSGI를 사용한 구현체입니다.미들웨어가 직접적으로..

django 2024.10.21

DRF Serializer

내가 생각하는 DRF의 가장 큰 장점은 Serializer이라고 생각한다.Serializer는 json, python, xml 객체간의 직렬화를 쉽게 해주며 데이터를 검증하며 이걸 다시 다른 형태로 역직렬화 시킬 수 있다. 1. Serializer 선언간단한 Board 클래스 하나를 선언해준다.>>> class Board:... def __init__(self, title, content):... self.title = title... self.content = content...>>> board = Board("Hello", "World!") 시리얼라이저저를 사용하는 방법은 모델을 선언하는 방법과 비슷하다.>>> class BoardSerializer(..

django 2024.09.18

Django ORM - Transaction

1. Transaction이란트랜잭션이란 db의 상태를 변경하기 위해 create, update, insert, delete같은 작업의 단위를 말한다.트랜잭션은 여러개의 상태가 변경되는 작업들을 하나로 실행하는 것 처럼 하나의 unit으로 실행해 성공, 실패의 두가지 상태만을 갖는다. 트랜잭션은 ACID의 4가지 성질이 있다.1. Atomicity 원자성트랜잭션의 작업이 중간에 실행되다 멈추지 않는걸 보장해주는 것이다.2. Consistency 일관성트랜잭션이 정상적으로 실행되면 db의 상태를 일관성 있게 유지하는것이다. 제약조건이 있다면 그에 위반되는 트랜잭션은 중단되는 것이다.3. Isolation 독립성하나의 트랙잭션 작업시 다른 트랜잭션이 중간에 끼어들지 못하는것을 말합니다. 하나의 트랜잭션이 끝..

django 2024.08.06

Django - Nginx + Gunicorn으로 배포하기

Django 를 개발할때에는 python3 ./manage.py runserver 명령어를 통해 장고의 내장 서버를 작동시켜 쉽게 배포했다.하지만 실제 prod 환경에서는 runserver로 배포하면 안된다. 그 이유는 테스트하거나 디버깅할때 사용되는 간단한 서버이다. 그리고 단일스레드여서 속도도 느리고 HTTPS도 사용하지 못한다.그래서 wsgi(Web Server Gateway Interface) 서버를 사용해야한다.wsgi에는 uwgi와 gunicorn이 있는데 더 간단하고 서버의 리소스를 적게쓰면서 빠른 gunicorn으로 서버를 구성했다.nginx와 gunicorn으로 서버를 구상하면 이런 모습이 나온다.1. GunicornAWS ec2에 ssh로 접속한다.pip install gunicorng..

django 2024.06.21