Django는 Python을 기반으로 만들어진 웹 프레임워크입니다.
Django에 대해서는 그동안 '배우기 쉽고 쓰기 편한 Python이라는 스크립트 언어가 있고, 그걸 기반으로 만든 Django라는 이름의 웹 프레임워크가 있다고 하더라.' 정도로 알고 있었습니다.
웹 프레임워크(Web Framework)는 다양한 웹 프로그램들을 손쉽게 만드는 기반인 플랫폼의 개념으로, 이를 활용하면 CMS(Content Management System)와 같은 복잡한 웹 프로그램을 비교적 적은 노력을 들여서 만들 수 있습니다.
이번에 파이썬을 공부하고, 그것을 복습하는 의미에서 Django를 활용해 간단한 웹 프로그램을 제작하는 프로젝트를 진행하였습니다. 프로젝트라고해서 그렇게 거창한 것은 아니고, 학교 홈페이지에서 학생식당 식단표를 추출해서 DB에 저장했다가 일목요연하게 정리해서 한 페이지로 보여주는 식단표 사이트입니다.
[Menuplexer] http://menuplexer.com
접속하시면 오늘의 식단만 달랑 보이지만, 보이는게 전부가 아닙니다.ㅎㅎ
페이지에 보이는 메뉴들을 자동으로 긁어다가 DB에 저장하는 백엔드 프로세스가 보이지 않는 곳에서 함께 돌고 있습니다. 물론 이 웹 크롤러도 이 프로젝트의 일환으로 직접 제작하였습니다.
(여담이지만, 프로젝트 이름은 Menu와 Multiplexer를 적당히 합친 것입니다. 작명 뭐라고 할까 고민할 때 74150 데이터시트를 보고 있었다네요.)
새로운 것을 할 때는 언제나 마찬가지이고, 또 항상 미리 각오를 하고 뛰어들지만 이번에도 역시 프로젝트를 끝내기까지 수많은 난관(이라 쓰고 삽질이라 읽..)을 겪었습니다. 공식 문서가 잘 되어 있긴 하지만 처음 시작하는 이들에겐 모든 가짓수를 전부 나열해놓은 장황한 공식 문서가 오히려 더 혼란을 줄 때도 있습니다.
여느 때와 마찬가지로 이번에도 프로젝트를 진행하면서 밟았던 과정들을 위키(비공개)에 정리해 놓았는데, 그것을 기반으로 Django Tutorial을 주제로 글을 연재하려고 합니다.
이 연재글에서는 제가 밟았던 과정들만을 다루게 될 것입니다. 문제를 해결하는 방법은 여러가지가 있겠지만,처음 시작하는 경우라면 일단 한 가지 방법으로 목표를 달성해 본 뒤, 그 중간과정에서 파생되는 수많은 다른 방법들을 시도해 보는 편이 더 수월할 것입니다.
- 뭔가 새로운 것을 처음 시작할 때 '가장 좋은 방법을 찾으려고 고군분투'하는것 보다는 '이미 잘 되는 것을 더 잘 되도록 고쳐나가는'편이 훨씬 수월하고 속편할 테니까요.ㅎㅎ
Django 특징과 장점
다음은 제가 짧고도 긴 Django 프로젝트를 진행하면서 직접 느낀 Django의 장점을 나열한 것입니다. 큰 규모의 복잡한 프로젝트를 진행한 것이 아니기 때문에 찾아 보면 더 많은 강점들이 있을 것입니다.
Django의 장점에는 여러 가지가 있지만, 아무래도 가장 배우기 쉽고 쓰기 편한 프로그래밍 언어인 파이썬과 그에 수반되는 강력한 라이브러리들을 그대로 사용할 수 있다는 점이 가장 큰 장점인 것 같습니다.ㅎ
ORM(Object-Relational Mapping) 추상화 계층
단순히 정적인 내용을 보여주는 웹 프로그램이 아니라면, 시시각각 변하는 Contents를 저장하고 관리하는 데 DB를 필수적으로 사용해야 합니다.
직접 DB Table을 설계하고 웹 프로그램과 연동해 보셨던 분은 DB에 저장되는 자료형과 웹에서 사용되는 자료형의 부조화를 한 번쯤은 느껴 보셨을 것입니다. 대표적인 예로 JavaScript와 연동할 때 많이 사용하는 자료형인 JSON을 들 수 있습니다. MongoDB와 같은 NoSQL계열 DB가 아닌 일반적인 RDBMS의 경우, JSON 자료형은 DB에 그대로 저장할 수 없으며, 변환 함수(Stringify, Serialize 등)를 통해 Text형태로 변환하여 저장해야 합니다.
즉, DBMS에서 제공하지 않는 자료형을 사용하려면 각 자료형마다 적절한 상호 변환을 수행해주는 Wrapper함수들을 정의해서 사용해야만 했습니다.
Django에는 DB Adaptor와 유저 프로그램 사이에서 이러한 귀찮은 변환작업을 자동으로 수행해주는 ORM(Object-Relational Mapping)계층이 존재합니다. Model을 설계할 때 파이썬에서 사용하는 자료형들을 그대로 사용할 수 있으며, Table에 정확히 어떤 Type의 Field로 저장되는지 신경쓸 필요가 없습니다.
기본적으로 제공하지 않는 자료형은 사용자가 직접 Wrapper함수를 정의하여 기존 ORM과 연동되도록 만들 수도 있습니다.
Backend Console
백엔드 콘솔은 제가 이번 프로젝트를 진행하면서 개인적으로 가장 마음에 들었던 부분입니다.
웹 프로그램에서 일반 사용자가 보는 프론트엔드를 잘 만드는 것도 중요하지만, 프론트엔드에 표시될 내용들을 관리하는 백엔드 시스템도 그 못지 않게 중요합니다.
Django에서는 백엔드 콘솔로 제공되는 'manage.py'를 사용해서 모든 백엔드 관리를 수행할 수 있습니다.
예를 들어, 완성한 프로젝트를 운용 서버에 옮긴 뒤 다음 명령을 실행하면 설치된 모든 모듈(App)에 정의된 Model들을 검사해서 필요한 DB Table들을 자동으로 생성해 줍니다. (테이블을 생성하는데 SQL은 한 글자도 쓰지 않아도 됩니다.)
./manage.py migrate
기본적으로 제공되는 Command 외에, 별도로 Custom Command를 정의해서 manage.py에서 실행 가능하도록 할 수 있습니다. 각 모듈(App)내에 필요한 명령들을 정의해놓으면 manage.py에서 이 명령을 찾아내서 실행할 수 있습니다.
이번 프로젝트를 진행할 때 몇 가지 Custom Command도 함께 구현하였습니다. Shell에 다음과 같이 명령을 치면 2015년 9월 16일 메뉴를 크롤링해서 DB에 저장합니다.
./manage.py insert-daily-menu kaist 2015-09-16
Python 라이브러리에 있는 Argument Parser를 그대로 사용할 수 있기 때문에 Custom Command를 정의하는 과정도 역시 수월합니다. (구체적인 방법은 추후 연재될 글에서 자세히 다루도록 하겠습니다.)
모듈화 구성과 모듈의 독립성
Django는 사이트의 기반이 되는 프로젝트(Sitebase)와 특정 기능을 수행하는 모듈(App)들이 상호 독립적입니다. 따라서 모듈에서 사용하는 Model들은 모두 각 모듈 디렉토리 내에 정의하게 되어 있고, 이미지나 CSS등의 Static File들도 각 모듈 디렉토리 내에 각각 따로 저장하도록 되어 있습니다.
프로젝트(Sitebase)는 Python환경이나 DB설정, URL Routing과 같이 사이트 전역에 적용되는 자원과 설정들을 관리하고, 관리를 위한 Backend Console을 제공합니다.
모듈(App)은 사이트에서 실질적인 기능을 수행하며, 필요에 따라 Sitebase에 설치하거나 제거할 수 있습니다. App에 종속적인 자원인 Model와 Static File들은 모두 모듈 디렉토리 내에 저장되므로 Sitebase와 다른 App에 독립적입니다. 따라서 사이트 개발을 모듈 단위로 수행할 수 있습니다. 완성한 App을 배포할 경우 App디렉토리만 따로 떼어서 전달하면 됩니다.
프로젝트를 생성할 때 기본적으로 설치되는 Admin도 역시 하나의 App입니다. Django라이브러리에 기본적으로 포함되어 있는 모듈을 그대로 불러와서 사용하기 때문에 별도의 디렉토리가 생성되지 않을 뿐입니다. 물론 Admin페이지도 Class상속을 통해 원하는 형태로 Customize가 가능합니다.
Django프로젝트를 처음 시작하는데 프로젝트를 생성하고 그 안에 또다시 앱을 만들면서 '뭐지?'하고 잠시 멈칫 했었습니다. 웹사이트에 공통적으로 사용되는 DB와 환경설정 요소들을 포함하는 Sitebase는 미리 다 만들어놓고, 이를 App과 분리함으로써 개발자는 모듈 개발에만 집중할 수 있으며, 결과적으로 전체적인 개발 시간을 단축할 수 있게 됩니다.
Production의 용이함: WSGI 지원
WSGI(Web Server Gateway Interface)는 웹 서버(e.g. Apache, Nginx)와 웹 어플리케이션 사이에서 통신을 중재하는 일종의 미들웨어입니다.
WSGI는 웹 서버로부터 요청(Request)을 받아서 이를 어플리케이션(e.g. Django)에 전달하고, 어플리케이션에서 만들어낸 응답(Response)를 받아서 이를 다시 웹 서버로 전달하는 역할을 수행합니다.
Django는 이 WSGI표준을 준수하며, 완성 후 실제 서버에 올려 운용할 때 uWSGI와 같은 WSGI미들웨어를 통해 손쉽게 웹 서버와 연동할 수 있습니다.
이 연재 튜토리얼에서는 uWSGI를 통해 Django를 Nginx웹 서버와 연동하는 방법에 대해서 다룰 것입니다.
- 전국 학생식당 메뉴 포탈 - 메뉴플렉서(Menuplexer) (1075)
- [Django Tutorial] 9. Production - uWSGI를 통해 Nginx 웹 서버와 연동하기 (11352) *1
- [Django Tutorial] 8. Production - setting.py설정, Static파일 모으기 (5484)
- [Django Tutorial] 7. 백엔드 콘솔에 Custom Command 추가하기 (4166)
- [Django Tutorial] 6. Database 연동하기 - Model설계, Migration (30164)
- [Django Tutorial] 5. Static 파일 사용하고 관리하기 (9272)
- [Django Tutorial] 4. URL Config, Template 및 View의 동작에 대한 이해 (9211)
- [Django Tutorial] 3. 프로젝트 및 App 생성, settings.py수정(DB연동, Migration), Runserver (12320)
- [Django Tutorial] 2. 개발 환경 세팅하기 - pyenv 및 virtualenv 활용 (6609)
- VirtualEnv를 통한 Python Sandbox 개발환경 구축하기 (4434)
- pyenv를 이용하여 여러 버전의 Python 동시에 사용하기 (14711) *3