Backend

[Backend] FastAPI

dong_seok 2024. 6. 18. 15:24
1. FastAPI
2. 가상환경 생성
3. 설치 및 예제

1. FastAPI

FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python의 API를 빌드하기 위한 웹 프레임워크로 Python 3.6 이상에서 비동기 프로그래밍을 사용합니다. 파이썬 웹 프레임 워크 중 가장 빠르다고 알려져 있습니다. FastAPI가 많이 사용되는데는 아래와 같은 이유가 있습니다.

 

  • 타입 힌트와 Pydantic 모델을 사용하여 데이터 검증과 직렬화를 자동으로 처리합니다. 이를 통해 개발 속도를 높이고, 오류를 줄일 수 있습니다.
  • Swagger와 ReDoc을 통해 API 문서를 자동으로 생성합니다. 이 기능을 활용하여 개발자와 사용자가 API를 쉽게 이해하고 사용할 수 있도록 합니다.
  • 비동기 Python 코드를 네이티브로 지원합니다. async와 await 키워드를 사용하여 I/O 바운드 작업을 최적화하고, 애플리케이션의 성능을 향상시킬 수 있습니다.

 

위에서 나온 도구들은 각각 웹 애플리케이션을 구축, 배포 및 관리하는 데 있어 특정 기능을 제공합니다. 여기에 각각의 도구가 어떻게 상호작용하는지 알아보도록 하겠습니다.

 

1) Uvicorn

FastAPI와 같은 ASGI(Asynchronous Server Gateway Interface) 애플리케이션을 위한 경량, 고성능 ASGI 서버입니다. ASGI가 무엇인지 설명하기에 앞서 CGI, WSGI를 선행하여 알아보도록 하겠습니다.

 

CGI(Common Gateway Interface)

WAS에 동적인 요청이 들어 왔을때 이에 대한 요청을 처리하고 응답을 해줘야합니다. 이때 서버 및 언어마다 이 형태가 다르면 곤란해지기 때문에 공통의 표준 인터페이스를 제공해줘야합니다. 이 인터페이스가 CGI라고 생각하시면 되겠습니다. 이런 CGI에는 큰 단점이 존재하는데, 요청이 들어올 때마다 애플리케이션 프로세스를 다시 실행해야 한다는 점입니다. 만약 다량의 요청이 동시에 들어온다면 그 때마다 새로운 프로세스를 생성하고, 사라졌다가 다시 생성해야 합니다. 상당히 비효율적인 것을 알 수 있습니다.

 

WSGI(Web Server Gateway Interface)

파이썬 웹 응용 프로그램을 호출하기 위한 서버로 CGI의 단점(요청이 들어올 때마다 새로운 프로세스 생성)을 보완한 방법입니다. 앞에서 말한 CGI의 경우 요청을 환경 변수나 STDIN 등으로 처리했지만 WSGI에서는 Callable object, 함수나 객체로 처리합니다. 서버에서 Callable object를 통해서 요청에 대한 정보와 Callback 함수를 전달하면 애플리케이션은 이 요청을 처리하고 Callback 함수를 실행합니다. 이런 인터페이스를 구현하는 서버나 어플리케이션을 WSGI compatible 하다고 하는데요, 그 중 특히 어플리케이션의 경우에는 WSGI application이라고 합니다.

 

또 이 중간에서 인증이나 쿠키 등을 관리하는 역할을 하는 것을 WSGI Middleware라고 하는데요, 이 또한 WSGI application의 일종입니다. 여기에는 흔히 사용하는 gunicorn 등이 포함됩니다. 웹 서버에 동적 요청이 발생하면 웹 서버가 WSGI 서버를 호출하고, WSGI 서버는 WSGI 애플리케이션(Django, Flask 등) 을 호출하여 동적 페이지 요청을 대신 처리하게 됩니다.

 

ASGI(Asynchronous Server Gateway Interface)

WSGI의 경우에는 비동기적인 요청 처리에 단점이 있었습니다. 하나의 동기적인 callable이 요청을 받아 응답을 리턴하는 방식이었는데, 이런 방식은 길게 유지되어야 하는 연결 - long-poll HTTP나 웹 소켓에는 적합하지 않았습니다. ASGI는 이를 개선하기 위해 만들어졌습니다. ASGI 공식 설명을 보면 "WSGI가 파이썬 앱에 대한 동기성에 대한 표준을 제공했다면 ASGI는 동기성과 비동기성 모두에 대한 표준을 제공합니다." 라고 되어 있을정도로, ASGI는 WSGI에 대해 호환성을 가지면서 비동기적인 요청도 처리할 수 있는 인터페이스 입니다.

ASGI 서버로는 보통 Uvicorn 등을 많이 사용합니다. 배포 환경에서는 Uvicorn을 gunicorn(WSGI)의 워커 클래스로 사용하여 복수의 프로세스를 관리하고, 더 안정적인 서비스를 제공할 수 있습니다.(gunicorn은 프로세스 매니저로서 동작하게 된다. 프로세스 매니저로서 Master 프로세스를 띄우고 Worker 프로세스로, 단일 프로세스로 실행하는 uvicorn  (uvicorn 에는 Gunicorn-호환 worker class 가 존재한다) 프로세스를 여러개 미리 띄워 요청을 처리하는 구조)

 

2) Pydantic

데이터 검증과 설정 관리를 위한 Python 라이브러리입니다. 타입 힌트를 사용하여 데이터의 구조를 정의하고, 자동으로 데이터 타입을 검증합니다. 

 

(1) 모델 정의

API 요청과 응답에 사용될 데이터 모델을 Pydantic을 사용하여 정의합니다. 이는 데이터 검증, 직렬화, 문서화를 자동화하는 데 도움이 됩니다.

 

(2) 환경 설정 관리

Pydantic은 환경 변수를 통한 애플리케이션 설정 관리를 쉽게 할 수 있게 해줍니다. BaseSettings 클래스를 사용하여 설정 값을 모델로 정의하고, 자동으로 환경 변수에서 값을 로드할 수 있습니다.

 

3)Starlette

FastAPI의 기반이 되는 경량 ASGI 프레임워크입니다. 비동기 웹 애플리케이션 개발을 위한 기본적인 도구를 제공합니다.

 

(1) 경량 서비스 구축

복잡한 기능이 필요 없는 간단한 비동기 서비스를 구축할 때 Starlette을 직접 사용 할 수 있습니다.

 

(2) 미들웨어와 이벤트 핸들러

Starlette은 요청 전후에 실행할 수 있는 미들웨어와 이벤트 핸들러를 지원합니다. 이를 통해 요청 처리 과정을 유연하게 제어 할 수 있습니다.

 

 

일반적인 Python 웹서비스 아키텍처

 

2.  가상환경 생성

Pycharm 환경에서 공식문서를 참고하여 설치 및 예제를 진행 해 보기에 앞서 먼저 가상환경을 만들도록 하겠습니다.

 

Pyenv를 이용하면 원하는 파이썬 버전을 손쉽게 이용 가능합니다. Pyenv로 설치할 수 있는 Python 버전을 정해져있고 설치가 되어있어야 해당 파이썬 버전의 가상환경을 생서할 수 있기 때문에 가장 먼저 Pyenv로 설치할 수 있는 Python 버전을 확인합니다.

 

pyenv install --list

 

설치 가능 Python version

 

설치 가능한 Python 버전을 확인하였으니 먼저 로컬에 버전을 설치해 주도록 하겠습니다.

 

pyenv install 3.11.0

 

설치 완료 후 잘 설치가 되었는지 "pyenv versions" 명령을 입력해 설치 되어있는 파이썬 버전 및 가상환경 리스트를 확인해줍니다.

 

 

3.11.0 버전이 잘 설치 된 모습을 볼 수 있습니다. 이제 해당 파이썬 버전의 가상환경을 생성 해 줍니다.

 

pyenv virtualenv 3.11.0 tutorial

 

 

파이썬 버전 3.11.0 이고 이름이 tutorial인 가상환경을 생성하겠다는 의미입니다. 마찬가지로 잘 생성되었는지는 "pyenv versions" 명령으로 확인 가능합니다. 이제 가상환경에 진입해 보도록 하겠습니다.

 

pyenv activate tutorial

 

 

해당 명령어로 가상환경 진입시 venv와 마찬가지로 괄호형태의 가상환경 진입을 표시해줍니다. 잘 진입 되었는지 확인하기 위해 "pip list" 와 "python --version" 으로 제가 셋팅한 가상환경이 맞는지 확인해주면 됩니다.

 

 

새로운 pyenv 가상환경이 잘 만들어진 모습을 볼 수 있습니다.

 

3. 설치 및 예제

공식문서에 나와 있는 패키지들을 설치해줍니다.

pip install fastapi
pip install "uvicorn[standard]"

 

버전 설치 후 공식문서의 main.py 를 복붙해서 가져와 줍니다.

 

 

근데 패키지 관련 컴파일 에러가 발생하였습니다. 생각해보니 처음 프로젝트를 만들때 인터프리터를 기본으로 설정해서 제가 만든 tutorial 가상환경이 인터프리터로 반영이 되지 않아서 발생한 에러였습니다. 인터프리터를 변경 해주도록 하겠습니다. "command + , "로 Preferences로 들어간 후 Project -> Python Interpreter 로 들어가서 바꾸면 됩니다. 

 

 

변경 후 코드를 살펴보면 컴파일 오류가 사라진 걸 볼 수 있을 것 입니다. 이제 서버를 실행시켜 보도록 하겠습니다. 

 

uvicorn main:app --reload

 

 

명령어는 아래의 의미를 가지고 있습니다.

  • main: main.py 파일 (파이썬 "모듈").
  • app: the object created inside of main.py with the line app = FastAPI().
  • --reload: 코드가 변경된 후 서버 재시작하기. 개발환경에서만 사용하십시오.

 

성공적으로 실행하면 다음과 같은 화면을 얻을 수 있습니다.

 

성공 화면

 

참고자료

https://blog.pages.kr/2915

https://lsjsj92.tistory.com/648

https://kangbk0120.github.io/articles/2022-02/cgi-wcgi-asgi

https://breezymind.com/start-asgi-framework/

https://fastapi.tiangolo.com/ko/#_4

 

 

'Backend' 카테고리의 다른 글

[Backend] FastAPI+Hugging Face  (0) 2024.05.11