Python FastAPI 로 백엔드 만들기 2화 - 프로젝트 구조


main



사실 MySQL을 연결해서 SQLAlchemy 로 데이터베이스를 다루는 방법에 대해 하려고 했습니다. 하지만 지금 프로젝트 구조를 다루지 않고 할 수 는 없을 것 같아서, 프로젝트 구조를 먼저 설명하려고 합니다. 지금은 귀찮고 아무 것도 아닌 작업인 것 같지만, 나중에 감당도 안되고 관리도 안되는 프로젝트가 되면 프로젝트 자체가 싫어지실 거에요. 관리하기 어렵고, 파악하기 힘들고, 협업하는 동료에게 습득이 어려운 프로젝트는 아무리 코딩을 잘하고 최신 기법을 써도 제대로 일을 못하는 것. 이라고 생각합니다.


혹시 비디오로 보고 싶으신 분은 아래 비디오로 시청하시면 되고, 텍스트로 읽고 싶으신분은 쭈~~~욱 읽어주시면 됩니다.





1. 프로젝트 구조 변경


현재 파일 구조는 이렇게 단순합니다.

 



우리가 앞으로 사용할 파일 구조 입니다.



venv 폴더와 app 폴더만을 프로젝트 폴더 아래 두고 나머지를 그 아래 전부 두는 것입니다. 프로젝트 폴더 안에는 파일이 없는가..  라고 물으신다면, 현재로써는 그렇습니다. 하지만, 나중에는 파일이 많아 질거에요!!

 


 


2. consts.py 와 config.py

consts.py 는 상수를 넣는 공간이고 config.py는 환경별 변수를 넣는 공간입니다. 서버에는 운영서버(실제 서비스를 하는서버) 도 있고 개발 서버도 있고 QA를 수행하는 스테이징 서버도 있고 내 컴퓨터에서만 돌려보는 로컬 환경도 있습니다. 그때 그때 다른 방법으로 설정파일을 넣는 것을 config.py 에 하고, consts.py 는 어떤 환경에도 변경되지 않는 것을 넣을 것입니다.


아래는 config.py 입니다.


from dataclasses import dataclass, asdict
from os import path, environ

base_dir = path.dirname(path.dirname(path.dirname(path.abspath(__file__))))


@dataclass
class Config:
    """
    기본 Configuration
    """
    BASE_DIR = base_dir

    DB_POOL_RECYCLE: int = 900
    DB_ECHO: bool = True


@dataclass
class LocalConfig(Config):
    PROJ_RELOAD: bool = True


@dataclass
class ProdConfig(Config):
    PROJ_RELOAD: bool = False


def conf():
    """
    환경 불러오기
    :return:
    """
    config = dict(prod=ProdConfig(), local=LocalConfig())
    return config.get(environ.get("API_ENV", "local"))


우선 대표적으로 Config 라는 부모 클래스를 하나 만들어 두고 그 아래로 Localconfig랑 ProdConfig를 만들었습니다. (Prod는 Production의 약자로 운영 서버를 뜻합니다)


데이터 클래스 데코레이터를 달고 있는 이유는 나중에 해당 클래스를 Dict 형태로 추출해서 쓰고 싶기 때문입니다. 위처럼 코드를 작성하시고 아래처럼 프린트를 해보세요!

print(asdict(LocalConfig()))

이렇게 하면 클래스가 Dict로 변하는 마법을 보실 수 있습니다.


conf()라는 함수는 환경변수 이름인 API_ENV 를 보고 환경을 정의합니다. 만약 환경변수가 없으면 local 설정 내용을 가지고 옵니다. 지금은 중요하지 않고요. 제가 나중에  AWS Elastic Beanstalk 로 함께 배포를 할 것인데, 다시 어떻게 사용하는지 알려드릴거에요~




3. main.py

from typing import Optional

import uvicorn
from fastapi import FastAPI

from app.common.config import conf


def create_app():
    """
    앱 함수 실행
    :return:
    """
    c = conf()
    app = FastAPI()

    # 데이터 베이스 이니셜라이즈

    # 레디스 이니셜라이즈

    # 미들웨어 정의

    # 라우터 정의

    return app


app = create_app()

if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)


저번시간에 FastAPI() 를 많이 고도화 시킬 수 있다고 말씀 드렸습니다.

우선은 이렇게 해 두었고요. 앞으로 여기에 많은 것을 집어 넣을것 입니다. 




추가 내용이 필요하시면 유투브와 함께 보시면 아주 이해가 잘 되시리라 믿습니다!


다음번엔 꼭! MySQL을 연결해서 사용해 보겠습니다!




  • [[a.original_name]] ([[a.file_size | fileSizer]])
'FastAPI 프로젝트' 시리즈 포스트
Python FastAPI 로 백엔드 만들기 2화 - 프로젝트 구조
2020-12-21
Python FastAPI 로 백엔드 만들기 3화 - MySQL 연결
2020-12-27
FastAPI 1화 - 프로젝트 생성
2020-12-18
파이썬에서 가장 빠른 웹프레임워크 FastAPI Feat. Pydandic
2021-01-04
Python으로 로그인 구현하기 (JWT X FastAPI)
2021-01-07
Node.js 아성에 도전한다. FastAPI written in Python
2020-10-13
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'파이썬' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]