DTO, 에러 처리, 모델 등 간단한 코드를 제외하고 인증, 라우터, 서비스 위주로 리뷰
service
모듈이 있는 것으로 보아 서비스 계층 패턴을 사용한 듯?
서비스 로직과 DB 관련 로직을 분리
server/app.py
lifespan
@asynccontextmanager
async def lifespan(app: FastAPI):
# 애플리케이션이 시작될 때 실행될 초기화 코드
await database.connect()
print("Database connected.")
yield # lifespan 동안 실행될 코드
# 애플리케이션 종료 시 실행될 코드
await database.disconnect()
print("Database disconnected.")
lifespan
이 비동기로 작성된 이유
database.connect
이 비동기 함수이기 때문database.connect
도 동기 함수라면 DB 연결이 끝날때까지 다음 작업 XFastAPI
객체 생성app = FastAPI(lifespan=lifespan)
FastAPI 객체 생성 시, lifespan이 꼭 비동기일 필요는 X
하지만 다음과 같은 상황에서는 비동기 lifespan을 설정해야 함
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 모든 도메인에서 API 요청 허용 (보안상 실제 서비스에서는 특정 도메인으로 제한해야 함)
allow_credentials=True, # 쿠키 기반 인증 허용
allow_methods=["*"], # 모든 HTTP 메서드(GET, POST, PUT, DELETE 등) 허용
allow_headers=["*"], # 모든 헤더 허용
)
CORS(Cross-Origin Resource Sharing) 문제 해결 → 직역하면 교차로 리소스를 공유할 때 발생하는 에러