갈루아의 반서재

디렉토리 및 프로젝트 생성
[root@lms data]# mkdir project
[root@lms data]# cd project
[root@lms project]# django-admin.py startproject Jbin
[root@lms project]# cd Jbin
[root@lms Jbin]# ls -al
▒հ▒ 24
drwxr-xr-x    2 root     root         4096 12▒▒ 10 17:58 .
drwxr-xr-x    3 root     root         4096 12▒▒ 10 17:58 ..
-rw-r--r--    1 root     root            0 12▒▒ 10 17:58 __init__.py
-rw-r--r--    1 root     root          503 12▒▒ 10 17:58 manage.py
-rw-r--r--    1 root     root         5027 12▒▒ 10 17:58 settings.py
-rw-r--r--    1 root     root          559 12▒▒ 10 17:58 urls.py
[각 파일의 기능]
__init__.py : 이 폴더가 파이썬 패키지임을 알려준다. 이 폴더내의 모든 스크립트를 모듈로 가져오도록 한다.
manage.py : 사이트 관리에 필요한 함수 배열 포함
settings.py : 웹사이트 셋팅 정보 포함. Django 는 환경설정을 위해서 XML 파일을 사용하지 않는다
urls.py : URL-페이지 대응 맵. 예를 들면, yourwebsite.com/about 을 About Us page 에 매칭시키는 것과 같이 말이다.

App
하지만 이러한 파일들만으로는 기능적인 웹사이트를 구축할 수는 없다. 그러기 위해서는 앱이 필요하다. 앱은 웹사이트에 기능을 더하는 코드를 의미하는 것으로, 일단 Django 의 디자인 철학부터 살펴볼 필요가 있다.

장고의 디자인 철학(Django’s design principles)
1) Django는 MVC 프레임워크이다. MVC는 데이터를 처리하는 코드와 유저 인터페이스를 관리하는 코드를 분리시킨 것이다. 하지만 모델-뷰-컨트롤러를 느슨하게 적용한다.
2) Django의 철학, "Don’t Repeat Yourself (DRY)". 특정 역할을수행하는 코드를 절대 두번 쓰지않는다는 의미다. 예를 들면, 앞으로 우리가 만들 블로그에서 전체 게시물에서 특정 게시물을 랜덤으로 뽑아내는 기능을 만든다고 하면, 한번만 코딩하고 각각의 페이지에서 그것을 사용하면 되는 것이다.

그러면 이런 특징들이 어떻게 앱과 관련이 있는가? 음, 앱은 웹사이트가 DRY 스타일로 구축되도록 도와준다. 각각의 프로젝트는 다수의 앱을 포함할 수 있다. 역으로, 각각의 앱은 여러 프로젝트의 일부가 될 수 있다. 앞서 본 예처럼, 우리가 향후 다른 웹사이트를 만든다고 해도 우리는 다시 그 코드를 작성할 필요가 없는 것이다. 간단히 이 프로젝트에서 앱을 가져오기만 하면 된다. 이런 점 때문에, 각각의 앱이 명확한 목적을 가지는 것이 중요하다. 그리고 잘 정돈될 필요가 있다. 특정 기능을 변경하고자 한다면, 방대한 파일을 다 뒤질 것이 아니라 연관되는 앱을 찾아 그 기능만 바꾸면 되는 것이다. 

[root@lms Jbin]# python manage.py startapp blog
[root@lms Jbin]# ls -al
▒հ▒ 36
drwxr-xr-x    3 root     root         4096 12▒▒ 10 18:59 .
drwxr-xr-x    3 root     root         4096 12▒▒ 10 17:58 ..
-rw-r--r--    1 root     root            0 12▒▒ 10 17:58 __init__.py
-rw-r--r--    1 root     root          125 12▒▒ 10 18:59 __init__.pyc
drwxr-xr-x    2 root     root         4096 12▒▒ 10 18:59 blog
-rw-r--r--    1 root     root          503 12▒▒ 10 17:58 manage.py
-rw-r--r--    1 root     root         5027 12▒▒ 10 17:58 settings.py
-rw-r--r--    1 root     root         2653 12▒▒ 10 18:59 settings.pyc
-rw-r--r--    1 root     root          559 12▒▒ 10 17:58 urls.py
[root@lms Jbin]# cd blog
[root@lms blog]# ls -al
▒հ▒ 20
drwxr-xr-x    2 root     root         4096 12▒▒ 10 18:59 .
drwxr-xr-x    3 root     root         4096 12▒▒ 10 18:59 ..
-rw-r--r--    1 root     root            0 12▒▒ 10 18:59 __init__.py
-rw-r--r--    1 root     root           57 12▒▒ 10 18:59 models.py
-rw-r--r--    1 root     root          383 12▒▒ 10 18:59 tests.py
-rw-r--r--    1 root     root           26 12▒▒ 10 18:59 views.py
데이터에 접근하기를 원할 때, 쿼리(raw queries)를 돌리는 것이 아니라 해당 메소드(method)를 호출하면 된다. Django 는 다수의 데이터베이스 프로그램을 사용할 수 있으므로, 이런 관점에서 앞서 말한 특징은 특히 유용하다. 예를 들어, MySQL 에서 향후 다른 데이터베이스로 변경하더라도, 현재의 코드는 여전히 유효하다는 점이다! 다른 말로 하면, 예를 들어 SQLite 나 다른 유사한 데이터베이스로 변경해도 데이터베이스에 접근하는 코드만 새로 쓰면 된다는 것이다. 그리고 뷰(view) 파일을 가지고는 실제 웹페이지를 생성하는 코드를 작성한다.