회사에서 Flask를 사용하던 도중 flask의 자유로움이 불편함으로 다가올때가 있었다.
dataclass를 사용하기도 불편하고 validation code도 계속해서 유지보수를 해줘야한다.
marshmallow의 코드 길이가
이런부분 때문에 생산성은 떨어진다고 느껴지는 구간이 있었다. 요즘 핫한 fast api를 도입해 보는 건 어떤가 라는 생각이 문뜩 들어 fast api를 알아보았다.
https://fastapi.tiangolo.com/ko/
공식문서내에서 빠른 코드작성, 적은버그, 직관적, 표준기반 이부분이 제일 우리 회사에 불편함을 없앨 수 있지 않을까 하는 생각이 들었다.
도입에 가장 중요한 몇 가지 특징들이 존재했다.
@dataclass
class Test:
test_data_a: str = "" # 이부분 에러
test_data_b: str
기존 dataclass를 사용했을때 본 데이터로 지정해야하는건 항상 앞으로 가야한다. 이부분도 은근 불편한 점이다.
pydantic에서는 이점이 가능하다.
class Test(BaseModel):
test_data_a: str = ""
test_data_b: str
너무 편안한...
이런점이 은근 dataclass쓸때 귀찮은작업인데 편하게 된다.
from pydantic import BaseSettings
from typing import Optional
from dotenv import load_dotenv
from os.path import dirname, join
dotenv_path = join(dirname(__file__), "./", ".env")
load_dotenv(dotenv_path)
class Config(BaseSettings):
STAGE: str = "dev"
APP_NAME: str
LOG_LEVEL: str = "DEBUG"
환경변수 불러올때 dotenv로 load한뒤 해당 환경변수를 똑같은 이름으로 지정하게 되면 그 환경변수를 불러오게 된다.
기본값을 지정하게 되면 환경 변수가 없을시 그 값으로 지정이된다.
환경변수를 불러오는 부분에서도 편안(?) 편하다.
의존성 주입이 Operation Function
에서(HTTP Method 실행 Function) 가능하다. flask를 개발하다 보면 request 값을 flask package내에서 가져오게 되는데 request관련된 값을 가져와야 하기 때문에 App을 실행시키지 않는 이상 request값은 없는 상황이다. 이러면 request에 대한 종속성이 생기게 된다. 이런것을 해결하기 위해서 FastAPI에서는 DI 패턴을 사용하고 있다.
from fastapi import Depends, FastAPI
app = FastAPI()
async def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
return commons
common_parameters는 종속성이 없는 하나의 function이고 이것을 app.get decorator
가 붙은 Operation function
에 주입시킬 수 있다.
common_parameters에 존재하는 parameter들은 query parameter로 자동으로 불러 올 수 있다.
flask로 생각하면
from flask import Flask, request
# ...
@app.route('/search', methods=['GET'])
def search():
args = request.args
return args
이런식으로 사용이 되었는데 뭐든 from flask import request
얘는 항상 달고다녀야 한다....
DI... Dependency Function들 Test Code도 용이하게 할 수 있고...(TDD를 하자는 건 아니다.) 너무 매력적입니다.
이외에 몇가지 추가로 작성하고 싶은 것들이나 Middleware customize 등 여러가지를 공유해보겠습니다.