# Django 6 릴리즈

> Clean Markdown view of GeekNews topic #24858. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=24858](https://news.hada.io/topic?id=24858)
- GeekNews Markdown: [https://news.hada.io/topic/24858.md](https://news.hada.io/topic/24858.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-12-05T23:22:40+09:00
- Updated: 2025-12-05T23:22:40+09:00
- Original source: [docs.djangoproject.com](https://docs.djangoproject.com/en/6.0/releases/6.0/)
- Points: 6
- Comments: 1

## Summary

**Django 6.0**은 Python 3.12 이상을 지원하며, 프레임워크 전반의 **보안과 비동기 처리** 역량을 강화했습니다. 내장 **Content Security Policy(CSP)** 로 XSS 등 콘텐츠 주입 공격을 방어할 수 있고, **Background Tasks 프레임워크**를 통해 요청-응답 사이클 밖에서 비동기 작업을 실행할 수 있습니다. 또한 템플릿 일부를 재사용할 수 있는 Template Partials와 최신 이메일 API 도입으로 코드 구조와 호환성이 한층 현대화되었습니다.

## Topic Body

- 웹 프레임워크 Django의 **6.0 버전**이 공개되어 Python 3.12 이상을 지원하고, 보안·템플릿·비동기 기능이 대폭 강화됨  
- **Content Security Policy(CSP)** 가 기본 내장되어 XSS 등 콘텐츠 주입 공격 방어를 위한 정책 설정이 가능함  
- **Template Partials** 기능으로 템플릿 내 재사용 가능한 부분 정의가 가능해져 코드 모듈화가 향상됨  
- **Background Tasks 프레임워크**가 추가되어 요청-응답 사이클 외부에서 비동기 작업 실행을 지원함  
- Python 최신 이메일 API 도입, MariaDB 10.5 지원 종료, `DEFAULT_AUTO_FIELD` 기본값 변경 등으로 **호환성 조정과 현대화**가 이루어짐  

---

### Python 호환성
- Django 6.0은 **Python 3.12, 3.13, 3.14**를 지원하며, 각 시리즈의 최신 릴리스만 공식 지원  
- Django 5.2.x는 **Python 3.10 및 3.11**을 지원하는 마지막 버전임  
- Django 6.0 이후 **서드파티 앱**은 Django 5.2 이전 버전 지원을 중단할 것을 권장함  

### 주요 신규 기능

#### Content Security Policy(CSP) 지원
- Django에 **CSP 표준**이 내장되어 XSS 등 콘텐츠 주입 공격 방어 강화  
  - `ContentSecurityPolicyMiddleware`, `csp()` 컨텍스트 프로세서, `SECURE_CSP` 설정을 통해 정책 정의 가능  
  - Python 딕셔너리 기반 설정으로 명확하고 안전한 정책 구성 지원  
- `SECURE_CSP_REPORT_ONLY`로 모니터링 모드 설정 가능  
- 뷰 단위로 정책을 재정의하거나 비활성화할 수 있는 **데코레이터** 제공  

#### Template Partials
- **템플릿 일부(fragment)** 를 정의하고 재사용할 수 있는 `partialdef` 및 `partial` 태그 추가  
- `template_name#partial_name` 구문으로 `get_template()`, `render()`, `{% include %}` 등에서 직접 참조 가능  
- 기존 서드파티 패키지 `django-template-partials` 사용자용 **마이그레이션 가이드** 제공  

#### Background Tasks 프레임워크
- Django에 **비동기 작업 실행용 내장 프레임워크** 추가  
  - HTTP 요청-응답 사이클 외부에서 이메일 전송, 데이터 처리 등 수행 가능  
  - `@task` 데코레이터로 작업 정의, `enqueue()`로 큐에 등록  
- 백엔드는 `TASKS` 설정으로 지정하며, 개발·테스트용 기본 백엔드 2종 포함  
- Django는 작업 생성과 큐잉만 담당하며, **실행은 외부 워커 프로세스**가 수행해야 함  

#### Python 최신 이메일 API 채택
- Django의 이메일 처리 로직이 **Python 3.6 이후의 현대적 이메일 API**(`email.message.EmailMessage`)로 전환  
- 이전 `SafeMIMEText`, `SafeMIMEMultipart` 클래스는 더 이상 사용되지 않음  
- `EmailMessage.message()` 반환 타입이 Python의 `EmailMessage` 인스턴스로 변경됨  

### 세부 개선 사항

#### Admin
- **Font Awesome Free 6.7.2** 아이콘 세트 적용  
- `AdminSite.password_change_form` 속성으로 관리자 비밀번호 변경 폼 커스터마이즈 가능  
- `messages.DEBUG`와 `messages.INFO`에 **별도 아이콘 및 CSS 스타일** 적용  

#### Auth
- **PBKDF2 해시 반복 횟수**가 1,000,000 → 1,200,000으로 증가  

#### GIS
- `GEOSGeometry.hasm` 속성으로 M 차원 여부 확인 가능  
- `Rotate` 함수로 지정 각도 회전 지원  
- `BaseGeometryWidget.base_layer` 속성으로 **지도 타일 제공자 커스터마이즈** 가능  
- MariaDB 12.0.1 이상에서 `coveredby`, `isvalid`, `GeoHash`, `IsValid` 등 기능 지원  
- 위젯 렌더링 시 **인라인 JavaScript 제거**, 커스터마이즈 시 템플릿 수정 필요  

#### PostgreSQL
- **Lexeme 표현식** 추가로 전체 텍스트 검색어 제어 강화  
- `CreateExtension` 등 확장 관련 연산에 `hints` 매개변수 추가  
- `django.contrib.postgres` 관련 필드·인덱스·제약조건에 시스템 체크 추가  

#### Staticfiles
- `ManifestStaticFilesStorage`가 **경로 정렬 일관성**을 보장해 불필요한 diff 감소  
- `collectstatic` 명령이 기본적으로 요약만 출력, 세부 정보는 `--verbosity 2` 이상에서 표시  

#### 기타
- **Haitian Creole 언어** 지원 추가  
- `startproject`, `startapp` 명령이 존재하지 않는 디렉터리 자동 생성  
- `shell` 명령에서 `django.conf.settings` 등 기본 유틸 자동 임포트  
- 마이그레이션에서 `zoneinfo.ZoneInfo` 직렬화 지원  
- `StringAgg`, `AnyValue` 등 새로운 **집계 함수** 추가  
- `AsyncPaginator`, `AsyncPage`로 **비동기 페이지네이션** 지원  
- ASGI 환경에서 **HTTP/2 다중 Cookie 헤더** 지원  
- 템플릿 내 `forloop.length` 변수 추가, `querystring` 태그 개선  
- `DiscoverRunner`가 `forkserver` 방식 병렬 테스트 지원  

### 비호환 변경 사항

#### 데이터베이스 백엔드 API
- `BaseDatabaseSchemaEditor` 및 PostgreSQL 백엔드가 컬럼 삭제 시 `CASCADE` 사용 중단  
- `return_insert_columns()` → `returning_columns()` 등 메서드명 변경  
- `UPDATE … RETURNING` 지원 시 `DatabaseFeatures.can_return_rows_from_update=True` 설정 가능  

#### 지원 중단
- **MariaDB 10.5** 지원 종료 (10.6 이상 필요)  
- **Python 3.12 미만** 지원 종료  
  - 주요 라이브러리 최소 버전: `aiosmtpd 1.4.5`, `bcrypt 4.1.1`, `Pillow 10.1.0`, `psycopg 3.1.12` 등  

#### Email
- `mixed_subtype`, `alternative_subtype`, `encoding` 속성 제거  
- 내부 구현 변경으로 **커스텀 EmailMessage 서브클래스** 점검 필요  

#### DEFAULT_AUTO_FIELD 기본값 변경
- 기본값이 `AutoField` → `BigAutoField`로 변경  
- Django 3.2 이후 경고(`models.W042`)를 처리하지 않은 프로젝트는 설정 추가 필요  

#### ORM 표현식
- `as_sql()` 메서드의 반환 파라미터는 **tuple 형식**이어야 함  

#### 기타
- JSON 직렬화 시 항상 개행 추가  
- `asgiref` 최소 버전 3.9.1로 상향  

### 폐기 예정 기능

#### django.core.mail API
- `get_connection()`, `send_mail()` 등에서 **선택적 인자**는 키워드 인자로만 전달해야 함  
- `EmailMessage`, `EmailMultiAlternatives` 생성 시 첫 4개 인자 외에는 키워드 인자만 허용  

#### 기타
- `BaseDatabaseCreation.create_test_db(serialize)` 폐기, `serialize_db_to_string()` 사용  
- PostgreSQL 전용 `StringAgg`, `OrderableAggMixin` 폐기  
- `urlize`, `urlizetrunc` 기본 프로토콜이 Django 7.0에서 **HTTPS로 변경 예정**  
- `ADMINS`, `MANAGERS` 설정은 (이름, 주소) 튜플 대신 **이메일 문자열 리스트**로 지정해야 함  
- `SafeMIMEText`, `SafeMIMEMultipart`, `BadHeaderError` 등 이메일 관련 클래스 폐기  

### 제거된 기능
- `BaseConstraint`의 위치 인자 지원 제거  
- `DjangoDivFormRenderer`, `Jinja2DivFormRenderer` 삭제  
- `cx_Oracle` 데이터베이스 드라이버 지원 제거  
- `forms.URLField` 기본 스킴이 `"http"` → `"https"`로 변경  
- `Model.save()` 및 `Model.asave()`의 위치 인자 지원 제거  
- `ModelAdmin.log_deletion()`, `LogEntryManager.log_action()` 삭제  
- `django.utils.itercompat` 모듈 제거  
- `GeoIP2.coords()`, `GeoIP2.open()` 메서드 삭제  
- `ForeignObject.get_joining_columns()` 및 관련 메서드 제거  

---  
Django 6.0은 **보안 강화, 비동기 처리, 현대적 이메일 API 도입**을 통해 프레임워크의 안정성과 확장성을 높였으며, Python 3.12 이상 환경으로의 전환을 명확히 함.

## Comments



### Comment 47270

- Author: neo
- Created: 2025-12-05T23:22:40+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=46153116) 
- 예전에 근무했던 조직에는 **NodeJS+React**로 된 ‘현대식’ 코드베이스와, 15년 가까이 된 **Python 2.7 기반의 Django 레거시 앱**이 있었음  
  처음엔 오래된 코드가 고통스러울 거라 걱정했지만, 오히려 그 반대였음  
  Django 앱은 다루기 즐겁고 정리하는 과정이 정말 재미있었음. 새 **Go/React 리라이트**로 교체될 때가 오면 아쉬울 것 같음
  - 왜 굳이 교체하려는지 모르겠음. **고장 나지 않았다면 굳이 바꿀 필요가 없지 않음**

- Django 팀에게 축하를 보냄  
  나는 오랫동안 **Docker Compose 기반의 Django + Celery + Postgres + Redis + esbuild + Tailwind 스타터 앱**을 유지해왔고, 최근 Django 6.0에 맞게 업데이트했음  
  [GitHub 저장소](https://github.com/nickjj/docker-django-example)에서 확인 가능함  
  아직 **CSP 설정**은 기본값으로 넣지 않았는데, 좀 더 검토 후 추가할 예정임
  - 북마크하려 했는데 이미 2023년 12월에 저장해둔 걸 발견했음
  - Nick의 저장소들은 항상 **최고 수준**임. 나도 내 자료에서 자주 인용하고 있음. 공개로 공유해줘서 고마움
  - 몇 년 전 프로젝트에서 이 템플릿을 썼었는데, 정말 훌륭했음
  - 최근 **uv 추가**를 보고 꾸준히 관리되고 있다는 게 느껴졌음

- Django의 **“batteries included”** 철학은 AI 코드 생성에 완벽히 어울림  
  관리자 패널, 로그인, 비밀번호 재설정 등 기본 기능이 이미 잘 갖춰져 있어서, AI가 작은 코드베이스로도 완전한 사이트를 만들 수 있음  
  코드가 작고 명확하니 AI가 반복적으로 개선하기도 쉬움
  - Django의 장점은 **사람이 읽기 쉬운 코드 구조**임  
    거대한 컴포넌트 대신 명확한 모델과 템플릿이 있어서, AI가 생성한 코드를 리뷰하기도 쉬움  
    또 Django admin이 독립된 **ground truth**로 존재하므로, 프론트엔드가 망가져도 데이터를 다룰 수 있음  
    다만 Python 생태계가 **gevent 모델**을 채택하지 않은 건 아쉬움. 그랬다면 비동기 전환이 훨씬 매끄러웠을 것임
  - Django의 **INSTALLED_APPS 구조** 덕분에 앱 단위로 기능을 쉽게 추가·제거할 수 있음  
    Flask나 FastAPI처럼 느슨하게 연결된 프레임워크보다 훨씬 통합적임  
    이런 차이가 결국 수많은 **작은 불편함(papercuts)** 을 줄여줌
  - Django와 Rails 둘 다 써봤는데, **Claude Code**로 테스트했을 때는 Rails가 훨씬 잘 작동했음  
    오래된 .NET 앱을 리라이트했는데 Rails는 거의 완벽하게 변환했지만 Django는 어려워했음
  - 사실 **Ruby on Rails**가 더 오래전부터 CSP, 백그라운드 워커 등 다양한 기능을 기본 제공해왔음
  - Django는 오픈소스 프로젝트에서 워낙 오래 쓰여서, AI가 학습할 **코드 데이터**가 풍부함

- 이번 릴리스의 **template partials** 기능은 꽤 괜찮아 보임  
  하지만 **타입 주석(type annotations)** 상태는 여전히 불편함  
  django-stubs는 mypy 플러그인이 필요하고, django-types는 pyright용 포크지만 동기화가 잘 안 됨  
  pylance는 또 자체 포크를 씀  
  다음 버전에서는 HttpRequest, HttpResponse, View, Model 같은 기본 타입이라도 공식적으로 포함되길 바람

- Django 덕분에 웹 개발이 정말 즐거웠음  
  다른 프레임워크로 바꿔도 결국 Django로 돌아오게 됨. **후회 없는 선택**이었음
  - 나는 **Ruby on Rails**에서 같은 경험을 했음  
    다른 프레임워크를 써봐도 Rails의 편리함 때문에 다시 돌아오게 됨  
    다만 Rails에는 기본 **Admin UI**가 없다는 게 아쉬움
  - 백엔드만 본다면 Django는 훌륭하지만, **프론트엔드 측면**에서는 아직 석기시대 수준임  
    완전한 풀스택을 원한다면 Laravel이나 Rails를 보는 게 나음
  - 솔직히 Django의 매력을 잘 모르겠음  
    PHP 시절부터 웹을 해왔는데 Django는 항상 **그저 그런 느낌**이었음

- Django는 내 첫 **프리랜스 대형 프로젝트**였고, 여전히 편안하게 느껴짐  
  여러 실험적인 시도를 해봤지만 항상 잘 작동했음. Django에게 감사함

- 15년 가까이 Django를 거의 독점적으로 써왔음  
  다른 프레임워크도 많이 시도했지만 Django만큼 **손에 맞는 것**은 없었음  
  이번 릴리스에서 **task framework**를 추가했지만, 백엔드와 워커가 포함되지 않은 건 아쉬움  
  차라리 다음 버전에서 완전한 형태로 포함되길 바람
  - Django가 그 선을 넘을 계획이 있는지 궁금함. 프레임워크 철학상 **경계 유지**를 중시할 것 같음
  - 완벽함이 선의 적이 되어선 안 됨. Django는 결국 **“마감이 있는 완벽주의자”** 를 위한 프레임워크임

- Django의 **포함형 구성(batteries included)** 덕분에 규모와 상관없이 어떤 프로젝트에도 적합함  
  팀과 기여자들에게 찬사를 보냄

- 우리는 어떻게 **SPA 시대**에 들어오게 되었는지 궁금함. 단순히 로딩 스피너를 없애려던 건지, 더 깊은 이유가 있었는지 알고 싶음
  - 핵심 이유 중 하나는 **모바일 앱의 등장**이었음  
    웹·iOS·Android가 하나의 백엔드를 공유하도록 만들면서, 자연스럽게 SPA 패턴이 확산됨  
    나도 여전히 SPA를 만들지만, 언젠가 **Django + htmx**로 큰 프로젝트를 해보고 싶음
  - 예전에 Angular로 **데이터 시각화**를 하면서 SPA로 전환했음  
    페이지 리로드 없이 앱처럼 동작하는 게 매력적이었지만, 실제로는 **강제 새로고침**이 필요한 경우도 많았음  
    그래도 데이터와 표현을 분리하는 구조는 우아하다고 생각함
  - 웹은 원래 **문서 렌더링용**으로 만들어졌지만, 사용자는 앱을 원했음  
    그래서 JS로 문서를 앱처럼 바꾸려는 시도가 이어졌음
  - 인터넷 속도가 느리고, 백엔드 검증이 느렸던 시절엔 **폼 검증**을 위해 JS를 추가하다가 복잡해졌음  
    결국 프론트엔드와 백엔드를 분리하고, API 계약과 검증 절차가 생겼음  
    나중엔 다시 서버 컴포넌트로 통합하려는 흐름이 생겼고, 지금 우리가 그 지점에 있음  
    참고로 예전식 웹폼 예시는 [이 링크](https://formulieren.amsterdam.nl/TriplEforms/DirectRegelen/formulier/nl-NL/evamsterdam/PVGAanvraagBewoners.aspx/fPVGAanvraagBewonersVragen)에서 볼 수 있음
  - Django나 Rails 같은 템플릿에는 **타입 안정성**이 부족했음  
    그래서 나는 **TypeScript 기반 빌드 프로세스**를 선호하게 되었음

- Django를 쓸 때마다 단순히 **즐거움**을 느낌. 그게 전부임
