Django: 6.0의 새로운 기능

발행: (2025년 12월 10일 오전 05:33 GMT+9)
7 min read

Source: Hacker News

2025-12-03

Django 6.0이 오늘 발표되었습니다. 20년 된 사랑받는 파이썬 웹 프레임워크의 또 다른 릴리즈 사이클이 시작됩니다! 이번 버전은 많은 사람들의 기여로 이루어진 모자이크 같은 새로운 기능들을 담고 있으며, 그 중 제가 직접 참여한 부분도 있습니다. 아래는 릴리즈 노트에서 제가 골라낸 주요 하이라이트입니다.

django-upgrade 로 업그레이드 돕기

Django 5.2 이하 버전에서 프로젝트를 업그레이드한다면 제 도구 django-upgrade 를 사용해 보세요. 오래된 Django 코드를 자동으로 최신 기능에 맞게 바꾸고, 폐기 경고를 해결해 주며, Django 6.0용 다섯 개의 fixers 를 포함하고 있습니다. (언젠가 에너지와 시간이 허락한다면 공식 Django 프로젝트로 제안하고 싶습니다…)

템플릿 파셜(Template partials)

Django 6.0에는 다른 눈에 띄는 변경 사항보다 먼저 다룰 네 가지 주요 기능이 있습니다. 그 중 첫 번째는 다음과 같습니다:

Django 템플릿 언어가 이제 템플릿 파셜을 지원합니다. 이를 통해 템플릿 파일 내에서 작고 이름이 지정된 조각을 캡슐화하고 재사용하기가 쉬워집니다.

파셜은 새로운 {% partialdef %}{% endpartialdef %} 태그로 표시된 템플릿의 섹션입니다. 같은 템플릿 안에서 재사용하거나 독립적으로 렌더링할 수 있습니다.

같은 템플릿 내에서 파셜 재사용

{% partialdef filter_controls %}
    
        {{ filter_form }}
    
{% endpartialdef %}

{% partial filter_controls %}

    {% for video in videos %}
        
            
## {{ video.title }}

            ...
        
    {% endfor %}

{% partial filter_controls %}

inline 옵션을 사용하면 정의 자체를 제자리에서 렌더링하면서 이 패턴을 더 간단히 만들 수 있습니다:

{% partialdef filter_controls inline %}
    
        {{ filter_form }}
    
{% endpartialdef %}

    {% for video in videos %}
        
            
## {{ video.title }}

            ...
        
    {% endfor %}

{% partial filter_controls %}

같은 파일 안에서 템플릿 코드를 반복하고 있다면 언제든 이 패턴을 활용하세요. 파셜은 변수를 사용할 수 있기 때문에, 데이터만 다른 유사한 컨트롤들을 중복 없이 관리할 수 있습니다.

파셜을 독립적으로 렌더링

{% load django_htmx %}

  
    
## {{ video.title }}

    
      
      Your browser does not support the video tag.
    

    {% partialdef view_count inline %}
    
        {{ video.view_count }} views
    
    {% endpartialdef %}

    {% htmx_script %}
  

해당 뷰 코드는 다음과 같습니다:

from django.shortcuts import render

def video(request, video_id):
    # …
    return render(request, "video.html", {"video": video})

def video_view_count(request, video_id):
    # …
    return render(request, "video.html#view_count", {"video": video})

video 뷰는 전체 템플릿을 렌더링하고, video_view_count 뷰는 템플릿 이름 뒤에 #view_count 를 붙여 view_count 파셜만 렌더링합니다—마치 URL에서 HTML 조각을 ID 로 참조하는 방식과 같습니다.

배경

htmx가 이 기능의 주요 동기가 되었으며, 이는 제작자 Carson Gross가 크로스‑프레임워크 리뷰 포스트에서 강조했습니다. 파셜을 사용하면 템플릿 내 “동작의 지역성”을 유지할 수 있어, 작성, 디버깅, 유지보수가 쉬워지고 파일이 산만해지는 것을 방지합니다.

템플릿 파셜에 대한 Django 지원은 원래 Carlton Gibson이 만든 django‑template‑partials 패키지에서 시작되었습니다. 이 패키지는 오래된 Django 버전에서도 여전히 사용할 수 있습니다. Django 자체에 통합된 작업은 올해 Google Summer of Code 프로젝트를 통해 이루어졌으며, 학생 Farhan Ali 가 작업하고 Carlton 이 멘토링했습니다. 자세한 개발 과정은 Farhan의 회고 블로그 포스트에서 확인할 수 있습니다. Farhan 의 기여, Carlton 의 멘토링, 그리고 Natalia Bidart, Nick Pope, Sarah Boyce 의 리뷰에 깊이 감사드립니다!

Tasks 프레임워크

다음 주요 기능:

Django는 이제 HTTP 요청‑응답 사이클 밖에서 코드를 실행할 수 있는 내장 Tasks 프레임워크를 포함합니다. 이를 통해 이메일 전송이나 데이터 처리와 같은 작업을 백그라운드 워커에게 오프로드할 수 있습니다.

백그라운드 작업은 오래전부터 웹 애플리케이션에서 흔히 요구되는 기능이었지만, Django는 이전에 내장 솔루션을 제공하지 않아 개발자들이 CeleryDjango Q2 같은 서드파티 패키지에 의존해야 했습니다. 새로운 Tasks 프레임워크는 백그라운드 작업을 정의하고 큐에 넣기 위한 표준 API를 제공하며, 서드파티 작업 러너가 일관되게 통합될 수 있게 합니다.

새로운 @task 데코레이터로 작업을 정의합니다:

from django.tasks import task

@task
def resize_video(video_id):
    ...

Task.enqueue() 로 백그라운드 실행을 위해 큐에 넣습니다:

from example.tasks import resize_video

def upload_video(request):
    # …
    resize_video.enqueue(video.id)
    # …

작업 실행

현재 Django는 프로덕션 수준의 작업 백엔드를 포함하고 있지 않습니다. 개발 및 테스트용으로 두 가지 백엔드가 제공됩니다:

  • ImmediateBackend – 작업을 동기적으로 실행하여 완료될 때까지 블록합니다.
    Docs

  • DummyBackend – 작업이 큐에 들어가도 아무 일도 하지 않으며, 나중에 검사할 수 있게 해줍니다. 테스트에 유용합니다.
    Docs

Back to Blog

관련 글

더 보기 »

Part 2: 첫 번째 Django 프로젝트 설정

이것은 “Learn Backend Development by Building a Social Media App” 시리즈의 파트 2입니다. 다시 오신 것을 환영합니다! 이전 파트에서는 백엔드가 실제로 무엇인지 배웠습니다.