Django는 파이썬 기반의 오픈소스 풀 스택 웹 프레임워크이다.
풀 스택이긴 프론트엔드쪽 기능은 빈약한 편이라 사실상 백엔드 프레임워크로만 쓰이는 경우가 많다.
파이썬 기반 웹 프레임워크 중에선 Flask와 함께 가장 널리 쓰인다.
Django를 이용하여 개발된 서비스로 유명한 것은 인스타그램, 스포티파이, 유튜브(일부), 드롭박스, 번개장터, 요기요 등이 있다
장고의 MVT 패턴은 소프트웨어 디자인 패턴의 MVC 패턴과 비슷한것이다.
MVC에서 Model은 그대로지만 View를 장고에선 Template, Controller는 장고에선 View라고 표현한 것이다.
URLconf(urls.py)
클라이언트로부터 받은 URL 요청을 어떻게 처리할것인지 정의한다.
장고의 url 처리함수는 직관적이고 이해하기 쉽다.
장고에서 기본제공하는 path converter와 include()를 활용할 수 있고 re_path()로 정규표현식도 활용할 수 있다.
View(views.py)
데이터와 비즈니스 로직 사이의 상호 동작을 관리하는것이다
클래스와 메소드, 함수 등으로 구성한다
Model(models.py)
본질적으로, 모델이란 부가적인 메타데이터를 가진 데이터베이스의 구조(layout)를 말한다.
사용할 데이터베이스를 정의하며, 이후 마이그레이션을 거치면 코드 내용대로 테이블을 생성하는 등의 동작이 settings.py에서 설정해놓은 DB에 반영된다.
ORM이란
전통적으로 데이터베이스를 사용하는 프로그램들은 데이터베이스의 데이터를 조회하거나 저장하기 위해 쿼리문을 사용해야 했다. 이 방식은 여전히 많이 사용되고 있는 방식이지만 몇 가지 단점이 있다. 개발자마다 다양한 쿼리문이 만들어지고, 또 잘못 작성된 쿼리는 시스템의 성능을 저하 시킬수 있기 때문이다. 그리고 데이터베이스를 MySQL에서 오라클로 변경하면 프로그램에서 사용한 쿼리문을 모두 해당 데이터베이스의 규칙에 맞게 수정해야 하는 어려움도 생긴다.
ORM(Object Relational Mapping)을 사용하면 데이터베이스의 테이블을 모델화하여 사용하기 때문에 위에서 열거한 SQL방식의 단점이 모두 없어진다. ORM을 사용하면 개발자별로 독특한 쿼리문이 만들어질 수가 없고 또 쿼리를 잘못 작성할 가능성도 낮아진다. 그리고 데이터베이스 종류가 변경되더라도 쿼리문이 아닌 모델을 사용하기 때문에 프로그램을 수정할 필요가 없다.
Template(html)
장고 템플릿 문법으로 html을 작성하며 클라이언트가 접속하는 페이지의 레이아웃을 결정하는 것이다.
템플릿 html에서 장고 템플릿 태그와 파이썬 문법들을 활용할 수 있지만 자바스크립트로만 할 수 있는 작업을 대체하진 못한다.
SPA 등이 필요없는 경우 어느정도 쓸만한 웹 페이지를 만드는게 가능하다.
프론트엔드적인 부분이며 리액트같은 프론트엔드 기술에 비해서 큰 기능개선이 없기 때문에 아주 단순한 웹페이지를 만드는 일 외에는 현재는 실무에서 잘 사용되지 않는다.
간단한 템플릿 예시
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% endif %}
django-admin startproject <프로젝트 이름>
cd <프로젝트 이름>
python manage.py startapp <앱 이름>
까지 하면 앱의 기본구성 파일들이 생성된다
프로젝트 대 앱(장고 공식문서)
프로젝트와 앱은 무엇이 다를까요? 앱은 블로그 시스템, 공개 기록 데이터베이스 또는 소규모 의견조사 앱과 같은 작업을 수행하는 웹 애플리케이션입니다. 프로젝트는 특정 웹 사이트에 대한 구성 및 앱의 모음입니다. 한 프로젝트에 여러 개의 앱이 포함될 수 있습니다. 앱은 여러 프로젝트에 있을 수 있습니다.
startproject 이후 생성되는 파일들:
porject_name/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
현재 Django 프로젝트의 환경 및 구성을 저장, SECRET_KEY와 DATABASE 와 같은 보안이 중요한 설정변수는 따로 파일을 만들어 분리하고 import 해서 사용하는 방식으로 만드는게 안전하며 따로 만든 파일들은 꼭 .gitignore에 포함시킬것
전체 프로젝트를 실행하는 파일, 명령어로 여러가지 실행을 할 수 있다
manage.py 자주쓰는 명령어:
startapp 이후 생성되는 파일들
app_name/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
모델 활성화하는 방법: settings.py의 INSTALLED_APPS에 해당되는 앱 이름을 추가해주고 models 코드 완성 후 migrate 해줘야한다 migrate란 현재의 모델 상태를 DB에 동기화 시키는것이다
python manage.py makemigrations 을 실행하면 migrations 폴더가 생성되고 그 안에 장고가 테이블 작업을 수행하기 위한 작업 파일(예: 0001_initial.py)들이 생성된다.
migrate는 settings/INSTALLED_APPS에 등록되어 있는 앱에 필요한 데이터테이블을 생성한다.
따라서 INSTALLED_APPS에 등록되어 있지 않다면 migration 명령이 실행되지 않는다.
이후에 python manage.py sqlmigrate 을 실행하면 실제로 마이그레이션을 실행하지 않지만 makemigrations에서 생성된 파일이 실행할 SQL 명령문을 확인해볼수 있다
python manage.py migrate 을 실행하면 실제로 마이그레이션이 된다. 이 때 코드에 오류가 있거나 다른 문제가 있으면 에러 표시가 나온다.
모델을 신규로 생성하거나 변경하면 makemigrations 명령을 먼저 수행한 후에 migrate 명령을 수행해야 한다
마이그레이션 이후 장고 쉘에서 QuerySet API를 이용하여 직접 데이터 CRUD 작업을 해볼수있다
웹페이지나 앱에 필요한 변수, 클래스, 메서드, 함수 등이 포함된 파일이다. 실제 비즈니스 로직을 구현하는 것이라 보면된다.
예를 들어 게시판 웹서비스를 개발한다면 게시판에 글을 올리고 읽고 수정하고 지우는 동작을 어떻게 할지 정의하는 내용이 들어가야 한다.
함수로 만든 view를 FBV(function based view), 클래스로 만든 view를 CBV(class based view)라고 부른다. FBV는 CBV가 할 수 있는걸 전부 할 수 있지만 CBV의 여러 장점 덕분에 대체로 CBV를 많이 사용한다.
참고자료:
장고 공식문서 튜토리얼
점프 투 장고