FastAPI

1. FastAPI는 웹 프레임워크이다.

  • Spring Framework, Django, Flask, Sanic 등등

2. FastAPI는 마이크로 프레임워크이다.

  • 마이크로 프레임워크
    • 가장 간단하게 http 요청을 받고 응답을 해주는 프레임워크 이다.
    • admin 기능도 없고 SSR을 지원하지 않는다.
    • Flask, Sanic
  • 풀 스택 프레임워크
    • 백엔드와 프론트가 합쳐져 SSR 이하 server side rendering 도 지원
    • Spring, Django
    • FastAPI도 sqlalchemy라는 외부 라이브러리를 통해 써드 파티로 SSR을 사용가능

3. FastAPI는 ASGI 어플리케이션이다.

  • WSGI(Web Server Gateway Interface)
    • 파이썬에서 정의한 웹 어플리케이션 인터페이스
    • 간단하게 파이썬으로 웹 어플리케이션을 만들기 위해서는 어떠한 규칙을 따라야 하는데 그 규칙이 WSGI라고 생각하면 된다.
  • ASGI
    • 비동기와 웹 소켓을 지원하는 WSGI

정리하면 FastAPI는 비동기를 지원하는 마이크로 웹 프레임워크이다.

왜 FastAPI를 사용하는가?

1. 모던 파이썬(python 3.6 이상 버전) 문법을 사용

  • 비동기를 지원
    • async, await 키워드 사용 가능
  • 타입 힌트
    • python은 동적 type 언어이기 때문에 type을 강제하지 않지만 변수 선언 시 힌트를 줄수있음

2. OpenAPI 기반 (+GraphQL)

  • OpenAPI (OAS, 구 SwaggerAPI)
    • RESTful 웹서비스를 지원하기 위한 스펙
    • RESTful API 디자인에 대한 정의
    • API spec은 RESTful API를 기 정의된 규칙에 맞게 json이나 yaml로 표현됨
  • Swagger
    • OpenAPI 스펙을 맞춘 api-docs를 이용해 html 페이지로 문서화해주는 프레임워크
    • OpenAPI를 Implement하기 위한 도구

이렇게 OpenAPI Specification을 json 또는 yaml로 기술한 스펙 문서를 swagger-ui 를 통해 띄우게 되면 브라우저에서 편리하게 API 문서를 볼 수 있다.

3. 문서를 자동으로 생성해줌

FastAPI는 OpenAPI 기반이기 때문에 자동으로 문서를 생성해준다.

4. 마이크로 프레임워크

  • API 서버
  • MSA

Spring 이나 Django 처럼 하나의 거대한 웹에 모든 기능이 다 들어가는 경우, 서비스 하나가 죽으면 서버가 죽는 문제가 있다. 여기서 MSA (Micro Service Architecture) 개념이 등장했다.

MSA는 하나의 거대한 서비스를 아주 작은 단위의 서비스로 쪼개는 방법이다. 예를 들어 홈쇼핑 웹사이트의 로그인 서비스, 장바구니 서비스, 결제 서비스 등으로 나누는 것을 의미한다. 이렇게 하면 로그인 서비스가 죽어도 장바구니 서비스나 결제 서비스 등 다른 서비스들은 정상적으로 동작하고 있다.

간단한 FASTPI 코드

from fastapi import FastAPI

app = FastAPI()  # fastapi app 인스턴스화 

@app.get("/")
def hello():
    return "Hello, World!"

(참고) REST? RESTAPI?

REST API

REST API(RESTful API)란 REST 아키텍처의 제약 조건을 준수하는 애플리케이션 프로그래밍 인터페이스이다. REST는 웹의 창시자(HTTP) 중의 한 사람인 Roy Fielding의 2000년 논문에 의해서 소개되었다. 현재의 아키텍쳐가 웹의 본래 설계의 우수성을 많이 사용하지 못하고 있다고 판단했기 때문에, 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐를 소개했는데 그것이 바로 Representational safe transfer (REST)이다.

REST

REST는 “Representational State Transfer” 의 약자로 소프트웨어 프로그램 개발의 아키텍처의 한 형식이다. 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다. 다시 말해 자원(resource)의 표현(representation) 에 의한 상태 전달을 의미한다.

자원의 표현

여기서 ‘자원’이란 뜻은 넓은 의미로 해당 소프트웨어가 관리하는 모든 것이 될 수 있다. 문서, 그림, 데이터가 될 수도 있고 심지어 해당 소프트웨어 자체가 될 수도 있다. 예를 들어 DB에 학생 명부가 저장되어 있다고 한다면 이 학생들의 정보가 자원이 된다.

자원의 표현은 그 자원을 표현하기 위한 이름이다. 예를 들어 DB의 학생 정보가 자원일 때, ‘student’를 자원의 표현으로 정의한다.

상태 전달

데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달하는 것을 뜻한다. 프로그램이 학생 명부 전체 리스트를 요청받으면 요청을 받은 시점의 ‘상태’ 즉 데이터를 전달하게 된다. 또한 새로운 학생 명부 상태(데이터)를 프로그램에 전달하여 해당 자원을 수정할 수도 있다.

이처럼 자원을 이름으로 구분하고 해당 자원의 상태를 주고 받는 모든 것이 REST라고 할 수 있지만, 일반적으로 REST라고 하면 HTTP URI를 통해 CRUD를 실행하는 API를 뜻한다. HTTP 프로토콜을 이용하기 때문에 URL(route)를 통해 자원을 특정짓고 HTTP Verbs를 통해 할일(CRUD)을 지정한다. 또한 JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.

CRUD Operation

  • Create : 생성(POST)
  • Read : 조회(GET)
  • Update : 수정(PUT)
  • Delete : 삭제(DELETE)
  • HEAD: header 정보 조회(HEAD)

RESTful

RESTful는 REST를 REST답게 쓰기 위한 방법으로 누군가가 공식적으로 발표한 것이 아니라 여러 개발자들이 비공식적으로 의견을 제시한 것들로 명확한 정의는 없다. RESTful 중 그나마 이견이 적은 route을 설정하는 법은 다음과 같다.

image

이와 같이 REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고 HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미한다. 웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여한다.

image