FastAPI 서버개발, Jinja, 매크로

FastAPI는 최신 웹 프레임워크로, 비동기 프로그래밍과 타입 힌트를 지원하여 빠른 성능과 개발 편의성을 제공합니다. 본 강좌에서는 FastAPI를 사용한 서버 개발의 기초부터 Jinja2를 사용한 템플릿 렌더링, 그리고 매크로를 사용한 템플릿의 재사용성 향상까지 알아보겠습니다.

1. FastAPI 소개

FastAPI는 Python으로 작성된 현대적인 웹 프레임워크로, 다음과 같은 특징이 있습니다:

  • 신속한 개발
  • 자동 문서화
  • 비동기 요청 처리
  • 타입 검사

FastAPI는 Starlette 프레임워크를 기반으로 하며, Pydantic을 통해 데이터 유효성 검사를 수행합니다. 이러한 특성 덕분에 FastAPI는 RESTful API 개발에 매우 적합합니다.

2. 개발 환경 설정

FastAPI를 사용하기 위해 먼저 Python과 FastAPI를 설치해야 합니다. 아래 명령어로 설치할 수 있습니다:

pip install fastapi uvicorn

추가로 Jinja2 템플릿 엔진도 설치해야 합니다:

pip install jinja2

3. FastAPI 기본 예제

다음은 간단한 FastAPI 서버 예제입니다. 이 서버는 기본적인 GET 및 POST 요청을 처리합니다.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# 데이터 모델 정의
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

# GET 요청 처리
@app.get("/")
async def read_root():
    return {"Hello": "World"}

# POST 요청 처리
@app.post("/items/")
async def create_item(item: Item):
    return item

위 코드를 사용하여 FastAPI 서버를 실행하려면, 다음 명령어를 입력합니다:

uvicorn main:app --reload

이제 localhost:8000에서 서버가 실행되고 있습니다.

4. Jinja2 템플릿 엔진

Jinja2는 Python으로 작성된 템플릿 엔진으로, 파이썬 코드를 HTML 문서에 쉽게 삽입할 수 있도록 해줍니다. FastAPI와 Jinja2를 결합하면 동적인 웹 페이지를 만들 수 있습니다.

4.1 Jinja2 설치

Jinja2는 이미 설치한 상태로 가정하겠습니다. 만약 설치하지 않았다면, 이전 단락의 명령어를 통해 설치하시면 됩니다.

4.2 Jinja2 템플릿 설정

FastAPI와 Jinja2를 연동하기 위해, 다음과 같은 디렉토리 구조를 설정합니다:

project/
│
├── main.py
└── templates/
    └── index.html

이제 index.html 파일을 작성해보겠습니다:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FastAPI & Jinja2</title>
</head>
<body>
    <h1>환영합니다!</h1>
    <p>여기는 FastAPI와 Jinja2로 작성된 웹 페이지입니다.</p>
    <ul>
    {% for item in items %}
        <li>{{ item.name }}: ${{ item.price }}{% if item.is_offer %} (할인 중){% endif %}</li>
    {% endfor %}
    </ul>
</body>
</html>

4.3 FastAPI에서 Jinja2 템플릿 사용하기

이제 FastAPI에서 Jinja2를 사용하여 템플릿을 렌더링할 수 있습니다. 다음과 같은 코드를 main.py에 추가합니다:

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

templates = Jinja2Templates(directory="templates")

@app.get("/items/", response_class=HTMLResponse)
async def read_items(request: Request):
    items = [{"name": "Item 1", "price": 10.5, "is_offer": True},
             {"name": "Item 2", "price": 20.5, "is_offer": False}]
    return templates.TemplateResponse("index.html", {"request": request, "items": items})

이제 localhost:8000/items/로 이동하면, Jinja2 템플릿을 통해 렌더링된 HTML 페이지를 확인할 수 있습니다.

5. Jinja2 매크로 사용하기

매크로는 Jinja2의 강력한 기능으로, 템플릿 내에서 코드의 재사용성을 높여줍니다. 매크로를 사용하면 반복되는 코드 패턴을 간편하게 정의하고 재사용할 수 있습니다.

5.1 매크로 정의

먼저 index.html 파일에 매크로를 추가해보겠습니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FastAPI & Jinja2</title>
</head>
<body>
    <h1>환영합니다!</h1>

    <!-- 매크로 정의 -->
    <{% macro render_item(item) %}>
        <li>{{ item.name }}: ${{ item.price }}{% if item.is_offer %} (할인 중){% endif %}</li>
    <{% endmacro %}>

    <ul>
    {% for item in items %}
        {{ render_item(item) }}
    {% endfor %}
    </ul>
</body>
</html>

5.2 매크로 사용하기

이제 매크로를 정의했으므로, render_item 매크로를 호출하여 각 아이템을 렌더링할 수 있습니다. 앞서 작성했던 read_items 함수는 그대로 유지됩니다.

이렇게 작성한 후, localhost:8000/items/에 접속하면 매크로를 통해 렌더링된 결과를 확인할 수 있습니다.

6. 마치며

이번 강좌에서는 FastAPI를 사용한 웹 서버 개발 방법과 Jinja2 템플릿 엔진 사용법, 그리고 매크로를 통한 코드 재사용성을 높이는 방법에 대해 알아보았습니다. FastAPI는 성능뿐만 아니라 생산성을 높여주는 훌륭한 도구입니다. 이를 통해 여러분의 웹 애플리케이션을 더욱 빠르고 효율적으로 개발할 수 있기를 바랍니다.

추가적으로 FastAPI와 Jinja2에 대한 더 많은 예제 및 유용한 자료는 공식 문서에서 확인하실 수 있습니다.

참고 자료