한 번 열고 한 번 닫아
FastAPI는 앱이 뜰 때와 내려갈 때 도는 lifespan context manager를 줘. 정석은 이래. 거기서 DB connection을 열어 app.state에 붙여두고, dependency injection으로 route에 꽂아주는 거야.
피해야 할 함정이 둘 있어.
- request마다 새 connection을 여는 것. 파일 핸들을 낭비하고 메모리에 쌓아둔 캐시도 못 써.
- module을 import하는 시점에 여는 것. 그때는 event loop가 아직 없는데 aiosqlite는 loop가 있어야 해.
Self-reference: 피파
backend/main.py가 정확히 이 lifespan 패턴이야. 뜰 때 SQLite store를 한 번 열고, migration을 돌리고, app.state.store에 붙이고, 내려갈 때 깔끔하게 닫아. route는 Depends로 store를 받아 쓰고.