FastAPI를 사용하여 고성능 API 서비스 구축하기
FastAPI를 사용하여 고성능 API 서비스 구축하기
FastAPI는 현대적이고 빠른(효율적인) 웹 프레임워크로, API 구축을 위해 설계되었습니다. Python 타입 힌트를 기반으로 하며, 비동기 프로그래밍을 지원하여 개발자가 고성능, 고가용성의 지연이 낮은 API 서비스를 구축할 수 있도록 합니다. 본문에서는 FastAPI를 사용하여 고성능 API 서비스를 구축하는 방법을 단계별로 자세히 설명하며, 환경 설정부터 배포까지의 전체 과정을 도와드립니다.
1단계: 환경 준비
개발 환경에 Python 3.6+가 설치되어 있는지 확인해야 합니다. 설치되지 않았다면 Python 공식 웹사이트를 방문하여 다운로드 및 설치하세요.
FastAPI 및 Uvicorn 설치
FastAPI 자체는 서비스를 제공하지 않으며, ASGI 서버가 필요합니다. 여기서는 고성능 ASGI 서버인 Uvicorn을 사용합니다. 다음 명령어를 사용하여 FastAPI와 Uvicorn을 설치할 수 있습니다:
pip install fastapi uvicorn
2단계: 기본 API 구축
간단한 FastAPI 애플리케이션을 만들어 보겠습니다.
애플리케이션 파일 생성
프로젝트 디렉토리에서 `main.py`라는 Python 파일을 생성하고, 다음 코드를 작성합니다:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
위 코드에서 우리는 먼저 FastAPI를 가져오고 `app` 인스턴스를 생성했습니다. 그런 다음, GET 라우트를 정의하여 루트 경로 `/`에 접근할 때 간단한 JSON 응답을 반환합니다.
서버 시작
다음 명령어를 사용하여 FastAPI 서버를 시작합니다:
uvicorn main:app --reload
main: 파일 이름을 의미하며, .py 확장자는 포함하지 않습니다.app: FastAPI 인스턴스를 의미합니다.--reload: 개발 모드에서 파일 변경 시 서버가 자동으로 재시작됩니다.
3단계: 라우트 및 데이터 모델 정의
복잡한 API를 구축하기 위해 Pydantic을 사용하여 데이터 모델을 정의해야 합니다.
데이터 모델 생성
`main.py`에 다음 내용을 추가합니다:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_available: bool = True
이 코드는 Pydantic을 사용하여 `Item`이라는 데이터 모델을 생성하며, 상품 이름, 가격 및 사용 가능 여부의 세 가지 속성을 포함합니다.
새로운 라우트 추가
그 다음, `Item` 타입의 데이터를 수신하기 위한 새로운 POST 라우트를 정의할 수 있습니다:
@app.post("/items/")
async def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
이 라우트에서는 FastAPI가 자동으로 전달된 데이터를 검증하고 이를 `Item` 모델에 매핑합니다.
4단계: 문서 자동 생성
FastAPI의 가장 큰 장점 중 하나는 API 문서를 자동으로 생성할 수 있다는 것입니다. 다음 주소를 통해 확인할 수 있습니다:
- Swagger UI:
http://127.0.0.1:8000/docs - ReDoc:
http://127.0.0.1:8000/redoc
이 생성된 문서에서 API를 인터랙티브하게 테스트하고, 각 라우트의 요청 및 응답 형식을 확인할 수 있습니다.
5단계: 인증 추가
실제 애플리케이션에서는 인증이 중요한 요소입니다. 간단한 역할 기반 인증을 추가해 보겠습니다.
보안 의존성 추가
FastAPI의 Depends 메서드와 OAuth2PasswordBearer를 사용하여 인증을 구현합니다:
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
async def fake_decode_token(token):
return {"sub": token}
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
if user is None:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="유효하지 않은 인증 자격 증명입니다")
return user
라우트 보호
그런 다음, 보호가 필요한 라우트에 인증을 추가할 수 있습니다:
@app.get("/users/me")
async def read_users_me(current_user: dict = Depends(get_current_user)):
return current_user
6단계: FastAPI 애플리케이션 배포
개발이 완료되면 애플리케이션을 클라우드 서버에 배포해야 할 수 있습니다. Docker를 사용하여 배포할 수 있습니다.
Dockerfile 생성
프로젝트 디렉토리에 Dockerfile이라는 파일을 생성하고 다음 내용을 입력합니다:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8
COPY ./app /app
Docker 이미지 빌드
터미널에서 다음 명령어를 사용하여 Docker 이미지를 빌드합니다:
docker build -t myfastapiapp .
Docker 컨테이너 실행
FastAPI 애플리케이션을 실행합니다:
docker run -d --name fastapi -p 80:80 myfastapiapp
결론
본 문서에서는 FastAPI를 사용하여 고성능 API 서비스를 구축하는 방법을 환경 준비부터 기본 API 생성, 라우트 및 데이터 모델 정의, 인증 추가 및 배포의 전체 과정에 대해 자세히 설명했습니다. FastAPI는 현대 API 구축을 간단하고 효율적으로 만들어주는 많은 강력한 기능을 제공합니다. 공식 문서를 통해 더 많은 기능과 특성을 탐색해 보시기 바랍니다. 이 글이 FastAPI를 더 빠르게 익히고 프로젝트 개발 효율성을 높이는 데 도움이 되기를 바랍니다!





