Backend/FastAPI

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

잘먹는 개발자 에단 2024. 7. 24. 17:54

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 가 더 편하다.

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

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