[FastAPI] FastAPI과 Uvicorn

merong·2024년 1월 22일
0

BACK-END

목록 보기
1/4

⚡ FastAPI는 현대적이고, 빠르며, 파이썬 표준 타입 힌트에 기초한 Python3.6+의 API를 빌드하기 위한 웹 프레임워크입니다.

필요성

FastAPI

장고 및 플라스크와 같은 파이썬 웹 프레임워크는 주로 웹 서비스에 초점을 두고 있었지만, FastAPI는 API(Application Programming Interface)를 만드는데 치중되어 있습니다.

FastAPI로 작성한 API는 React나 Vue.js, Svelte와 같은 Frontend 웹 프레임워크에서 사용할 수 있고, 안드로이드나 아이폰 앱에서도 사용할 수 있습니다. 만약 장고나 플라스크로 웹 서비스를 만들었다면 이에 대응하는 안드로이드나 아이폰 앱을 위한 API 개발을 따로 해야 하지만, FastAPI는 한번 만든 API를 여러 클라이언트에서 추가 작업 없이 사용할 수 있습니다.

  • API? 서버가 사용자에게 제공할 수 있는 것을 정리해 놓은 메뉴판. 리모콘.. 주문을 하는 방식은 보통 URL에 담아 보냅니다. ex) ‘~/’ 보내면 Hello 메소드 실행시켜줘. or ‘~/data’ 보내면 Hello 메소드 실행시켜줘.

Uvicorn

ASGI(Asynchronous Server Gateway Interface) 서버로, 빠르고 성능이 좋으며 코드가 간단하고, 버그가 적다는 장점을 가지고 있습니다.

FastAPI 프레임워크만으로는 웹 개발을 할 수 없으며, ASGI와 호환되는 웹 서버가 필요한데, 그렇기 때문에 FastAPI로 구현한 웹을 서버에 띄우려면 uvicorn을 통해 서버를 생성해주는 작업을 필수적으로 거쳐야 합니다.

uvicorn main:app --reload
  • uvicorn main:app 명령은 다음을 의미합니다:
    • main: 파일 main.py (파이썬 "모듈").
    • appmain.py 내부의 app = FastAPI() 줄에서 생성한 오브젝트.
    • -reload: 코드 변경 후 서버 재시작. 개발에만 사용.
  • ASGI? : 비동기 서버 게이트웨이 인터페이스로, 파이썬 웹 애플리케이션과 웹 서버 간의 공통적인 인터페이스를 기술합니다. 여기서 비동기란, 서버에서 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있는 동기 방식과 다르게, 요청을 보냈을 때 응답 상태와 상관없이 다음 동작을 수행할 수 있는 방식을 말합니다. 이를 사용하면, DB나 API 연동 과정에서 발생하는 대기 시간을 낭비하지 않고, CPU가 다른 작업을 할 수 있습니다.
  • FastAPI로 구축한 서버 모식도

기능적 특징

  1. 빠른 속도

    FastAPI는 파이썬 웹 프레임워크 중 가장 빠르다고 알려져 있습니다.

  2. 빠른 구현

    API 개발은 보통 입출력 양식을 정하고, 기능을 구현한 후, 테스트하는 순서로 진행됩니다. FastAPI는 입출력을 정의하고, 입출력 값의 검증을 빠르고 안전하게 할 수 있습니다. (with Pydantic) 그리고 작성한 API는 자동으로 생성되는 API 문서를 통해 손쉽게 테스트할 수 있습니다. (with Swagger)

  3. 테스트 가능한 API 문서

    FastAPI로 작성한 API는 API 사용법에 관한 문서를 따로 작성할 필요 없이, 문서가 자동으로 생성됩니다.

    Swagger UI docs에서는 API 동작(HTTP method : GET, POST, PUT, DELETE)을 테스트 해 볼 수 있으며, ReDoc은 Read Only 형태로 제공되는 API 문서입니다.

    • docs : *uvicorn server url + ‘/docs’
    • ReDoc : *uvicorn server url + ‘/redoc’
  4. 적은 버그


Sample Code

from fastapi import FastAPI
app = FastAPI()

from fastapi.responses import FileResponse
@app.get("/")
def hello():
    return FileResponse("index.html")

@app.get("/data")
def hello():
		return {'hello': 1313}
  • @app.get("/")와 같이 데코레이터를 사용하여 해당 URL에 대한 함수를 정의할 수 있습니다.
    • outputs
      • 처음 Uvicorn 서버에 접속했을 때, “/”으로 접속되므로, ‘index.html’이 띄워지게 됩니다.
        index.html (<div>안녕</div>)
      • Url 뒤에 “/data”를 붙여준다면, 두 번째 hello()가 반환하는 딕셔너리 데이터가 보여지게 됩니다.
        ‘/data’에 접속한 모습
profile
매일매일이 새로운 시작점

0개의 댓글