Tech/FastAPI

FastAPI - app.get과 router.get 차이 (FastAPI와 APIRouter)

@~@ 2024. 1. 9. 23:43

<점프 투 FastAPI>을 읽고 공부한 내용을 정리한 글입니다.

app.get과 router.get의 코드가 둘 다 get이나 post를 쓰고 뒤에 URL이 온다는 점에서 쓰임새가 똑같아 보이는데 언제는 app.get을 쓰고 router.get을 쓰길래 둘의 차이가 궁금해졌다.



app은 FastAPI 객체를 만들고 

from fastapi import FastAPI

app = FastAPI()

@app.get("/hello")
def hello():
    return {"message": "Hello World"}



router는 APIRouter 객체를 만든다.

from fastapi import APIRouter, FastAPI

app = FastAPI()
router = APIRouter()

@router.get("/items/")
def read_items():
    return [{"name": "Empanada"}, {"name": "Arepa"}]

app.include_router(router)


이 때, APIRouter 클래스는 엔드포인트를 그룹화하고 모듈화 할 수 있다는 차이가 있다.

(엔드포인트란 클라이언트가 서버에 request를 보낼 때 처리되는 URL과 그에 따른 HTTP 요청 방식(GET, POST 등)을 말한다.)

예를 들어, 블로그 어플리케이션을 만든다고 할 때, APIRouter 클래스는 아래와 같이 사용자 관련 엔드포인트와 게시물 관련 엔드포인트로 그룹화하고 모듈화하여 코드를 더 구조화 할 수 있다. 따라서 대규모 어플리케이션에서는 APIRouter를 사용하는 것이 더 효율적이다.

from fastapi import FastAPI, APIRouter

app = FastAPI()

# 사용자 관련 엔드포인트를 담을 라우터 생성
user_router = APIRouter()

@user_router.get("/users/{user_id}")
def get_user(user_id: int):
    return {"user_id": user_id}

@user_router.post("/users/")
def create_user():
    # 새로운 사용자 생성 로직
    pass

# 게시물 관련 엔드포인트를 담을 라우터 생성
post_router = APIRouter()

@post_router.get("/posts/{post_id}")
def get_post(post_id: int):
    return {"post_id": post_id}

@post_router.post("/posts/")
def create_post():
    # 새로운 게시물 생성 로직
    pass

# 애플리케이션에 라우터 추가
app.include_router(user_router, prefix="/users")
app.include_router(post_router, prefix="/posts")


 
FastAPI 클래스는 어플리케이션 레벨에서 엔드포인트를 설정하고 관리한다. 하지만 그 자체로 코드를 모듈화하고 엔드포인트를 그룹화하여 관리하는 용도로는 사용할 수 없다.


챗지피티가 정리한 app.get과 router.get의 차이

  1. app.get():
    • FastAPI 인스턴스인 **app**에 직접적으로 라우팅 경로와 핸들러 함수를 추가하는 방법입니다.
    • 이 방식은 작은 규모의 애플리케이션에서 라우팅을 정의하고 관리하기에 간단한 방법을 제공합니다.
    • 단일 파일이나 작은 규모의 프로젝트에서 사용하기 좋습니다.
    • 라우팅이 FastAPI 인스턴스에 직접 추가되므로, 애플리케이션 규모가 커질수록 코드 관리 및 유지보수에 어려움이 있을 수 있습니다.
  2. router.get():
    • APIRouter 인스턴스인 **router**를 만들어서 거기에 라우팅 경로와 핸들러 함수를 추가하는 방법입니다.
    • 이 방식은 라우터를 모듈화하고 기능 별로 묶어 애플리케이션을 조직화하는 데 사용됩니다.
    • 큰 규모의 애플리케이션에서 라우팅을 모듈화하여 코드를 더 쉽게 유지하고 관리할 수 있습니다.
    • **app.include_router(router)**를 사용하여 **APIRouter**를 FastAPI 인스턴스에 포함시킵니다.