ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django & FastAPI 구조 비교, 사용 후기
    프로그래밍/Python 2022. 1. 19. 00:21
    반응형

     

    주로 Django를 사용하여 개발을 진행 하다가 시간이 조금 남아서 FastAPI를 사용해보고 있습니다.

     

    같은 Python언어를 사용하지만 Flask도 사용해본 적이 없어서 FastAPI는 많이 낯설더군요...

     

    Django 같은 경우는 어느 정도 규격화된 구조가 있지만 FastAPI는 비교적 자유로운 것 같습니다.

    위에 올려놓은 그림도 현재 Youtube를 보면서 따라 했을 때 나온 폴더 구조인데 사람마다 다르게 사용할 수 있겠습니다.

     

    Django DRF를 사용해서 API를 만들때와 FastAPI를 사용하여 API를 만들 때 대충 위와 같은 구조로 유사한 기능을 한다고 정리를 해봤습니다.

     

    FastAPI에서 Common, MiddleWare, DB 폴더를 만들었는데

    Common :환경변수 세팅

    MiddleWare: 각종 미들웨어 세팅 ex)토큰인증

    DB: DB 관련 함수들

     

    위 3개의 폴더 작성한 기능 및 변수들은

    Django에서는 Settings.py에서 설정하면 끝나는 일입니다.

    DB에 crud나 conn 같은 경우도 settings에서 db정보만 연결해두면

    각 view에서 ORM으로 사용할 수 있죠.

     

    FastAPI에 DB 폴더 중 schema.py 파일은

    Django에서 models.py 같은 역할을 합니다.

     

    FastAPI에도 models.py가 있는데 Django와는 다르다는 것을 주의해야 합니다.

    FastAPI의 mdoels.py는 Django의 serializer.py 같은 역할을 한다고 생각하시면 됩니다.

    [models.py]

    class User(BaseModel):
        id: int
        email: str = None
        name: str = None
        phone_number: str = None
        profile_img: str = None
        sns_type: str = None
    
        class Config:
            orm_mode = True

     

    FastAPI의 엔드포인트 비즈니스 로직은 routes폴더에서 파일을 생성해서 만들어 줬습니다.

    함수를 만들고 그 위에 세부 경로를 작성해 주는 방식이더군요

    Django에서 각 앱에 있는 url.py와 views.py를 합쳐놓은 느낌이라고 생각하시면 될 것 같습니다.

    [예시 | routes/??. py]

    router = APIRouter(prefix="/auth")
    
    
    @router.post("/register", status_code=201, response_model=Token)
    async def register(reg_info: UserRegister, session: Session = Depends(db.session)):
        """
        `회원가입 API`\n
        :param sns_type:
        :param reg_info:
        :param session:
        :return:
        """
        is_exist = await is_email_exist(reg_info.email)
        if not reg_info.email or not reg_info.pw:
            return JSONResponse(status_code=400, content=dict(msg="Email and PW must be provided'"))
        if is_exist:
            return JSONResponse(status_code=400, content=dict(msg="EMAIL_EXISTS"))
        hash_pw = bcrypt.hashpw(reg_info.pw.encode("utf-8"), bcrypt.gensalt())
                new_user = Users.create(session, auto_commit=True, pw=hash_pw.decode('utf-8'), email=reg_info.email)        token = dict(Authorization=f"Bearer {create_access_token(data=UserToken.from_orm(new_user).dict(exclude={'pw', 'marketing_agree'}),)}")
        return token

     

    마지막 Fast API main.py에서 실제로 전체 서버를 띄우는데 Django의 manage.py와 유사합니다.

    다만 각 앱의 라우터를 정의하고 미들웨어를 띄우는 것을 정의해줘야 합니다.

     

    [요약/소감/정리]

    매번 Django로 개발하다가 이번에 처음으로 FastAPI를 사용했습니다.

    자유도도 높고, 큰 사이즈의 개발이 아니면 사용하기 좋을 것 같습니다.

     

    다만 사이즈가 커지면 구조를 잘 잡아야할 것 같고.

    아직은 Django보다는 자료가 많이 없다보니, 삽질을 많이할 가능성이 높습니다.

    또한 구현해야하는 부분이 많아지므로 조금 귀찮아질 수 있습니다.

     

    사실 FastAPI의 특징 같은 경우는 실제로 제가 하나의 작은 서비스를 구현해봐야 장점을 더욱 잘 파악할 수 있을 것 같습니다.

     

    middleware등도 따로 작성하면서 Django의 다양한 기능 지원에 감사하면서

    한편 FastAPI에서 이러한 것들을 만드는 것이 재미있기도 합니다.

    (아마 기간에 쫓기면서 개발하지않아서인가..)

    FastAPI에 대한 내용은 추가로 개발하면서 후기를 더욱 많이 올려보겠습니다.

     

     

    ## 참고로 youtube에서 본 fastapi강의 채널은 이곳입니다.

    모르는 분이지만 강의를 무료로 공유해주셔서 감사합니다!
    https://www.youtube.com/channel/UCdTRjVhVcEKBiuUm4r-PHxw

    반응형

    '프로그래밍 > Python' 카테고리의 다른 글

    Python 설치  (0) 2022.01.15
Designed by Tistory.