고급 웹프로그래밍

FastAPI(planner 코드리뷰 src.routes.users)

rabbit-jun 2025. 5. 2. 14:57

코드리뷰

from fastapi import APIRouter, HTTPException, status
from src.models.users import User, UserSignIn
from src.database.connection import Database

user_router=APIRouter(
    prefix= "/users",
    tags = ["Users"]
)

user_db = Database(User) # User(Beamie의 Document를 상속한 MongoDB 모델 클래스)를 인자로 받는다, 전역에서 DB 객체 생성

@user_router.post("/signup")
async def sign_new_user(user: User):
    """회원가입"""   # 이런식으로 작성하면 함수에 마우스를 올렸을 때 설명이 보임
    user_exist = await user_db.model.find_one(User.email == user.email) # 검색조건과 일치하는 문서 하나 반환
    if user_exist:
        raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="이미 존재하는 이메일 입니다.")
        await user_db.save(user)
    return {"message": "회원가입 성공"}

@user_router.post("/signin")
async def sign_user_in(credentials: UserSignIn):
    """로그인 API
    이메일,비밀번호
    """
    user = await user_db.model.find_one(User.email == credentials.email)

    if not user:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="이메일을 찾을 수 없습니다")
    if user.password != credentials.password: 
        raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="pw가 틀립니다")
    return {"message": "로그인 성공"} # 지금은 학습용이라 이렇게 메시지를 띄우지만 실제로는 토큰을 반환해서 프론트가 토큰을 받으면 다음페이지로 넘어가게 만든다

용어 설명

  • HTTPException: HTTP 상태 코드와 함꼐 에러 메시지를 전달하기 위한 FastAPIT 내장 예외 클래스
  • status: HTTP 상태 코드(ex. 404, 401, 200, ...)를 사람이 읽기 쉬운 이름으로 적음, status.를 쓰면 자동완성 목록이 뜸
  • finde_one(): Beanie에서 모든 모델이 Document를 상속하고 나면 사용할 수 있는 매서드로 인자로 검색조건을 넘겨주면 해당 조건에 맞는 문서를 MongoDB에서 하나만 찾아서 반환
반응형