최근 몇 년 동안, 서버리스 아키텍처는 개발자들 사이에서 인기를 얻고 있습니다. 이는 전통적인 서버 구축과 관리의 복잡함에서 벗어나, 코드를 작성하고 배포하는 데 집중할 수 있게 해줍니다. 본 글에서는 FastAPI를 활용하여 서버리스 아키텍처를 구축하는 방법에 대해 자세히 설명하겠습니다.
1. 서버리스 아키텍처란?
서버리스 아키텍처는 개발자가 서버를 직접 관리하지 않고 클라우드 서비스 제공업체에 의해 자동으로 스케일링되고 관리되는 웹 애플리케이션을 구축하는 방법입니다. 이 때 사용되는 서버는 일시적이며 불필요한 서버 관리 작업으로부터 해방될 수 있습니다.
서버리스 아키텍처의 장점은 다음과 같습니다:
- 비용 효율성: 사용한 만큼만 지불하므로, 유지비용이 적고 비용을 절감할 수 있습니다.
- 자동 확장: 트래픽이 증가할 때 자동으로 리소스를 할당하므로 수요에 맞춰 조정이 가능합니다.
- 빠른 배포: 개발자는 비즈니스 로직에 집중하고 인프라 관리에서 벗어날 수 있습니다.
2. FastAPI란?
FastAPI는 Python을 사용하여 API를 구축하기 위한 매우 효율적인 웹 프레임워크입니다. 이는 비동기 프로그래밍을 지원하고, 자동으로 OpenAPI 및 JSON Schema 문서를 생성하며, 빠른 성능을 자랑합니다. FastAPI를 선택하는 이유는 다음과 같습니다:
- 높은 성능: Starlette를 기반으로 하여 높은 처리량을 자랑합니다.
- 쉬운 사용법: 기초적인 Python 지식만으로도 쉽게 API를 구축할 수 있습니다.
- 유효성 검사: Pydantic을 사용하여 데이터 유효성을 자동으로 검사합니다.
3. FastAPI와 서버리스: AWS Lambda로 시작하기
FastAPI를 서버리스 아키텍처에서 사용할 수 있는 곳 중 하나는 AWS Lambda입니다. AWS Lambda는 이벤트 기반으로 서버 코드가 실행되는 컴퓨팅 서비스입니다. 이 연재에서는 FastAPI 애플리케이션을 AWS Lambda에서 실행하는 방법을 설명하겠습니다.
3.1. AWS Lambda와 API Gateway 설정하기
FastAPI 애플리케이션을 AWS Lambda에서 실행할 수 있도록 하기 위해, AWS Lambda와 Amazon API Gateway를 설정해야 합니다.
- AWS 계정을 만들고 AWS Management Console에 로그인합니다.
- 서비스 목록에서 “Lambda”를 선택한 후 “함수 생성”을 클릭합니다.
- 함수 이름을 입력하고 런타임을 “Python 3.x”로 설정 후 “함수 생성”을 클릭합니다.
- 함수가 생성되면, “API Gateway” 트리거를 추가합니다.
3.2. FastAPI 애플리케이션 코드 작성하기
FastAPI 애플리케이션을 작성해 보겠습니다. 아래 코드는 기본적인 FastAPI 앱의 예입니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
위 코드는 FastAPI 앱을 생성하고 두 개의 엔드포인트를 정의합니다. 첫 번째 엔드포인트는 루트 URL로 요청받을 때 “Hello, World!” 메시지를 반환하며, 두 번째 엔드포인트는 아이템 ID와 쿼리 파라미터를 받아 해당 정보를 반환합니다.
3.3. AWS Lambda에 FastAPI 배포하기
AWS Lambda에 FastAPI 애플리케이션을 배포하려면, Zappa라는 도구를 사용할 수 있습니다. Zappa는 Python 웹 애플리케이션을 서버리스 환경에서 손쉽게 배포할 수 있게 도와주는 프레임워크입니다. 아래 단계로 진행해 보겠습니다.
- Zappa 설치하기:
- Zappa 설정 파일 생성하기:
- 배포하기:
pip install zappa
zappa init
zappa deploy
3.4. CORS 설정하기
서버리스 아키텍처에서 FastAPI 애플리케이션이 다른 도메인에서 요청을 받을 수 있도록 CORS(Cross-Origin Resource Sharing) 설정이 필요할 수 있습니다. FastAPI에서는 CORS 미들웨어를 쉽게 추가할 수 있습니다.
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 허용할 도메인 목록
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
4. FastAPI와 데이터베이스 연동하기
FastAPI와 데이터베이스를 연결하여 실제 애플리케이션을 만드는 것도 가능합니다. SQLAlchemy를 사용하여 FastAPI와 관계형 데이터베이스를 쉽게 연동할 수 있습니다.
4.1. SQLAlchemy 설치하기
pip install sqlalchemy databases
4.2. FastAPI로 데이터베이스 CRUD 작업 구현하기
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
price = Column(Integer)
Base.metadata.create_all(bind=engine)
@app.post("/items/")
async def create_item(item: Item):
db = SessionLocal()
db.add(item)
db.commit()
db.refresh(item)
db.close()
return item
4.3. 비동기 데이터베이스 연결
FastAPI는 비동기 작업을 지원하므로, 데이터베이스 연결 시 비동기 ORM 라이브러리를 사용할 수도 있습니다. databases 라는 라이브러리를 활용하여 비동기로 데이터베이스와 연결해 보겠습니다.
import databases
database = databases.Database(DATABASE_URL)
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
@app.post("/async-items/")
async def create_async_item(item: Item):
query = Item.__table__.insert().values(name=item.name, price=item.price)
last_record_id = await database.execute(query)
return {**item.dict(), "id": last_record_id}
5. 테스트 및 디버깅
FastAPI는 내장된 테스트 클라이언트를 제공하여 API를 쉽게 테스트할 수 있습니다. pytest와 함께 사용해 보겠습니다. FastAPI 앱을 테스트하려면, 다음과 같이 작성할 수 있습니다.
from fastapi.testclient import TestClient
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, World!"}
6. 결론
FastAPI와 서버리스 아키텍처는 함께 사용될 때 고성능의 비즈니스 로직을 처리할 수 있는 훌륭한 조합이 됩니다. AWS Lambda와 같은 서버리스 플랫폼을 활용하여, 트래픽 변화에 따른 유연한 리소스 관리가 가능합니다. FastAPI의 간결한 문법과 빠른 개발 속도로 인해, 개발자들은 애플리케이션의 구현에 더욱 집중하고 개선할 수 있습니다.
오늘 다룬 내용을 바탕으로 실습을 진행하고, 여러분의 프로젝트에 FastAPI와 서버리스 아키텍처를 접목해 보시기 바랍니다. 빠른 성장과 혁신을 위한 좋은 선택이 될 것입니다.