FastAPI - 서버만들기

조정훈·2024년 4월 12일

FastAPI의 특징

1. 간결함

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
	return {"message": "Hello World"}

async를 붙여주면 비동기로 작동한다.

주의: 여기에서 root() 함수가 async 비동기 함수로 작성되었다 하더라도, 내부 로직에 동기(sync)로 작동하는 오래걸리는 함수가 있다면, 서버가 block되어 서버가 멈춘 것 처럼 보인다.
만약 동기함수를 포함한다면 그냥 def로 작성하면 된다.
그냥 def로 동기함수로 짜면 FastAPI가 자동으로 별도의 스레드풀로 수행한다.
또는 starlette의 run_in_threadpool을 사용해 스레드 풀에서 수행하도록 한다.
기억하자 비동기 이벤트 쓰레드는 하나다.

  • await
    비동기 프로그래밍의 핵심
    await 키워드는 Python의 비동기 프로그래밍 라이브러리인 asyncio에서 사용되는 중요한 키워드입니다. await 키워드는 비동기 함수 내에서 I/O 작업이 완료될 때까지 기다리는 역할을 합니다.

    왜쓰냐?
    -> 만약 I/O 작업이 완료될 때까지 다른 코드 실행을 기다리게 된다면 CPU가 낭비되고 서버 성능이 저하됩니다.
    따라서 await 키워드를 사용하여 I/O 작업이 완료될 때까지 비동기적으로 기다리고 그동안 다른 작업을 수행할 수 있도록 합니다.

    • 작동방식
    1. await 키워드가 있는 코드에 도달하면, 해당 I/O 작업이 비동기적으로 실행됩니다.
    2. I/O 작업이 실행되는 동안 CPU는 다른 작업을 처리할 수 있습니다.
    3. I/O 작업이 완료되면, await 키워드 다음에 위치한 코드가 다시 실행됩니다.

2. 속도

Node.js, Go와 비슷한 수준의 속도를 자랑한다 라고 개발진이 말함.(실제로는 그정도는 아닌듯?) Uvicorn, Starlette 기반으로 서버가 구동된다.

3. Docs

docs가 한글번역되어있는 부분이 꽤 많고 초보자도 사용하기 쉽게 잘 되어있다.
링크) https://fastapi.tiangolo.com/ko/tutorial/first-steps/


4. Swagger

웹 인터페이스를 정의해놓고 프론트엔드랑 공유할 수 있음.
postman 처럼 사용할 수 있다.



구성요소

FastAPI

app 이라고 하는 FastAPI의 몸체(서버객체)를 만든다.
uvicorn main:app --reload = app이라고하는 변수를 찾아서 실행을 시켜라



API Router

from fastapi import FastAPI

app = FastAPI()
router = APIRouter(route_class=TimedRoute)

@app.get("/")
async def not_timed():
	return {"message": "Not timed"}
    
@router.get("/timed")
async def timed():
	return {"message": "It's the time of my life"}
    

app.include_router(router)

기능들을 Router 단위로 쪼개서 관리할 수 있다.
Router에 API를 정의하고 FastAPI 객체에 router를 include 하는 방식으로 사용 가능.
API의 Prefix를 정의할 수도 있다.
ex) '/Predict' 또는 '/data'

  • 코드 해석
    코드를 보면 not_timed, timed 라는 비동기 함수를 정의했고 @app~ 데코레이터는 FastAPI에게 각 함수가 루트 경로 (/) 에 대한 GET 요청을 처리한다고 알려준다. @router~도 마찬가지이다. 두 함수 모두 각각의 메세지를 반환하도록 되어있다.
    마지막 코드는 이전에 정의된 router를 메인 FastAPI 애플리케이션 (app)에 포함시키는 코드이다. 이를 통해 router 내에서 정의된 기능에 메인 애플리케이션을 통해 액세스할 수 있다.



Pydantic

Request 또는 Response 값에 대해 검증(validation)할 수 있는 모델
값을 직접 검증하는 코드를 작성하는 것 보다 훨씬 편하고, 개발 속도도 빠르다.

값을 지정해놓으면 오른쪽처럼 swagger에서 나오도록 해줄 수 있다.
맞지 않게 값을 넣으면 422 error 가 나올것이다.
desription: Optional[str] = None : description은 필수값은 아니라는 뜻



HTTP Method

@app.get()
@app.post()
@app.put()
@app.delete()
로 정의할 수 있다.

각 ()안에는 path를 파라미터로 정의할 수 있다.(path parameter라고 부름)

type도 정해줄 수 있다. type 맞지않게 넣으면 error 발생함

path에는 없지만 다른 파라미터를 넣고싶을 때 그림처럼 넣어줄 수 있다.(Query parameter라고 부름)

그림처럼 ? 와 & 로 전달된다. http://127.0.0.1:8000/items는 위 그림과 같은 값을 호출한다.(따로 query parameter 지정 안할 시 default로 호출됨)



따로 공부해보면 좋은 것

0개의 댓글