2012. 3. 28. 16:38

[01] django 소개

원문 : http://www.djangobook.com/en/2.0/chapter01/

 

이 책은 시간을 절약하면서 즐겁게 web을 개발 할 수 있는 web development framework인 django에 대해 다룬다.

django를 사용하면 high-quality web 개발이 가능하다.

 

web 개발을, 좋게 얘기하자면 exciting하고 creative한 활동인데 반해,

나쁘게 얘기하자면, 반복적이고 성가시고 좌절감을 안겨준다고 할 수 있다.

django는 당신에게 재이있는 요소에 집중하도록 해주는데,

그것은 공통의 web 개발 pattern의 추상화, 빈번한 programming 작업에 대한 지름길(shortcut), 그리고

문제 해결을 위한 규약을 제공한다.

django는 필요시 framework 범위 밖의 작업도 가능케 하면서, 당신의 방법에 대해 관여하지 않는다.

 

본 책의 목표는 당신을 django의 전문가로 만들기 위함이다.

그 촛점은 두개로 나눠지는데,

첫째는 깊이있는 설명 즉, django는 무엇이며 어떻게 web application을 빌드하는지를 다루며,

부번째로는 "내 project에 이런 도구를 어떻게 적용할까?"에 대한 답을 구해주기 위한

고수준의 concept을 설명한다.

본 책을 읽음으로 유지보수하는데 깔끔하고 쉬운 코드로 구성된 web site를

보다 빠르게 개발하는 skill을 배울 수 있다.

 

web framework은 무엇인가?

 

django는 새로운 web framework의 주요 멤버인데, 그럼 web framework 용어의 뜻은 무었인가?

 

그 답을 찾기위해 framework 없이 python으로 씌어진 web application의 design을 고려해 보자.

본 책을 통해 우리는 지름길 없이 작업을 완료할 수 있는 기본적인 방법은 제공해 줄 것인데,

그 지름길이 매우 도움이 된다는 것을 인지시켜주기 위해서이다.

(또한 지름길없이 완료하는 방법을 알아야 하는것이 중요한데, 지름길이 언제나 유용하건 아니기 때문이다)

 

python web app을 빌드하기 위한 대부분의 방법은 Common Gateway Interface(CGI) 표준을 사용하는 것이다.

HTML을 output하는 python script를 만든뒤 확장자를 ".cgi" 확장자로 web server에 저장하고 web browser로

방문한다. 그것이 다다.

 

아래는 python cgi script 예인데, db로 부터 출판된 책중 최근의 10개를 출력하는 것이다.

문법은 그다지 신경쓰지 말고, 어떻게 이뤄지는지 느끼기 바란다.

 

#!/usr/bin/env python

 

import MySQLdb

 

print "Content-Type: text/html\n"

print "<html><head><title>Books</title></head>"

print "<body>"

print "<h1>Books</h1>"

print "<ul>"

 

connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db')

cursor = connection.cursor()

cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10")

 

for row in cursor.fetchall():

print "<li>%s</li>" % row[0]

 

print "</ul>"

print "</body></html>"

 

connection.close()

 

우선 CGI의 요구사항을 만족하기 위해 "Content-Type"을 출력하고 개행한다.

다음으로 html 서두부분을 출력하고 db 연결한뒤 최근 10개의 책 이름을 구하기 위해 query를 실행한다.

해당 책에 대해 loop 돌면서 책 이름을 생성한다. 마지막으로 html을 종료하고, db를 닫는다.

 

이것과 비슷한 단한번 사용될 page를 만든다고 할때, 처음부터 쓰기 접근법(write-it-from-scratch)은 나쁘진 않다.

위 코드는 이해하는데 충분히 단순하고, 심지어 초보 개발자라 하더라도 시작부터 종료까지 16줄의 python 코드를

읽을 수 있을 것이다. 더이상 따로 배울건 없으며, 읽을 다른이도 없을 것이다. 또한 배포(deploy)도,

".cgi"로 끝내고 web server로 upload하기 때문에 쉽다.

 

이러한 단순함에도 불구하고 이러한 접근방법은 많은 문제를 야기한다. 다음 질문에 대한 답변을 만들어 보라.

 

- application의 많은 부분이 db에 접근이 필요할 때 무엇이 발생하는가?

확실하게는 db 접속 code는 개별 cgi script에 복사될 필요가 없다. 공유된 함수 사용하는 것으로 개선해야 한다.

 

- 개발자가 "Content-Type"과 db 닫기에 대해 정말 걱정해야 하는가?

이런것은 개발자의 생산성을 줄이고 실수를 유발할 수 있다. 이러한 처리는 몇개의 공통 infrastructure를 통해

처리하는것이 최선일 것이다.

 

- 이 코드가 다양한 환경에서 재사용된다면, 각각의 db와 password는 어떻게 구별되는가?

이 싯점에서는 몇몇 환경별 지정 가능한 설정이 필요하다.

 

- python 코드에 대한 경험이 없는 web designer가 해당 page에 대해 redesign을 한다면, 어떤일이 발생하겠는가?

하나라도 잘못된 문자가 포함된다면 전체 application은 crash될 것이다.

이상적으로, page의 로직(db로 부터의 책 제목들)은 html display로 부터 개별 분리되어야 하고,

그렇다면 designer는 전자에 영향없이 후자만 개발하면 된다.

 

web framework는 이러한 문제를 해결하기 위한 의도로 작성되었다. web framework은

application을 위해 programming infrastructure를 제공하고 개발자로 하여금 깔끔하고 유지보수 쉬운 코드를

재개발 없이 가능케 한다.

 

the MVC Design Pattern

 

이제 앞의 접근법과 web framework 접근법의 차이를 보여주기 위해, 앞선 cgi code를 django로 한 것을

나타낸다. 단, 4개 이상의 python 파일(models.py, view.py, urls.py)과 html template 파일(latest_books.html)로

나눠서 표기한다.

 

# models.py (the database tables)

 

from django.db import models

 

class Book(models.Model):

    name = models.CharField(max_length=50)

    pub_date = models.DateField()

 

 

# views.py (the business logic)

 

from django.shortcuts import render_to_response

from models import Book

 

def latest_books(request):

    book_list = Book.objects.order_by('-pub_date')[:10]

    return render_to_response('latest_books.html', {'book_list': book_list})

 

 

# urls.py (the URL configuration)

 

from django.conf.urls.defaults import *

import views

 

urlpatterns = patterns('',

    (r'^latest/$', views.latest_books),

)

 

 

# latest_books.html (the template)

 

<html><head><title>Books</title></head>

<body>

<h1>Books</h1>

<ul>

{% for book in book_list %}

<li>{{ book.name }}</li>

{% endfor %}

</ul>

</body></html>

 

역시 syntax는 크게 걱정하지 말고, 전체 design을 보고 느껴보기 바란다.

 

- models.py은 db table의 description을 포함하는데, python의 class로 표현된다.

이것을 model이라고 한다. 그것을 사용하여 sql없이 db의 crud(create,retreive, update, delete)를 사용할 수 있다.

 

- views.py는 해당 page에 대해 business logic을 수행한다. latest_books() 함수는 view라고 읽혀진다.

 

- urls.py는 주어진 URL pattern으로 어떤 view를 지정할지를 결정한다.

위 코드는 /latest/ URL은 latest_books() 함수에 의해 처리되록 한다. 만약 example.com과 같은 domain이라면,

어떠한 http://example.com/latest/는 latest_books() 함수를 실행토록 한다.

 

- latest_books.html은 해당 page의 design에 해당되는 html template를 결정한다.

basic logic statement로 구성된 template 언어를 사용한다.

 

이러한 항목들은 Model-View-Controller(MVC)로 불려진 pattern을 느슨하게 따르고 있다.

MVC는 data 정의와 접근에 대한 코드(model)은

request-routing 논리(controller)와 분리되어 실행되고,

분리된 UI(view)를 가진다.

(자세한 MVC 모델은 Chapter 5.에서 설명한다.)

 

이러한 접근방법의 가장큰 장점중 하나는 각 compoent는 느슨하게 연결되어 있다는 것이다. (loosely coupled)

django의 각 구별된 조각은 단일 목적이며 다른 조각에 영향을 미치지 않는다.

예를 들어, 개발자는 URL 변경을 일부분만 수정하고, 이는 다른 코드들의 영향을 미치지 않는다.

designer는 python code를 손대지 않는다.

db 관리자는 db table 이름을 변경할 수 있는데, 이는 단일 위치의 코드만 수정하면 된다.

즉, 전체 file들을 찾아 변경할 필요가 없다는 뜻이다.

 

본 책에서는 MVC의 각 component는 그들만의 chapter가 존재한다.

chapter 3은 view, chapter 4는 templete, 그리고 chapter 5는 model이다.

'django > the django book study' 카테고리의 다른 글

[05] django의 model  (8) 2012.04.12
[04] django의 template  (14) 2012.04.05
[03] django 1.4의 view와 urlconfs  (5) 2012.04.04
[02] django 1.4 설치와 project 생성하기  (1) 2012.03.30
[00] Chapter 0  (0) 2012.03.28