[Pre-course] 2021. 10. 13

13727 단어 TILTIL

Django

라이브러리? 프레임워크?

참고 자료 : 노마드 코더

둘의 차이점을 찾기 위해 구글에서 오랜 시간 서핑을 했지만 위 유튜브에서 가장 많은 이해가 되었다

간단하게 요약하면 개발자(나)가 원할 때 불러서 사용하는 것이 라이브러리, 규칙에 따라 작성하면 실행되는 것이 프레임워크이다

장고는 프레임워크이며 이해가 잘 되지 않는다면 영상을 한 번 보는 것을 추천한다 ( 길이 : 5분 가량)

MTV 패턴

참고 자료 : docs.djangoproject.com 용어

MTV는 Model-Template-View를 말한다
MVC, Model-View-Controller와 유사하지만 장고를 설명하는 것에 있어 더 적절하다고 한다
그렇다면 View를 Template이라고 부르고, Controller를 View라고 부르는 이유는 무엇일까?
docs.djangoproject.com 자주 묻는 질문을 보도록 하자

Model

: DB에 데이터를 저장하는 것으로 각각의 모델은 파이썬의 클래스로 정의된다
  모델은 저장하고 있는 데이터의 필수적인 필드와 동작을 포함하고 있고 각각의 모델은 각각 하나의 DB Table이 된다
  *장고는 ORM(Object Relational Mapping)을 지원하기에 파이썬 코드로 DB를 조작할 수 있다

Template

: HTML 파일로 데이터를 표현하기 위한 형식, 사용자에게 보여지는 화면을 의미한다
  웹 시스템의 역사에서 현재 모던 웹에서는 사용하지 않고 Model과 View에서 데이터를 json 형식으로 반환한다

View

: 페이지 렌더링을 담당한다 (템플릿)
  항상 템플릿으로 렌더링 하는 것은 아니고 백엔드에서 데이터만 주고 받을 수 있다

*URLConf(URL 설계)

: URL 패턴을 정의하여 해당 URL과 뷰를 매핑하는 단계
  path함수를 이용해 URL을 뷰와 매핑할 수 있다



첫 번째 장고 앱 작성하기

docs.djangoproject.com 튜토리얼을 진행하며 작성

진행에는 미니콘다, MySQL, VS Code를 사용했다

튜토리얼 시작 전 가상환경 세팅부터 실시한다

환경 세팅

# 가상환경 생성
conda create -n "가상환경 이름" python="버전"
conda activate "가상환경 이름"
# DB 생성
mysql -u root -p
mysql> create database "NAME" character set utf8mb4 collate utf8mb4_general_ci;
# Django 설치
pip install django
# MySQL server에 접속하기 위한 package 설치
pip install mysqlclient

프로젝트 만들기

cd 명령으로 코드를 저장할 디렉토리로 이동하여 명령을 수행한다

django-admin startproject mysite
mysite/
    manage.py        : Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티
    mysite/          : 디렉토리 내부에는 프로젝트를 위한 실제 Python 패키지들이 저장
        __init__.py  : Python으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일
        settings.py  : 현재 Django 프로젝트의 환경 및 구성을 저장
        urls.py      : 현재 Django project 의 URL 선언을 저장, Django 로 작성된 사이트의 목차라고 할 수 있다
        asgi.py      : 현재 프로젝트를 제공하기 위한 ASGI 호환 웹 서버의 진입점
        wsgi.py      : 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점

위와 같이 폴더와 파일들이 생성된다 ( 각각의 역할 확인은 djangoproject.com 공식 문서에 더 자세히 나와있다 )

서버 실행

터미널을 실행해 manage.py가 위치해 있는 mysite 디렉토리에서 명령어를 통해 서버를 실행시킬 수 있다

python manage.py runserver

http://127.0.0.1:8000/ 를 접속해보면 Congratulations!을 확인할 수 있다
현재 단계에서 발생하는 에러메시지는 아직 DB와 관련된 설정을 진행하지 않아서 생기는 것이기 때문에 신경쓰지 말자

설문조사 앱 만들기

앱은 manage.py가 존재하는 디렉토리에서 생성하면 된다
python manage.py startapp "앱 이름" 명령어 입력

python manage.py startapp polls
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

첫 번째 뷰 작성하기

# polls/view.py
from django.http import HttpResponse
def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

view.py를 호출하기 위해선 url이 연결이 되야한다
이를 위해 URLconf가 사용되고 urls.py라는 파일을 생성해야 polls 디렉토리에서 URLconf를 사용할 수 있다

# polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
    path('', views.index, name='index'),
]

polls/urls.py를 최상위 URLconf에서 볼 수 있게 하려면 mysite/urls.py에서 django.urls.includeimport 하고, urlpatterns 리스트에서 polls/urlsinclude()함수를 사용해 추가해주면 된다

# mysite/urls.py
from django.urls import include, path
urlpatterns = [
    path('polls/', include('polls.urls')),
]

include() 와 path()

include()

: 다른 URLconf들을 참조할 수 있도록 도와준다
  Django가 함수 include()를 만나면 전체 URL에서 해당 시점(path())까지만 적용하고 뒷부분은 includeURLconf로 전달한다

path()

: 필수 인수(routeview), 선택 인수(kwargs, name) 총 4개의 인수가 전달 된다
 

urlpatterns = [
    path('', views.index, name='index'),
]

route : URL route에서 사용된 경로를 지정하는 것
view : 해당 URL에 상응하는 view를 지정하는것
            view를 지정하는 방식 = 함수 뷰의 이름을 지정 or 클래스명.as_view()
kwargs : 키워드 인수들이 목표한 view 에 사전형으로 전달된다
name : URL에 이름을 지으면 템플릿을 포함한 Django 어디에서나 명확한 참조 가능

위의 예시에서 view가 어떻게 사용됐는지 보면 views.index 이므로 pollsviews.pyindex를 호출하겠다는 의미이다

잘 연결되었는지 확인하려면 서버를 실행하고 http://localhost:8000/polls/를 입력해보자
view.index에 정의한 Hello, world. You’re at the polls index. 가 잘 보이는 것을 확인할 수 있다

모델 만들기

# polls/models.py
from django.db import models
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

각각의 Field 인스턴스의 이름은 DB에서 칼럼명으로 사용된다
또한 위 Choice 클래스의 ForeignKey를 보았을 때 각각의 Choice 가 하나의 Question 에 관계된다는 것을 알 수 있다 ( 나도, 컴퓨터도 )

모델 활성화

현재 프로젝트에게 polls 앱이 설치되어 있다는 것을 알려줘야 모델을 활성화할 수 있다

# mysite/settings.py
INSTALLED_APPS = [
            ...,
            ...,
    'polls.apps.PollsConfig',
]   

이제 Django는 polls 앱이 포함된 것을 알게 되었다
DB에 테이블을 생성시키기 위해선 makemigrationsmigrate를 시켜주면 된다

python manage.py makemigrations polls 
#Migrations for 'polls':
#  polls/migrations/0001_initial.py
#    - Create model Question
#    - Create model Choice
python manage.py migrate 

MySQL을 실행시키고 테이블을 조회해보면 모델 활성화가 잘 된 것을 확인해볼 수 있다

좋은 웹페이지 즐겨찾기