FastAPI 알아가기

lionloopy·2024년 11월 27일

오늘의 공부

목록 보기
10/22
post-thumbnail

FastAPI란

파이썬 웹 프레임워크 중 가장 빠른 속도를 지닌 프레임워크이다.
속도와 개발 속도 모두 엄청 빠르다.

operation

FastAPI에서 operation은 HTTP의 method를 의미한다.

  • post: 데이터 생성할 때
  • get: 데이터 얻어올 때
  • put: 데이터 업데이트 할 때
  • delete: 데이터 지울 때
@app.get("/api/~")
async def getItem():
	return ~

기본 구조

  1. DTO 정의: 반환될 데이터를 정의
  2. model 작성: 데이터베이스 스키마 정의
  3. repo 작성: 데이터베이스 CRUD 작업 정의
  4. service 작성: 비즈니스 로직 작성
  5. router 작성: 엔드포인트 정의
  6. app.py 설정: FastAPI 애플리케이션 실행

app.py

  • FastAPI 애플리케이션의 진입점(entry point)이다.
    애플리케이션을 설정하고, 라우터를 연결하는 등의 역할을 수행한다.
    FastAPI() 인스턴스를 생성한다.

DTO

  • 네트워크 통신(요청 및 응답)에 사용되는 데이터 구조를 정의한다.
    클라이언트가 요청하거나, 서버가 반환할 데이터 형식을 명시한다.
    데이터 유효성 검증(pydantic)을 통해 잘못된 요청이나 응답을 방지한다.
from pydantic import BaseModel
from typing import List, Dict

class ContainerSummaryDTO(BaseModel):
    name: str
    cpu_usage: str
    memory_usage: str

model

  • 데이터베이스 테이블과 매핑되는 구조를 정읳나다.
    테이블의 컬럼, 데이터 타입, 관계를 정의한다.
    데이터베이스와 CRUD 작업 지원

repo

  • 데이터베이스에서 데이터 조회 및 조작을 담당하는 계층
    데이터베이스 쿼리를 캡슐화하여 비즈니스 로직과 데이터베이스 접근 코드를 분리한다.
    서비스 계층에서 호출된다.

라우터

  • API 엔드포인트를 정의하는 계층이다.
    클라이언트 요청을 받아 서비스 계층에 전달하고, 응답을 반환한다.
    데이터 유효성 검증(DTO)을 수행하고 에러를 처리한다.
    get, post, put, delete와 같은 HTTP 메서드 처리
    클라이언트와 서비스 계층 사이의 연결 담당

서비스

  • 비즈니스 로직을 처리하는 계층
    요청에 따라 필요한 데이터베이스 작업을 수행하고, 데이터를 가공하여 반환한다.

라우터

FastAPI의 라우팅은 매우 유연하고, 번거로운 일을 처리해준다.
routing이란, 클라이언트가 서버로 보내는 HTTP request들을 처리하는 과정을 말한다.
HTTP request들은 정해진 routes로 전달되며, 이는 정해진 핸들러를 통해서 요청과 응답을 처리한다.

  • app.py
@app.get('/')
def read_root():
    return {"message": "API is running"}

라우팅은 app 변수로부터 다뤄진다. uvicorn을 사용하여 FastAPI 인스턴스를 지정해주고 application을 실행시킬 수 있다.

uvicorn src.app:app --host 0.0.0.0 --port 8000 --reload
  • test_router.py
todo_list = []

@todo_router.post("/todo")
async def add_todo(todo: dict) -> dict:
    todo_list.append(todo)
    return {"message": "Todo added successfully"}

@todo_router.get("/todo")
async def retrieve_todos() -> dict:
    return {"todos": todo_list}

만약 이렇게 route 경로에 파일을 만들고 api를 작성한다면

  • app.py
@app.get('/')
def read_root():
    return {"message": "API is running"}
    
app.include_router(router=todo_router)

app.include_router로 APIRouter 클래스로 정의된 route들을 등록해줘야한다.

DTO

DTO는 Data Transfer Object이다.
네트워크를 통해 보낼 데이터를 매핑하는 클래스이다.
데이터를 네트워크에서 주고받기 위해 사용된다.
즉, DB에서 데이터를 얻어 service나 controller(router)등으로 보낼 때 사용하는 객체이다.
-> DTO와 모델은 역할이 다르기 때문에 반드시 값이 일치할 필요는 없다.

model

FastAPI에서는 sqlalchemy를 활용하여 관계형 데이터베이스를 모델링하는데,
models는 FastAPI에서 데이터베이스 테이블(스키마)를 뜻한다.

class Photo(Base):
    __tablename__ = "photo"

    photo_id = Column(Integer, primary_key=True)
    filename = Column(String(255), default="unknown")
    type = Column(String(255), default="unknown")
    src = Column(String(255), default="unknown")  # 이미지 저장 경로
    created_time = Column(DateTime, default=datetime.now)

참고자료

https://lucky516.tistory.com/86
https://velog.io/@chappi/FastAPI%EB%A5%BC-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90-2%EC%9D%BC%EC%B0%A8-Routing-APIRouter-Pydantic-Model-Query-Route-Request-Parameter
https://mopil.tistory.com/62

profile
기록은 담백하게, 성장은 빠르게! 🐘

0개의 댓글