2018년 10월 13일 토요일

가벼운 Django 사용 후기.

정말 단기간에 가볍게 사용해본거라 잘 모르지만 정리는 해두는게 나으므로.

#
2년전이던가. 사내에서 간단하게 쓸 웹 서비스를 만들기 위해 여러가지 프레임워크를 살펴보다가 Admin 기능 하나에 끌려 파이썬의 Django를 사용해보게 되었다.

최근 흐름은 모르겠지만 그래도 아직까진 Django와 Flask가 파이썬에서 가장 인기있는 웹프레임워크인 것으로 알고 있다. Django가 풀스택 프레임워크에 가깝다면 Flask는 개발자가 상황에 맞게 필요한 라이브러리를 조합해 사용하는 경량 프레임워크란 차이가 있다.

Django와 Flask 둘 중에 꼭 뭐가 배우기 쉽고 뭐가 좋다고 말하긴 어려운 것 같다. 특정 프레임워크의 선택은 만드는 목적과 달성하려는 수준, 그리고 개인과 팀의 취향에 따라 갈리는 부분이기 때문이다.

어쨌든 난 Django의 Admin 기능 하나를 보고 Django를 선택했었다. 물론 엄청 괜찮은 수준의 문서 지원도 한 몫 했지만 지금 다시 살펴봐도 Django의 Admin 기능은 쿨하다. models.py와 admin.py만 만져주면 뚝딱 생기는 Admin 페이지는 많은 수고를 줄여준다. 빌트-인 미들웨어 지원도 좋았고, 데이터베이스나 웹서버에 대한 지식 없이도 쉽게 서비스를 띄울 수 있는 점도 큰 장점이다.

Django는 웹프레임워크가 제공했으면 하는 거의 모든 기능을 기본적으로 지원해준다. 요청, 응답에 대한 다양한 변환, 참조, 그리고 렌더링 함수를 제공하고 있고, 다양한 빌트-인 미들웨어 제공은 딱히 창의적일 필요없는 지루한 작업을 줄여준다. (물론 상용으로 확장되면 꽤나 어렵고 까다로운 문제점들이 있다곤 하나 그건 다른 프레임워크에서도 마찬가지지 않나 싶다.)

# 설치
pip install django=={version}

# 버전 확인
console;
python -m django --version
code; 
import django
print(django.VERSION)
print(django.get_version())

# 프로젝트 생성
django-admin startproject {project_name}
L manage.py - Django 프로젝트와 상호작용 하는 커맨드라인 유틸리티. (python manage.py shell 과 같은..)
L {project_name}/settings.py - Django 프로젝트의 환경 구성을 지정.
L {project_name}/urls.py - 라우팅을 위한 프로젝트의 URL 선언. path()에 대해 알아야 한다. 정규 표현식이나 파라미터를 받아 처리할 수 있고, 처리 함수(view 함수), 사전형 인수(kwargs), 그리고 프로젝트에서 참조가능한 이름(name)을 지정할 수 있다.
L {project_name}/wsgi.py - WSGI 호환 웹 서버의 진입점.

* WSGI?
Web Server Gateway Interface. WSGI는 정적인 컨텐츠를 처리하는 웹서버와 파이썬 웹애플리케이션 사이의 인터페이스를 위한 파이썬 프레임워크다. 이에 대한 구현체인 WSGI 미들웨어로는 mod_wsgi, uwsgi, gunicorn, twisted.web, tornado 등이 있다. 웹서버의 관점에선 애플리케이션이고, 웹애플리케이션의 관점에서는 서버로 동작하게 되는 셈인데 애플리케이션 컨테이너의 역할을 수행한다고 보면 된다. WSGI 서버는 독립적인 웹서버로서의 기능이 약하고 DDOS 공격에 취약하므로 Nginx나 Apache 같은 독립적인 웹 서버와 함꼐 사용하는 것이 권장된다.

# 앱 생성
python manage.py startapp {app_name}
L {app_name}/admin.py
L {app_name}/apps.py
L {app_name}/migrations/
L {app_name}/models.py
L {app_name}/tests.py
L {app_name}/views.py - MVC의 V, View가 아님에 유의하자. Django는 MTV (Model - Template - View) 패턴을 따르는데 views.py는 MVC C, Controller와 유사한 역할을 한다.

# 모델 변경과 적용
1. models.py에서 모델을 추가하거나 변경.
2. python manage.py makemigrations 명령을 통해 변경사항을 migration 파일로 기록하낟.
3. python manage.py migrate 명령을 통해 변경사항을 데이터베이스에 적용한다.
4. Admin에 노출시킬 필요가 있는 모델은 admin.py에 admin.site.regiter()로 등록해준다.

* makemigrations 명령어 : 모델에 대해 변경된 내역을 migration이라는 개념의 파일로 저장해준다. migration은 Django가 모델의 변경사항을 저장하는 방법으로 디스크상의 파일로 존재하게 된다.
* migrate 명령어 : settings.py 내 INSTALLED_APPS의 설정을 탐색하여 필요한 데이터베이스 테이블을 생성한다. 클래스 1개는 Table 1개로 생성되며 id (Primary Key)는 자동으로 생성되므로 신경쓰지 않아도 된다. (ORM에 대한 기본적인 개념을 알고 접근하면 좋다. 결국 Django-ORM이 지저분한 뒷작업을 다 해주는거다.)
https://docs.djangoproject.com/ko/2.1/intro/tutorial01/

# 관리자 생성
python manage.py createsuperuser # 관리자 사이트 접근 가능한 user 생성.
생성후 Admin 페이지에서 기본으로 보여지는 Groups, Users 내용은 INSTALLED_APPS에 선언된 django.contrib.auth 모듈이 제공하는 인증 기능이다.
관리자 페이지 편집에 대한 내용은 다음 링크를 참고해보자.
https://docs.djangoproject.com/ko/2.1/intro/tutorial07/

# settings.py
DEBUG; 디버그 모드 설정
INSTALLED_APPS; 설치된 앱 또는 본인이 만든 app 추가
MIDDLEWARE_CLASSES; request와 response 사이에서 동작하는 기능 레이어 지정
TEMPLATES; Django template 관련 설정과 실제 view 위치.
DATABASES; 데이터베이스 엔진의 연결 설정
STATIC_URL; 정적 파일의 URL(css, js, image, etc.)

# 기타
1. XSS, CSRF 등의 보안 이슈에 Django가 어떻게 대응하고 있는지 살펴볼 필요가 있다. (autoescape, safe // {% csrf_token %}
2. 템플릿 생성, 처리 관련 내용은 튜토리얼 문서를 천천히 읽어보는 것이 낫다.
https://docs.djangoproject.com/ko/2.1/intro/tutorial03/
3. 배포 관련해서는 다음 링크를,
http://pythonstudy.xyz/python/article/316-Site-Deployment-Nginx
4. 한국어로 학습할 수 있는 방법은, 공식 문서나 장고-걸스에서 제공하는 문서의 질이 좋고, 위키독스 자습 페이지도 괜찮아 보인다.
https://wikidocs.net/6609
5. 책중에 Two Scoops of Django가 괜찮다 하여 구매해두었는데 잘 안읽히는 걸 보면 입문서는 아닌듯 하다.



댓글 없음:

댓글 쓰기