국문과 유목민

[FastAPI] FastAPI를 쉽게 알아보자 (FastAPI 시식 코너) 본문

기술 견문록/MLOps

[FastAPI] FastAPI를 쉽게 알아보자 (FastAPI 시식 코너)

논곰 2024. 11. 8. 22:28
처음 AI를 공부할 때, 데이터를 다루는 방법이나 AI 기술에 대한 이해만 있으면 될 줄 알았다. 그러나 실제 현업에서 일을 해보니 알아야 되는 기술은 많았고, 길바닥 출신이었던 나는 막연한 두려움을 가졌던 것 같다. 그러나 막상 기술들을 실제 사용해보면 두려움과 어려움은 잠시뿐이고, 오히려 편리함을 주는 기술들이 많았다. 그래서 이러한 기술들에 대해 막연한 두려움을 해결할 수 있게 도움을 줄 수 있는 글이 있으면 좋지 않을까 생각했고 이번 글또를 통해 정리해보고자 한다. 그래서 전문적인 부분보다는 해당 기술들이 왜 필요한 지를 위주로 설명을 해보고자 한다.

FastAPI

FastAPI가 뭔가요?

우선 처음 FastAPI를 접한다고 생각하고 FastAPI 를 구글에 검색해봅니다. 그러면, 가장 처음 등장하는 '위키백과'의 설명을 보면 Docker에 대해 다음과 같이 써있습니다.

 FastAPI는 Python 3.8+에서 HTTP 기반 서비스 API를 구축하기 위한 웹 프레임워크입니다. Pydantic 및 유형 힌트를 사용하여 데이터를 검증, 직렬화 및 역직렬화합니다

 

순수한 AI 개발자의 입장에서는 잘 이해가 안 갈 수 있기 때문에, 천천히 문장을 뜯어보자. (만약, HTTP, API, 프레임워크에 대해 알고 있다면 넘어가셔도 좋습니다.)

여기서 우선,  HTTP 기반 서비스 API 웹 프레임워크를 뜯어보자. HTTP(Hypertext Transfer Protocol)는 웹에서 데이터를 주고받는 표준 통신 규약이다. 말은 어려워 보여도 규약은 말 그대로 규칙이고, 내가 웹에서 'A'라는 명령을 요청했데, 저기서 '가'라고 받아서 처리해버리지 않게 서로가 이해할 수 있게 만든 규칙이 HTTP다. (HTTP 말고도, gRPC, SOAP, WebSocket 등이 있는데 일단 넘어가자)
API(Application Programming Interface)는 서로 다른 소프트웨어 시스템에서 서로 상호 작용을 가능하게 하게 도와주는 도구다. 서비스를 만든다고 하면 유저에게 필요한 데이터가 있을 것이고, 또 유저가 원하는 정보를 제공받아야 하는데 이러한 상호작요을 도와주는 도구가 API이다. 

마지막으로 프레임워크(Framework)는 개발도구라고 생각할 수 있는데, 기능을 사용하기 위해 정해진 틀(Frame)에 맞춰서 작업을 해야 한다. 예를 들어 다음과 같은 도시락 통이 있을 때, 우리는 밥이나 반찬을 '틀'에 맞게 넣어야 뚜껑을 닫아서 나갈 수 있는 것처럼, 프레임워크를 사용하기 위해서는 주어진 '틀'에 맞게 코드를 작성해줘야 '서빙'을 내보낼 수 있다.

도시락의 벽을 뿌술 수 있을 수도 있겠지만, 그러지는 말자...

FastAPI를 설명한다고 해놓고 HTTP, API, 프레임워크에 대해서만 설명하고 있냐고 할 수 있겠지만, 사실상 해당 내용만 이해하고 있다면 위 FastAPI에 대한 설명은 충분하다고 생각한다. 말 그대로 우리가 만든 서비스(AI모델 등)를 표준 통신 규칙을 지켜서 서빙할 수 있게 도와주는 도구이다.

정리해보면
- FastAPI는 파이썬 기반 웹 프레임워크로 우리가 만든 서비스(소프트웨어 서비스)를 배포할 수 있게 도와주는 도구

 

FastAPI를 왜 쓰는데요?

FastAPI가 뭔지에 대해서는 어느정도 이해했다고 하고, 왜 사용하는 지를 얘기해보자. FastAPI 이전에도 웹 프레임워크라고 해서 Django나 Flask와 같은 것들도 있었다. 해당 프레임워크들도 결국 소프트웨어 서비스를 만들기 위해 사용됐었는데, 사실 진업장벽이 높기도 하고 생각보다 무게도 크고, 속도도 느린 문제가 있었다. 그런데, FastAPI의 경우 다른 두 프레임워크보다 속도도 빠르고, 비동기도 지원하고, API문서도 자동으로 생성해준다는 장점이 있었다 (비동기나, API 문서 자동 생성 부분은 '어떻게'에서 설명).  2024년이 거의 끝나가는 지금 FastAPI의 github star수를 보면 가파르게 성장해서 2023년에는 Flask를 제쳤고, 곧 Django도 넘을 기세로 인기가 많다. 그리고 인기가 많다는 것은 그만큼 쓰는 사람이 많고, 오류를 겪는 사람도 많고, 해결한 경험도 많이 나오고, 관련 문서도 많다는 것도 장점이다.
(여기서 github star 수는 얼마나 많은 개발자들이 관심을 가지고 있는 지 보여주는 수치, 높을 수록 많은 사람이 쓰는구나)

https://star-history.com/#tiangolo/fastapi&pallets/flask&django/django&Date

처음 API를 만들어야 할 때쯤에 사용하던 게 FastAPI였고, 아직까지는 불편함을 크게 느끼지 못해서 다른 프레임워크를 써보지는 못했지다. 하지만, 다음과 같이 프레임워크 별 장단점이 있으니 살펴보면 좋을 것 같아 괜찮은 자료가 있어 공유하겠다.

https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS5997817104

정리해보면
- FastAPI는 다른 웹 프레임워크 서비스보다 '속도, 비동기 지원, API 문서 자동 작성'과 같은 장점이 있어서 많은 사람들이 사용하고 있다.

FastAPI를 어떻게 쓰는데요?

 그럼 이제 위에서 FastAPI를 왜 쓰는 지에 대해서도 이해했다면 이제 사용을 해보고 싶을 것이다. FastAPI를 사용해보는 것은 그렇게 어렵지 않다. 아래에서는 설치 방법부터 간단한 함수 실행 및 GET과 POST의 차이, 문서 자동 작성에 대해서 하나의 시나리오를 상정해 설명을 해보겠다.

설치

conda환경이 설치되어 있다고 가정하고 진행하겠습니다. (없으면 없는대로 'pip'부터 진행해도 됩니다)
conda create -n fastapi-test python=3.10
conda activate fastapi-test
pip install fastapi uvicorn

간단한 함수 생성 (GET/POST)

다음 유명한 짤에서 모티브를 얻어 두 가지 기능을 만들어보겠다. 하나는 이름을 물어보는 함수인 'who_are_you'함수이고, 사람 이름이 들어오면, '{사람이름} 자리에 앉아!'를 호출해 상태를 'sitdown'으로 바꾸는 'sit_down'함수를 만들어보고자 한다. 여기서 각각 기능에 따라 GET과 POST 메서드 방식 사용할 수 있는데, API를 사용하는 입장에서 해당 메서드를 이해하면 된다. 단순히 값만 '얻고' 싶으면 GET, 내가 데이터를 '보내서 변경' 등을 하고 싶다면 POST로 생각하면 된다. 

7호선 단소할아버지

main.py 파일을 만들어 안에 다음과 같이 코드를 작성했다. 여기서 그냥 def가 아닌 async def로 함수를 정의하게 되면, 해당 함수를 비동기로 처리할 수 있다.  

from fastapi import FastAPI

# FastAPI instance
app = FastAPI()
people_status = 'standing'

# 메인 페이지
@app.get("/")
async def hello_world():
    return {"message": "지하철 7호선 시뮬레이터입니다"}

# get 메소드 정의 시 데코레이터(@)로 app.get 명시
@app.get("/get_function")
async def who_are_you():
    return {
        "message": "콱씨! 너 누구야!",
        "status": people_status
    }

# post 메소드 정의 시 데코레이터(@)로 app.post 명시
@app.post("/post_function")
async def sit_down(name: str):
    global people_status
    people_status = 'sitdown'
    return {
        "message": f"{name} 자리에 앉아!",
        "people_status": people_status
    }

FastAPI 실행 (uvicorn)

FastAPI를 실행하기 위해서는 uvicorn 명령어와 함께 아래처럼 main 파일을 실행해줘야 한다.

uvicorn: FastAPI가 비동기 기능(ASGI)을 사용하기 위해 사용되는 서버 

 

uvicorn main:app

그럼 다음과 같은 메시지가 뜨게 되면 성공이다.

API 사용해보기

FastAPI를 실행했다면 다음 URL을 통해 결과를 확인해보자.

메인화면

GET 메소드 호출 반환 값

POST 메서드 호출 불가

API 문서 사용해보기

  • http://127.0.0.1:8000/docs http://127.0.0.1:8000/redoc를 통해 접근하면 다음과 같은 API 문서가 자동적으로 생성된 것을 볼 수 있다. docs를 통해 나오는 API 문서는 'swagger'라고 하고, redoc은 말 그대로 redoc이라고 한다. 

Swagger & redoc

우리는 swagger 페이지에서 다음과 같이 입력을 넣고 테스트를 해볼 수 있다. 실행하려고 하는 POST 메소드에 'Try it out'을 클릭해서 파라미터를 넣어보면, 실행 결과를 확인할 수 있다.

POST 메소드 (호출 테스트를 통해 단소 할아버지를 앉힐 수 있었다)

이처럼 FastAPI는 자동으로 함수들이 필요로 하는 입력 파라미터의 값을 파악해 문서를 자동으로 만들어준다. 이러한 문서화 기능의 경우 협업의 과정에서 매우 중요하게 사용될 수 있는데, 해당 API를 호출하기 위해서 필요한 값들에 대한 정보를 API 문서 하나로 퉁칠 수 있는 것이다. 예를 들어, 'sit_down' 함수가 필요로 하는 값이 'name'에 대한 정보인데, 이를 API를 사용하려고 하는 사람들에게 매번 말할 수 없다. 따라서 이러한 문서가 있으면 이러한 소통의 단계에서 이점을 얻을 수 있다.

정리

오늘은 간단하게 FastAPI에 대해 알아봤는데, 이해가 됐으면 좋겠다. 지금 회사에서도 API를 활용해 서비스를 배포하고 있는데, 사용해보면 볼 수록 꽤 괜찮은 프레임워크라는 생각이 든다. 무게도 그렇게 무겁지 않고, 필요한 기능을 빠르게 구현하고, 테스트 해볼 수 있다는 것은 큰 장점이라고 생각한다. 사실 FastAPI가 장점으로 가지는 부분 중 비동기 처리에 대한 부분이나 Pydantic과 같은 부분에 대해서는 분량 조절 실패로 더 다루지 못했다.

 간단하게 설명하면, 비동기 처리의 경우, api가 동시에 호출될 때 한번에 여러 가지를 처리할 수 있게 해주는 처리방법이다. Pydantic의 경우 우리가 필요로 하는 데이터 타입이 정해져 있으면, 이를 기본적으로 정의해두고 이에 맞지 않으면 오류를 내뱉게 할 수 있는 기능 정도라고 얘기할 수 있을 것 같다. 이와 관련된 내용은 추가로 준비할 수 있다면 더 다뤄보도록 하겠다.

 혹 FastAPI에 대해 더 알고 싶은 부분이 있다면 하단 FastAPI 공식 docs를 통해 추가 공부를 해보는 것도 좋을 것 같다. 한글로 번역도 꽤 되어있고, 예시 코드도 잘 작성이 되어있어서 따라가기만 해도 (일단 나보다는) 더 잘 할 수 있을 것이라고 생각한다.  

참고자료

 

배우기 - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

 

Comments