FastAPI 서버개발, 간단한 CRUD 애플리케이션 개발

본 포스트에서는 FastAPI를 활용하여 간단한 CRUD 애플리케이션을 개발하는 방법을 다룹니다. FastAPI는 최신 Python 웹 프레임워크 중 하나로, 비동기 프로그래밍을 지원하며, 자동으로 API 문서를 생성하는 기능이 포함되어 있어 개발자들에게 좋은 선택입니다. 이번 강좌에서는 FastAPI의 기본 개념을 설명하고, 실제로 쉽게 사용할 수 있는 CRUD(Create, Read, Update, Delete) 애플리케이션을 만들어 보겠습니다.

FastAPI 소개

FastAPI는 Python 3.6 이상에서 사용할 수 있는 웹 프레임워크입니다. 여기서 “Fast”라는 이름은 성능이 매우 뛰어나기 때문에 붙여졌습니다. FastAPI는 Pydantic을 통해 데이터 검증을 수행하고, Starlette를 기반으로 하여 비동기 기능을 제공합니다. API 문서는 Swagger UI와 ReDoc을 통해 자동으로 생성되며, 이는 개발자와 사용자가 API를 쉽게 이해하고 사용할 수 있도록 돕습니다.

특징

  • 빠른 성능: FastAPI는 우수한 성능을 제공하며, 이로 인해 높은 처리량을 요구하는 애플리케이션에 적합합니다.
  • 데이터 검증: Pydantic을 활용한 강력한 데이터 검증이 가능합니다.
  • 비동기 지원: 비동기식 프로그래밍이 가능하여, 높은 효율성을 보장합니다.
  • 자동 문서화: Swagger UI와 ReDoc을 통해 API 문서가 자동으로 생성됩니다.

프로젝트 설정

FastAPI를 사용하기 위해 먼저 환경을 설정해야 합니다. 아래의 단계에 따라 FastAPI 애플리케이션을 만들 준비를 하겠습니다.

1. Python 설치

FastAPI는 Python을 기반으로 하므로, 우선 Python 3.6 이상이 설치되어 있어야 합니다. Python을 설치한 후, 아래의 명령어로 FastAPI와 Uvicorn(ASGI 서버)를 설치합니다:

pip install fastapi uvicorn

2. 프로젝트 디렉토리 생성

다음으로, 프로젝트를 위한 디렉토리를 생성합니다. 예를 들어, fastapi_crud라는 이름으로 디렉토리를 만들고 이동합니다:

mkdir fastapi_crud
cd fastapi_crud

3. 애플리케이션 파일 생성

애플리케이션의 메인 파일인 main.py를 생성합니다:

touch main.py

간단한 CRUD 애플리케이션 구현

이제 FastAPI를 사용하여 간단한 CRUD 애플리케이션을 구현해 보겠습니다. 이 예제에서는 사용자 정보를 관리하는 API를 만들 것입니다. 사용자 정보는 이름과 나이로 구성되어 있습니다. 아래에 구체적인 코드를 설명합니다.

1. FastAPI 앱 설정

아래의 코드는 FastAPI 애플리케이션을 설정하고 시작하는 방법을 보여줍니다:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    id: int
    name: str
    age: int

2. 데이터 저장소

이 예제에서는 메모리에 사용자 데이터를 저장하는 단순한 방식으로 리스트를 사용합니다:

users = []

3. Create: 사용자 생성 API

사용자를 생성하는 API를 정의합니다. 이 API는 JSON 형식의 사용자 정보를 POST 방식으로 받아 새로운 사용자를 리스트에 추가합니다:

@app.post("/users/")
async def create_user(user: User):
    users.append(user)
    return user

4. Read: 모든 사용자 조회 API

모든 사용자 정보를 반환하는 API를 정의합니다:

@app.get("/users/")
async def read_users():
    return users

5. Read: 특정 사용자 조회 API

특정 사용자의 정보를 조회하는 API를 아래와 같이 정의할 수 있습니다:

@app.get("/users/{user_id}")
async def read_user(user_id: int):
    for user in users:
        if user.id == user_id:
            return user
    return {"error": "User not found"}

6. Update: 사용자 정보 수정 API

특정 사용자의 정보를 수정하는 API를 만듭니다:

@app.put("/users/{user_id}")
async def update_user(user_id: int, user: User):
    for idx, existing_user in enumerate(users):
        if existing_user.id == user_id:
            users[idx] = user
            return user
    return {"error": "User not found"}

7. Delete: 사용자 삭제 API

특정 사용자를 삭제하는 API를 정의합니다:

@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
    for idx, existing_user in enumerate(users):
        if existing_user.id == user_id:
            del users[idx]
            return {"message": "User removed"}
    return {"error": "User not found"}

전체 코드

위에서 설명한 모든 코드를 하나의 main.py 파일에 합쳐보겠습니다:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    id: int
    name: str
    age: int

users = []

@app.post("/users/")
async def create_user(user: User):
    users.append(user)
    return user

@app.get("/users/")
async def read_users():
    return users

@app.get("/users/{user_id}")
async def read_user(user_id: int):
    for user in users:
        if user.id == user_id:
            return user
    return {"error": "User not found"}

@app.put("/users/{user_id}")
async def update_user(user_id: int, user: User):
    for idx, existing_user in enumerate(users):
        if existing_user.id == user_id:
            users[idx] = user
            return user
    return {"error": "User not found"}

@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
    for idx, existing_user in enumerate(users):
        if existing_user.id == user_id:
            del users[idx]
            return {"message": "User removed"}
    return {"error": "User not found"}

애플리케이션 실행

이제 애플리케이션을 실행할 시간입니다. 아래의 명령어를 사용하여 Uvicorn 서버를 시작합니다:

uvicorn main:app --reload

서버가 성공적으로 실행되면, 웹 브라우저에서 http://127.0.0.1:8000/docs로 이동하여 Swagger UI를 통해 API를 테스트할 수 있습니다.

테스트

Swagger UI를 사용하여 상세하게 API를 테스트하는 방법에 대해 설명합니다. 각각의 엔드포인트에서 POST, GET, PUT, DELETE 요청을 통해 사용자 정보를 추가, 조회, 수정 및 삭제할 수 있습니다.

사용자 생성

POST 요청을 통해 사용자를 생성할 수 있습니다. JSON 형식으로 아래와 같은 데이터를 입력합니다:

{
    "id": 1,
    "name": "홍길동",
    "age": 30
}

모든 사용자 조회

GET 요청을 통해 모든 사용자의 리스트를 볼 수 있습니다.

특정 사용자 조회

GET 요청을 통해 특정 사용자의 ID로 조회할 수 있습니다. 예: /users/1

사용자 수정

PUT 요청을 통해 특정 사용자의 정보를 수정할 수 있습니다. JSON 형식으로 업데이트된 데이터를 입력합니다:

{
    "id": 1,
    "name": "홍길동 업데이트",
    "age": 31
}

사용자 삭제

DELETE 요청을 통해 특정 사용자를 삭제할 수 있습니다. 예: /users/1

결론

이번 포스트에서는 FastAPI를 사용하여 간단한 CRUD 애플리케이션을 개발하는 방법을 배웠습니다. FastAPI는 매우 직관적이고 사용하기 쉬우며, 이를 통해 효율적인 웹 API를 쉽게 구축할 수 있습니다. 또한, Swagger UI와 같은 도구를 통해 API 문서를 자동으로 생성하고 테스트할 수 있는 점은 개발 과정을 더욱 효율적으로 만들어 줍니다.

이제 여러분도 FastAPI를 사용하여 더 복잡한 애플리케이션을 만들어 볼 수 있는 기초를 쌓았길 바랍니다. FastAPI가 제공하는 다양한 기능들을 탐험해 보세요!