Django 6.0의 새로운 기능

2 hours ago 1

  • 20주년을 맞은 Django 6.0은 템플릿, 백그라운드 작업, 보안, 이메일 등 핵심 영역을 대폭 개선한 주요 릴리스임
  • Template partials 기능으로 템플릿 내 코드 재사용이 쉬워졌으며, htmx와 같은 도구와의 통합이 강화됨
  • Tasks 프레임워크가 새로 추가되어 HTTP 요청-응답 주기 밖에서 백그라운드 작업을 실행할 수 있음
  • Content Security Policy(CSP) 가 기본 내장되어 XSS 등 콘텐츠 주입 공격 방어가 간편해짐
  • 이메일 API 현대화, ORM 개선, 기본 키 확장 등으로 개발자 경험과 확장성이 크게 향상됨

Django 6.0 개요

  • Django 6.0은 Python 웹 프레임워크의 새로운 릴리스로, 20년간의 발전을 이어가는 버전임
  • 주요 변경 사항은 템플릿, 백그라운드 작업, 보안, 이메일 처리 등 네 가지 핵심 기능을 중심으로 구성됨
  • 개발자 커뮤니티의 다수 기여자들이 참여했으며, 공식 릴리스 노트에 기반한 주요 개선점이 정리됨

django-upgrade 도구

  • 기존 프로젝트를 Django 5.2 이하 버전에서 업그레이드할 때 django-upgrade 도구를 사용하면 코드 자동 변환 가능
  • Django 6.0 관련 5개의 자동 수정기(fixer) 가 포함되어 있으며, 일부 경고를 자동으로 해결함

Template partials

  • 템플릿 부분 정의({% partialdef %}) 기능이 추가되어 템플릿 내에서 코드 중복을 줄이고 재사용 가능
    • 동일 템플릿 내에서 정의한 partial을 여러 번 호출 가능
    • inline 옵션을 사용하면 정의와 동시에 렌더링 가능
  • 부분 렌더링 기능을 통해 특정 partial만 독립적으로 렌더링 가능
    • 예시에서는 htmx를 사용해 view_count 부분을 주기적으로 갱신
    • URL에 #partial_name을 붙여 특정 부분만 렌더링 가능
  • 이 기능은 Google Summer of Code 프로젝트를 통해 Django에 통합되었으며, 기존 django-template-partials 패키지에서 발전함

Tasks 프레임워크

  • Django에 백그라운드 작업 실행용 Tasks 프레임워크가 새로 추가됨
    • HTTP 요청-응답 주기 외부에서 코드 실행 가능
    • 이메일 전송, 데이터 처리, 보고서 생성 등 비동기 작업에 활용
  • @task 데코레이터로 작업 정의, Task.enqueue()로 큐에 등록 가능
  • 기본 제공 백엔드는 개발용 ImmediateBackend, DummyBackend 두 가지이며,
    django-tasks 패키지의 DatabaseBackend를 사용하면 SQL DB 기반 실행 가능
  • db_worker 명령으로 작업 워커를 실행하며, 로그를 통해 상태 확인 가능
  • 이 기능은 Wagtail에서 시작된 아이디어로, DEP 0014 제안 후 Django에 통합됨

Content Security Policy(CSP) 지원

  • Django 6.0은 CSP 표준을 기본 지원하여 XSS 등 콘텐츠 주입 공격 방어 강화
    • ContentSecurityPolicyMiddleware를 MIDDLEWARE에 추가해 활성화
    • SECURE_CSP, SECURE_CSP_REPORT_ONLY 설정으로 정책 구성 가능
  • Nonce 기반 보안이 내장되어 <script> 및 <style> 태그에 nonce="{{ csp_nonce }}" 속성 추가 가능
    • 요청마다 난수 nonce가 생성되어 신뢰된 리소스만 실행됨
  • CSP는 2004년 제안 이후 django-csp 패키지로 구현되어 왔으며, 이번 버전에서 공식 내장됨

이메일 API 업데이트

  • Django의 이메일 처리 로직이 Python 3.6의 현대적 이메일 API로 전환됨
    • 내부적으로 email.message.EmailMessage 클래스를 사용
    • 기존 send_mail() 및 EmailMessage 인터페이스는 그대로 유지
  • 새로운 API는 버그 감소, 보안성 향상, 인라인 첨부파일 처리 개선 등의 장점 제공
  • MIMEPart 객체를 사용해 HTML 본문 내 이미지 등 인라인 첨부를 간단히 추가 가능
  • 이 변경은 2024년 제안되어 8개월간 개발 후 병합됨

이메일 API의 위치 인자 제한

  • django.core.mail API에서 일부 매개변수는 키워드 인자만 허용하도록 변경
    • fail_silently 등 선택적 인자를 위치 인자로 전달 시 경고 발생
    • 가독성과 유지보수성을 높이기 위한 조치
  • django-upgrade의 mail_api_kwargs fixer로 자동 수정 가능

Shell 자동 import 확장

  • Django 5.2의 자동 모델 import 기능이 확장되어,
    settings, connection, models, functions, timezone 등이 자동 import됨
  • ./manage.py shell -v 2로 자동 import 목록 확인 가능
  • 개발 편의성 향상 및 반복 코드 감소 효과

ORM 개선: save() 시 동적 필드 갱신

  • GeneratedField나 표현식 기반 필드가 save() 후 자동 갱신
    • RETURNING 절을 지원하는 DB(SQLite, PostgreSQL, Oracle)에서 즉시 반영
    • MySQL, MariaDB에서는 지연 로딩으로 자동 갱신
  • 추가 쿼리 없이 최신 값을 바로 사용할 수 있어 효율성 향상

Universal StringAgg 집계 함수

  • StringAgg 집계 함수가 모든 데이터베이스 백엔드에서 사용 가능
    • 입력 값을 구분자(delimiter)로 연결한 문자열 반환
    • PostgreSQL 전용 기능이었으나 이제 django.db.models에서 직접 사용 가능
  • Value() 표현식으로 구분자 지정 가능

BigAutoField 기본화

  • DEFAULT_AUTO_FIELD의 기본값이 BigAutoField 로 변경
    • 64비트 정수형 기본 키를 사용하여 Primary Key 고갈 문제 예방
    • 새 프로젝트에서는 별도 설정 없이 자동 적용
  • Django 3.2에서 도입된 설정을 단순화하여 보일러플레이트 감소

Template 개선

  • forloop.length 변수가 추가되어 루프 내 전체 길이 참조 가능
    • {{ forloop.counter }}/{{ forloop.length }} 형태로 사용
  • querystring 템플릿 태그 개선
    • 빈 매핑 시 ? 자동 추가로 링크 동작 일관성 확보
    • 다중 매핑 인자 병합 지원으로 쿼리 파라미터 조합 용이

마무리

  • Django 6.0에는 174명의 기여자가 참여했으며,
    수많은 최적화와 버그 수정이 포함됨
  • 업그레이드를 통해 보안성, 유지보수성, 개발자 경험(DX) 이 전반적으로 향상됨
  • 공식 릴리스 노트에서 추가 변경 사항 확인 가능

Read Entire Article