FastAPI를 사용하여 게시판 서비스 구현하기

FastAPI logo

서론

FastAPI는 Python 기반의 웹 프레임워크로, 빠른 실행 속도와 현대적인 기능들을 제공하여 웹 서비스를 구현하는 데 매우 효과적입니다. 이번에는 FastAPI를 사용하여 간단한 게시판 서비스를 구현하는 방법을 알아보겠습니다.

개발 환경 설정

먼저 FastAPI를 설치하기 위해 pip를 사용합니다. 터미널에서 다음 명령을 실행하세요:

pip install fastapi

그리고 개발 서버를 실행하기 위해 uvicorn도 설치합니다:

pip install uvicorn

프로젝트 구조

프로젝트를 시작하기 전에 다음과 같은 디렉토리 구조를 만들어봅시다:

- main.py
- models.py
- crud.py
- database.py

데이터베이스 설정

가장 먼저 데이터베이스를 설정해야 합니다. database.py 파일을 열고 다음과 같이 데이터베이스 연결 코드를 작성하세요:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

위 코드에서는 SQLite를 사용하고 있습니다. 다른 데이터베이스를 사용한다면 SQLALCHEMY_DATABASE_URL을 해당 데이터베이스의 URL로 변경해야 합니다.

모델 정의

models.py 파일을 열고 다음과 같이 게시글을 나타내는 모델을 정의하세요:

from sqlalchemy import Column, Integer, String
from database import Base

class Post(Base):
    __tablename__ = "posts"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    content = Column(String)

위의 코드에서는 Post라는 테이블을 생성하고, id, title, content라는 세 가지 열로 구성되어 있다는 것을 알 수 있습니다.

CRUD 함수 작성

이제 crud.py 파일을 열고 다음과 같이 CRUD 함수를 작성하세요:

from sqlalchemy.orm import Session
from models import Post

def get_post(db: Session, post_id: int):
    return db.query(Post).filter(Post.id == post_id).first()

def get_posts(db: Session, skip: int = 0, limit: int = 100):
    return db.query(Post).offset(skip).limit(limit).all()

def create_post(db: Session, post: Post):
    db.add(post)
    db.commit()
    db.refresh(post)
    return post

def update_post(db: Session, post_id: int, updated_post: Post):
    post = db.query(Post).filter(Post.id == post_id).first()
    post.title = updated_post.title
    post.content = updated_post.content
    db.commit()
    db.refresh(post)
    return post

def delete_post(db: Session, post_id: int):
    post = db.query(Post).filter(Post.id == post_id).first()
    db.delete(post)
    db.commit()

위의 코드에서는 데이터베이스 세션에 접근하고, 게시물을 생성, 읽기, 갱신, 삭제하는 함수들을 정의하였습니다.

FastAPI 애플리케이션 작성

이제 main.py 파일을 열고 다음과 같이 FastAPI 애플리케이션을 작성하세요:

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from database import SessionLocal, engine
from models import Base, Post
from crud import get_post, get_posts, create_post, update_post, delete_post

app = FastAPI()

# 데이터베이스 테이블 생성
Base.metadata.create_all(bind=engine)

# 의존성 주입
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/posts/", response_model=Post)
def create_new_post(post: Post, db: Session = Depends(get_db)):
    return create_post(db, post)

@app.get("/posts/", response_model=List[Post])
def get_all_posts(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    posts = get_posts(db, skip=skip, limit=limit)
    return posts

@app.get("/posts/{post_id}", response_model=Post)
def get_single_post(post_id: int, db: Session = Depends(get_db)):
    post = get_post(db, post_id)
    if post is None:
        raise HTTPException(status_code=404, detail="Post not found")
    return post

@app.put("/posts/{post_id}", response_model=Post)
def update_existing_post(post_id: int, updated_post: Post, db: Session = Depends(get_db)):
    post = update_post(db, post_id, updated_post)
    if post is None:
        raise HTTPException(status_code=404, detail="Post not found")
    return post

@app.delete("/posts/{post_id}")
def delete_existing_post(post_id: int, db: Session = Depends(get_db)):
    delete_post(db, post_id)
    return {"message": "Post deleted successfully"}

위의 코드에서는 FastAPI 애플리케이션을 정의하고, 게시물 생성, 조회, 갱신, 삭제를 위한 엔드포인트를 설정하였습니다.

실행

터미널에서 다음 명령을 실행하여 개발 서버를 실행하세요:

uvicorn main:app --reload

이제 http://localhost:8000/docs에 접속하여 FastAPI의 자동 생성된 API 문서를 확인할 수 있습니다.

마무리

이제 FastAPI를 사용하여 간단한 게시판 서비스를 구현하는 방법을 알아보았습니다. FastAPI는 높은 성능과 현대적인 기능을 제공하므로 웹 서비스 개발에 효과적으로 사용할 수 있습니다.

#FastAPI #게시판서비스