Computer Science/Python

    [Python] FastAPI 미들웨어로 Sqlalchemy Session 관리하기

    🌟 들어가며FastAPI를 사용해 웹 어플리케이션을 구현할 때 Sqlalchemy Session객체의 라이프 사이클을 관리하는 것은 매우 중요합니다. 병행성이 보장되어야하는 환경에서 Session객체는 스레드별로 독립적이지 않기 때문입니다. 따라서 각 스레드별로 독립적으로 Session을 관리해줘야합니다. 이를 위해 미들웨어, ContextVar 그리고 scoped_session을 활용해 병행실행이 필요한 환경해서 Session을 어떻게 관리해야하는지 알아보도록 하겠습니다.📜 이번 포스팅에서 다루지 않는것Sqlalchemy의 Engine, Session의 개념FastAPI Depends미들웨어 개념ContextVar의 개념🔄 Thread local, Thread Safe?Sqlalchemy는 Bas..

    [Python] FastAPI와 Dependency Injector

    🚀 들어가며소프트웨어를 설계하다보면 DI 패턴을 적용해야하는 경우 있습니다. python 기준으로 객체의 의존성 주입은 다양한 방식으로 구현할 수 있지만, Python에서 DI 패턴을 프레임워크 형태로 구현한 Dependency Injector 라이브러리를 통해 의존성 주입과 제어의 역전(IoC)기능을 사용할 수 있습니다.이번 포스팅에서는 FastAPI와 Dependency Injector를 활용해 Layered 아키택처를 구현하는 방법에 대해 알아보겠습니다.🔍 의존성 주입에 대한 간단 설명이번 포스팅에서 의존성 주입에 대한 개념에 대해 설명하지 않지만, 간단히 짚고 넘어가겠습니다. DI, IoC, DIP와 같은 개념은 Spring과 같은 프레임워크를 사용한다거나, 객체 지향 설계에 대해 공부하셨다면..

    [Python] 비동기 테스트를 하려면? (a.k.a pytest-asyncio)

    들어가며python은 async/await 문법과 single-thread 기반 event loop를 통해 비동기적인 작업을 지원합니다. 하지만, 비동기적으로 만들어진 코드를 테스트하기 위해서는 어떻게 해야 할까요? 이번 포스팅에서는 비동기 테스트를 위한 pytest 익스텐션인 pytest-asyncio에 대해 알아보겠습니다.아래과 같은 개념을 알고 있어야 이 글을 이해하기 수월합니다.Pytest를 사용한 기본적인 테스트 코드 작성 방법pytest scope에 대한 이해Python의 비동기(Async) 개념(async/await, 코루틴, event loop)그리고 이 포스팅을 통해 알 수 있는 내용은 다음과 같습니다.pytest-asyncio의 테스트 스코프(scope)async한 코드의 async한 ..

    [Python] UoW(Unit of Work) 패턴을 알아보자

    들어가며 UoW 패턴은 저장소 패턴과 더불어 어플리케이션의 DB 접근에 대한 효과적인 추상화 방안을 마련해줍니다. 이번 포스팅에서는 UoW 패턴의 개념과 적용 예시를 정리해보겠습니다. 다음과 같은 개념을 알고 있어야 포스팅을 좀 더 쉽게 이해할 수 있습니다. 계층형(Layered) 아키텍쳐 저장소(Repository) 패턴 Python 컨택스트 매니저(Context manager)의 사용법 UoW(Unit of Work)? UoW는 작업단위로 해석되는 소프트웨어 디자인 패턴입니다. 애플리케이션(ex: API 서버)의 특정 비지니스 로직에서 발생하는 여러번의 변경사항을 한번에 처리합니다. 이를 통해 DB 일관성과 DB 연산의 원자성을 유지할 수 있도록 합니다. 애플리케이션의 비지니스 로직은 복잡해지기 마련..

    [Python] SqlAlchemy 1.4 -> 2.0 마이그레이션 단계별 가이드

    들어가며 SqlAlchemy 버전 업그레이드 진행 과정에 대해 설명한 포스팅 입니다. 이 글을 통해 다음과 같은 내용을 확인할 수 있습니다 SqlAlchemy 1.4/2.0 버전의 차이 마이그레이션을 위한 단계 각 버전 별 쿼리 스타일의 차이 왜 마이그레이션을 해야할까? SQLAlchemy 2.0 버전은 1.4 버전에서 지원하지 않는 기능들을 추가적으로 제공합니다. SQL 표현식 변경 typing 지원 Declarative(선언형) ORM 모델 개선 bulk insert ORM insert update, upsert 등... 비동기 컨텍스트 매니저 지원 이외에도 버전 업그레이드에 따른 쿼리 성능의 개선이 있었기 때문에 마이그레이션을 통해 얻을 수 있는 기능상의 이점이 상당합니다. 자세한 내용은 다음 공식..

    [Python] Tox로 여러 환경에서 테스트하기

    들어가며 python을 사용해 프로그래밍을 하다보면, python 버전 설치된 패키지의 버전에 따라 프로그램이 작동하지 않을 수도 있다. 새로운 패키지를 설치해 프로그램을 업데이트 했을 때 프로그램이 동작하지 않는 경우도 있으며, 개발환경에서는 잘 동작하던 프로그램이 배포환경에서는 잘 작동하지 않는 경우도 종종 있다. 이러한 문제를 해결하기 위해서는 여러가지 버전과 패키지의 테스트를 자동화 시켜주는 도구인 tox를 소개하고자 한다. Tox란 무엇인가? tox aims to automate and standardize testing in Python. It is part of a larger vision of easing the packaging, testing and release process of P..

    [Pythonic Code] 파이썬스러운 코드!

    Pythonic code? 파이썬의 기능을 최대한 살려서 코드를 짜는 것! 읽기 편하고 유지보수를 쉽게하는 클린코드! 좋은 가독성과 코드 일관성을 유지할 수 있다! list comprehension 파이썬스럽게 list를 생성하는 방법 가장 많이 사용되는 기법중 하나 for + append 보다 빠른속도로 리스트를 생성할 수 있다 Unpythonic result =[] for i in range(0,10): result.append(i) Pythonic result = [i for i in range(10)] result = [i for i in range(10) if i % 2 == 0] ✅ append와 속도 비교를 비교해보면 실행 성능 차이를 확실히 알 수 있다! split & join split ..