FastAPI로 간단한 API 개발을 시도해 본다 - (1) 프로젝트 시작하기

FastAPI를 사용해 간단한 API 개발을 해 본다.

한참 Python의 간결함(?) 에 매료되어 있을 때, Python을 이용해 Web API 개발을 시도해본 적이 있다.

당시 사용했던 프레임워크로는 FlaskDjango REST Framework 였던 것으로 기억한다. 둘 다 훌륭한 프레임워크였지만 지금은 기억나지도 않는 석연찮은 이유 아마도 취업의 압박 으로 인해 Python 자체를 멀리하게 되면서 이들 프레임워크를 사용하는 일도 자연스레 줄어들게 되었다.

당시 Django를 이용해 프로젝트를 진행했던 흔적은 여기 에 남아있다.

몇주 전부터 미디엄(medium.com)의 뉴스레터가 계속 Python 기반의 웹 API 프로젝트 진행 사례에 대해 글을 모아 보내주는 걸 보면서, 다시 한 번 Python에 대한 호기심이 생기기 시작했다. 최근 서비스들이 개인화/추천 피쳐 없이 출시되는 경우가 드문데, 대다수의 데이터 과학자들/머신러닝 엔지니어들에게 사랑받는 언어, 그리고 ML 분야로 엔지니어 포지션을 갖고자 할때 배워야 할 언어 로 꼽히는 언어가 Python임을 생각해본다면, 아무래도 데이터 인그레스 - 데이터 가공 - 모델링 - API를 통한 서브까지 모든 생명주기를 하나의 언어로 구현할 수 있는 방법을 찾다보니 Python 기반의 웹 API 개발이 다시 한 번 각광받는 듯하다. 관련한 자료는 아래의 링크들에서 참고해볼 수 있다.

https://testdriven.io/blog/fastapi-machine-learning/

https://medium.com/@8B_EC/tutorial-serving-machine-learning-models-with-fastapi-in-python-c1a27319c459

기존의 Django, Flask가 쉽게 말로 표현할 수 없는 사용상의 불편함과 컨벤션의 장황함(…) 으로 인해 그렇게 애정이 가지 않았었는데, 이번에 시도해 볼 FastAPI는 그런 어려움을 많이 해소했기를 바라면서 프로젝트를 시작해 보았다.

준비작업

보통의 Python 프로젝트가 늘 그렇듯, 가상환경을 통해 의존성을 격리시키는 작업이 먼저 이뤄져야 할 것 같다.

1
python3 -m venv {VENV_DIR_NAME}

이후에는 FastAPI 프로젝트의 생성 및 구동에 필요한 필수 의존성들을 추가해 준다. 참고로 FastAPI의 깃허브 저장소는 이 링크 에서 살펴볼 수 있고, 공식 문서는 여기 에서 확인하면 된다.

필요한 의존성

Python 기반 웹 API의 개발이므로 WSGI 구현체가 우선 필요하고, 물론 FastAPI 의존성도 추가되어야 hello world 를 띄울 수 있다.

Django에선 WSGI 구현체로 uwsgi를 권장했던 것 같지만, FastAPI에서는 uvicorn을 권장한다. 권장하는 이유는 uvicorn이 비동기 애플리케이션을 위한 ASGI 규격을 지원하기 때문이다.

따라서, 빠르게 프로젝트를 시작하기 위해서는 아래 명령어를 수행해 두 의존성을 추가해 주는 것으로 출발하면 된다.

1
2
pip install uvicorn
pip install fastapi

hello world!

간단한 hello world 스타터를 위해서는 아래의 코드를 작성해주면 된다.

1
2
3
4
5
6
7
from fastapi import FastAPI

app = FastAPI()

@app.get(path="/")
async def hello():
return "hello world"

애플리케이션을 구동하기 위해서는 ASGI 구현체인 uvicorn의 도움을 받아야 한다. 우선 상기한 코드를 작성한 디렉터리로 이동한 이후, 아래 명령을 수행하면 된다.

1
uvicorn {APP_FILE_NAME}:{FASTAPI_INSTANCE_VAR_NAME} --reload

실행한 옵션과 파라메터에 대해 간단히 정리하자면…

  • APP_FILE_NAME : 실제 코드가 작성된 파일의 이름(위치).
  • FASTAPI_INSTANCE_VAR_NAME : 코드 상에 FastAPI 인스턴스가 할당된 변수명을 입력한다. 예시 코드에선 app 이다.
  • --reload : 핫 릴로드를 지원하도록 설정한다.

마무리

간단하게 FastAPI를 이용해 hello world 를 찍어봤다.

Java/Spring 을 즐겨 (먹고살기 위해) 사용하는 개발자의 눈으로 보면, Python 기반 웹 프레임워크들의 프로젝트 부트스트래핑 속도나, hello world를 띄울 때까지의 코드 작성량은 정말 부럽다.

다음 포스팅을 통해 Web API 개발에 필수적인 파라미터 바인딩과 데이터소스 접근에 대해서도 정리해 보려고 한다.