안녕하세요! 오늘은 FastAPI를 사용하여 백엔드 서버를 개발하는 방법에 대해 알아보겠습니다. FastAPI는 현대적인, 빠른 (고성능), 비동기 웹 프레임워크로, Python 3.6 이상에서 작동합니다. RESTful API를 구축하는 데 최적화되어 있으며, API 개발 속도를 빠르게 해주는 유용한 도구입니다. 이 튜토리얼에서는 FastAPI의 설치 방법과 간단한 서버를 만드는 실습을 진행합니다.
FastAPI란?
FastAPI는 Python에서 비동기 API 구축을 쉽게 해주는 웹 프레임워크로, Starlette과 Pydantic 위에 구축되어 있습니다. FastAPI는 데코레이터(Decorator)를 통해 라우트를 쉽게 정의하고, 자동으로 Swagger 문서화 시스템을 생성해줍니다. 특히, 타입 힌트를 기반으로 하여 데이터 유효성 검사 및 자동 완성을 제공하는 점이 큰 장점입니다.
FastAPI 설치하기
FastAPI를 사용하기 위해서는 우선 Python이 설치되어 있어야 합니다. Python이 설치되어 있지 않다면, Python 웹사이트에서 다운로드 후 설치하시기 바랍니다.
1단계: Virtual Environment 설정하기
프로젝트를 진행하기에 앞서, 가상 환경을 사용하는 것을 추천합니다. 가상 환경을 통해 의존성을 분리할 수 있습니다. 아래 명령어로 가상 환경을 생성하고 활성화합니다.
python -m venv fastapi_env
# Windows
fastapi_env\Scripts\activate
# macOS/Linux
source fastapi_env/bin/activate
가상 환경이 활성화되면, 커맨드 프롬프트에 `(fastapi_env)`가 표시됩니다.
2단계: FastAPI 및 Uvicorn 설치하기
FastAPI를 설치하려면 pip를 사용하여 설치할 수 있습니다. Uvicorn은 FastAPI 앱을 실행하는 ASGI 서버입니다.
pip install fastapi uvicorn
3단계: FastAPI 설치 확인하기
FastAPI가 올바르게 설치되었는지 확인하기 위해, 간단한 Python 스크립트를 작성해 보겠습니다. 아래와 같이 main.py
파일을 생성하세요.
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
FastAPI 서버 실행하기
이제 FastAPI 서버를 실행할 준비가 되었습니다. 아래와 같이 다음 명령어를 입력하여 서버를 실행하세요.
uvicorn main:app --reload
여기서 main:app
은 main.py
파일의 app
객체를 참조합니다. --reload
플래그는 코드 변경 시 서버를 자동으로 다시 로드해줍니다.
브라우저에서 http://127.0.0.1:8000
에 접속하면 다음과 같은 JSON 응답을 확인할 수 있습니다.
{"Hello": "World"}
Swagger 문서 확인하기
FastAPI는 자동으로 Swagger UI를 생성하여 API 문서를 제공합니다. 아래 주소로 이동하면 API 문서를 확인할 수 있습니다.
http://127.0.0.1:8000/docs
Swagger UI에서는 우리가 정의한 API의 엔드포인트를 확인하고, 직접 호출해볼 수 있습니다.
FastAPI 기본 구조 소개
위의 예제에서 사용된 기본 FastAPI 구조에 대해 설명하겠습니다. FastAPI의 주요 구성 요소는 다음과 같습니다:
- FastAPI 인스턴스:
app = FastAPI()
로 인스턴스를 생성합니다. 이 ‘app’ 객체는 라우터 및 미들웨어를 포함합니다. - 라우트 정의: @app.get(“/”)는 GET 요청을 처리하는 라우트를 정의합니다. 요청을 받으면
read_root
함수가 호출됩니다. - 응답: JSON 형태로 응답을 반환하며, FastAPI는 자동으로 Content-Type 헤더와 상태 코드를 설정해줍니다.
FastAPI에서 사용할 수 있는 여러 기능들
FastAPI는 다양한 기능을 제공합니다. 몇 가지 주요 기능은 다음과 같습니다:
- 타입 시스템: 파라미터와 응답의 데이터 타입을 명확히 정의하고 유효성 검사를 자동으로 수행합니다.
- 거대한 구성요소: 다양한 인증 및 권한 부여 옵션을 지원합니다.
- 비동기 프로그래밍:
async/await
을 활용하여 비동기 요청 처리 가능. - 데이터베이스 통합: SQLAlchemy와 같이 다른 ORM을 쉽게 통합할 수 있습니다.
기본적인 CRUD API 구현해보기
이제 FastAPI의 기본 구조를 이해했으니, 간단한 CRUD(Create, Read, Update, Delete) API를 구현해 보겠습니다. 아래는 메모를 관리하는 API의 예입니다.
# main.py
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Memo(BaseModel):
id: int
content: str
memo_list = []
@app.post("/memos/", response_model=Memo)
def create_memo(memo: Memo):
memo_list.append(memo)
return memo
@app.get("/memos/", response_model=List[Memo])
def read_memos():
return memo_list
@app.put("/memos/{memo_id}", response_model=Memo)
def update_memo(memo_id: int, memo: Memo):
for idx, m in enumerate(memo_list):
if m.id == memo_id:
memo_list[idx] = memo
return memo
return None
@app.delete("/memos/{memo_id}")
def delete_memo(memo_id: int):
global memo_list
memo_list = [m for m in memo_list if m.id != memo_id]
return {"message": "삭제되었습니다."}
CRUD API 설명
- Create:
/memos/
경로로 POST 요청을 보내면 새로운 메모를 생성할 수 있습니다. - Read:
/memos/
경로로 GET 요청을 보내면 모든 메모를 조회할 수 있습니다. - Update:
/memos/{memo_id}
경로로 PUT 요청을 보내면 특정 메모를 수정할 수 있습니다. - Delete:
/memos/{memo_id}
경로로 DELETE 요청을 보내면 특정 메모를 삭제할 수 있습니다.
결론
이번 포스트에서는 FastAPI의 설치 방법과 기본적인 서버 구현 방법에 대해 알아보았습니다. FastAPI는 빠르고 유연한 API 개발을 할 수 있게 도와주며, 비동기 처리가 가능하기 때문에 높은 성능을 제공합니다. 앞으로 더 많은 기능을 활용하여 고급 API를 개발할 수 있습니다. 추가적인 학습을 위해 FastAPI의 공식 문서를 참고하시기를 권장합니다.
시청해 주셔서 감사합니다! 여러분의 프로젝트에 도움이 되었기를 바랍니다.