서론
FastAPI는 Python 기반의 웹 프레임워크로, 빠른 실행 속도와 현대적인 기능들을 제공하여 웹 서비스를 구현하는 데 매우 효과적입니다. 이번에는 FastAPI를 사용하여 간단한 게시판 서비스를 구현하는 방법을 알아보겠습니다.
개발 환경 설정
먼저 FastAPI를 설치하기 위해 pip
를 사용합니다. 터미널에서 다음 명령을 실행하세요:
pip install fastapi
그리고 개발 서버를 실행하기 위해 uvicorn
도 설치합니다:
pip install uvicorn
프로젝트 구조
프로젝트를 시작하기 전에 다음과 같은 디렉토리 구조를 만들어봅시다:
- main.py
- models.py
- crud.py
- database.py
main.py
는 FastAPI 애플리케이션의 진입점입니다.models.py
는 데이터베이스 모델을 정의하는 파일입니다.crud.py
는 데이터의 생성, 읽기, 갱신, 삭제(CRUD)에 관련된 함수를 정의하는 파일입니다.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 #게시판서비스