Fast API 사용법과 비동기
·
python
"FastAPI는 빠르다."이 명제는 반은 맞고 반은 틀렸습니다. FastAPI 자체가 마법을 부리는 것이 아니라, Python의 비동기 생태계(Asynchronous Ecosystem) 가 전통적인 동기 서버의 한계를 극복했기 때문입니다.도대체 Gunicorn(WSGI)으로는 왜 부족했는지, 그리고 현대적인 Python 서버 아키텍처는 C10K(1만 동시 접속) 문제를 어떻게 공학적으로 해결했는지, 그 심층부를 해부해 보겠습니다.1. 근본 원인 분석: 왜 동기(Sync) 서버는 멈추는가?전통적인 웹 프레임워크(Flask, Django)가 사용하는 동기 I/O 모델의 가장 큰 병목은 Context Switching 비용과 리소스 유휴 상태(Idle) 입니다.1.1 OS 스레드 모델의 한계동기 서버는 '요..
TypeError: must be str or None, not ModelPrivateAttr
·
트러블슈팅
"내부 변수니까 _variable로 선언해야지" 하고 코드를 작성했다가, 예상치 못한 TypeError를 마주친 적 있으신가요?특히 Pydantic v2를 사용하면서 Class 내부 상수를 정의할 때 이 문제를 자주 겪게 됩니다.이번 글에서는 TypeError: must be str, not ModelPrivateAttr 에러가 발생하는 기술적 원인을 분석하고, Pydantic의 설계 의도에 부합하는 ClassVar 패턴을 소개합니다.1. 문제 상황: "분명 문자열을 넣었는데?"다음과 같이 복합 ID를 파싱하는 Pydantic 모델을 만들었다고 가정해 봅시다. 내부에서만 쓸 구분자(_delim)를 정의하고, split 함수에 넘겨주었습니다.from pydantic import BaseModelclass ..
FastAPI Event Loop Mismatch
·
트러블슈팅
[Python/AsyncIO] APScheduler와 SQLAlchemy 비동기 세션 충돌 (Event Loop Mismatch)APScheduler로 백그라운드 작업을 돌리다가 한 번쯤은 마주치게 되는 이벤트 루프 미스매치(Event Loop Mismatch).특히 FastAPI와 SQLAlchemy 비동기 세션을 함께 쓸 때 자주 발생하는 이 문제, 정확히 왜 발생하고 어떻게 해결해야 할까요?다음과 같은 에러 로그를 보셨다면, 오늘 이야기가 도움이 될 겁니다.RuntimeError: Task got Future attached to a different loop1. 문제 상황: 메인 스레드 vs 스케줄러 스레드보통 FastAPI 서버(uvicorn)가 뜨면 메인 스레드에 이벤트 루프(Loop A)..
FastAPI Depends
·
python
들어가기 앞서자바를 메인언어로 백엔드를 공부했지만 어쩔수없이 FastAPI 를 해야하니 알아보는 시간을 갖도록 했다.자바에서도 DB 와 같은 외부 서드파티 저장소와의 연결을 위한 Connection 객체가 있듯,Python 에서도 충분히 있을거라고 생각했고Springboot 때 처럼 커넥션 객체를 트랜잭션이 시작할때 열리고 트랜잭션 종료때 반환되는 방식인가 했지만?Depends 라는 녀석을 Springboot 로 따지만 Controller 함수에서 사용하는것 처럼 보인다. 필자가 사용하는 환경은 아래와 같다.Lang: Python 3.11ORM: sqlalchemy 2.0.23web: FastAPI 0.104.1사용from fastapi import FastAPI, Depends, HTTPExceptio..