FastAPI는 웹 API 개발을 위해 설계된 현대적이고 빠른 프레임워크로, Python으로 작성되어 있으며 Starlette와 Pydantic을 기반으로 하고 있습니다. FastAPI는 비동기 프로그래밍을 지원하여 높은 성능을 자랑하며, 코드 작성 시 자동으로 OpenAPI와 JSON Schema를 생성해줍니다. 이번 글에서는 FastAPI 서버 개발 방법을 다루고, Jinja 템플릿 언어를 사용하여 HTML을 구성하는 방법을 설명하겠습니다. 또한, 반복문을 활용하여 동적으로 HTML 콘텐츠를 생성하는 방법을 함께 알아보겠습니다.
1. FastAPI 소개
FastAPI는 Python 3.6 이상에서 사용할 수 있는 웹 프레임워크로, RESTful API를 간편하게 구축할 수 있게 해줍니다. FastAPI의 가장 큰 특징은 다음과 같습니다.
- 비동기 지원: FastAPI는 async/await 구문을 지원하여 비동기 요청을 처리할 수 있습니다.
- 자동 문서화: 작성한 API에 대해 자동으로 OpenAPI 문서를 생성합니다.
- 데이터 검증: Pydantic을 사용하여 API 요청 및 응답 데이터의 검증이 용이합니다.
2. FastAPI 설치
FastAPI를 설치하기 위해서는 Python이 설치되어 있어야 하며, 다음과 같은 명령어를 사용하여 설치할 수 있습니다.
pip install fastapi uvicorn
3. FastAPI 기본 설정
FastAPI를 처음 설정해보겠습니다. 아래는 기본적인 FastAPI 서버의 예제입니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
위의 코드는 FastAPI 서버를 생성하고, 루트 경로(“/”)에 GET 요청이 들어오면 “Hello, World”라는 JSON 응답을 생성합니다. 이 코드를 실행하기 위해서는 다음 명령어를 사용합니다.
uvicorn main:app --reload
여기서 “main”은 Python 파일의 이름이며, “app”은 FastAPI 인스턴스 이름입니다. –reload 플래그를 사용하면 코드 변경 시 자동으로 서버를 재시작합니다.
4. Jinja 템플릿 소개
Jinja는 Python 웹 프레임워크에서 널리 사용되는 템플릿 엔진입니다. Jinja를 사용하면 HTML 파일과 Python 코드를 분리하여 웹 애플리케이션의 관리 및 유지보수를 용이하게 할 수 있습니다. FastAPI는 Jinja를 통해 HTML 템플릿을 렌더링할 수 있습니다.
5. FastAPI에서 Jinja 사용하기
FastAPI에서 Jinja를 사용하기 위해 먼저 Jinja2를 설치해야 합니다.
pip install jinja2
다음으로, Jinja 템플릿을 사용하기 위한 FastAPI의 기본 설정을 살펴보겠습니다.
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
여기서 “templates”라는 디렉토리를 생성하고 그 안에 “index.html” 파일을 만들어야 합니다. “TemplateResponse”를 사용하여 Jinja 템플릿을 렌더링하고 있습니다.
6. Jinja 템플릿에 반복문 사용하기
Jinja에서는 Python의 리스트나 딕셔너리와 같은 iterable 객체를 쉽게 반복할 수 있는 기능을 제공합니다. 아래는 Python 리스트를 반복하여 HTML 리스트를 생성하는 예제입니다.
@app.get("/items/", response_class=HTMLResponse)
async def read_items(request: Request):
items = ["Apple", "Banana", "Cherry"]
return templates.TemplateResponse("items.html", {"request": request, "items": items})
위 코드에서 “items” 리스트를 FastAPI 경로(“/items/”)에 대한 GET 요청에 대한 응답으로 HTML 템플릿에 전달합니다. 이제 “items.html” 파일을 생성하여 Jinja 반복문을 사용하여 리스트 항목을 출력해보겠습니다.
Items List
과일 목록
{% for item in items %}
- {{ item }}
{% endfor %}
위의 “items.html” 파일에서 Jinja의 {% for %} 구문을 사용하여 “items” 리스트의 각 항목을 반복하여 출력하고 있습니다. 이를 통해 웹 페이지에 동적으로 HTML 콘텐츠를 생성할 수 있습니다.
7. Jinja의 조건문 사용하기
반복문과 함께 Jinja에서는 조건문도 사용할 수 있습니다. 예를 들어, 과일 목록에서 특정 조건에 따라 다른 내용을 출력하도록 설정할 수 있습니다.
Items List
과일 목록
{% for item in items %}
- {{ item }}
{% if item == "Banana" %}
(이것은 바나나입니다!)
{% endif %}
{% endfor %}
위의 예제에서는 “item”이 “Banana”일 때, 추가 메시지를 출력하도록 설정하였습니다. Jinja의 조건문을 통해 HTML 템플릿 내에서 동적인 콘텐츠를 쉽게 제어할 수 있습니다.
8. FastAPI와 Jinja를 활용한 전체 예제
지금까지 배운 내용을 바탕으로 FastAPI와 Jinja를 활용한 전체 예제를 만들어 보겠습니다. 프로젝트 폴더 구조는 다음과 같습니다.
project/
│
├── main.py
└── templates/
├── index.html
└── items.html
이제 “main.py” 파일에 전체 코드를 작성해보겠습니다.
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
@app.get("/items/", response_class=HTMLResponse)
async def read_items(request: Request):
items = ["Apple", "Banana", "Cherry"]
return templates.TemplateResponse("items.html", {"request": request, "items": items})
이제 “index.html” 파일과 “items.html” 파일은 이전에 설명한 내용과 동일하게 작성하십시오. FastAPI 서버를 실행한 후, “/” 경로에 접속하여 메인 페이지를 확인하고 “/items/” 경로에 접속하여 과일 목록을 볼 수 있습니다.
9. 결론
이번 강좌에서는 FastAPI를 사용하여 웹 API를 개발하는 방법과 Jinja 템플릿을 통해 HTML을 동적으로 생성하는 방법, 그리고 반복문과 조건문을 활용하여 보다 복잡한 UI를 구성하는 방법을 배웠습니다. FastAPI의 매력은 그 간결함과 비동기 처리 능력, 그리고 자동 문서화 기능에 있습니다. 앞으로 FastAPI와 Jinja를 활용하여 더욱 다양한 웹 애플리케이션을 개발해보시길 바랍니다.
10. 다음 단계
더 나아가 FastAPI의 고급 기능인 유저 인증, 데이터베이스 통합, 비동기 작업 등을 학습하여 실무에 적용할 수 있는 방향으로 발전시켜 보십시오. FastAPI의 공식 문서도 참고하시면 많은 도움이 될 것입니다.