Django Templates 심화: 고급 기능과 최적화 기법
안녕하세요, Django 개발자 여러분! 오늘은 기초에 이어서 Django Templates 심화 기능에 대해 알아볼 거예요. 기본적인 템플릿 사용법은 이제 익숙하시죠? 이제 한 단계 더 나아가 템플릿을 더욱 효율적으로 사용하고, 프로젝트를 한층 더 강력하게 만들어볼 시간입니다. 여러분의 Django 실력을 한 단계 업그레이드할 준비되셨나요? 자, 시작해볼까요?
Django Templates 심화 – 템플릿 상속

Django Templates의 가장 강력한 기능 중 하나는 바로 템플릿 상속입니다. 이를 통해 코드 중복을 줄이고 일관된 레이아웃을 유지할 수 있죠.
기본 템플릿 만들기
먼저 base.html이라는 기본 템플릿을 만들어봅시다.
<!DOCTYPE html>
<html lang="ko">
<!-- HTML5 문서의 시작을 선언하고, 주 언어를 한국어로 지정 -->
<head>
<meta charset="UTF-8">
<!-- 문서의 문자 인코딩을 UTF-8로 설정 -->
<title>{% block title %}My Django Site{% endblock %}</title>
<!-- 페이지 제목을 위한 블록. 자식 템플릿에서 재정의 가능 -->
{% block extra_head %}{% endblock %}
<!-- 추가적인 head 요소를 위한 빈 블록. 필요시 자식 템플릿에서 내용 추가 가능 -->
</head>
<body>
<header>
{% block header %}
<h1>Welcome to My Site</h1>
{% endblock %}
<!-- 헤더 섹션을 위한 블록. 기본 환영 메시지 포함. 자식 템플릿에서 변경 가능 -->
</header>
<main>
{% block content %}
{% endblock %}
<!-- 메인 콘텐츠를 위한 빈 블록. 각 페이지의 주요 내용이 여기에 들어감 -->
</main>
<footer>
{% block footer %}
<p>© 2025 My Django Site</p>
{% endblock %}
<!-- 푸터 섹션을 위한 블록. 기본 저작권 정보 포함. 자식 템플릿에서 수정 가능 -->
</footer>
</body>
</html>템플릿 상속 사용하기
이제 이 기본 템플릿(base.html)을 상속받아 새로운 페이지를 만들어봅시다.
{% extends "base.html" %}
<!-- base.html 템플릿을 상속받음을 선언 -->
{% block title %}Welcome Page{% endblock %}
<!-- base.html의 title 블록을 "Welcome Page"로 대체 -->
{% block content %}
<h2>환영합니다!</h2>
<p>이 페이지는 Django Template 상속을 사용해 만들어졌어요.</p>
{% endblock %}
<!-- base.html의 content 블록에 새로운 내용을 추가 -->
{% block extra_head %}
<style>
h2 { color: #007bff; }
</style>
{% endblock %}
<!-- base.html의 extra_head 블록에 CSS 스타일을 추가 -->이렇게 하면 기본 구조는 유지하면서 필요한 부분만 수정할 수 있어요. 정말 편리하죠?
커스텀 템플릿 태그와 필터 만들기
Django에서 제공하는 기본 태그와 필터만으로는 부족하다고요? 걱정 마세요. 우리가 직접 만들 수 있답니다!

커스텀 필터 만들기
먼저 myapp/templatetags/custom_filters.py 파일을 만들고 다음과 같이 작성해보세요.
from django import template # Django의 template 모듈을 임포트
register = template.Library() # 새로운 템플릿 태그 라이브러리 생성
@register.filter # add_exclamation 함수를 템플릿 필터로 등록
def add_exclamation(value):
return f"{value}!" # 주어진 값 뒤에 느낌표를 추가
@register.filter(name='multiply') # multiply_by 함수를 'multiply'라는 이름의 필터로 등록
def multiply_by(value, arg):
return value * arg # 주어진 값을 인자로 받은 수와 곱함
# 사용 예:
# {{ "Hello"|add_exclamation }} -> 출력: Hello!
# {{ 5|multiply:3 }} -> 출력: 15
# 주의: 이 파일을 사용하려면 앱의 templatetags 폴더에 저장하고,
# 템플릿에서 {% load 파일이름 %}으로 로드해야 합니다.
이제 템플릿에서 이렇게 사용할 수 있어요:
{% load custom_filters %}
<!-- custom_filters.py 파일에 정의된 커스텀 필터들을 로드합니다. -->
<p>{{ "Hello"|add_exclamation }}</p>
<!-- "Hello" 문자열에 add_exclamation 필터를 적용합니다.
결과: <p>Hello!</p> -->
<p>{{ 5|multiply:3 }}</p>
<!-- 숫자 5에 multiply 필터를 적용하고 인자로 3을 전달합니다.
결과: <p>15</p> -->커스텀 태그 만들기
태그를 만드는 것도 어렵지 않아요. myapp/templatetags/custom_tags.py 파일을 만들고,
from django import template
# Django의 template 모듈을 임포트합니다.
from django.utils.safestring import mark_safe
# HTML을 안전하게 렌더링하기 위한 mark_safe 함수를 임포트합니다.
register = template.Library()
# 새로운 템플릿 태그 라이브러리를 생성합니다.
@register.simple_tag
# bootstrap_alert 함수를 simple_tag로 등록합니다.
def bootstrap_alert(message, alert_type='info'):
# message: 알림에 표시할 메시지
# alert_type: 알림의 유형 (기본값은 'info')
return mark_safe(f'<div class="alert alert-{alert_type}">{message}</div>')
# Bootstrap 스타일의 알림 div를 생성하고, mark_safe를 사용해 안전한 HTML로 표시합니다.
# 사용 예:
# {% bootstrap_alert "주의하세요!" "warning" %}
# 출력: <div class="alert alert-warning">주의하세요!</div>
# 주의: 이 파일을 사용하려면 앱의 templatetags 폴더에 저장하고,
# 템플릿에서 {% load 파일이름 %}으로 로드해야 합니다.템플릿에서는 이렇게 사용하면 됩니다.
{% load custom_tags %}
<!-- custom_tags.py 파일에 정의된 커스텀 태그들을 로드합니다. -->
{% bootstrap_alert "주의하세요!" "warning" %}
<!-- bootstrap_alert 커스텀 태그를 호출합니다.
첫 번째 인자 "주의하세요!"는 알림에 표시될 메시지입니다.
두 번째 인자 "warning"은 알림의 유형을 지정합니다.
이 태그는 다음과 같은 HTML을 생성합니다:
<div class="alert alert-warning">주의하세요!</div>
-->템플릿 최적화 기법
Django Template을 사용할 때 성능을 높이는 방법도 있어요. 몇 가지 팁을 소개해드릴게요.
- 템플릿 프래그먼트 캐싱: 자주 변경되지 않는 부분은 캐싱해두면 좋아요.
{% load cache %}
{# cache 템플릿 태그 라이브러리를 로드합니다 #}
{% cache 500 sidebar %}
{# 500초 동안 'sidebar'라는 이름으로 내부 콘텐츠를 캐시합니다 #}
{# 캐시 기간 동안 후속 요청은 저장된 버전을 사용하여 성능을 향상시킵니다 #}
<!-- 캐시할 내용 -->
{# 이 부분에 실제로 캐시하고자 하는 템플릿 코드가 들어갑니다 #}
{# 예: 데이터베이스 쿼리 결과, 복잡한 계산 등 #}
{% endcache %}
{# 캐시 블록의 끝을 나타냅니다 #}- 불필요한 컨텍스트 변수 제거:
with태그를 사용해 복잡한 변수를 단순화할 수 있어요.
{% with total=business.employees.count %}
{% comment %}
with 태그를 사용하여 business.employees.count의 결과를 total 변수에 할당합니다
이는 복잡한 계산이나 데이터베이스 쿼리를 한 번만 실행하고 그 결과를 재사용할 때 유용합니다
{% endcomment %}
{{ total }} employee{{ total|pluralize }}
{# total 변수의 값을 출력합니다 #}
{# pluralize 필터를 사용하여 total이 1보다 크면 's'를 추가합니다 #}
{# 예: 1 employee, 2 employees, 0 employees #}
{% endwith %}
{# with 블록의 끝을 나타냅니다. 이 이후로는 total 변수를 사용할 수 없습니다 #}- 데이터베이스 쿼리 최소화: 템플릿에서 반복문을 사용할 때 주의가 필요해요. 가능하면 뷰에서 미리 데이터를 처리해주세요.
보안 고려사항

Django Template은 기본적으로 XSS 공격을 방지하기 위해 자동으로 이스케이프 처리를 해줘요. 하지만 safe 필터를 사용할 때는 주의가 필요합니다.
{{ user_input|safe }} <!-- 주의: 사용자 입력을 그대로 출력합니다 -->마무리
Django Template의 심화 기능들을 살펴봤는데요, 어떠셨나요? 템플릿 상속, 커스텀 태그와 필터, 그리고 최적화 기법까지. 이 기능들을 잘 활용하면 더욱 강력하고 효율적인 Django 애플리케이션을 만들 수 있을 거예요. 계속해서 실험하고 연습해보세요. 여러분의 Django 실력이 한층 더 업그레이드될 거예요! Django Template의 심화 기능들, 재미있게 배우셨나요? 이제 여러분의 Django 프로젝트가 한층 더 멋져질 거예요. 화이팅!
#용어 해설
- 템플릿 상속: 기본 템플릿을 만들고 다른 템플릿에서 이를 확장하여 사용하는 기법
- 커스텀 태그/필터: 개발자가 직접 만든 템플릿 태그나 필터
- 컨텍스트: 템플릿에 전달되는 변수들의 집합
- 이스케이프: 특수 문자를 HTML 엔티티로 변환하여 XSS 공격을 방지하는 기법
- 캐싱: 자주 사용되는 데이터를 미리 저장해두어 성능을 향상시키는 기법







