FastAPI 서버개발, 기본 경로 설정 및 HTTP 메서드(POST, GET, PUT, DELETE) 처리

FastAPI는 Python을 기반으로 한 현대적인 웹 프레임워크로, API를 쉽게 구축하고 배포할 수 있는 강력한 기능을 제공합니다. 본 강좌에서는 FastAPI를 사용하여 기본 경로를 설정하고, HTTP 메서드(POST, GET, PUT, DELETE)를 처리하는 방법에 대해 상세히 설명하겠습니다. 이 과정에서 필요한 설정과 예제 코드를 제공하니 참고하시기 바랍니다.

1. FastAPI 설치 및 기본 설정

FastAPI를 사용하기 위해서는 Python 환경이 필요합니다. Python 3.6 이상이 설치되어 있는지 확인한 후, FastAPI와 Uvicorn(비동기 웹 서버)를 설치합니다. 이를 위해 다음 명령어를 사용합니다:

pip install fastapi uvicorn

2. FastAPI 서버 실행하기

FastAPI 애플리케이션을 작성하기 위해 기본적인 구조를 설정해보겠습니다. 아래와 같이 main.py 파일을 생성하고 다음 코드를 입력합니다:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

위 코드는 FastAPI 서버의 가장 기본적인 예제로, 서버가 실행되면 / 경로로 접근했을 때 “Hello, FastAPI!”라는 메시지를 반환합니다.

서버를 실행하려면 터미널에서 다음 명령어를 사용합니다:

uvicorn main:app --reload

브라우저를 열고 http://127.0.0.1:8000로 이동하면 “Hello, FastAPI!” 메시지를 확인할 수 있습니다.

3. HTTP 메서드 처리

FastAPI는 다양한 HTTP 메서드를 지원합니다. 주요 HTTP 메서드에는 GET, POST, PUT, DELETE가 있습니다. 각각의 메서드를 사용하여 API를 설계하여 보겠습니다.

3.1 GET 메서드

GET 메서드는 서버에서 데이터를 조회할 때 사용됩니다. 예를 들어, 다음 코드는 특정 사용자의 정보를 조회하는 API를 구현합니다:

@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id, "name": "User Name"}

위 코드는 /users/{user_id} 경로에서 GET 요청을 처리합니다. 사용자 ID를 입력받아 해당 ID에 대한 사용자 정보를 반환합니다.

3.2 POST 메서드

POST 메서드는 서버에 새로운 데이터를 생성할 때 사용됩니다. 다음 예제는 사용자를 추가하는 API입니다:

from pydantic import BaseModel

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

@app.post("/users/")
async def create_user(user: User):
    return {"user_id": 1, "name": user.name, "age": user.age}

위의 예제에서 User 클래스는 Pydantic을 사용하여 데이터 모델을 정의합니다. 사용자가 POST 요청을 통해 전달하는 데이터는 User 클래스의 인스턴스로 변환됩니다.

3.3 PUT 메서드

PUT 메서드는 서버에 존재하는 데이터를 수정할 때 사용됩니다. 아래의 코드는 사용자의 정보를 업데이트하는 API입니다:

@app.put("/users/{user_id}")
async def update_user(user_id: int, user: User):
    return {"user_id": user_id, "updated_name": user.name, "updated_age": user.age}

여기서 사용자의 ID와 업데이트할 정보를 수정하여 반환합니다.

3.4 DELETE 메서드

DELETE 메서드는 서버에서 정보를 삭제할 때 사용됩니다. 다음은 사용자를 삭제하는 API의 예입니다:

@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
    return {"message": f"User {user_id} has been deleted."}

이 API는 특정 사용자의 ID를 받아 해당 사용자 삭제에 대한 메시지를 반환합니다.

4. FastAPI의 데이터 검증

FastAPI는 Pydantic을 통해 데이터 검증을 지원합니다. 위 예제에서 User 클래스를 사용하여 이름과 나이를 검증했습니다. 올바른 데이터 형식을 지정함으로써 API가 정확하게 작동하도록 보장할 수 있습니다.

5. FastAPI와 데이터베이스 연동

대부분의 웹 애플리케이션에서는 데이터를 데이터를 저장하고 검색하기 위해 데이터베이스와의 연동이 필요합니다. FastAPI와 SQLAlchemy를 사용하면 데이터베이스와 통신할 수 있습니다. 여기서는 SQLite를 예로 들어보겠습니다.

from fastapi import FastAPI, Depends
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

데이터베이스에 연결하기 위한 엔진을 생성하고 세션을 정의했습니다. 이제 사용자 모델을 데이터베이스와 연동해보겠습니다.

class UserModel(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    age = Column(Integer)

이제 데이터베이스를 초기화하고, FastAPI와 연동하는 방법을 살펴보겠습니다:

Base.metadata.create_all(bind=engine)

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

GET 메서드에 데이터베이스에서 사용자 정보를 가져오는 로직을 작성해보겠습니다:

@app.get("/users/{user_id}")
async def read_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(UserModel).filter(UserModel.id == user_id).first()
    return user if user else {"message": "User not found"}

6. FastAPI 문서화

FastAPI의 가장 큰 장점 중 하나는 자동으로 API 문서를 생성해준다는 점입니다. Swagger UI를 통해 API를 쉽게 테스트하고 문서화할 수 있습니다. 서버를 실행한 후 http://127.0.0.1:8000/docs로 접속하면 Swagger UI에서 API를 확인할 수 있습니다.

7. 보안 및 인증

실제 애플리케이션에서는 사용자 인증 및 보안이 중요합니다. FastAPI는 OAuth2를 지원하여 JWT 토큰 기반 인증을 구현할 수 있습니다. 이 부분은 추가적인 구현이 필요하므로 FastAPI의 공식 문서를 참고하시기 바랍니다.

8. 결론

FastAPI는 현대적인 웹 애플리케이션 개발에 적합한 강력한 프레임워크입니다. 본 강좌에서는 기본적인 경로 설정 및 HTTP 메서드 처리를 다루었습니다. FastAPI를 사용하여 여러분만의 RESTful API를 구현해보길 바랍니다. 추가적인 내용이 필요하시면 FastAPI 공식 문서에서 더욱 다양한 기능과 사용법을 학습하실 수 있습니다.

여러분의 프로젝트에 FastAPI를 적용해 보시기 바랍니다.