책. Two Scoops of Django (모범 사례로 배우는 Django(장고) 테크닉)

책. Two Scoops of Django (모범 사례로 배우는 Django(장고) 테크닉)

모범 사례로 배우는 Django(장고) 테크닉

(대니얼 로이 그린펠드 · 오드리 로이 그릴펠드 지음 / 김승진 옮김 / 프로그래밍인사이트)

settings와 requirements 파일

우리가 생각하는 최선의 장고 설정 방법

  • 버전 컨트롤 시스템으로 모든 설정 파일을 관리해야 한다.
  • 반복되는 설정들을 없애야 한다.
  • 암호나 비밀 키 등은 안전하게 보관해야 한다.

http://2scoops.co/the-best-and-worst-of-django

settings/local.py 세팅 파일을 이용하여 장고/파이썬 셸 시작

1
2
python manage.py shell --settings=twoscoops.settings.local
python manage.py runserver --settings=twoscoops.settings.local

장고에서 모델 이용하기

장고는 세 가지 모델 상속 방법을 제공한다.

  • 추상화 기초 클래스(abstract base class)
  • 멀티테이블 상속(multitable inheritance)
  • 프락시 모델(proxy model)

멀티테이블 상속은 피하자
접합 상속(concrete inheritance)이라고도 부르는 멀티테이블 상속은 가능한 이용하지 않기를 권한다.

모델에서 null=Trueblank=True 옵션을 이용할 때는 애매한 부분을 주의하기 바란다.

쿼리와 데이터베이스 레이어

쿼리 표현식

1
2
3
from django.db.models import F
from models.customers import Customer
customers = Customer.objects.filter(scoops_ordered__gt=F('store_visits'))

내부적으로 장고는 다음과 같은 코드를 실행한다.

1
SELECT * from customers_customer where scoops_ordered > store_visits

쿼리 표현식이 프로젝트의 안전성과 성능을 대폭 향상시켜 줄 것이다.

https://docs.djangoproject.com/en/1.8/ref/models/expressions

데이터베이스 함수들

https://docs.djangoproject.com/en/1.8/ref/models/database-functions

필요에 따라 인덱스를 이용하자.

  • 인덱스가 빈번하게(모든 쿼리의 10~25% 사이에서서 이용될 때
  • 실제 데이터 또는 실제와 비슷한 데이터가 존재해서 인덱싱 결과에 대한 분석이 가능할 때
  • 인덱싱을 통해 성능이 향상되는지 테스트할 수 있을 때

PostgreSQL을 이용할 때 pg_stat_activity는 실제로 어떤 인덱스들이 이용되는지 알려준다.

명시적인 트랜잭션 선언

  • 데이터베이스에 변경이 생기지 않는 데이터베이스 작업은 트랜잭션으로 처리하지 않는다.
  • 데이터베이스에 변경이 생기는 데이터베이스 작업은 반드시 트랜잭션으로 처리한다.
  • 데이터베이스 읽기 작업을 수반하는 데이터베이스 변경 작업 또는 데이터베이스 성능에 관련된 특별한 경우에는 앞의 두 가이드라인을 모두 고려한다.
목적 ORM 매서드 트랜잭션을 이용할 것인가
데이터 생성 .create(), .bulk_create(), .get_or_create() ✔️
데이터 가져오기 .get(), .filter(), .count(), .iterate(), .exists(), .exclude()
데이터 수정하기 .update() ✔️
데이터 지우기 .delete() ✔️

장고 ORM 트랜잭션 관련 자료

함수 기반 뷰와 클래스 기반 뷰

장고 1.8은

  • 함수 기반 뷰(function-based view, FBV)
  • 클래스 기반 뷰(class-based view, CBV)

둘 다 지원한다.

뷰의 기본 형태들

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# simplest_views.py
from django.http import HttpResponse
from django.views.generic import View

# 함수 기반 뷰의 기본 형태
def simplest_view(request):
# 비즈니스 로직이 여기에 위치한다.
return HttpResponse("FBV")

# 클래스 기반 뷰의 기본 형태
class SimpleView(View):
def get(self, request, *args, **kargs):
# 비즈니스 로직이 여기에 위치한다.
return HttpResponse("CBV")

왜 이 기본 형태가 중요한가?

  • 종종 우리에게 한 기능만 따로 떼어 놓은 관점이 필요할 때가 있다.
  • 가장 단순한 형태로 된 기본 장고의 뷰를 이해했다는 것은 장고 뷰의 역할을 명확히 이해했다는 것이다.
  • 장고의 함수 기반 뷰는 HTTP 메서드에 중립적이지만, 클래스 기반 뷰의 경우 HTTP 메서드의 선언이 필요하다는 것을 설명해 준다.

함수 기반 뷰의 모범적인 이용

함수 기반 뷰의 장점

  • 뷰 코드는 작을수록 좋다.
  • 뷰에서 절대 코드를 반복해서 사용하지 말자
  • 뷰는 프레젠테이션(presentation) 로직을 처리해야 한다. 비즈니스 로직은 가능한 한 모델 로직에 적용시키고 만약 해야 한다면 폼 안에 내재시켜야 한다.
  • 뷰를 가능한 단순하게 유지하자.
  • 403, 404, 500을 처리하는 커스텀 코드를 쓰는 데 이용하라.
  • 복잡하게 중첩된 if 블록 구문을 피하자

데코레이터에 대한 더 많은 자료들

클래스 기반 뷰의 모범적인 이용

클래스 기반 뷰를 이용할 때의 가이드라인

  • 뷰 코드의 양은 적으면 적을수록 좋다.
  • 뷰 안에서 같은 코드를 반복적으로 이용하지 말자.
  • 뷰는 프레젠테이션 로직에서 관리하도록 하자. 비즈니스 로직은 모델에서 처리하자. 매우 특별한 경우에는 폼에서 처리하자.
  • 뷰는 간단 명료해야 한다.
  • 403, 404, 500 에러 핸들링에 클래스 기반 뷰는 이용하지 않는다. 대신 함수 기반 뷰를 이용하자.
  • 믹스인은 간단 명료해야 한다.

어떤 장고 제네릭 클래스 기반 뷰를 어떤 태스크에 이용할 것인가?

장고 폼의 기초

폼 패턴들

유용한 폼 관련 패키지들

  • django-floppyforms: 장고 폼을 HTML5로 렌더링해 준다.
  • django-crispy-forms: 폼 레이아웃의 고급 기능들. 폼을 트위터의 부트스트랩 폼 엘리먼트와 스타일로 보여준다. django-floppyforms와 함께 쓰기 좋아서 빈번하게 함께 쓰인다.

REST API 구현하기

개발자들은 AJAX와 모바일 앱을 지원해야 하며 JSON, YAML, XML을 포함한 여러 형식을 지원해야 하는 일이 큰 과제가 되었다. REST(representational state transfer) API는 다양한 환경과 용도에 맞는 데이터를 제공하는 디자인을 정의하고 있다.

패키지 API를 제작하기 위한 패키지들

  • django-rest-framework 는 장고의 기본 클래스 기반 뷰를 바탕으로 브라우징이 가능한 편리한 API 기능 등을 제공한다.
  • django-tastypie는 자체적으로 구현된 클래스 기반 뷰 시스템을 제공하는 안정된 도구다.
  • 매우 단순하고 빠르게 REST API를 제작하고 싶다면 django-braces(클래스 기반 뷰)와 django-jsonview(함수 기반 뷰)가 좋은 대안이 된다. 다만 이 도구들은 API를 제작하는데만 중점을 두고 있지는 않기 때문에 HTTP 메서드의 모든 기능을 다 이용한다거나 복잡한 디자인을 구현해야 할 때 문제가 생길 것이다.

비즈니스 계획으로서의 접속 제한

  • 개발자(Developer) 단계는 무료로 서비스되지만 시간당 10 API 요청만 가능
  • 한 숟갈(One Scoop) 24달러, 분당 25요청
  • 두 숟갈(Two Scoops) 79달러, 분당 50요청
  • 기업(Corporate) 5000달러, 분당 200요청

장고의 어드민 문서 생성기

1
pip install docutils
1
2
3
4
5
INSTALLED_APPS = [
...
'django.contrib.admindocs',
...
]
1
2
3
4
urlpatterns = [
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
...
]

이후 /admin/doc으로 가서 문서들을 살펴볼 수 있다.

장고의 비법 소스: 서드 파트 패키지들

장고의 진정한 강력함은 바로 빠르게 성장하고 있는 오픈 소스 커뮤니티에서 제공하는 파이썬 패키지와 서드 파티 장고 패키지들이다.

패키지들

코어

비동기

공유하기