전체 글 23

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

Python - yield

파이썬의 리스트는 힙 메모리 영역에 저장되어 있는 객체의 주소를 모아둔 하나의 객체이며 컬렉션(collection)입니다. 파이썬의 리스트는 동적 리스트이며 리스트를 추가하고 제거하는데 인덱스를 걱정할 필요가 없으며 여러 자료형들을 하나의 리스트에 담을 수 있다는 장점이 있습니다.하지만 이런 리스트는 메모리에 저장되기 때문에 메모리를 매우 많이 사용하게 됩니다. 이런 상황을 해결하기 위해서 yield를 사용할 수 있습니다. 1. yield파이썬에서 yield는 제너레이터 함수를 만드는 데 사용하는 키워드입니다.제너레이터는 이터레이터를 생성하는 함수입니다. 여기서 이터레이터는 iterable 한 객체를 __next__ 매직메서드를 사용해서 요소들을 순차적으로 반환시켜 주는 객체입니다.함수에서 yield 키..

python 2024.12.10

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

Python - 멀티스레드, GIL (Global Interpreter Lock)

1. Python 인터프리터파이썬 인터프리터는 파이썬의 코드를 한 줄씩 읽으면서 실행하는 프로그램을 말합니다. 이 파이썬 인터프리터를 구현한 구현체 중에 하나가 현재 표준 구현체로 사용되고 있는 CPython입니다. GIL은 CPython에서 적용되는 개념입니다. 2. GIL (Global Interpreter Lock)2-1. GIL과 멀티스레딩보통의 멀티 스레딩은 이런 방식으로 작동합니다.여러개의 스레드가 서로 병렬로 동시에 실행되는 것을 말합니다.하지만 파이썬은 조금 다르게 작동합니다.일반적으로 두개의 스레드가 병렬로 작동하는 방식을 사용하지 않고 스레드가 각각 컨텍스트 스위칭을 하며 프로그램을 실행합니다.이 이유는 파이썬에서는 일종의 뮤텍스 역할을 하는 GIL이 있기 때문입니다.GIL은 하나의 자..

python 2024.11.25

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

Python list append, extend, +=

파이썬에 배열에 값을 추가하는 방법은 append, extend, +=, insert 등등이 있습니다.그 중 append, extende, +=의 차이점을 알아보겠습니다.1. append, +=>>> a = [1, 2, 3]>>> b = [4, 5, 6]>>> a.append(b)>>> print(a)[1, 2, 3, [4, 5, 6]]append를 사용할 시 그 자체를 배열에 원소로 넣습니다.+= 연산자를 사용해도 append와 같은 방식으로 동작합니다.무엇을 넣든 원소 하나로 들어가는 특징이 있습니다. 2. extend>>> a = [1, 2, 3]>>> b = [4, 5, 6]>>> a.extend(b)>>> print(a)[1, 2, 3, 4, 5, 6]extend를 사용하면 배열에 iterabl..

python 2024.10.07

Python mutable 변경 가능, immutable 변경 불가능

파이썬은 다른 언어들과는 다르게 모든 것들이 객체이다. 이 객체들은 python memory manager에서 관리된다.이 객체들의 주소는 id 라는 함수를 통해서 알 수 있다.파이썬엔 mutable 변경 가능, immutable 변경 불가능 객체가 있다.immutableint, floot, bool, str, tuplemutablelist, set, dicimmutable>>> a = 100>>> b = 100>>> c = 100>>> print(id(a), id(b), id(c))439093744043909374404390937440위 코드는 각각 다른 변수들에 100이라는 integer 값을 할당해 주더라도 객체의 주소는 다 같은 걸 볼 수 있다.여기서 python memory manager은 10..

python 2024.09.23

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

Python 잘 쓰는법: 리스트, 딕셔너리

1. 시퀀스 슬라이싱파이썬엔 시퀀스라는 자료형이 있다.시퀀스는 데이터를 순서대로 담는 자료형이다.문자열: 'Python'파이썬이라는 문자열도 Char의 시퀀스이다.배열: ['a', 'b', 'c']튜플: ('a', 'b', 'c')파이썬엔 이러한 시퀀스를 슬라이싱 할 수 있는 많은 방법이 있다.>>> a = ['a', 'b', 'c', 'd']>>> print(a)['a', 'b', 'c', 'd']>>> print(a[1:5])['b', 'c', 'd']기본적으로 list[시작:끝]으로 쉽게 할 수 있다. 시작 인덱스부터 출력되며 마지막 인덱스는 포함하지 않고 리턴된다.>>> assert a[:1] == a[0:1]>>> assert a[1:] == a[1:len(a)]맨 앞부터 슬라이싱하는경우에는 0..

python 2024.09.09