3. 장고 설치 및 프로젝트와 앱 만들어 보기

등록일 : 2020.12.15. 19:27


이전 시간 돌아보기

Django로 웹사이트를 만들기 위해 Python을 설치하고 이 개발을 돕는 PyCharm 툴을 설치했다. 그리고 파이참에서 새로운 프로젝트까지 만들었다. 장고는 파이썬을 베이스로 사용되기 때문에 장고를 배우는데 왜 파이썬이 필요하며 개발을 더 편리하게 돕는 파이참 같은 개발 툴을 사용하면 더 편하다는 것을 알았다.

PyCharm에서 Terminal 사용하기

이제 파이참을 실행하고 지난 시간 만들었던 프로젝트를 열어 준다. 파이참 하단의 터미널로 이동한다. 파이참에서 프로젝트를 열고 나면 하단에 'Terminal' 탭이 보인다. 이 부분을 클릭해보자.

* Mac OS의 경우
(venv)  ~/PycharmProjects/mysiteProject $
* Windows OS의 경우
(venv) C:\Users\...\PycharmProjects\mysiteProject>

와 같은 모양일 것이다. 경로나 모양은 조금 다를 수 있지만, 앞에 (venv)가 있다면 정상적으로 가상환경에 잘 진입해 있는 것이다. 위에서 파이참에서 프로젝트를 만들때 거의 이야기 하지 않았지만, 해당 프로젝트만을 위한 파이썬 가상환경을 생성하게 되어 있었다.

회사나 개인 프로젝트를 두 개 이상을 한다고 생각해보자. 프로젝트 성격에 맞게 환경이 달라져야 하는 경우가 발생한다. 어떤 프로젝트는 장고 3버전을 쓸 것이고 어떤 프로젝트는 오래된 프로젝트여서 기존의 장고 버전이 2.X 버전을 쓸 수도 있다. 이렇게 프로젝트마다 환경이 달라질 수 있어 각각의 파이썬 가상환경을 만들어 편리하게 환경을 분리 해 줄 수 있는 것이다. 환경을 새로 구축하기 위해 PC를 한대 더 구매하는 것을 피해야 하지 않겠는가?

파이썬의 가상 환경은 무조건 써야 한다고 생각하는 것이 좋으며, 나중에 서로 환경이 꼬여버리거나 충돌이 일어나는 심각한 상황으로부터 미리 보험을 들어 둔다고 생각하자. 터미널에 진입했을 때 가상 환경인지 아닌지는 맨 앞에 (venv) 로 표시된다. 이름은 파이썬 프로젝트 초기에 생성 시 변경할 수 있으나 우리는 변경하지 않았으므로 (venv)로 보일 것이다.

이전 시간에 설정했으나 혹시나 여전히 보이지 않는다면 파이참 우측 하단에 Interpreter > Interpreter Settings 메뉴를 눌러준다. 그다음 Python Interpreter > 설정 > + 버튼을 통해 추가 가능하다. 각 운영체제에 위에 파이썬이 설치되어 있다면 알아서 경로를 찾아주므로 여기서 ok만 누르면 된다.

[참고] 가상환경의 생성 / 삭제는 파이참에서 기본적으로 제공하지만, 파이참이 없는 환경인 경우 터미널의 명령어로 가능하다. 이 부분은 부록을 참고하기 바란다.

Python 가상환경에 Django 패키지를 추가하기

파이참에서 만든 프로젝트는 (venv) 라는 가상환경에서 동작하게 만들어 준다. Python 가상 환경에 이제 Django를 추가하여 사용할 것이다. 그렇기 때문에 사람들이 Django라고 하면 Python + Django 를 기본적으로 생각하게 된다.

다시 파이참의 Terminal 창으로 돌아가자. 가상환경까지 진입했다면 이제 장고 패키지를 설치해보겠다. 그 전에 우선 설치된 패키지 리스트를 확인해보자. pip list 명령어로 알 수 있다. 현재 파이썬 환경의 설치된 패키지들의 목록을 볼 수 있는 명령어이다.

여기서부터 이 프로젝트의 파이참에서 실행한 터미널 화면의 기호는 앞의 경로를 다 표시하지 않고 (venv) $로 통일한다. 윈도우의 경우는 윈도우 파이참의 터미널 진입 화면인 (venv) C:\...> 이라고 치환해 생각해 주길 바란다.

(venv) $ pip list
Package   Version
---------   -------
pip         20.2.3
setuptools  49.2.1

숫자는 여러분과 다를 수 있다. 파이썬 가상환경을 기본으로 이런 패키지들이 설치되어 있고, 여기에 개발에 필요한 패키지를 설치할 수 있다. 여러분이 직접 만들어도 되고, 누군가 잘 만들어둔 패키지가 있다면 가져와 쓸 수도 있는 것이다. 장고를 설치해보자. pip install 패키지 이름을 입력하면 된다. 다음과 같이 입력해보자.

(venv) $ pip install django
Collecting django
 Downloading Django-
...중략...
Installing collected packages: sqlparse, pytz, asgiref, django
Successfully installed asgiref-3.3.1 django-3.1.4 pytz-2020.4 sqlparse-0.4.1
(venv) $

다운로드 및 설치가 자동으로 진행된다.

참고로 장고의 철자는 django 이다. 이는 오타가 아니다. 모든 설치가 완료되었으면 설치된 패키지를 다시 한번 확인해보자. 터미널에서 다시 pip list를 입력해보면 Django 외에도 몇 가지 패키지가 더 설치되었다. 장고를 사용하기 위해 필수적으로 필요한 추가 패키지가 같이 설치되었으므로 이는 임의로 삭제하지 말자. 그냥 그대로 두면 된다.

장고 버전 확인은 다음과 같다.

(venv) $ python -m django --version
3.1.3

저자는 3.1.3 기반으로 진행하지만 이보다 숫자가 높다고 해서 특별히 진행이 안되지 않을 것이다.

설치가 완료되었지만 아직 아무것도 하지 않았다. 아무것도 하지 않으면 당연히 아무 일도 일어나지 않는다. 컴퓨터, 그리고 프로그래밍의 특징 중에 하나가 시키지 않은 일은 절대 하지 않는다는 것이다. 조금 번거롭겠지만 하나하나 다 컴퓨터에게 명령해야 한다.

장고 프로젝트 시작하기

이제 장고 프로젝트를 시작해보겠다. 장고 프로젝트 시작설정을 하는 명령어는 다음과 같다. 역시 터미널에서 진행한다.

(venv) $ django-admin startproject mysite

아무 반응 없다. 정상이다. 만약에 무슨 메시지가 나왔다면 오류일 것이다. 에러메시지를 잘 읽어보고 해결하자. 아무 반응이 없었다면 이제 파이참의 프로젝트의 폴더 부분을 보자.

mysite 라는 하위 폴더와 venv 라는 폴더가 보일 것이다. venv 는 가상환경을 위한 폴더이다. 방금의 명령어 동작으로 mysite 폴더가 생성되었다. 명령어를 입력 전까지는 없었던 폴더이다. mysite 폴더를 열어보자.

mysiteProject        # 파이참에서 만든 프로젝트(폴더)
 mysite/                 # 이하 django-admin startproject mysite 명령어로 만들어진 폴더와 .py 파일들이다.
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  manage.py

라는 폴더와 파일들이 보일 것이다. 두려워할 필요는 없다. 차차 알게 될 것이다. 파일명의 확장자가 .py 라고 쓰요 있는 친구들이 바로 Python 파일들이다. Django는 파이썬 환경에서 Django 패키지를 설치 후 만들어지는 Python 파일들을 파이썬 언어를 통해 내용을 입력하면서 만들어진다고 이해하면 되겠다. 그것이 곧 프로그래밍 과정이다.

장고 프로젝트 안에 앱을 생성하기

이제 장고 프로젝트 안에 앱을 생성해 보겠다. 단계가 복잡해 보이지만, 하나의 프로젝트 안에 여러 개의 앱 서비스를 만들 수 있음으로 이를 구분하는 역할이라고 생각하면 된다.

위에서 우리가 만들고자 한 앱이 기억나는가? 안 나도 상관없다. 우리는 투표를 할 수 있는 투표 앱을 만들기 위해 다음과 같이 polls라는 이름으로 앱을 추가하겠다.

다시 터미널로 이동한다. 다음과 같은 명령어를 입력할 것인데 manage.py 가 있는 곳으로 이동 후 진행해야 한다. mysite 폴더로 이동한다. 폴더를 이동하는 방법은 cd mysite 명령어를 입력하면 된다. 이곳은 manage.py 파일이 있는 곳으로 장고 프로젝트 홈 디렉터리라고 생각하면 되겠다.

mysite 폴더 이동 후 명령어 입력

(venv) $ cd mysite
(venv) $ python manage.py startapp polls
(venv) $

역시 아무 반응이 없다. 파이참의 왼쪽의 폴더와 파일 목록을 확인하자.

mysiteProject        # 파이참에서 만든 프로젝트(폴더)
 mysite/                 # 이하 django-admin startproject mysite 명령어로 만들어진 폴더와 .py 파일들이다.
    mysite/
    polls/                # python manage.py startapp polls 명령어로 생성되었다
  manage.py

위 화면처럼 mysite 하위 폴더에 polls 폴더가 생성됨을 알 수 있다. 이렇게 앱을 추가하면 장고 프로젝트 하위 폴더로 앱 폴더가 생성됨을 알 수 있다.

실제로 사용자에게 응답해주기

누군가 당신이 만든 투표 사이트에 접속한다고 생각해보자. 접속한 사람에게 접속 안내 메시지를 회신해주고 주고 싶다. 이 부분을 관리하는 부분이 바로 view.py 이다. 말 그대로 이름도 '뷰' 이다. 사용자에게 응답해줄 수 있는 views.py 를 수정하기 위해 mysite/polls/views.py 를 더블 클릭해보자.

polls/views.py

from django.shortcuts import render

# Create your views here.

기본으로 작성되어 있는 문구이다. 뷰를 만들라고 한다. view.py 파일은 위에서 말했듯이 Python 파일로 되어 있다. 첫번째 줄은 당장 알 필요 없다.

그다음 문장에는 #으로 시작하는 문장이 기술되어 있다. Python에서 #으로 시작하는 문장은 주석문(Comment)으로 코드 내에 설명을 작성할 때 쓰인다. 이는 프로그램의 실행(동작)에 영향을 미치지 않는다. 꼭 #으로 시작해야 한다는 점을 주의하자.

자 이제 polls/views.py의 내용을 모두 지우고 다음의 내용으로 변경해 보자.

polls/views.py 수정하기

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

축하한다. 당신은 처음으로 Python 언어로 프로그램을 만든 것이다. 파이썬 프로그래밍은 기본적으로 확장자가 py인 파이썬 파일을 작성하는 일이다. 프로그래밍을 보통 '언어'라고 하는 데는 그 이유가 있다. 바로 컴퓨터가 이해할 수 있는 말로 써야 한다. 하지만 우리는 사람이므로 그런 것들을 사람의 언어와 유사하게 만들어 활용하는 것이 바로 프로그래밍 언어이다. 여기서는 그 언어 문법이 Python인 것이다. 프로그래밍을 위해서는 정해진 문법을 따라 기술하는데 이제 그 부분을 그때그때 조금씩 설명하도록 하겠다.

주의 : 처음에 코드를 연습할 때 이해가 잘 안 되더라도 어느 정도는 직접 같은 문장을 타이핑해 보면서 익혀보자. 무슨 말인지는 몰라도 이 부분에 익숙해질 필요가 있다. 암기보다는 흐름에 대한 이해를 위해서라고 생각하자.

프로그램을 만들어야 하는데 누군가 잘 만들어놓은 소스 코드(패키지)가 있고 이를 가져다 쓸 수 있다면 얼마나 좋을까? 첫번째 줄에서는 from A import B문이 쓰였다. 이 문장이 그런 역할을 해 준다. 장고에서는 웹 요청에 대한 응답을 회신해 줄 수 있는 기능이 이미 잘 구현되어 있다. 이를 그대로 사용하기 위해 가져왔다. django.http에서 httpResponse를 가져온다. 처음에 우리가 pip로 장고 패키지를 설치했다는 것을 생각해보자. 장고에서 만들어진 유용한 함수나 기능들은 이렇게 가져다 쓸 수 있다.

def는 파이썬에서 함수를 정의할 때 쓰인다. 프로그래밍에서 사용할 것들은 그 구분을 위해 이름을 정의하는 일이 매우 많다. 예제에서는 이 함수이름을 index로 정의 한 것이다. 이는 이 함수의 이름이 되는 것이고 해당 함수의 기능은 'Hello, world. You're at the polls index.' 를 응답으로 돌려준다고 알고만 있자. index함수는 request(요청)를 받아 사용됨을 유추할 수 있다. 함수에서의 필요한 것들을 이렇게 받을 수 있다.

컴퓨터 동작의 기본원리 잠시 짚고 넘어가기

위 함수와 유사하게 컴퓨터의 기본 동작 방식은 [사용자 입력 → 함수(처리) → 출력]이다.

여기서는 사용자 요청 → index(request) 함수 → ("Hello, world. You're at the polls index.") → request(요청)한 곳에 응답해준다.

우리가 웹에 하는 동작은 기본적으로 [요청 → 응답] 기반으로 구성되어 있다.

혹시 다른 프로그래밍을 배워본 적이 있는가? print('hello, world.')를 입력하면 화면에 출력하는 게 가장 처음 배우는 프로그래밍이다. 단순히 화면에 출력한다면 이렇게 연습하겠지만, 웹은 조금 상황이 다르다. 누군가 웹사이트에 접속하고 URL 주소를 입력하고 해당 주소 접속 및 요청이 올바른 요청이라면 이에 맞는 응답을 처리하여 사용자에게 응답해 주는 동작이 기본 동작이라 좀 더 부가적인 구성이 필요하다.

위에서 작성한 view.py 에서는 어디서 어떻게 요청을 하는지는 아직 정의하지 않았고, 아무튼 요청이 들어오면 이 부분을 장고에서 만들어 놓은 HttpResponse 를 활용하여 응답하는 부분을 만들었다.

이제 그 앞부분을 만들어 보자. 누군가 당신이 만든 투표 사이트에 접속한다면 view.py 의 index라는 함수에서 처리하도록 할 예정이다. 그 응답으로 "Hello, world. You're at the polls index." 를 화면에 출력하게 해줄 것이다.

내 사이트에 접속하려면 어떻게 해야 하는가? 당장 우린 아무것도 아직 없지만 장고에서 내 PC를 서버로 만들어 준다. 보통은 웹사이트에서 www.naver.com 처럼 입력한다. 그리고 그 하위에는 수많은 폴더와 파일들이 있다. 예를들어 네이버의 개인정보 처리 방침을 보기 위한 서비스 링크를 제공자인 네이버는 다음과 같이 제공한다.

<!-- 네이버의 개인정보 처리 방침 페이지 url 형식 -->
https://policy.naver.com/policy/service.html

우리도 이와 비슷하게 구조를 만들 것이다. 이 부분을 관리해주는 부분이 바로 urls.py 파일이다. views.py 의 index() 함수가 해당 응답을 해주도록 만들었으나 어떻게 접속해야 이 응답이 되는지는 설정하지 않았다. 이제 우리가 지정한 url 로 접속하면 해당 응답을 보여줄 수 있도록 urls.py에 view.py를 연결해보자.

polls 앱 안에 urls.py 파일은 기본으로 만들어져 있지 않다. 파이참 왼쪽의 polls 폴더를 우클릭하여 New > File > urls.py 를 생성한다. 그리고 다음과 같이 입력한다.

polls/urls.py 수정하기

from django.urls import path
from . import views

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

장고에서 경로 설정을 해주기 위해 path를 import 했다.

여기서는 path()안에 접속 경로가 ''로 되어 있는데 이는 홈 화면 경로를 의미한다. 로 경로가 지정되게 된다. 뒤의 views.index는 '뷰파일.인덱스' 함수로 연결해달라는 것이다. 그리고 이 이름을 index라고 정의 한 것이다. 당장 잘 이해가 안 가더라도 따라 해보자. 현재 편집하고 있는 파일은 urls.py에서 from . import views로 view.py를 가져왔다. from .은 현재 위치를 나타내며 import views는 views.py를 가리킨다. from import는 파일과 파일의 연동(사용)에도 사용된다.

그리고 하나 더 작업이 필요하다. 메인 프로젝트의 url에 polls 의 url 을 등록해야 한다. 기존의 내용을 모두 지우고 다음과 같이 입력한다.

mysite/urls.py 수정 (polls/urls.py 아님을 주의)

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

모두 당장 이해할 필요는 없지만, 우선은 그냥 실행했다. 위의 코드들을 이제 응답할 함수도 만들고, url 도 연결했다. 이제 구동시키고 실제 URL로 접속해보자.

터미널을 실행하고 manage.py가 있는 mysite 폴더로 이동한다. 그리고 터미널로 이동해 실행 명령어를 입력한다.

(venv) $ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 24, 2020 - 09:47:28
Django version 3.1.3, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

드디어 당신이 만든 장고 프로젝트와 polls 앱을 구동했다. 안내 메시지 중 Run 'python manage.py migrate' to apply them. 문장의 실행 동작은 뒤에서 진행할 예정이니 여기서는 크게 신경 쓰지 말자.

서버 실행 메세지 중 ...Starting development server at http://127.0.0.1:8000/ ... 부분에서 알 수 있듯이 이제 웹브라우저에서 http://127.0.0.1:8000/ 로 이동하면 내가 만든 서비스를 볼 수 있다. 보통 127.0.0.1 은 자기 자신의 PC를 가리키며 현재 이는 다른 PC나 네트워크에서 볼 수 없다. 그러니 맘 편히 제작하면 된다. 뒤에 붙어있는 :8000 는 포트 번호를 명시한다. Django는 기본적으로 8000번 포트를 사용한다. 이는 서버나 PC에 다양한 프로그램이 동시에 구동되고 운영될 수 있어 그것을 구분해주는 고유 번호 정도로 알고 있자. 개인 PC에서 특별히 문제가 될 일은 없음으로 그대로 사용하면 된다.

크롬 브라우저 사용하기

브라우저에도 다양한 종류가 있다. 여기서는 Chrome 브라우저를 사용할 것이다. 다른 브라우저를 사용해도 큰 차이는 없겠지만, 혹시 모를 차이를 대비해 환경을 일치시켜보자. 포털 사이트에서 크롬 브라우저로 검색해 브라우저를 설치하자.

이제 크롬 웹브라우저를 사용해 해당 주소를 접속하자. 앞으로 특별한 요청이 없어도 항상 크롬 브라우저에서 확인하길 바란다. 앞으로 화면과 나의 브라우저 화면 디자인이 많이 다르다면 다른 브라우저를 실행했을 수 있으니 이를 참고하여 진행하자.

크롬 웹 브라우저 접속 후 정확히 http://127.0.0.1:8000 를 입력하고 이동해 본다.

Page not found (404) 오류가 발생할 것이다. 그러나 이것은 의도된 화면이니 걱정하지 말자. 화면의 안내 메시지를 보면 polls/ 와 admin/ 이 정의 되어 있다고 한다.

이번에는 http://127.0.0.1:8000/polls/ 로 이동해보도록 하자.

위 사진과 같은 메시지가 출력되었을 것이다. path('polls/', include('polls.urls')),덕분에 우리는 /polls/ 로 입력하면 이를 polls앱의 urls.py로 연결하였고 path('', views.index, name='index')의 홈 경로 '' 에서 view.index 함수를 통해 요청을 처리하고 결과를 사용자에게 응답해 주었다. 지금은 다소 복잡하게 느낄지 모르지만 어려울 것 없다. 요청이 잘 오지 않았는가?

다시 한번 축하한다. 드디어 첫 번째 프로젝트가 성공적으로 시작되었음을 알린다. 시작이 반이다. 포기하지 말고 계속해보자.

http와 https

웹 브라우저에 www.naver.com 또는 google.com을 입력해본 경험이 누구나 한번씩 있다.

보통 앞에 http:// 를 생략해도 자동으로 붙여주는 경우가 있다. http:// 뒤에 www.website.com 또는 co.kr 등을 입력하는데 앞에 붙는 http(s)는 웹에서 요청을 하여 인터넷에서 데이터를 주고받을 수 있는 규칙을 알려주는 데 쓰인다. 웹사이트 들은 모두 이 규칙을 따르고 있다. 시작하는 글자는 http 또는 https이다. https는 보안이 더 좋은 것이라고 보면 되겠다. 브라우저에서는 입력하지 않아도 자동으로 처리해주기도 하며 요즘은 대부분 https 를 기본으로 쓴다. 우리는 아직 연습을 위해 http를 그대로 사용할 것이고, https를 붙이면 동작하지 않을 것이다. 한번 해봐도 좋다. 따라서 http://127.0.0.1:8000/ 으로 입력해야 정확히 응답을 주고받을 수 있다. 물론 http://를 빼고 127.0.0.1:8000 로 만 접속해도 결과는 동일할 것이다. 다만 연습과 이해를 위해 앞의 http:// 를 붙여보는 연습을 하자.

장고 개발 서버 실행과 종료하기

위에서 장고 서버를 실행하는 방법을 배웠다. 터미널에서 python manage.py runserver 명령으로 실행했다. 이렇게 실행되는 서버를 여기서는 개발 서버라고 부르도록 하자. 서버 실행 중 종료를 원하는 경우는 실행 중인 터미널 화면에서 키보드에서 다음과 같은 키를 누른다.

# Windows의 경우 실행 중인 개발 서버 터미널 화면에서 다음의 명령어 수행 
Quit the server with CTRL-BREAK.

# MacOS의 경우 실행 중인 개발 서버 터미널 화면에서 다음의 명령어 수행
Quit the server with CONTROL-C.

그러면 다시 터미널에서 서버 실행 이전 화면으로 빠져나올 것이다. 이 상태에서 http://127.0.0.1:8000/ 을 접속해보자. 브라우저마다 다르겠지만 보통 '사이트에 연결할 수 없음' 메세지가 표시될 것이다. 사이트에 연결할 수 없는 이유는 여러 가지 이겠지만 여러분이 이 온라인 북을 학습하는 데 있어서 저 메시지가 뜬다면 다음과 같이 점검하자.

터미널을 진입하여 manage.py 가 있는 폴더로 이동했는지 체크한다. 그리고 서버 실행 명령을 터미널에서 실행한다. 그다음 서버 시작 메시지가 떴는지 확인하자. 실행되지 않고 에러 메시지가 발생한다면 에러 메시지를 잘 읽고 그에 대응하도록 하자. 또한 작성한 파이썬 코드에 이상은 없는지 빠진 점은 없는지 확인하자.

또 하나 재미있는 점은 인터넷을 모두 끄면 www.naver.com 같은 사이트는 접속할 수 없다고 나올 것이다. 하지만 http://127.0.0.1:8000/ 은 접속이 가능하다. 이것으로 인해 장고 개발 서버 실행은 실제 인터넷 환경에서 사용되고 있는 것이 아니라 PC에서만 동작하고 있음을 알 수 있다. 따라서 인터넷이 잘 안 되는 곳에 있다면 이 온라인 북은 볼 수 없겠지만, 그런 환경에서도 개발 서버를 실행하여 실습과 연습은 얼마든지 가능하다.

자 이제 이번 장은 모두 학습을 완료했다. 잠시 쉬었다 해도 좋고 재미있다면 바로 다음 장으로 이어가자.