FastAPI 서버개발, FastAPI에서 Jinja를 사용하는 방법

최근 몇 년간 웹 개발의 트렌드는 변화해왔으며, 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의 기능을 활용하여 더욱 발전하는 웹 개발자가 되어보시기 바랍니다!