본문 바로가기
Backend/Python

[FastAPI] Project Levup - 서비스 구조화하기

by 천우산__ 2023. 11. 18.

기능을 두개만 만들었는데도 벌써 main.py 파일 내 코드가 너무 많아졌다. express로 서비스를 만들었을 때도 기능별로 분리하는 작업을 했었는데

FastAPI에도 비슷하게 하는지 궁금해서 사이트를 찾아봤다

https://fastapi.tiangolo.com/tutorial/bigger-applications/

 

Bigger Applications - Multiple Files - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

공식문서에 따르면, router / models 등으로 나눠서 분리하는것으로 보이는데, express 로 진행할 때 만큼 세분화하지는 않아 보인다.

그렇게 나누는 것도 서비스 만드는 사람이나 팀 마음대로긴 하지만..

일단 구조화는 진행하되, 구현된 서비스가 적고, 하나의 router에 복잡하거나 많은 연산이 진행될 것 같지는 않아서 공식 문서대로만 나눠봤다.

 

1. Router 분리

# router/users.py

from fastapi import APIRouter
from models.users import Users

router = APIRouter(prefix = "/api/users", tags = ["users"])

@router.post("/signup")
def signup(Users: Users):
    id, email, password = Users.id, Users.email, Users.password

    check_duplication = db.users.find_one({"id" : id})
    
    if check_duplication:
        return {"error" : "이미 존재하는 ID입니다."}
    
    hash_pw = hashlib.sha256(password.encode("utf-8")).hexdigest()
    user_info = {
        "id" : id,
        "email" : email,
        "password" : hash_pw
    }
    
    db.users.insert_one(user_info)
    return db.users

라우터 분리 시 APIRouter를 호출해서 prefix와 tags 를 전달해주는 것이 보이는데

여기서 prefix의 경우 router 에서 공통적으로 사용할 api 요청 포인트를 적어주는 곳이고, tags는 /docs 에서 보여주는 api 문서를 분리해주는 역할을 한다.

api 문서 - users api는 분리되어있다.

 

2. Models 분리

# models/users.py

from pydantic import BaseModel

class Users(BaseModel):
    id : str
    email : str
    password : str

모델 부분은 따로 저장하기에는 코드가 너무 적은 듯 한데, 여러 서비스에서 이 구조를 가져다 쓸 수 있도록 하는것 같다.

 

3. Main.py 에서 Router 호출

from routers import users

app.include_router(users.router)

서비스 구조화는 여기까지 하고, 다음으로는 메모 작성 전 로그인 여부 및 유효성을 검사하는 로직을 구현하자