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 작업이 완료될 때까지 비동기적으로 기다리고 그동안 다른 작업을 수행할 수 있도록 합니다.
Node.js, Go와 비슷한 수준의 속도를 자랑한다 라고 개발진이 말함.(실제로는 그정도는 아닌듯?)
Uvicorn, Starlette 기반으로 서버가 구동된다.

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

웹 인터페이스를 정의해놓고 프론트엔드랑 공유할 수 있음.
postman 처럼 사용할 수 있다.
app 이라고 하는 FastAPI의 몸체(서버객체)를 만든다.
uvicorn main:app --reload = app이라고하는 변수를 찾아서 실행을 시켜라
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'
Request 또는 Response 값에 대해 검증(validation)할 수 있는 모델
값을 직접 검증하는 코드를 작성하는 것 보다 훨씬 편하고, 개발 속도도 빠르다.

값을 지정해놓으면 오른쪽처럼 swagger에서 나오도록 해줄 수 있다.
맞지 않게 값을 넣으면 422 error 가 나올것이다.
desription: Optional[str] = None : description은 필수값은 아니라는 뜻
@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로 호출됨)