DTO, 에러 처리, 모델 등 간단한 코드를 제외하고 인증, 라우터, 서비스 위주로 리뷰

service 모듈이 있는 것으로 보아 서비스 계층 패턴을 사용한 듯?

서비스 로직과 DB 관련 로직을 분리

server/app.py

1. lifespan

@asynccontextmanager
async def lifespan(app: FastAPI):
    # 애플리케이션이 시작될 때 실행될 초기화 코드
    await database.connect()
    print("Database connected.")
    yield  # lifespan 동안 실행될 코드
    # 애플리케이션 종료 시 실행될 코드
    await database.disconnect()
    print("Database disconnected.")

lifespan이 비동기로 작성된 이유

  1. database.connect 이 비동기 함수이기 때문
  2. 만약 database.connect 도 동기 함수라면 DB 연결이 끝날때까지 다음 작업 X

2. FastAPI 객체 생성

app = FastAPI(lifespan=lifespan)

FastAPI 객체 생성 시, lifespan이 꼭 비동기일 필요는 X

하지만 다음과 같은 상황에서는 비동기 lifespan을 설정해야 함

3. CORS 미들 웨어 생성

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 모든 도메인에서 API 요청 허용 (보안상 실제 서비스에서는 특정 도메인으로 제한해야 함)
    allow_credentials=True,  # 쿠키 기반 인증 허용
    allow_methods=["*"],  # 모든 HTTP 메서드(GET, POST, PUT, DELETE 등) 허용
    allow_headers=["*"],  # 모든 헤더 허용
)

CORS(Cross-Origin Resource Sharing) 문제 해결 → 직역하면 교차로 리소스를 공유할 때 발생하는 에러