나의 첫 Django 앱 만들기 - part 1 - 2

투표 앱 만들기

이제 "프로젝트" 환경이 마련되었으니 당신의 첫 장고 웹 어플리케이션을 만들 준비가 되었습니다.

당신이 만들 각각의 장고 어플리케이션은 어떤한 규칙에 따르는 파이썬 패키지로 구성되어 있습니다. 장고는 개발자가 디렉터리를 만드는 것 보다, 코드를 만드는 것에 열중할 수 있도록 기본 앱 디렉터리 구조를 자동으로 생성해주는 유틸리티를 제공하고 있습니다. 

Projects vs. apps

프로젝트와 앱의 차이점은 무엇일까요? 앱이란 어떠한 기능을 하는 웹 어플리케이션을 말 합니다.  – e.g., 웹 블로그 시스템, 퍼블릭 레코드의 데이터베이스나 간단한 투표 어플리케이션 등. 프로젝트란 특정 웹 사이트의 어플리케이션들과 그 구성의 집합을 뜻 합니다. 프로젝트는 여러개의 앱을 포함할 수 있으며, 하나의 앱은 여러개의 프로젝트에 포함 될 수 있습니다.

당신의 앱은 파이썬 패스 (Python path) 위 라면 어디에나 존재할 수 있습니다. 이번 강좌에서는 투표 앱을 mysite의 서브 모듈이 아닌 manage.py 의 바로 옆에 만들어 최상 모듈로써 임포트 되도록 만들겠습니다.

새로운 앱을 만들기 위해서 manage.py 가 있는 디렉터리로 이동하여 다음의 명령어를 입력하여 주십시오.

$ python manage.py startapp polls

이 명령어는 polls 라는 이름의 디렉터리를 만들며, 이 디렉터리는 다음과 같은 구성를 가지고 있습니다.

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

이 디렉터리 구조는 투표 앱의 하우스가 될 것 입니다.

첫 뷰 만들기

첫 뷰를 만들어 보도록 합시다. polls/views.py 를 코드 에디터로 열고 다음의 파이썬 코드를 입력하여 주십시오.

polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

이 코드가 가장 간단한 장고 뷰 입니다. 이 뷰를 사용하기 위해서는 URLconf를 만들어 뷰를 URL에 맵핑 해야 합니다.

polls 디렉터리안에 URLconf를 만들기 위해서 urls.py라는 이름의 파일을 만듭니다. 당신의 앱 디렉터리는 다음과 같을 것 입니다.

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

새로 만든 polls/urls.py 파일안에 다음의 코드를 입력하여 주십시오.

polls/urls.py
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

다음 스텝은 루트 URLconf가 polls.urls 모듈을 보게끔 해주는 것 입니다. mysite/urls.py 파일에 django.conf.urls.include 를 임포트하고 urlpatterns 리스트 안에 include() 를 넣어 주세요.

mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

include() 함수는 루트 URLconf가 다른 URLconf를 참조할 수 있도록 해줍니다. include() 함수의 레귤러 익스프레션은 문자열의 마직막을 표시하는 $ 가지고 있지 않고, 대신에 문자열 마지막에 / 를 가지고 있습니다. 이것은 URL 요청이 들어 왔을때 루트 URLconf 와 매칭되는 부분만을 잘라내고 또 다른 프로세싱을 위해 나머지를 문자열을 include() 함수가 지정한 다른 URLconf로 보내는 역할을 합니다.

include() 를 사용하는 이유는 URL을 간단히 plug-and-play 할 수 있도록 하기 위함입니다. 투표 앱은 자신의 URLconf인 polls/urls.py안에 자신만의 URL을 가지고 있기 때문에 “/polls/” 이나 “/fun_polls/” 또는 “/content/polls/” 등 관리자가 원하는 어떤 root path로도 설정할 수가 있습니다.

include()는 언제 사용 할까요?

다른 URL 패턴을 포함시킬 때에는 항상 include()를 사용해야 하며, admin.site.urls 만이 예외입니다.

자신의 코드와는 다른가요?

만약에 admin.site.urls가 아닌 include(admin.site.urls)가 보인다면 이 강좌의 장고 버전과 다른 버전을 사용 중일 겁니다. 자신의 버전에 맞는 강좌는 보시던가 새로운 장고로 업데이트 하여 주십시오.

이제 index 뷰를 URLconf로 연결 하였습니다. 다음의 명령어를 실행하여 문제가 없는지 확인해보죠.

$ python manage.py runserver

브라우져의 주소창에 http://localhost:8000/polls/ 를 입력해 주십시오. index 에 입력한 “Hello, world. You’re at the polls index.”가 출력될 것 입니다.

url() 함수는 두개의 필수 인자 (argument) 인 regex 와 view, 그리고 두개의 옵션 인자인 kwargs 와 name을 전달 받습니다. 여기서 이 인자들에 대해서 확인하고 넘어가는게 좋을 듯 합니다.

url() argument: regex

“regex” 란 단어는 “regular expression”를 뜻하는 일반 약어이며, 문자열의 패턴 매칭을 위한 구문입니다. 지금의 경우에는 url 패턴 매칭을 위해 사용되고 있습니다. Django는 첫번째 regular expression 부터 시작하여 모는 리스트를 확인합니다. Request 요청이 들어온 URL과 매칭되는 regular expression 을 찾을때 까지 모든 regular expression을 확인합니다.

이러한 regular expression은 GET 와 POST 파라메터나 도메인 이름은 확인하지 않습니다. 예를 들어, https://www.example.com/myapp/ 와 같은 요청이 들어오면, URLconf 는 myapp/ 만을 검색합니다. 만약 https://www.example.com/myapp/?page=3 와 같은 요청이 들어오면, URLconf는 myapp/을 찾게 됩니다.

Regular expressions에 대해서 더 알고 싶으시면, Wikipedia’s entry 와 re module을 읽어 보십시오. 또한, O’Reilly book “Mastering Regular Expressions” by Jeffrey Friedl 또한 훌륭한 서적입니다. 하지만, 사실상 간단한 패턴 매칭만 가능 하다면 꼭 regular expression의 전문가가 될 필요는 없습니다. 사실, 너무 복잡한 regexes는 URL 룩업 퍼포먼스를 떨어뜨릴 수 가 있으니, 모든것을 regexes에 의존하지 않는 것이 좋을 것 입니다.

마자막으로 퍼포먼스에 대해서 한가지 얘기하자면, regular expressions는 처음 URLconf 모듈이 로딩될 때 컴파일 되며, 위에서 얘기 언급했듯이 아주 복잡한 구문만 아니면 아주 빠르게 처리 됩니다.

url() argument: view

장고가 regular expression 일치하는 문자열을 찾으면, url() 에 인수로 전달된 특정 view 함수를 실행한다. 이때 HttpRequest 오브젝트를 첫번째 인수로, regular expression으로 캡쳐한 값을 두번째 인수로 전달 합니다. 만약에 네임드 캡쳐를 사용했다면 캡쳐된 값은 키워드 인수로 전달 합니다. 네임드 캡쳐에 대해서는 뒤에 예제를 들어 살펴 보도록 하겠습니다.

url() argument: kwargs

임위로 만들어진 키워드 인수는 파이썬 사전으로 타겟 뷰로 전달 될 수 있습니다. 이 강의에서는 이 기능을 사용하지 않겠습니다.

url() argument: name

URL에 이름을 지정하면 장고 앱 어딘가에서 특히 템플릿과 같은 파일에서 참조가 가능합니다. 이 강력한 기능을 사용하면 파일 하나만 수정하여 앱 전체의 글로벌 적용을 할 수가 있습니다.

기초 request 와 response 절차에 대해서 익숙해 졌다면, 첫 장고 앱 만들기 part 2 에서 데이터베이스 사용법에 알아 보도록 합시다.


blog comments powered by Disqus