Django 4.0 릴리스와 주요 변경 사항

이 글에서는 Django 4.0에 추가된 기능과 바뀐 점을 알아보려 합니다. Django 4.0 release notes를 참고하였습니다.

Django는 3년 마다 LTS를 위해 메이저 버전을 하나씩 올리고, 8개월마다 마이너 버전을 올립니다. 현재 LTS 버전은 3.2.x입니다. 이번에 출시한 4.0은 LTS 버전은 아닙니다.

출처: Django 공식 웹 사이트 - 다운로드 페이지

파이썬 호환성

Django 4.0은 파이썬 3.8과 3.9, 3.10을 지원합니다. 파이썬 3.6과 3.7을 지원하는 마지막 버전은 Django 3.2.x입니다.

44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

새 기능

기본 타임존은 zoneinfo

이제부터 파이썬 기본 라이브러리인 zoneinfo가 기본 타임존입니다. Django 3.2부터 시작한 pytz를 zoneinfo로 이전하는 작업의 일환입니다. pytz 지원은 중단 예정이며 Django 5.0에서 완전히 삭제됩니다.

함수형 고유키 제약

UniqueContraint() 표현식으로 함수형 고유키를 생성할 수 있습니다. 예를 들어 온라인 상점의 영문 이름을 소문자화하여 고유키로 사용하고 싶다고 해보면 다음과 같이 선언하면 됩니다.

class Shop(models.Model):
    name = models.CharField(max_length=255)
    class Meta:
        constraints = [
            UniqueConstraint(Lower('name'),
            name='unique_name')
        ]

이렇게 선언한 후, 이름이 OnlineShop인 상점이 존재할 때 다른 상점의 이름을 onlineshop으로 등록할 수 없습니다.

scrypt 암호 해시기

PBKDF2보다 안전한 scrypt 암호 해시기를 도입했습니다. 이를 사용하려면 OpenSSL 1.1 버전 이상이 필요합니다. 또한 메모리를 더 사용하기 때문에 기본값으로 지정하진 않았습니다.

Redis 캐시 백엔드 내장

Redis 캐시를 지원하는 django.core.cache.backends.redis.RedisCache 내장 백엔드를 추가했습니다. 이를 사용하려면 redis-py 3.0.0 버전 이상이 필요합니다.

템플릿 기반의 폼 렌더링

FormFormset, ErrorList에 템플릿 기반의 렌더링 기능을 추가했습니다. Form과 Formset 렌더링에 필요한 render(), get_context(), template_name 등의 메서드와 속성도 추가했습니다.

예를 들어 다음과 같은 뷰가 있다고 가정하죠.

from shop.forms import CartForm
def cart(request):
    CartFormSet = formset_factory(CartForm)
    if request.method == 'POST':
        formset = CartFormSet(request.POST)
    else:
        formset = CartFormSet()
    return render(request, 'cart.html', {'formset': formset})

그동안 cart.html에서는 이런 식으로 폼을 렌더링했습니다.

<form method="post">
    {{ formset.management_form }}
    <table>
        {% for form in formset %}
        {{ form }}
        {% endfor %}
    </table>
</form>

이제는 뷰에서 formset.template_name 속성을 선언한 후 cart.html을 다음과 같이 줄일 수 있습니다.

<form method="post">
    <table>
        {{ formset }}
    </table>
</form>

자잘한 변경

관리자 화면(django.contrib.admin)

admin/base.html 템플릿 파일에 header 블럭을 추가했습니다. 여기에는 관리자 화면의 헤더 부분(아래 화면의 빨간 테두리 부분)이 들어갑니다.

관리자 화면의 header 부분

관리자 화면의 내비게이션 바에 필터를 추가했습니다.

내비게이션 바의 필터

django.contrib.postgres

서비스 이름으로 연결하기를 지원합니다. 예를 들어 .pg_service.conf 파일을 다음과 같이 선언해두었다고 가정합니다.

[shops_service]
host=localhost
user=superadmin
dbname=shops
port=5432

데이터베이스 접속 비밀번호는 .shops_pgpass에 저장해두었고요.

localhost:5432:shops:superadmin:PASSWORD

이제 settings.pyDATABASES 부분은 다음과 같이 선언할 수 있습니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'OPTIONS': {
            'service': 'shops_service',
            'passfile': '.shops_pgpass',
        },
    }
}
from django.contrib.postgres.expressions import ArraySubquery
orders = Order.objects.filter(shop=OuterRef('pk')).values('product_name')
shop = Shop.objects.annotate(orders=ArraySubquery(orders)).first()
shop.orders  # ['Route53', 'ELB', 'EC2']

orders = Order.objects.filter(shop=OuterRef('pk')).values(json=JSONObject(product='product_name', id='id'))
shop = Shop.objects.annotate(orders=ArraySubquery(orders)).first()
shop.orders  # [{'id': 3, 'product': 'Route53'}, {'id': 4, 'product': 'ELB'}, {'id': 5, 'product': 'EC2'}]

기타

하위 호환되지 않는 기능

데이터베이스 API

PostgreSQL 9.6 지원 중단

Oracle 12.2와 18c 지원 중단

SecurityMiddleware가 X-XSS-Protection 헤더를 설정하지 않음

마이그레이션 자동 감지 변경

마이그레이션 자동 감지기가 모델 클래스 대신 모델 스테이트를 참고합니다. 또한 ForeignKeyManyToManyField 필드에 대한 마이그레이션 파일 생성시 몇몇 속성을 특정하지 않습니다. 따라서 간혹 아무 일도 하지 않는 AlterField가 마이그레이션 파일 안에 선언되기도 합니다.

자잘한 변경

중단 예정인 기능

pytz 타임존

pytz 대신 zoneinfo를 권장합니다. 따라서 몇몇 시간 관련 메서드에서 사용하던 is_dst 전달인자도 중단 예정입니다.

pytz는 Django 5.0에서는 사용할 수 없습니다.

타임존 지원

Django 5.0 버전부터는USE_TZ 설정의 기본 값이 False에서 True로 바뀔 예정입니다. 사실 Django 1.4 버전부터startproject 명령어가 자동 생성하는 settings.py 파일에 USE_TZ = True가 들어 있었지만, 기본 값은 False였습니다.

지역화

USE_L10N 설정의 기본 값 역시 False에서 True로 바뀌었습니다. 아울러 USE_L10N 설정은 중단 예정입니다. Django 5.0에서는 기본으로 날짜나 숫자를 지역화합니다.

삭제된 기능

Django 3.0부터 중단 예정이었던 기능

Django 3.1부터 중단 예정이었던 기능


요약은 여기까지입니다. 개인적으론 중요하지 않아 보여서 적지 않은 내용이 여러분에겐 더 중요할 수도 있으니, Django 4.0 공식 릴리스 노트를 한 번 살펴보시길 추천합니다.

'아마존 웹 서비스 계정 생성 후 해야하는 IAM 보안 조치: 루트 사용자와 IAM 사용자의 차이' 대표 이미지

아마존 웹 서비스 계정 생성 후 해야하는 IAM 보안 조치: 루트 사용자와 IAM 사용자의 차이

🗒 기사, 2018-07-19 - 하나의 AWS 계정은 루트 사용자와 다수의 IAM 사용자로 구성된 다중 사용자 환경입니다. 아마존에서는 루트 계정을 사용하기보다는 IAM 사용자를 만들어 권한을 관리할 것을 권장하고 있습니다. 이를 중심으로 계정 생성 후에 적용해야하는 보안 조치들을 소개합니다.

AWS 파게이트(Fargate) 가격 30%-50% 인하 발표

🗞 새소식, 2019-01-10 - AWS 파게이트는 AWS ECS 상에서 컨테이너를 인스턴스 없이 실행하는 서비스입니다. 파게이트는 가격이 비싼 편이었는데 대폭적인 가격 인하를 발표했습니다. 서울 리전을 포함해 1월 7일부터 기존 자격 대비 vCPU는 20%, 메모리는 65% 단위 가격을 인하합니다.

AWS RDS for PostgreSQL에서 S3 데이터 임포트 기능 지원

🗞 새소식, 2019-04-26 - 4월 24일 AWS에서는 PostgreSQL Amazon S3에 있는 데이터를 Amazon RDS for 에 가져오는(import) 기능을 발표했습니다. 이 기능을 사용하면 S3에 저장되어있는 text, csv, binary 형식의 데이터를 RDS에서 직접 임포트하는 것이 가능합니다.