본문 바로가기

Coding343

SQLAlchemy와 AsyncIO를 사용할 때 발생한 문제점 개요 SQLAlchemy 1.4 비동기 세션을 통해 작업을 진행하던 중 아래와 같은 에러가 발생하였다. if self.session.twophase and self._parent is None: AttributeError: 'NoneType' object has no attribute 'twophase' 이에 대해 조사한 내용을 간단하게 정리한다. 환경 PostgreSQL SQLAlchemy 1.4.42 FastAPI 0.87.0 asyncpg 0.26.0 사전 지식 본 코드에서는 아래와 같은 형태로 비동기 세션을 사용하기 위한 환경을 구성하였다. SQLAlchemyMiddleware import uuid4 class SQLAlchemyMiddleware(BaseHTTPMiddleware): def __.. 2022. 11. 17.
동시성을 고려한 쿠폰 재고 시스템 설계 개요 커머스 도메인을 다루는 서비스를 보면 쿠폰을 제공하는 기능이 꼭 하나씩은 존재한다. 선착순으로 진행하는 경우도 있고 그렇지 않은 경우도 있는데, 대다수의 쿠폰은 재고를 가지기 마련이다. 단순하게 생각한다면 DB에 쿠폰의 재고를 저장해두고 유저가 쿠폰을 획득할 때 마다 재고를 하나씩 차감하면 된다고 생각할 수 있는데 여기에는 큰 문제점이 하나 존재한다. 예를 들어 100개의 쿠폰을 발급할 수 있다고 가정해보자. 99개의 쿠폰이 소진되었고 재고가 1개 남은 상태이다. 이때 A라는 유저가 재고를 조회하고 데이터베이스에서는 1개의 재고가 남았다고 알려준다. 그리고 동시에 B유저가 재고 조회를 진행하고 마찬가지로 데이터베이스에서는 1개의 재고가 남았다고 알려준다. 다음으로 A가 쿠폰을 획득함과 동시에 재고를.. 2022. 7. 28.
FastAPI BaseHTTPMiddleware 관련 이슈 개요 FastAPI에서 Custom Middleware를 생성할 때 일반적으로 BaseHTTPMiddleware를 상속받아서 구현하는 형태로 사용한다. https://www.starlette.io/middleware/#basehttpmiddleware Starlette의 Middleware 관련 문서에 들어가보면 자세한 내용이 나와있다. 하지만 해당 미들웨어의 경우 몇가지 이슈가 존재하는데 그에 관해 간단하게 살펴보고 해결책을 제시하고자 한다. 문제점 첫 번째로 중간에 Request가 끊기면 정상적으로 동작하지 못한다. No response에러가 발생하며 예외가 터지게 된다. 두 번째로 BackgroundTasks와 이슈가 발생한다. 첫 번째 이슈의 연장선으로, Request가 들어오고 Backgroun.. 2022. 7. 23.
FastAPI add_middleware() 관련 이슈 개요 FastAPI에서 일반적으로 미들웨어를 설정하는 경우 add_middleware() 메소드를 활용한다. 하지만 https://github.com/tiangolo/fastapi/issues/5071 깃헙 이슈에 따르면 해당 메소드의 경우 호출할 때 마다 미들웨어를 re-initialize하는 이슈가 있다고 한다. 따라서 Middleware클래스를 활용하여 넣어주는 방식으로 변경하는게 좋다고 나와있고 본 포스팅에서는 관련된 내용을 간단하게 담아본다. Middleware 클래스 일반적인 미들웨어 세팅 방식은 다음과 같다. app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_.. 2022. 7. 23.
Python Generic Type 개요 스프링에서는 Spring Data JPA라는 것이 존재한다. 해당 라이브러리는 인터페이스를 생성 후 특정 인터페이스를 상속받으면 자동으로 메소드가 생성되는 역할을 한다. 예를 들어 findById(), findByEmail(), save(), delete() 등 여러가지 CRUD관련 메소드가 자동으로 생성된다. 실무에서 파이썬을 통해 서버를 개발하며 Layered architecture를 도입해서 사용하고 있는데, 특정 레포지토리를 생성할 때 마다 동일한 역할을 하는 메소드를 만드는게 귀찮았다. 그래서 스프링의 Data JPA와 같은 것을 만들어볼 순 없을까 생각했고 우연찮게 FastAPI 를 만든 개발자의 깃헙에서 비슷한 코드를 발견하였다. (https://github.com/tiangolo/fu.. 2022. 7. 7.
Python Metaclass 사용해보기 개요 파이썬에는 메타 클래스(Metaclass)라는 것이 존재한다. 메타 프로그래밍(Meta prgramming)이라고도 불리는데 이를 이용하면 특이한 행위를 수행하는 클래스를 만들 수 있다. 기본적으로 파이썬에서 메타 클래스란 클래스를 만드는 클래스를 의미하고 이를 구현하는 방법은 아래와 같이 두 가지가 존재한다. - type을 사용하여 동적으로 클래스를 생성하는 방식 - type을 상속받은 후 메타 클래스를 구현하는 방식 대부분의 경우에서 메타 클래스가 필요한 경우는 없다고 볼 수 있다. 인터넷을 찾아보면 Django ORM 등을 구현할 때 사용하는 방법이라는 예제도 나와있는데 실제로 나도 실무에서 메타 클래스를 사용한 경험은 거의 없었다. 구글 등 파이썬 메타 클래스에 대해 검색하면 수많은 자료들이.. 2022. 7. 6.