장고에서 제공하는 튜토리얼을 사용하여 장고의 MVT 패턴의 흐름을 파악해보자.
튜토리얼 내용은 아래 링크 참조
https://docs.djangoproject.com/ko/3.2/intro/tutorial01/
본 튜토리얼을 통해 설문조사 어플리케이션을 만들어볼 수 있다.
미니콘다 가상환경 안에서 장고를 설치하여 진행한다. 데스크탑에서 프로젝트 mysite
를 생성한다. 프로젝트를 생성하면 장고에서 기본적인 구조를 설치해준다.
mysite
디렉토리 안에 mysite
디렉토리가 또 있는 이유는?
바깥 mysite
는 한번 더 감싸주는 역할을 하고, 다른 이름으로 변경해도 된다. 안쪽 mysite
가 실질적이며 필요한 패키지들을 저장해준다.
설문조사 기능을 만들어볼 것이다. 앱 생성은 최상위 디렉토리에서 (manage.py
와 같은 경로에서) 한다. 앱을 생성하면 아래와 같이 장고에서 앱을 위한 기본적인 파일들도 만들어준다.
polls
앱을 만들었고 view.py
에서 뷰를 작성한다.
뷰는 URLconf
를 통해 받아온 클라이언트의 요청을 받는다. 요청과 관련된 모듈인 http의 httpResponse를 불러온다. 어떤 응답을 할 것인지 함수나 클래스로 작성한다.
여기까지 마치고 서버를 실행할 때 뷰의 리턴값이 응답되지 않는다. mysite
프로젝트는 아직 우리의 뷰에 대해서 모르기 때문이다. 따라서 우리는 장고에게 뷰에 해당하는 url이 있다고 알려줘야 한다. URLconf
를 사용하면 된다. URLconf
는 url과 view를 연결시켜 주는 역할을 한다.
먼저 polls
앱에 urls.py
를 생성하고, urlpatterns 리스트에 views.index를 추가한다. 최상위 URLconf
인 mysite/urls.py
에 polls.urls
을 추가한다.
프로젝트를 위한 기본적인 세팅이 끝났고, 데이터베이스와 데이터를 추가해보자.
먼저 mysite/setting.py
에서 데이터베이스 관련 환경설정을 한다. (데이터베이스 종류 선택, 이름 설정 등)
데이터베이스 관련 명령어
makemigrations
마이그레이션 파일 생성 (설계도 생성)
migrate
마이그레이션 파일을 데이터베이스에 반영 (설계도를 데이터베이스에 반영)
showmigrations
마이그레이션 적용 현황을 보여준다
sqlmigrate
지정한 마이그레이션의 sql 내역을 보여준다. 테이블 스키마가 어떻게 설정되어 있는지 확인 가능하다
python manage.py migrate
명령을 내리면 데이터베이스 테이블이 만들어진다. db에 반영이 되었지만 아직은 빈 테이블이다.
테이블에 데이터를 추가하려면
1. models.py
에서 스키마를 설정한다.
2. python manage.py makemigrations
를 해서 테이블 설계도를 제출한다.
3. 모델 메서드를 사용하여 데이터를 추가한다.
이 3단계를 먼저 진행한 후 migrate
를 나중에 해도 된다.
polls/models.py
에서 테이블의 스키마를 만든다. 각각의 테이블은 클래스로 생성한다. 클래스 Question과 Choice 를 만든다. 클래스 Choice의 question은 클래스 Question의 외부키로 설정한다. 한 개의 질문에 다수의 선택지가 있는 one to many 관계이다.
이제 장고에게 polls
앱이 설치되어 있다는 것을 알려주어야 한다. mysite/settings.py
에 들어가서 INSTALLED_APPS
에 polls.apps.PollsConfig
를 추가해준다. 테이블 설계도 제출을 위해 python manage.py makemigrations polls
을 해준다. 이제 polls
라는 마이그레이션 파일이 생성되었다.
python manage.py migrate
를 하여 polls
앱을 데이터베이스에 반영해준다.
python shell
에 들어가서 모델 메소드를 사용해보자. 데이터를 생성하고 변경할 수 있다.
의문점. q.choice_set.all()이 클래스 Choice와 연결되는 이유
# 클래스 Question의 id가 1인 행을 변수 q에 할당
q = Question.objects.get(pk=1)
# Question을 참조하는 Choice가 q와 연결된다
q.choice_set.all()
#Choice 데이터 생성
q.choice_set.create(choice_text='Not much', votes=0)
q.choice_set.create(choice_text='The sky', votes=0)
A. 클래스 Choice는 클래스 Question의 외부키로 설정되어 있다. (one to many 관계) Choice는 Question을 참조하는 것을 알지만, Question은 Choice가 참조하는지 모른다. 참조되는 테이블.참조하는 테이블._set.all()
메소드는 참조하는 테이블에 연결시켜 준다.
Part 2에서 데이터를 생성했다. 웹페이지에 보여질 내용은 view
에 담는다. 데이터를 불러오거나 재가공해야 하는 내용이라면, 뷰에서 클래스나 함수를 사용하여 해당 내용이 추출될 수 있도록 작성해야 한다.
polls/views.py
에서 함수 방식으로 뷰를 추가해준다. 추가된 뷰들이 제대로 응답하기 위해 url과 연결시켜준다. polls/urls.py
에서 path 경로를 추가하고 각각의 연결될 뷰들도 같이 추가해준다.
모델을 호출해서 데이터를 다룰 것이다.
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by~ # Question 테이블에서 최신 5개 row를 가져옴
output = ~ # question_text만 뽑아서 재정렬하고 output에 할당함
return HttpResponse(output) # output 응답
여기서 문제는 웹페이지 구조가 바뀌면 index 함수를 다시 짜야 하기 때문에, 유지 및 보수에 효율적이지 못하다. 이 때 구조와 관련된 것은 templates
에서 다루고 뷰는 index 함수 리턴 값만 연결되도록 하면 된다. 하지만 웹의 발전과 함께 템플릿은 사용하지 않는 추세이며 이러한 재가공은 대부분 프론트엔드에서 진행한다.
장고 튜토리얼에서는 템플릿을 사용하지만, 우리는 json을 사용할 것이다. view
와 url
에 대해서는 다음 시간에 자세히 다루도록 한다.
웹 개발을 위해 흔히 일반적으로 사용하는 내용을 장고가 모아주었다. 모아준 내용은 generic
키워드에 담겨 우리는 쉽고 빠르게 더 적은 코드로 개발을 할 수 있다.