← 블로그 홈

Django 5.0 & 5.1 주요 기능 리뷰: 웹 개발이 더 쉬워졌다

Django 5.0과 5.1이 출시되면서 웹 개발 생산성과 접근성이 크게 향상되었습니다. 이 글에서는 최신 Django 버전들의 주요 기능들을 자세히 살펴보고, 개발 현장에서 어떻게 활용할 수 있는지 알아보겠습니다.

Django 5.0과 5.1이 출시되면서 웹 개발 생산성과 접근성이 크게 향상되었습니다. 이 글에서는 최신 Django 버전들의 주요 기능들을 자세히 살펴보고, 개발 현장에서 어떻게 활용할 수 있는지 알아보겠습니다.

📊 Django 5.1 주요 기능

1. {% raw %}{% querystring %}{% endraw %} 템플릿 태그

무엇이 바뀌었나?

  • 기존: 복잡한 쿼리 스트링 처리 로직
  • 새로움: 간단한 템플릿 태그로 URL 파라미터 조작

기존 방식 (복잡함)

{% raw %}
{# 기존 방식 - 매우 복잡한 코드 #}
<a href="?{% for key, values in request.GET.iterlists %}
  {% if key != "page" %}
    {% for value in values %}
      {{ key }}={{ value }}&amp;
    {% endfor %}
  {% endif %}
{% endfor %}page={{ page.next_page_number }}">Next page</a>
{% endraw %}

새로운 방식 (간단함)

{% raw %}
{# Django 5.1 방식 - 매우 간단 #}
<a href="{% querystring page=page.next_page_number %}">Next page</a>
{% endraw %}

실제 활용 예시

{% raw %}
<!-- 필터 옵션 추가 -->
<a href="{% querystring category='electronics' %}">전자제품</a>

<!-- 정렬 옵션 변경 -->
<a href="{% querystring sort='price' order='desc' %}">가격순</a>

<!-- 검색 쿼리 유지하면서 페이지 이동 -->
<a href="{% querystring page=2 %}">다음 페이지</a>
{% endraw %}

2. PostgreSQL 연결 풀링

성능 개선의 핵심

  • 데이터베이스 연결 시간 단축
  • 동시 연결 수 효율적 관리
  • 높은 트래픽 환경에서 안정성 향상

설정 방법

# settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "mydb",
        "USER": "myuser",
        "PASSWORD": "mypassword",
        "HOST": "localhost",
        "PORT": "5432",
        "OPTIONS": {
            "pool": {
                "min_size": 2,      # 최소 연결 수
                "max_size": 10,     # 최대 연결 수
                "timeout": 30,      # 타임아웃 (초)
            }
        },
    },
}

3. LoginRequiredMiddleware

기본 인증 강화

  • 애플리케이션 전체에 로그인 필수 적용
  • 특정 뷰만 예외 처리 가능
  • 보안 강화와 개발 효율성 증대

설정 방법

# settings.py
MIDDLEWARE = [
    # ... 기존 미들웨어
    "django.contrib.auth.middleware.LoginRequiredMiddleware",
]

예외 처리

# views.py
from django.contrib.auth.decorators import login_not_required

@login_not_required
def public_view(request):
    return render(request, 'public.html')

@login_not_required
def api_endpoint(request):
    return JsonResponse({'status': 'public'})

4. 비동기 세션 지원

세션 API 비동기 지원

  • 기존 동기 메소드: get(), set(), delete()
  • 새로운 비동기 메소드: aget(), aset(), adelete()

사용 예시

# views.py
async def async_session_view(request):
    # 비동기 세션 읽기
    user_id = await request.session.aget('user_id')
    
    # 비동기 세션 설정
    await request.session.aset('last_visit', timezone.now())
    
    # 비동기 세션 삭제
    await request.session.adelete('temporary_data')
    
    return JsonResponse({'status': 'success'})

🚀 Django 5.0 주요 기능

1. 관리자 페이지 패싯 필터

데이터 분석 기능 강화

  • 필터별 데이터 개수 표시
  • 사용자 경험 개선
  • 대용량 데이터 관리 효율성 증대

활성화 방법

# admin.py
class ProductAdmin(admin.ModelAdmin):
    list_filter = ['category', 'brand', 'status']
    show_facets = admin.ShowFacets.ALWAYS  # 항상 표시
    # show_facets = admin.ShowFacets.NEVER   # 숨기기
    # show_facets = admin.ShowFacets.AUTO    # 자동 (기본값)

2. 폼 필드 그룹 템플릿

템플릿 간소화

  • 복잡한 폼 렌더링 로직 단순화
  • 재사용 가능한 필드 그룹
  • 접근성 개선

기존 방식 (복잡함)

{% raw %}
<div>
  {{ form.name.label_tag }}
  {% if form.name.help_text %}
    <div class="helptext">{{ form.name.help_text|safe }}</div>
  {% endif %}
  {{ form.name.errors }}
  {{ form.name }}
</div>
{% endraw %}

새로운 방식 (간단함)

{% raw %}
<div>
  {{ form.name.as_field_group }}
</div>
{% endraw %}

3. 데이터베이스 계산 기본값 (db_default)

성능과 일관성 향상

  • 데이터베이스 레벨에서 기본값 처리
  • 애플리케이션 성능 개선
  • 데이터 일관성 보장

사용 예시

# models.py
from django.db import models
from django.db.models.functions import Now, Pi

class User(models.Model):
    username = models.CharField(max_length=100)
    age = models.IntegerField(db_default=18)           # 기본 나이
    created_at = models.DateTimeField(db_default=Now()) # 현재 시간
    
class Circle(models.Model):
    radius = models.FloatField()
    circumference = models.FloatField(db_default=2 * Pi()) # 원주율 계산

4. 생성 필드 (GeneratedField)

계산된 필드 자동 관리

  • 다른 필드 값으로부터 자동 계산
  • 데이터베이스 레벨 처리
  • 일관성과 성능 향상

실제 활용 예시

# models.py
from django.db import models
from django.db.models import F

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    tax_rate = models.DecimalField(max_digits=5, decimal_places=4)
    
    # 세금 포함 가격 자동 계산
    total_price = models.GeneratedField(
        expression=F("price") * (1 + F("tax_rate")),
        output_field=models.DecimalField(max_digits=10, decimal_places=2),
        db_persist=True,
    )

class Rectangle(models.Model):
    width = models.FloatField()
    height = models.FloatField()
    
    # 면적 자동 계산
    area = models.GeneratedField(
        expression=F("width") * F("height"),
        output_field=models.FloatField(),
        db_persist=True,
    )

5. 필드 선택지 문법 개선

더 유연한 choices 정의

  • 딕셔너리 형태 지원
  • 함수 형태 지원
  • Enum 직접 사용 가능

기존 방식

# models.py
class Winner(models.Model):
    MEDAL_CHOICES = [
        ('gold', '금메달'),
        ('silver', '은메달'),
        ('bronze', '동메달'),
    ]
    medal = models.CharField(max_length=10, choices=MEDAL_CHOICES)

새로운 방식들

# models.py
from django.db import models

# 1. 딕셔너리 형태
SPORT_CHOICES = {
    "격투기": {"judo": "유도", "karate": "가라데"},
    "라켓": {"badminton": "배드민턴", "tennis": "테니스"},
    "unknown": "미정",
}

# 2. 함수 형태
def get_year_choices():
    current_year = timezone.now().year
    return [(i, str(i)) for i in range(2000, current_year + 1)]

# 3. Enum 직접 사용
Medal = models.TextChoices("Medal", "GOLD SILVER BRONZE")

class Winner(models.Model):
    medal = models.CharField(max_length=10, choices=Medal)  # .choices 불필요
    sport = models.CharField(max_length=20, choices=SPORT_CHOICES)
    year = models.IntegerField(choices=get_year_choices)

🔧 비동기 기능 강화

Django 5.1 비동기 기능

인증 데코레이터 비동기 지원

# views.py
from django.contrib.auth.decorators import login_required

@login_required
async def async_profile_view(request):
    user = await request.auser()  # 비동기 사용자 조회
    # 비동기 로직 처리
    return render(request, 'profile.html', {'user': user})

Django 5.0 비동기 기능

포괄적인 비동기 지원

# views.py
from django.contrib.auth import aauthenticate, alogin
from django.contrib.auth.hashers import acheck_password

async def async_login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        
        # 비동기 인증
        user = await aauthenticate(
            request, 
            username=username, 
            password=password
        )
        
        if user:
            # 비동기 로그인
            await alogin(request, user)
            return redirect('dashboard')
    
    return render(request, 'login.html')

🎯 실무에서 바로 적용 가능한 팁

1. 성능 최적화

PostgreSQL 연결 풀 설정

# production settings
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "OPTIONS": {
            "pool": {
                "min_size": 5,
                "max_size": 20,
                "timeout": 30,
            }
        },
    },
}

2. 보안 강화

전체 애플리케이션 인증 필수

# settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.LoginRequiredMiddleware',  # 추가
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

3. 사용자 경험 개선

쿼리스트링 활용

{% raw %}
<!-- 검색 및 필터 페이지 -->
<div class="filters">
    <a href="{% querystring category='electronics' %}">전자제품</a>
    <a href="{% querystring category='clothing' %}">의류</a>
    <a href="{% querystring sort='price' order='asc' %}">가격 낮은순</a>
    <a href="{% querystring sort='rating' order='desc' %}">평점 높은순</a>
</div>

<!-- 페이지네이션 -->
<div class="pagination">
    {% if page.has_previous %}
        <a href="{% querystring page=page.previous_page_number %}">이전</a>
    {% endif %}
    
    {% if page.has_next %}
        <a href="{% querystring page=page.next_page_number %}">다음</a>
    {% endif %}
</div>
{% endraw %}

🔄 마이그레이션 가이드

Python 호환성

  • Django 5.0: Python 3.10, 3.11, 3.12 지원
  • Django 5.1: Python 3.10, 3.11, 3.12, 3.13 지원

데이터베이스 호환성

  • PostgreSQL: 13+ (Django 5.1)
  • MariaDB: 10.5+ (Django 5.1)
  • SQLite: 3.31.0+ (Django 5.1)
  • MySQL: 8.0.11+

주요 제거 사항

# Django 5.0에서 제거됨
# USE_TZ = False  # 기본값이 True로 변경
# USE_L10N = False  # 설정 자체가 제거됨
# pytz 지원 제거 (zoneinfo 사용 권장)

🎉 결론

Django 5.0과 5.1은 단순한 버전 업데이트를 넘어 웹 개발의 패러다임을 바꾸는 중요한 릴리스입니다. 특히:

  1. 생산성 향상: 템플릿 태그와 폼 렌더링 간소화
  2. 성능 개선: 데이터베이스 연결 풀링과 계산 필드
  3. 보안 강화: 기본 인증 미들웨어와 개선된 보안 기능
  4. 미래 지향: 비동기 기능 확장과 현대적 Python 지원

이러한 기능들을 적절히 활용하면 더 안정적이고 효율적인 웹 애플리케이션을 개발할 수 있습니다. 점진적으로 새로운 기능들을 도입하여 기존 프로젝트의 성능과 유지보수성을 개선해보세요.


더 자세한 내용은 Django 공식 문서를 참조하시기 바랍니다.

이 글을 공유해보세요!