인기 있는 웹 프레임워크인 장고(Django) 5.0 버전이 최근 출시되었습니다 (23년 12월 4일). 이번 업데이트는 다양한 새로운 기능, 개선 사항 및 최적화를 특징으로 하며 Django 4.2보다 크게 발전했습니다. Django 5.0의 주요 특징과 기능에 대해 소개합니다.
※ 이 글은 아래 기사 내용을 토대로 작성되었습니다만, 필자의 개인 의견이나 추가 자료들이 다수 포함되어 있습니다.
- 원문: Django 5.0 is here
- URL: https://medium.com/django-unleashed/django-5-0-is-here-e4c5debcaf13
장고 5.0의 주요 특징
장고 5.0의 주요 특징은 다음과 같습니다.
- Python 호환성이 향상되어 Python 버전 3.10, 3.11 및 3.12를 지원합니다.
- 관리의 패싯 필터, 양식 필드 렌더링을 위한 단순화된 템플릿, 데이터베이스 계산 기본값과 같은 새로운 기능이 도입되었습니다.
- 데이터베이스 생성 모델 필드를 구현하여 데이터베이스 상호 작용에 더 많은 유연성과 효율성을 추가합니다.
- 필드 선택 선언을 위한 확장된 옵션으로 보다 다양하고 동적인 양식 및 모델 필드 구성이 가능합니다.
- django.contrib.admin, django.contrib.auth 등을 포함한 다양한 Django 모듈 전반에 걸쳐 수많은 사소한 기능이 추가되고 개선되었습니다.
- 프레임워크를 간소화하고 향후 개발을 위한 발판을 마련하는 것을 목표로 하는 이전 버전과 호환되지 않는 변경 및 지원 중단입니다.
이번 릴리스는 Django의 발전에 중요한 이정표를 세웠으며, 전 세계 개발자에게 향상된 기능과 사용 편의성을 제공합니다.
파이썬과의 호환성
Django 5.0은 최신 버전의 Python과의 호환성을 도입하여 범위와 기능을 크게 확장했습니다. Django 5.0버전은 Python 3.10, 3.11 및 3.12를 지원합니다. 이러한 호환성 확장을 통해 Django는 Python의 최신 발전과 동기화되어 개발자에게 Python 생태계의 최신 기능과 개선 사항의 이점을 제공합니다.
Django 5.0은 이 세 가지 Python 버전을 지원하지만 Django 팀은 각 시리즈의 최신 릴리스를 사용할 것을 적극 권장합니다. 이는 최상의 성능, 보안 및 최신 기능에 대한 액세스를 보장하기 위한 것입니다.
최신 Python 릴리스를 사용하면 개발자는 Django 5.0의 모든 잠재력을 활용하여 최신 Python 버전과 함께 제공되는 최적화된 호환성 및 향상된 기능의 이점을 누릴 수 있습니다.
장고 5.0의 새로운 기능
관리자의 패싯(Facet) 필터
Django 5.0에는 관리자 변경 목록에 적용된 필터에 대한 facet counts가 도입되었습니다. UI를 통해 전환할 수 있는 이 기능은 필터와 함께 패싯 개수를 표시하고 데이터 배포에 대한 빠른 개요를 제공함으로써 관리 인터페이스를 향상시킵니다. 패싯 필터의 동작은 ModelAdmin.show_facets 속성을 사용하여 구성할 수 있습니다.
양식 필드 렌더링을 위한 단순화된 템플릿
이 릴리스에서는 필드 그룹 템플릿을 도입하여 Django 양식 필드의 렌더링을 단순화했습니다. 이러한 템플릿은 레이블, 위젯, 도움말 텍스트 및 오류와 같은 양식 필드 구성 요소의 효율적인 렌더링을 촉진하여 양식 표시의 효율성과 명확성을 모두 향상시킵니다.
Before:
<form>
...
<div>
{{ form.name.label_tag }}
{% if form.name.help_text %}
<div class="helptext" id="{{ form.name.auto_id }}_helptext">
{{ form.name.help_text|safe }}
</div>
{% endif %}
{{ form.name.errors }}
{{ form.name }}
<div class="row">
<div class="col">
{{ form.email.label_tag }}
{% if form.email.help_text %}
<div class="helptext" id="{{ form.email.auto_id }}_helptext">
{{ form.email.help_text|safe }}
</div>
{% endif %}
{{ form.email.errors }}
{{ form.email }}
</div>
<div class="col">
{{ form.password.label_tag }}
{% if form.password.help_text %}
<div class="helptext" id="{{ form.password.auto_id }}_helptext">
{{ form.password.help_text|safe }}
</div>
{% endif %}
{{ form.password.errors }}
{{ form.password }}
</div>
</div>
</div>
...
</form>
After:
<form>
...
<div>
{{ form.name.as_field_group }}
<div class="row">
<div class="col">{{ form.email.as_field_group }}</div>
<div class="col">{{ form.password.as_field_group }}</div>
</div>
</div>
...
</form>
데이터베이스 계산 기본값
Django 5.0에서는 Field.db_default 매개변수를 사용하여 데이터베이스 계산 기본값을 설정할 수 있습니다.
from django.db import models
from django.db.models.functions import Now, Pi
class MyModel(models.Model):
age = models.IntegerField(db_default=18)
created = models.DateTimeField(db_default=Now())
circumference = models.FloatField(db_default=2 * Pi())
이 기능은 데이터베이스 수준에서 직접 기본값을 처리하는 데 더 많은 유연성을 제공합니다.
데이터베이스 생성 모델 필드
Django 5.0의 새로운 GeneratedField를 사용하면 데이터베이스 생성 열을 생성할 수 있습니다. 이 필드는 모든 데이터베이스 백엔드에서 지원되며 다른 필드에서 계산되는 필드에 유용합니다.
from django.db import models
from django.db.models import F
class Square(models.Model):
side = models.IntegerField()
area = models.GeneratedField(
expression=F("side") * F("side"),
output_field=models.BigIntegerField(),
db_persist=True,
)
이 기능은 데이터베이스 성능을 최적화하고 데이터 무결성을 보장하는 데 특히 유용합니다.
필드 선택 선언을 위한 추가 옵션
Django 5.0의 Field.choices는 더 큰 유연성을 제공합니다. Field.choices는 이제 ChoiceField.choices반복 가능 항목 외에도 매핑 또는 호출 가능 항목을 지원합니다.
from django.db import models
Medal = models.TextChoices("Medal", "GOLD SILVER BRONZE")
SPORT_CHOICES = {
"Martial Arts": {"judo": "Judo", "karate": "Karate"},
"Racket": {"badminton": "Badminton", "tennis": "Tennis"},
"unknown": "Unknown",
}
def get_scores():
return [(i, str(i)) for i in range(10)]
class Winner(models.Model):
name = models.CharField(...)
medal = models.CharField(..., choices=Medal)
sport = models.CharField(..., choices=SPORT_CHOICES)
score = models.IntegerField(choices=get_scores)
이 업데이트는 모델 및 양식 내에서 선택 항목을 선언하고 처리하는 방식을 단순화합니다.
다양한 모델의 사소한 기능
Django 5.0에는 다양한 모듈에 걸쳐 다양한 사소한 기능도 포함되어 있습니다.
- django.contrib.admin: 로그 항목 쿼리 집합 사용자 지정 및 관리자 클래스 검색을 위한 새로운 메서드, 업데이트된 jQuery 버전 및 향상된 목록 표시 속성이 추가되었습니다.
- django.contrib.auth: PBKDF2 비밀번호 해셔 및 새로운 비동기 기능에 대한 기본 반복 횟수가 늘어났습니다.
- django.contrib.contenttypes: GenericForeignKey 프리페치 지원이 향상되었습니다.
- django.contrib.gis: GIS 데이터 처리를 위한 새로운 함수 및 방법과 GDAL 및 GEOS 버전에 대한 지원이 업데이트되었습니다.
- django.contrib.messages: 메시지에 대한 새로운 테스트 방법입니다.
- django.contrib.postgres: 유효성 검사 오류 코드를 사용자 정의하기 위한 새로운 속성을 추가했습니다
장고 5.0의 이전 버전과 호환되지 않는 변경 사항
데이터베이스 백엔드 API의 변경 사항
Django 5.0에는 타사 데이터베이스 백엔드에 영향을 미칠 수 있는 변경 사항이 도입되었습니다. 특히 supports_expression_defaults, supports_default_keyword_in_insert 및 supports_default_keyword_in_bulk_insert 같은 새로운 속성은 데이터베이스 기능을 반영하도록 적절하게 설정되어야 합니다.
django.contrib.gis에서 이전 버전의 GDAL 및 GEOS에 대한 지원 제거
이전 버전의 GDAL(2.2 및 2.3) 및 GEOS(3.6 및 3.7)에 대한 지원이 django.contrib.gis 모듈에서 제거되어 향상된 지리공간 기능을 위한 최신 버전에 맞춰졌습니다.
django.contrib.sitemaps의 변경 사항
Google Sitemaps ping 엔드포인트 지원 중단에 대한 응답으로 함수 ping_google()및 ping_google관리 명령이 django.contrib.sitemaps에서 제거되었습니다.
MySQL 버전 < 8.0.11에 대한 지원 중단
Django 5.0은 더 이상 MySQL 8.0.x 시리즈의 사전 릴리스를 지원하지 않습니다. 이제 MySQL의 최소 지원 버전은 8.0.11로, 최신 데이터베이스 기능 및 보안 개선 사항과의 호환성을 보장합니다.
QuerySet.update_or_create() 메서드 업데이트
이제 QuerySet의 update_or_create() 메서드에 create_defaults 매개 변수가 포함됩니다. update_or_create()에 사용되는 create_defaults라는 이름의 필드가 있는 모델은 조회에서 create_defaults__exact로 필드를 지정해야 합니다.
MariaDB 10.7 이상에서 UUIDField 마이그레이션 필요
MariaDB 10.7 이상에서는 UUIDField가 CHAR(32) 대신 UUID 열로 생성됩니다. 이전 버전의 Django에 있는 기존 UUIDField 열을 마이그레이션해야 합니다.
class Char32UUIDField(models.UUIDField):
def db_type(self, connection):
return "char(32)"
class MyModel(models.Model):
uuid = Char32UUIDField(primary_key=True, default=uuid.uuid4)
장고 5.0에서 더 이상 사용되지 않는 기능
Form Renderers: DjangoDivFormRenderer 및 Jinja2DivFormRenderer 과도기적 폼 렌더러는 더 이상 사용되지 않습니다.
BaseConstraint Arguments: 키워드 전용 인수를 위해 위치 인자 name과 위반 오류 메시지를 BaseConstraint에 전달하는 것은 더 이상 사용되지 않습니다.
ModelAdmin.lookup_allowed(): ModelAdmin.lookup_allowed()의 시그니처에 요청을 추가. 이 인수를 허용하지 않는 서브클래스에 대한 지원은 더 이상 사용되지 않습니다.
ForeignObject Methods: ForeignObject 및 ForeignObjectRel의 get_joining_columns() 메서드는 더 이상 사용되지 않습니다. 서브클래스는 대신 get_joining_fields()를 구현해야 합니다.
Forms URLField Scheme: 장고 6.0에서는 forms.URLField의 기본 스키마가 "http"에서 "https"로 변경됩니다. 과도기적 설정인 FORMS_URLFIELD_ASSUME_HTTPS도 더 이상 사용되지 않습니다.
Database Operations: DatabaseOperations.field_cast_sql()이 더 이상 사용되지 않고 DatabaseOperations.lookup_cast()가 사용됩니다.
ChoicesMeta 메타클래스: django.db.models.enums.ChoicesMeta 메타클래스의 이름이 ChoicesType으로 변경되었습니다.
Prepatch Methods: Prefetch.get_current_queryset() 및 관련 관리자의 get_prefetch_queryset() 메서드가 더 이상 사용되지 않습니다.
장고 5.0에서 제거된 기능
테스트 설정: SERIALIZE 테스트 설정을 제거합니다.
문서화되지 않은 모듈: 문서화되지 않은 django.utils.baseconv 및 django.utils.datetime_safe 모듈이 제거되었습니다.
설정 변경:
- USE_TZ 설정의 기본값이 False에서 True로 변경되었습니다.
- USE_L10N 및 USE_DEPRECATED_PYTZ 설정이 제거되었습니다.
- pytz 시간대 지원이 제거되었습니다.
GIS 클래스: django.contrib.gis.admin.GeoModelAdmin 및 OSMGeoAdmin 클래스를 제거합니다.
양식 렌더링: 기본 양식 및 양식 집합 렌더링 스타일이 div 기반으로 변경되었으며 관련 템플릿이 제거되었습니다.
사이트맵 및 CSRF 변경: 사이트맵 관련 기능의 다양한 변경 사항과 CSRF_COOKIE_MASKED 과도기 설정이 제거되었습니다.
포스트그레스 집계: 행이 없을 때 특정 포스트그레스 집계의 동작이 변경되었습니다.
기타 제거:
- 시간대, 해싱 및 쿼리 집합과 관련된 여러 메서드, 인수 및 기능
- django.contrib.sessions.serializers.PickleSerializer 제거
- 저장되지 않은 모델 인스턴스를 관련 필터로 전달하는 기능 중단
- django.utils.timezone.utc 별칭 제거
결론
주요 시사점 요약
- Django 5.0에는 관리 및 데이터베이스 계산 기본값의 패싯 필터와 같은 새로운 기능을 포함하여 중요한 업데이트가 도입되었습니다.
- Python 3.10, 3.11 및 3.12를 지원하며 최신 Python 릴리스를 사용하는 것이 좋습니다.
- 업데이트에는 이전 버전과 호환되지 않는 변경 사항과 더 이상 사용되지 않는 기능의 제거가 포함되어 프레임워크 현대화를 향한 움직임을 알립니다.
Django 개발자를 위한 시사점
- 개발자는 Python 호환성, 데이터베이스 기능 및 템플릿 렌더링의 변화에 적응해야 합니다.
- 원활한 전환을 위해서는 이전 버전과 호환되지 않는 변경 사항을 인식하고 계획하는 것이 중요합니다.
업그레이드 및 적응에 대한 권장 사항
- 변경 사항의 영향을 이해하려면 릴리스 노트를 철저하게 검토하세요.
- Django 5.0으로 업그레이드하기 전에 준비 환경에서 애플리케이션을 광범위하게 테스트하세요.
- 새로운 기능과 제거된 기능을 준수하도록 코드를 업데이트하고 리팩터링합니다.
- 향후 업데이트에 대한 정보를 얻고 Django 개발의 지속적인 발전에 대비하세요.
'Python' 카테고리의 다른 글
개발을 위한 고급 Python 팁 (2) | 2023.12.17 |
---|---|
데이터 통합을 위한 상위 10개 Python ETL 솔루션 (0) | 2023.12.14 |
개발자 가이드: Python을 사용하여 암호화폐 지갑을 구축하는 방법 (56) | 2023.12.07 |
모든 프로그래머가 알아야 할 10가지 기본 프로그래밍 원칙 (2) | 2023.12.03 |
Python에서 데이터 분석을 위해 Pandas를 사용하는 방법 (45) | 2023.12.03 |