최근 몇 년간 웹 개발의 트렌드는 변화해왔으며, Python 언어의 인기도 그에 힘입어 나란히 증가하고 있습니다. FastAPI는 비동기 프로그래밍을 지원하는 현대적인 웹 프레임워크로, 성능과 사용 편의성을 모두 갖춘 특징을 가지고 있습니다. 본 강좌에서는 FastAPI를 이용하여 백엔드 서버를 개발하는 방법과 함께, Jinja 템플릿 엔진을 사용하여 동적인 HTML 페이지를 생성하는 방법에 대해 깊이 있게 다루어보겠습니다.
목차
- 1. FastAPI 개요
- 2. Jinja 템플릿 엔진 이해하기
- 3. FastAPI와 Jinja 연동하기
- 4. 실제 예제: 기본 FastAPI 서버 구축하기
- 5. Jinja를 활용한 동적 HTML 페이지 생성하기
- 6. 결론 및 향후 학습 방향
1. FastAPI 개요
FastAPI는 Python 3.6+부터 사용할 수 있는 웹 프레임워크로, RESTful API를 쉽게 개발할 수 있도록 도와줍니다. FastAPI는 다음과 같은 주요 특징들이 있습니다:
- 자동 문서화: Swagger UI를 통해 API 문서를 자동으로 생성합니다.
- 높은 성능: Starlette를 기반으로 하여 비동기 러닝을 지원합니다.
- 타입 힌트: Python의 타입 힌트를 활용하여 코드의 가독성과 안전성을 향상시킵니다.
2. Jinja 템플릿 엔진 이해하기
Jinja는 Python에서 사용할 수 있는 가장 인기 있는 템플릿 엔진으로, HTML 페이지를 동적으로 생성하는 데 유용합니다. Jinja의 주된 기능은 다음과 같습니다:
- 템플릿 상속: 기본 구조를 설정하고, 필요에 따라 자식 템플릿에서 이를 상속받아 사용할 수 있습니다.
- 조건문 및 반복문 지원: Jinja는 데이터의 조건에 따라 HTML을 구성할 수 있는 기능을 제공합니다.
- 필터 기능: 템플릿에서 데이터를 원하는 형태로 변환할 수 있는 다양한 필터를 제공합니다.
3. FastAPI와 Jinja 연동하기
FastAPI는 Jinja 템플릿 엔진과의 통합이 용이하여, HTML 페이지를 생성하는 데 필요한 설정이 간단합니다. 다음은 FastAPI와 Jinja를 연동하는 기본적인 방법입니다:
3.1. FastAPI 설치하기
pip install fastapi uvicorn jinja2
3.2. 기본 프로젝트 구조
프로젝트의 기본 폴더 구조는 다음과 같이 설정합니다:
- /your_project
- main.py
- /templates
- index.html
3.3. FastAPI 앱과 Jinja 설정하기
이제 FastAPI 애플리케이션을 설정하고 Jinja 템플릿 엔진을 등록해 보겠습니다:
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import Request
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
4. 실제 예제: 기본 FastAPI 서버 구축하기
이제 기본 FastAPI 서버를 구축하는 방법을 알아보겠습니다. 이전에 설정한 main.py
파일에 아래의 코드를 추가하면 됩니다:
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import Request
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/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
위 코드는 FastAPI 애플리케이션을 설정하고, 두 개의 경로를 정의하는 작업을 수행합니다. 첫 번째 경로는 루트 경로이고, 두 번째 경로는 동적 경로로, 특정 item ID를 입력받아 해당 값을 JSON 형태로 반환합니다.
5. Jinja를 활용한 동적 HTML 페이지 생성하기
이제 Jinja 템플릿을 활용하여 HTML 페이지를 동적으로 생성해보겠습니다. templates/index.html
파일을 아래와 같이 생성합니다:
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>FastAPI와 Jinja 예제</title>
</head>
<body>
<h1>안녕하세요, FastAPI와 Jinja를 사용하여 동적으로 생성된 페이지입니다.</h1>
<p>현재 접속한 경로: {{ request.url.path }}</p>
</body>
</html>
이 HTML 파일은 FastAPI에서 전달한 request
객체의 URL 경로를 출력합니다. 이제 FastAPI 서버를 실행하고 웹 브라우저에서 확인해보겠습니다:
uvicorn main:app --reload
이제 http://127.0.0.1:8000/ 에 접근할 수 있습니다. 위에서 설정한 HTML 페이지가 렌더링 되어 표시될 것입니다. 또한, /items/1와 같은 경로에 접근하면 JSON 형태로 아이템 ID를 확인할 수 있습니다.
6. 결론 및 향후 학습 방향
FastAPI와 Jinja 템플릿 엔진을 활용하여 동적인 웹 페이지를 쉽게 구축하는 방법에 대해 살펴보았습니다. FastAPI의 강력한 기능은 REST API 개발 뿐만 아니라 효율적인 웹 애플리케이션 작성에도 큰 도움을 줍니다. 향후 이 주제로 더 깊이 있는 학습을 원하신다면, 다음과 같은 주제를 고려해 보시기 바랍니다:
- FastAPI의 OAuth2 및 JWT 인증
- 데이터베이스와의 통합 (SQLAlchemy, Tortoise-ORM 등)
- 비동기 작업 처리 (Celery 등)
최신 트렌드에 맞추어 FastAPI의 기능을 활용하여 더욱 발전하는 웹 개발자가 되어보시기 바랍니다!