FastAPI 사용법 RESTful API 만들기 예제

안녕하세요 이번 글에서는 Python의 강력한 웹 프레임워크인 FastAPI를 활용하여 RESTful API를 개발하는 과정을 자세히 다루려고 합니다. FastAPI는 비동기 지원, 빠른 성능, 높은 개발 효율성으로 인해 최근 많은 개발자들 사이에서 인기를 끌고 있습니다. 본문에서는 FastAPI 사용법과 개발된 RESTfulAPI를 cURL을 이용해 테스트하는 방법에 대해서도 설명드리겠습니다.

FastApi 설치 및 서버 실행

FastAPI 프레임워크를 사용하기 위해 fastapi 설치와 FastAPI 애플리케이션을 실행할 ASGI 서버를 호스팅하기 위해 uvicorn을 설치합니다. 코드 작성이 완료되면, 아래 명령어를 사용하여 서버를 실행합니다.

pip install fastapi
pip install uvicorn

# 아래 코드작성 후에 서버를 실행합니다.
uvicorn main:app --reload

FastAPI로 RESTful API 구축하기

이 코드는 API의 기본 구조와 데이터 모델을 설정하는 부분까지만 포함되어 있습니다. 실제로 API 엔드포인트를 추가하기 위해 @app.get(), @app.post(), @app.put(), @app.delete()와 같은 데코레이터를 사용하여 설명드리겠습니다.

# main.py

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional, Dict

#  FastAPI 애플리케이션을 생성합니다. 이 인스턴스는 앱의 모든 경로와 엔드포인트를 관리합니다.
app = FastAPI()

# 간단한 데이터 저장소
posts = {
    1: {"title": "첫 번째 제목", "content": "첫번째 글입니다.", "published": True, "rating": 5},
    2: {"title": "두 번째 제목", "content": "두번째 글입니다.", "published": True, "rating": 4}
}

# 블로그 포스트 모델
class Post(BaseModel):
    title: str
    content: str
    published: bool = True
    rating: Optional[int] = None

GET 기능 (전체)

/posts/ 엔드포인트를 추가합니다. 이 엔드포인트는 GET 요청을 처리하며, 등록된 모든 블로그 포스트를 조회할 수 있습니다. 구체적으로, get_all_posts 함수는 posts 딕셔너리에 저장된 모든 포스트의 값을 리스트 형태로 반환합니다. 이렇게 하면 API를 통해 모든 블로그 포스트의 데이터를 JSON 배열 형태로 받아볼 수 있습니다.

@app.get("/posts/")
def get_all_posts():
    return list(posts.values())

조회 요청

http://127.0.0.1:8000/docs에 접속하면 개발자가 구현한 API 엔드포인트, 가능한 요청, 응답 예시 등을 시각적으로 탐색하고 테스트할 수 있게 해줍니다. Try it out -> Execute 를 누르면 데이터를 조회할 수 있습니다.

fastapi-사용법-post

GET 기능 (개별 조회)

특정 블로그 포스트를 조회하는 엔드포인트를 추가합니다. /posts/{post_id} 경로를 통해, 클라이언트는 post_id를 사용하여 특정 포스트를 요청할 수 있습니다. 특정 post_id를 가진 블로그 포스트의 상세 정보를 요청할 수 있으며, 존재하지 않는 post_id를 요청할 경우 적절한 에러 메시지와 함께 404 에러 응답을 받게 됩니다.

@app.get("/posts/{post_id}")
def get_post(post_id: int):
    if post_id not in posts:
        raise HTTPException(status_code=404, detail="Post not found")
    return posts[post_id]

조회 요청

http://127.0.0.1:8000/docs에 접속하면 개발자가 구현한 API 엔드포인트, 가능한 요청, 응답 예시 등을 시각적으로 탐색하고 테스트할 수 있게 해줍니다. Try it out -> post_id 입력 후 -> Execute을 누르면 개별 POST를 조회할 수 있습니다

fastapi-사용법-post

POST 기능

/posts/ 경로에 POST 요청을 보내면, 제공된 데이터를 사용하여 새 포스트를 생성합니다.

@app.post("/posts/", status_code=201)
def create_post(post: Post):
    post_id = len(posts) + 1
    posts[post_id] = post.dict()
    return {"post_id": post_id, **post.dict()}

생성 요청

http://127.0.0.1:8000/docs에 접속하면 개발자가 구현한 API 엔드포인트, 가능한 요청, 응답 예시 등을 시각적으로 탐색하고 테스트할 수 있게 해줍니다. Try it out -> Request body 입력 후 -> Execute을 누르면 개별 POST를 조회할 수 있습니다

fastapi-사용법-post

PUT 기능

/posts/{post_id} 경로에 PUT 요청을 보내면, 지정된 post_id에 해당하는 포스트를 업데이트할 수 있습니다. 함수의 동작 방식은 다음과 같습니다:

@app.put("/posts/{post_id}")
def update_post(post_id: int, updated_post: Post):
    if post_id not in posts:
        raise HTTPException(status_code=404, detail="Post not found")
    posts[post_id] = updated_post.dict()
    return {"post_id": post_id, **updated_post.dict()}

수정 요청

http://127.0.0.1:8000/docs에 접속하면 개발자가 구현한 API 엔드포인트, 가능한 요청, 응답 예시 등을 시각적으로 탐색하고 테스트할 수 있게 해줍니다. Try it out -> post_id 입력, Request body 입력 후 -> Execute을 누르면 개별 POST를 수정할 수 있습니다

fastapi-사용법-put

Delete 기능

/posts/{post_id} 경로에 DELETE 요청을 보내면, 지정된 post_id에 해당하는 포스트를 삭제할 수 있습니다.

@app.delete("/posts/{post_id}")
def delete_post(post_id: int):
    if post_id not in posts:
        raise HTTPException(status_code=404, detail="Post not found")
    del posts[post_id]
    return {"detail": "Post deleted"}

삭제 요청

http://127.0.0.1:8000/docs에 접속하면 개발자가 구현한 API 엔드포인트, 가능한 요청, 응답 예시 등을 시각적으로 탐색하고 테스트할 수 있게 해줍니다. Try it out -> post_id 입력 -> Execute을 누르면 개별 POST를 삭제할 수 있습니다

fastapi-사용법-delete

마무리

FastAPI는 Python에서 RESTful API를 구축하기 위한 강력하고 빠른 프레임워크입니다. 이 글을 통해 기본적인 CRUD 작업을 수행하는 API를 만드는 방법과 http://127.0.0.1:8000/docs의 cURL을 이용해 이 API에 요청을 보내는 방법을 배웠습니다.

Leave a Comment