본문 바로가기

전체 글845

Python Alembic으로 Migration 관리하는 방법 Django같은 경우 풀스택을 지향하는 프레임워크로써 기본적으로 수많은 기능들을 제공한다. 그 중 편리한 기능중 하나가 바로 마이그레이션이다. 프레임워크에서 기본적으로 마이그레이션 기능을 제공하기에 사용자는 추가적인 설치나 세팅을 해줄필요가 없이 손쉽게 정의한 모델을 데이터베이스 테이블로 생성할 수 있다. 하지만 Flask, Sanic등 자유도가 높은 프레임워크의 경우 마이그레이션을 위한 기본 기능이 존재하지 않는다. 일반적으로 Alembic을 통해 마이그레이션 관리를 통합하는데, 본 포스팅에서는 SQLAlchemy를 사용하는경우에 Alembic을 통해 데이터베이스 마이그레이션을 관리하는 방법에 대해 기술한다. 1. 설치 아래의 명령어로 라이브러리를 설치한다. pip3 install alembic2. 초.. 2019. 9. 26.
Django Restframework Serializer 뜯어보기 현재 Custom Authentication을 구현하여 request.user에 Header에 들어있는 특정한 값을 파싱하여 넣도록 구현했다. 그 다음으로 리퀘스트를 검증하기위해 Serializer를 사용하는데, 일반적으로 시리얼라이저는 정의해놓은 필드이외의 값을 받지 못한다. 예를 들어 아래와 같은 시리얼라이저가 있다고 가정해보자. class CreatePostRequestSerializer(serializers.Serializer): body = serializers.CharField(required=False) attachments = serializers.ListField(required=False)리퀘스트로는 body, attachments 두개의 값이 들어오고 제대로 값이 들어왔는지 판단하는 .. 2019. 9. 19.
Python dataclass property/setter 파이썬 3.7부터 보다 간편하게 클래스를 생성할 수 있는 dataclass가 추가됐다. dataclass를 사용하여 Getter/Setter를 추가할 때 발생한 문제점과 해결 방법에 대해 기술한다. 파이썬에서 Getter/Setter를 사용하려면 @proprety와 @요소.setter라는 특수한 데코레이터를 사용해야한다. 먼저 일반적인 클래스의 경우 어떻게 사용하는지부터 살펴본다. class User: def __init__(self, id: str, pw: str): self.id = id self._pw = pw @property def pw(self): return self._pw @pw.setter def pw(self, value: str): self._pw = value if __name__ .. 2019. 9. 18.
Python Requests Retry 일반적으로 파이썬에서 리퀘스트를 보낼 때 requests 라이브러리를 사용한다. 사용법이 간단하고 직관적이므로 처음 사용하는 사용자들이라도 손쉽게 사용할 수 있기 때문이다. (https://2.python-requests.org/en/master/) 만약 리퀘스트를 보낸 후 돌려받은 Response를 통해 어떠한 로직을 거쳐야하는 상황이 있다고 가정해보자. 만약 단 한번의 리퀘스트를 전송했는데 대상 서버의 상태가 죽어있을 경우 정상적인 Repsonse를 받을 수 없고 그 이후에 거치는 로직또한 정상적으로 탈 수 없다. 따라서 대상 서버의 응답이 정상이 아니라면, 일정한 횟수동안 재시도(Retry)를 하도록 구현해야한다. 이러한 재시도 로직이 필요할 경우 개발자가 직접 특정한 로직을 구현할 필요없이 라이브.. 2019. 9. 5.
PostgreSQL Partitioning 적용하는 방법 PostgreSQL Version 10미만 1. 테이블 생성 먼저 아래와 같이 부모 테이블을 생성한다. CREATE TABLE users( id bigint, nickname varchar(20), gender char(1), )다음으로 부모 테이블을 상속받아서 자식 테이블을 생성한다. 본 예제에서는 gender를 따라 남성/여성을 구분할 것이므로 users_male과 users_female 두개의 테이블을 만들었다. CREATE TABLE users_male( CHECK (gender = 'M') ) INHERITS(users) CREATE TABLE users_female( CHECK (gender = 'F') ) INHERITS(users)여기서 CHECK 문법을 사용하.. 2019. 8. 7.
MongoDB 위치 기반 쿼리(Geospatial) 개요 위치와 관련된 정보를 저장할 때 보통 위도, 경도를 저장하여 사용한다. 저장된 위도, 경도를 토대로 특정 범위 내에 존재하는 다른 값들을 찾는 경우가 간간히 있다. 예를 들어 현재 내 위치에서 10km 이내에 존재하는 모든 카페를 찾고 싶다고 해보자. 이러한 경우 단순 쿼리를 체이닝하기에는 약간 복잡하게 느껴질 수 있다. MongoDB에서는 이러한 지리, 거리 관련 쿼리를 쉽게 하기 위해 지리 공간적인(Geospatial) 쿼리를 지원한다. 선행 지식은 다음과 같다. 선행지식 GeoJson : Json 형태로 지형에 대한 데이터를 정의하는 포맷이며 형태는 아래와 같다. : {: , coodinates: } type에는 Point, PolyGon, MultiPoint등 여러가지가 존재한다. 본 예제에.. 2019. 7. 22.