FastAPI(planner 코드 리뷰 src.main)
2025. 4. 30. 21:23ㆍ고급 웹프로그래밍
(MongoDB server설치)[https://www.mongodb.com/try/download/community]
(MongoDB community 설치)[https://www.mongodb.com/ko-kr/docs/manual/tutorial/install-mongodb-on-ubuntu/]
먼저 mongod --version을 하여 mongod가 설치되어 있는지 확인 (없으면 MongoDB server설치)
sudo systemctl start mongod
를 하여 mongod 데이터베이스를 활성화 시켜준 뒤 sudo systemctl status mongod
를 하여 동작 확인
uv run uvicorn src.main:app --reload 실행
mongosh
을 이용하여 db를 볼 수 있다 (MongoDB community를 따로 설치 해야 함)
main.py
from contextlib import asynccontextmanager
from .routes.events import event_router
from .routes.users import user_router
from src.database.connection import initialize_dabase()
from src.database.connection import initialize_database
@asynccontextmanager
async def lifespan(app: FastAPI):
# 코드를 구현하면 서버 시작할 때 할 작업들
await initialize_database()
yield
# 서버 종료시 정리해야할 작업들
app = FastAPI(
lifespan=lifespan,
)
app.include_router(event_router)
app.include_router(user_router)
@app.get("/")
async def root_path():
return "hello world!"
if__name__=="__main__":
import uvicorn
uvicorn.run( # uvicron 실행
"src.main:app"
host=127.0.0.1,
port= 80000,
reload =True)
1. 변수 의미
- asynccontextmanager : python의 비동기 컨텍스트 매니저를 만들 때 사용하는 데코레이터
- async: 비동기 프로그래밍을 위한 예약어
- 동시에 여러 작업을 처리할 수 있도록 만드는 방법
- await: 비동기 함수의 실행이 끝날 때까지 기다리게 하면서 다른 작업은 동시에 진행될 수 있게해준다
- ex. 맘스터치에서 햄버거 나올 동안(직원이 햄버거 만드는 중) 나는 핸드폰한고 있음
- lifespan: FastAPI 앱이 시작될 때 또는 종료될 때 실행할 코드를 담는 비동기 컨텍스트
- app.include_router(...): FastAPI에서 라우터(router) 를 앱에 등록하는 함수, 프로젝트를 모듈화하고 구조화하는 역할
- 서버를 켜면 (...)의 경로들이 자동으로 등록된다
- @app.get("/"): GET / 요청에 응답하는 엔드포인트 등록
- if__name__=="main": 해당스크립트가 있는 경로에서 이 파일을 실행하면 아래 코드브록을 실행
2. 전체 흐름
lifespan
은 FastAPI 애플리케이션이 시작되기 전과 종료되기 직전에 실행할 코드를 정의하기 위한 함수이다.FastAPI(lifespan=lifespan)
으로 등록하면, FastAPI는 내부적으로 앱 실행 전async with lifespan(app):
구조로 실행하게 된다.@asynccontextmanager
는yield
를 기준으로 "앱 실행 전"과 "앱 종료 시" 작업을 구분할 수 있게 해주는 데코레이터이다.await initialize_database()
는 비동기 함수이므로await
를 붙여야 정상적으로 실행되며, 이는 앱 시작 전에 수행될 초기화 작업이다.- app.include_router(event_router) : event.py에 있는 evenvt 관련 경로들을 메인 앱에 자동 연결
- app.include_router(user_router) : user.py에 있는 user 관련 경로들을 메인 앱에 자동 연결
- @app.get("/") async def root_path(): return hello world: 루트 경로 get 요청이 들어오면 hello world!를 띄운다
- if__name__ =="main": 에 속해 있는 코드에 의해 uvicorn main:app --reload 실행
질문
1. 왜 `uv run python src/main.py` 는 안되고 `uv run python -m src.main` 될까?
답변
- `uv run python src/main.py` 는 하나의 단일 파일만 보기 때문에 기준이 없으므로 상대경로를 인식 못하는데 반해
`uv run python -m src.main`는 main.py를 패키지로 인식하기 때문에 src를 기준으로 하위 폴더와 파일의 경로 인식
반응형
'고급 웹프로그래밍' 카테고리의 다른 글
FastAPI(planner 코드리뷰 src.routes.users) (0) | 2025.05.02 |
---|---|
FastAPI(planner 코드리뷰 src.routes.events) (0) | 2025.05.02 |
MongoDB 연동하기 (0) | 2025.04.30 |
MongoDB (0) | 2025.04.30 |
Python에서 SQL 다루는 방법 (0) | 2025.04.30 |