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): 구조로 실행하게 된다.
  • @asynccontextmanageryield를 기준으로 "앱 실행 전"과 "앱 종료 시" 작업을 구분할 수 있게 해주는 데코레이터이다.
  • 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` 될까?

답변

  1. `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