본문 바로가기
Backend/FastAPI

Fast API는 진짜 빠르고 편할까?

by 잘먹는 개발자 에단 2024. 7. 24.

Fast api는 

1. 일단 파이썬이라서 문법 너무 간단

2. 매우 빠르다고 합니다. 알아본 걸로는 node 보다 빠르고 go 와 비슷하다고 합니다. 싱글스레드일텐데 어캐했누..

3. 타입 힌팅을 이용해서 자동으로 Api 문서를 생성한다. 

4. 라우트 데코레이터를 이용하여 쉽게 Api를 구현할 수 있다. 

    ㄴ app.get("/item")

5. 다양한 데이터베이스와 연동할 수 있다. ( SQLite, SQL Server, Mysql 다 된다 )

6. 개발도구로는 인텔리제이의 파이참 추천 ( 대학교 이메일 있으면 무료로 쓸 수 있어요! )

 

 

* main.py ( python 3.9 이상 사용 )

 

- 프로젝트 구조를 다음과 같이 하면 좋음

Project

ㄴ main.py

ㄴ model.py

ㄴ database.py 

from fastapi import FastAPI
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, Integer, String, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# FastAPI 어플리케이션 인스턴스 생성
app = FastAPI() 

# 데이터베이스 정보
DB_ID = "root"
DB_PASSWORD = "비밀입니당"
DB_IP = "localhost"
DB_PORT = "3306"
DB_NAME = "ForBlazor"

# 데이터베이스 연결 문자열
conn_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(
    DB_ID, DB_PASSWORD, DB_IP, DB_PORT, DB_NAME
)

# 데이터베이스 엔진 생성
engine = create_engine(conn_str)

# 세션 메이커 설정
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# SQLAlchemy 베이스 클래스 생성
Base = declarative_base()

# SQLAlchemy 모델 정의 : 실제 테이블 구조와 같아야 함
class Test(Base):
    __tablename__ = "Test01"  # 테이블 이름 설정
    Id = Column(Integer, primary_key=True, index=True) 
    Name = Column(String(255))

# Pydantic 모델 정의
class Item(BaseModel):
    Name: str # 같을 필요는 없고, DTO라고 생각하면 됨

# 루트 엔드포인트 정의
@app.get("/")
async def root():
    # 데이터베이스 세션 열기
    db = SessionLocal()
    try:
        # SQL 쿼리 실행 및 결과 가져오기
        result = db.execute(text("SELECT Id, Name FROM Test01")).fetchall()
        # 결과를 Item 객체 리스트로 변환
        items = [Item(Id=row.Id, Name=row.Name) for row in result]
    finally:
        # 세션 닫기
        db.close()

    return items

# 새로운 사람을 추가하는 엔드포인트 정의
@app.post("/addPerson")
async def add_person(item: Item):
    # 데이터베이스 세션 열기
    db = SessionLocal()
    try:
        # 새로운 Test 객체 생성
        new_item = Test( Name=item.Name)
        # 세션에 추가
        db.add(new_item)
        # 커밋하여 데이터베이스에 반영
        db.commit()
    except Exception as e:
        # 오류 발생 시 롤백
        db.rollback()
        # 오류 메시지 반환
        return {"error": str(e)}
    finally:
        # 세션 닫기
        db.close()

    return {"message": "Person added successfully"} # 성공 메시지 반환

 

 

실행

- fastapi dev main.py

 

 

간단하게 로컬 DB에 있는거 가져오는 코드를 작성해봤는데, 

편하긴하다. 근데 여러모로 node.js + express 조합이 낫다고 생각이 들었던게..

 

1. 파이썬 때문에 근본적으로 문법이 간결해서 좋긴한데, 어쨋든 프레임워크의 사용법에 대해서 유즈케이스가 있어야지 그거 보고 좀 편하게 작성할텐데 커뮤니티가 아직 형성이 안되서, 자료가 많지 않다.. ( 물론 갓 지피티로 극복 가능하지만, 이것도 한계가 있을 듯 )

 

2. Express 같은 경우에는 그냥 쿼리 날리고 그거 갖다가 JSON 대충 구성해서 뿌려버리면 되는데, 이것 같은 경우에는 DTO와 테이블 모델을 구성해줘야 하기 때문에 조금 더 복잡할 수 있다. 근데 어떻게 보면 쿼리를 보는 것보다 테이블 모델을 보고 이해하는게 더 편할 수 있다. 이건 호불호라고 볼 수 있겠다. 

 

 

 

# 결론 

- 편한건 node + Express 가 더 편하다.

- 파이썬 쓰고 싶으면 써도 나쁘지 않다. 

- 문서화 일일히 하기 싫으면 쓰는 것 추천