티끌모아 태산

FastAPI란 본문

Web programming/Back-end

FastAPI란

goldpig 2024. 1. 29. 17:19
728x90

출처: https://fastapi.tiangolo.com/

FastAPI란

  이번 시간에는 파이썬 웹 프레임워크인 FastAPI에 대해서 알아보겠다. 파이썬을 활용해서 웹 서버를 만들 때, 좀 무거운 프로젝트면 'Django'를 사용하고 조금 가벼운 프로젝트는 'Flask' 프레임워크를 사용했었다. 하지만 요즘 FastAPI가 뜨고 있는 추세다. 

  • Django
  • Flask
  • FastAPI

FastAPI를 사용하는 이유는 다음과 같다. 일단 장고와 플라스크보다 빠르고 코드가 간결하다는 장점이 있다.

출처: 코딩애플

아래 사진을 보면 Flask나 Django에 비해 FastAPI가 서버가 유저에게 문자를 전송하는 속도, DB 입출력 속도, HTML 파일 전송 속도 등에서 2배 이상의 성능을 나타는것을 확인할 수 있습니다.

서버에서 유저에게 문자 전송하는 속도
DB 입출력 속도
HTML 파일 전송량

이와 같이 FastAPI가 다른 웹 프레임워크보다 성능이 2배 이상 뛰어난 이유는 비동기 처리를 기본적으로 지원하기 때문이다. 

  • 비동기 처리: 특정 코드가 오래걸리면 기다리는 동안 다른 코드를 실행한다. 즉, 해당 작업이 끝날 때까지 가만히 기다리지 않고 그 동안 다른 코드를 수행하는 것.

FastAPI 기능

  • GET/POST 요청받기
  • DB 입출력
  • 회원 인증
  • 데이터 validation
  • 웹 소켓
  • async/await
  • type 넣기
  • API 문서 자동 생성 등...

FastAPI 채택 이유

  위에서 FastAPI의 장점을 설명했다. 다시 한번 정리하면 다음과 같다. 

  1. 성능이 좋고 코드가 간결하다.
  2. API 문서 자동화 기능
  3. 마이크로 서비스에 좋음

 

출처: 코딩애플

이처럼 장고는 단위가 크게 개발을 하는 반면 FastAPI는 서버를 기능별로 쪼개서 작은 단위, 즉 마이크로서비스에 적합하다.

FastAPI 실습

  • IDE: Visual Studio Code
  • main.py

실습은 main.py 파일을 하나 만들어서 진행. 아래 명령어를 순서대로 설치

  • pip install fastapi
  • pip install uvicorn
  • pip install uvicorn[standard] - 실시간 미리보기 기능 제공, async/await을 기반한 비동기 프로그래밍 지원으로 성능이 가장 좋다고 알려진 ASGI
// 서버를 만들기 위함.
from fastapi import FastAPI
// FastAPI 인스턴스 생성
app = FastAPI()

메인 페이지 접속시 'hello' 보내기

@app.get('/')
def 작명():
	return 'hello'

이렇게 하나의 기능을 작성하고 서버를 실행해서 확인하기 위해서는 다음과 같은 명령어를 입력해야 한다.

  • uvicorn main:app --reload

기본코드를 입력하고 필요한 패키지가 설치 되었는데, 오류가 발생한다면 다음과 같은 명령어를 입력하자.

  • python -m uvicorn main:app --reload (unicorn 또한 파이썬 모듈이라는 점에서 다음과 같이 입력)

브라우저 반환 결과

@app.get('/data')
def 작명():
	return {'hello' : 1234}

출력결과

그리고 해당 URL에 /docs를 입력하면 내가 만든 API 문서를 자동으로 만들어 준다. 그리고 마음에 안들경우 redocs를 넣어서 다시 받을 수 있다.

// html 파일 보내주기
from fastapi.responses import FileResponse
@app.get('/')
def 작명():
	return FileResponse('index.html')
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        안녕하세요!!!
    </div>
</body>
</html>

이제 유저로부터 이름이나 연락처 등 데이터를 받는 로직을 만들어보자. 유저로부터 데이터를 받기 위해서는 모델부터 생성 해야한다.

  1. 모델 생성 -> from pydantic import BaseModel
  2. 클래스 생성하고 그 안에 어떤 데이터를 유저들이 보낼 수 있는지 명시해야한다.
from pydantic import BaseModel
class Model(BaseModel):
    name: str
    phone: int
    
@app.post("/send")
def 작명(data : model): // data에 유저의 이름과 핸드폰 번호가 들어있다.
	print(data)
	return '전송완료

위 코드의 결과는 POSTMAN을 활용해서 해보자.

전체 실습 코드

from fastapi import FastAPI  # FastAPI import
app = FastAPI()

@app.get("/")
def printHello():
	return "Hello World"

@app.get('/data')
def 작명():
	return {'hello' : 1234}

from fastapi.responses import FileResponse
@app.get('/')
def 작명():
	return FileResponse('index.html')

 

728x90