오늘날의 웹 애플리케이션은 RESTful API를 통해 다양한 클라이언트 애플리케이션과 통신할 수 있는 기능이 필수적입니다. FastAPI는 Python으로 신속하게 웹 API를 구축할 수 있도록 설계된 최신 프레임워크입니다. 이번 글에서는 FastAPI의 APIRouter
클래스를 활용한 라우팅에 대해 심도 깊은 논의를 진행할 것입니다.
FastAPI란?
FastAPI는 Python의 비동기 프로그래밍을 지원하는 현대적인 웹 프레임워크로, 매우 빠른 속도를 자랑합니다. FastAPI는 또한 Pydantic과 Starlette를 기반으로 하여 데이터 검증과 처리에서 뛰어난 성능을 보여줍니다. FastAPI의 주요 특징은 다음과 같습니다:
- 빠른 속도: Starlette를 기반으로 하여 비동기적으로 요청을 처리할 수 있습니다.
- 자동 문서화: OpenAPI 및 JSON Schema를 통해 API 문서를 자동으로 생성합니다.
- 데이터 검증: Pydantic을 사용하여 요청 데이터의 유효성을 검사합니다.
- 비동기 작업 지원:
async/await
문법을 지원하여 비동기 작업을 효율적으로 처리합니다.
APIRouter란?
APIRouter
클래스는 FastAPI에서 라우팅을 관리하는 데 유용한 도구입니다. 이를 통해 API 엔드포인트를 모듈화하여 코드의 재사용성과 가독성을 높일 수 있습니다. APIRouter는 특정 경로에 대한 엔드포인트를 그룹화하여 좀 더 깔끔한 구조의 코드를 작성할 수 있도록 도와줍니다.
APIRouter 사용하기
APIRouter를 사용하는 기본적인 방법은 다음과 같습니다:
from fastapi import FastAPI, APIRouter
app = FastAPI()
router = APIRouter()
@router.get("/items/")
async def read_items():
return [{"item_id": 1}, {"item_id": 2}]
app.include_router(router)
위의 코드는 FastAPI 애플리케이션을 생성하고, APIRouter를 통해 /items/
경로에 대한 GET 요청을 처리하는 간단한 예제입니다. router.get
데코레이터를 사용하여 HTTP GET 요청에 대한 핸들러 함수를 정의합니다.
APIRouter의 이점
- 모듈화된 코드 구조: 라우터를 사용하여 관련된 엔드포인트를 그룹화함으로써 코드의 가독성과 관리 용이성이 향상됩니다.
- 코드 재사용성: 라우터를 다른 파일이나 패키지에서 불러와서 사용할 수 있어, 규모가 큰 애플리케이션의 유지 보수가 용이합니다.
- 명확한 API 문서화: 각 라우터에 대한 문서화를 개별적으로 진행할 수 있어, API 사용자가 이해하기 쉽습니다.
예제: APIRouter와 함께 복잡한 라우팅 사용하기
이번 절에서는 APIRouter를 사용하여 더 복잡한 API 라우팅 구조를 구현해보겠습니다. 다음 예제에서는 상품과 관련된 엔드포인트를 정의해 보겠습니다.
from fastapi import FastAPI, APIRouter
from typing import List
app = FastAPI()
router = APIRouter()
class Item:
def __init__(self, item_id: int, name: str):
self.item_id = item_id
self.name = name
items_db = [
Item(item_id=1, name="Item One"),
Item(item_id=2, name="Item Two"),
]
@router.get("/items/", response_model=List[Item])
async def read_items():
return items_db
@router.get("/items/{item_id}")
async def read_item(item_id: int):
for item in items_db:
if item.item_id == item_id:
return item
return {"message": "Item not found"}
app.include_router(router)
위의 코드는 /items/
경로에서 모든 아이템의 목록을 반환하고, /items/{item_id}
경로에서 특정 아이템을 조회하는 엔드포인트를 제공합니다. FastAPI의 response_model
기능을 활용하여 반환되는 데이터 모델을 정의했습니다.
비동기 I/O로 성능 최적화하기
FastAPI의 장점 중 하나는 비동기 처리가 가능하다는 점입니다. 이를 통해 대규모 애플리케이션에서도 높은 성능을 유지할 수 있습니다. 데이터베이스와의 비동기 I/O 통신을 위해 다음과 같이 코드를 개선할 수 있습니다.
from fastapi import FastAPI, APIRouter
from pydantic import BaseModel
from typing import List
import asyncio
app = FastAPI()
router = APIRouter()
class Item(BaseModel):
item_id: int
name: str
items_db = [
Item(item_id=1, name="Item One"),
Item(item_id=2, name="Item Two"),
]
async def fake_db_fetch_all():
await asyncio.sleep(1) # Simulating a database query delay
return items_db
@router.get("/items/", response_model=List[Item])
async def read_items():
return await fake_db_fetch_all()
@router.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int):
items = await fake_db_fetch_all()
for item in items:
if item.item_id == item_id:
return item
return {"message": "Item not found"}
app.include_router(router)
위의 예제는 비동기적으로 데이터를 처리하는 방법을 보여줍니다. fake_db_fetch_all
함수는 실제 데이터베이스를 사용하는 대신, `asyncio.sleep`을 통해 지연을 시뮬레이션하고 있습니다.
중간자 미들웨어를 통한 보안 및 인증 추가하기
애플리케이션의 보안성을 높이기 위해 인증 기능을 추가할 수 있습니다. FastAPI는 다양한 미들웨어를 지원하여 라우터의 요청을 가로챌 수 있습니다. 예를 들어 JWT(JSON Web Token)를 사용하여 인증을 처리할 수 있습니다.
from fastapi import FastAPI, APIRouter, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
from typing import List
app = FastAPI()
router = APIRouter()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: str
def fake_decode_token(token):
return User(username=token + "user", email=token + "@example.com")
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
if not user:
raise HTTPException(status_code=401, detail="Invalid authentication credentials")
return user
@router.get("/users/me", response_model=User)
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
app.include_router(router)
위의 코드는 JWT 토큰을 사용하여 사용자를 인증하는 방법을 보여줍니다. Depends
를 사용하여 엔드포인트에 의존성을 추가하고, OAuth2PasswordBearer
를 통해 토큰을 처리합니다.
결론
FastAPI의 APIRouter
클래스를 사용하면 간결하고 구조화된 API를 구축할 수 있습니다. 모듈화된 라우팅 구조를 통해 재사용성을 높이고, 비동기 I/O를 활용하여 성능을 개선할 수 있습니다. 또한, 보안 미들웨어를 통해 중요한 정보와 자원을 보호할 수 있습니다. 이러한 기능들은 현대 웹 애플리케이션을 개발하는 데 필요한 핵심 요소입니다.
FastAPI는 개발자가 필요한 모든 기능을 갖춘 탄탄한 프레임워크입니다. 이 글을 통해 APIRouter 클래스를 효과적으로 사용하는 방법을 이해하고, 실무에 적용할 수 있기를 바랍니다.