IT/WEB

[Django] 튜토리얼 ② : Django 설치부터 PostgreSQL DB 연동까지

개발자 두더지 2020. 9. 8. 14:57
728x90

Django 공식 튜토리얼의 내용을 중심으로 참고 자료를 이용해 살을 붙여 Django를 이용한 Web 애플리케이션을 만드는 과정에 대해 포스팅하도록 하겠습니다. 

 

 

사용 프로그램・버전 


■ Django 3.1.1

■ Python 3.7 다운로드 링크

■ PostgreSQL 12.4 다운로드 링크

■ Visual Studio Code 다운로드 링크 

 우선 Python과 사용할 데이터 베이스를 다운로드한다. 데이터 베이스는 원하는 MySQL이나 Oracle등 원하시는 것으로 선택하면 된다. 나는 Python과 PostgreSQL를 설치하였고, 설치시 따로 설정해야 할 일이 없기에 구체적인 설명을 생략하도록 하겠다 (※ PostgreSQL 다운로드시 슈퍼유저 패스워드는 본인이 원하는 비밀번호로 설정하면 된다). 또한 코드 에이터로는 비주얼 스튜디오 코드를 사용하였다.

 

 

Django 설치


 가상환경(Virtual environment)를 만들어 프로젝트 전부를 Python/Django와 분리해주기도 하지만 저는 이 과정을 생략했다. 가상환경을 이용한 방법은 여기를 참고하시길 바란다.

 cmd(명령 프롬프트)을 연다. 아래의 명령어를 입력해 django를 설치한다. 

pip install django

 django 설치 버전을 설정하고 싶다면 "pip install django~=버전"으로 입력하시면 된다. django 설치가 잘 되었는지 확인하고 싶다면 아래의 명령어를 입력하면 된다.

python -m django --version

 설치된 버전의 숫자가 나오면 잘 설치된 것이고, "No module named django"와 같은 에러가 발생한다면 장고가 제대로 설치되지 않은 것 이므로 다시 설치해보길 권장한다.  

 

 

프로젝트 만들기


 그 다음 프로젝트를 저장할 폴더를 작성한다. 나는 로컬 디스크(C:)에 바로 django_prac이라는 폴더를 하나 만들었다. 

 다시 cmd창에서 cd 명령어를 이용해 C:/django_prac으로 이동한 후 아래의 명령어를 수행한다.

django-admin startproject mysite

 이 명령을 통해 mysite라는 프로젝트 디렉토리가 생성된다. 그리고 기본으로 생성된 파일구조는 다음과 같다.

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

 외부의 mysite/ 루트 디렉토리는 프로젝트의 컨테이너로써 이름은 본인이 작성하고 싶은대로 작성할 수 있다.

파일  역할
mysite/ 디렉토리 내부에는 프로젝트를 위한 실제 Python 패키지들이 저장된다. 이 디렉토리 내의 이름을 이용하여 (mysite.urls와 같은 식으로) 프로젝트의 어디서나 Python 패키지들을 임포트할 수 있다.
mysite/manage.py 스크립트인데, 사이트 관리를 도와주는 역할. 이 스크립트로 다른 설치 작업 없이 컴퓨터에서 웹 서버를 시작할 수 있다.
mysite/settings.py 웹 사이트 설정 파일

■ INSTALLED_APPS
프로젝트에서 사용할 앱들의 경로가 위치하는 영역, user defined app의 경로도 이 항목에 포함된다.

■ TEMPLATES
공통적으로 들어가는 html 코드를 관리하기 위한 확장형 template 들의 경로를 설정하는 영역

■ DATABASES
database를 사용하기 위한 설정, default로 sqllite를 사용한다.

■ TIME_ZONE
django의 DateTime 객체에서 사용할 기준 시간을 설정

■ STATIC_URL
CSS, Image등의 정적 파일 경로를 설정 
mysite/urls.py 현재 Django project의 URL 선언을 저장한다. 바로 전 포스팅에서 설명한 urlresolver가 사용하는 패턴 목록을 포함하고 있는 파일
mysite/asgi.py 현재 프로젝트를 서비스하기 위한 ASGI 호환 웹 서버의 진입점
mysite/wsgi.py 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점

 

 

개발 서버


 작성한 Django 프로젝트가 제대로 동작하는지 확인하기 위해 cmd창에서 cd 명령어를 이용해 mysite 디렉토리로 이동한 후, 아래 명령어를 실행해보자.

python manage.py runserver

 기본적으로 8000포트에서 실행되기 때문에 8000포트를 사용하고 있는 프로그램이 있다면 에러가 발생한다. 포트를 변경해서 실행하기 위해서는 포트 번호를 다음과 같이 입력해주면 된다.

python manage.py runserver 변경할 포트 번호
(예) python manage.py runserver 8080

 커맨드 라인에 아래와 같은 문구가 뜬다면 정상적으로 서버가 동작중이라고 할 수 있다.

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

9월 04, 2020 - 15:50:53
Django version 3.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

 인터넷 상에서 확인해보면, 위의 URL 주소를 입력하면 된다. 위 URL을 입력했을 때 아래와 같은 화면을 만났다면 서버가 잘 동작중이라고 할 수 있겠다.

 

 

설정 변경


mysite/settings.py을 조금 변경해보자. 에디터를 열어 mysite/settings.py에 있는 TIME_ZONE을 서울 기준으로 변경해준다.

TIME_ZONE = 'Asia/Seoul'

그리고 정적파일 경로를 추가해준다. 파일의 맨 끝의 STATIC_URL 바로 아래에 STATIC_ROOT를 추가해준다.

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

참고로 맨 위에 import os를 입력해야 os모듈을 인식해 정상 동작한다.

 

 

앱 만들기


앱을 생성하기 위해서는 cmd창에서 manag.py가 존재하는 mysite로 이동하여 다음의 명령어를 입력한다.

python manage.py startapp polls

 polls는 앱 이름으로 원하는 앱 이름으로 작성하면 된다. 그럼 파일 구조가 다음과 같이 변경되었음을 알 수 있다.

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

앱의 파일구조에 대한 설명은 아래의 표를 참고하길 바란다.

파일  역할
admin.py adminpage에서 GUI를 통해 관리할 모델을 선언하는 페이지로 python manage.py createsupersuer 명령어를 통해 만든 관리자 ID, PW로 접근한다.
models.py 앱에서 사용하기 위한 데이터 베이스 테이블을 ORM문법에 의거하여 작성하는 파일, 클래스는 DB에서 테이블과 각 멤버 객체들은 column에 대응한다.
urls.py root app에서 라우팅된 request의 엔드포인트에 따라 라우팅될 view가 정의된 파일
views.py request가 최종적으로 라우팅되어 동작시킬 로직이 정의된 파일

 

 

뷰 작성하기


첫 번째 뷰를 작성해 보자. polls/views.py에다음과 같은 코드를 입력한다. 

# polls/views.py

from django.http import HttpResponse


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

뷰를 호출하려면 이와 연결된 url이 있어야 하는데 이를 위해 URLconf가 사용된다. polls 디렉토리에서 URLconf를 생성하려면, urls.py라는 파일을 생성해야한다.  생성 후 파일구조는 아래와 같다.

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

그리고 urls.py에는 다음과 같은 코드를 작성한다.

#polls/urls.py

from django.urls import path

from . import views

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

다음으로는 최상위 URLconf에서 polls.urls 모듈을 바라보게 설정한다. mysite/urls.py를 열어 django.urls.include를 import하고, urlpatterns 리스트에 include()함수를 아래와 같이 추가한다.

# mysite/urls.py

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

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

 include() 함수는 다른 URLconf들을 참조할 수 있도록 도와준다. 즉 다른 url.conf파일을 처리를 맡기는 것이다. 예를 들어 example.com/contents/0001.html과 같은 URL이 있다고 가정했을 때,  맨 처음의 디렉토리까지는 여기의 url.conf에 그 이후의 ***.html의 부분은 contents/용의 url.conf로 판정하는 것이 가능하다는 것이다. include함수를 사용함으로써 url.conf의 기재가 간략해지고 개발 환경의 디렉토리 구성도 알기 쉽도록 할 수 있다는 장점이 있다. 

 이제 index의 뷰가 URLconf에 연결되었을 것이다. 잘 작동하는지 확인하기 위해 다시 서버를 동작시켜보자.

python manage.py runserver

http://127.0.0.1:포트번호/polls/ 를 인터넷에 입력하면 view.py에 작성했던 문자열을 확인할 수 있을 것이다.

 

( 참고로 서버를 중지시키려면 Ctrl키 + C )

[Note] path() 함수


path()함수의 인수는 다음과 같다.

path(route, view, kwargs = None, name = None)

route 인자와 view인자는 필수이고 나머지 두 개의 인자는 선택이다. 이 인수들의 의미는 다음과 같다.

■ route
 route는 url 패턴을 포함한 문자열이다. 요청이 처리될 때, Django는 urlpatterns의 첫 번째 패턴부터 시작하여, 일치하는 패턴을 찾을 때 까지 요청된 URL을 각 패턴과 리스트의 순서대로 비교한다. 패턴 들은 GET이나 POST의 매개 변수들, 혹은 도메인 이름을 검색하지 않는다. 예를 들어, www.example.com/myapp/이 요청된 경우, URLconf는 오직 myapp/부분만 바라본다. www.example.com/myapp/?page=3 같은요청에도, URLconf는 역시 myapp/부분만 신경쓴다. 

■ view
 Django에서 일치하는 패턴을 찾으면, HttpRequest 객체를 첫번째 인수로 하고, 경로로 부터 '캡처된' 값을 키워드 인수로하여 특정한 view함수를 호출한다.

■ kwargs
 임의의 키워드 인수들을 목표한 view에 사전형으로 전달된다.

■ name
 URL에 이름을 지어 템플릿을 포함한 Django어디에서나 명확하게 참조하도록 하는 것이다. 

 

 

데이터 베이스 설정


앞서 말했듯 나는 PostgreSQL을 사용할 것이다. Django와 PostgreSQL을 연동하는 과정이 필요하다. 그러기 위해서 처음해야할 일은 PostgreSQL에서 데이터 베이스를 세팅하는 일이다. 먼저 SQLshell(psql)을 실행하자.

  "postgres 사용자의 암호"부분이 나올 때 까지 Enter키를 누르자. postgres 사용자의 암호는 PostgreSQL을 설치했을 때 설정한 슈퍼 유저 비밀번호를 입력하면 된다. 암호를 올바르게 입력하였다면 위와 같이 커맨드 라인이 postgres=#로 바뀐 것을 확인할 수 있다. 

 

1) 데이터 베이스 생성

CREATE DATABASE mysite;

프로젝트 네임인 mysite 를 그대로 데이터 베이스명으로 사용했다. 문제 없이 생성됐다면 "CREATE DATABASE"가 출력된다.

 

 2) user, password 지정

CREATE USER user_id WITH PASSWORD 'password'; 

user_id에는 본인이 지정하고 싶은 user명 password에도 역시 본인이 지정할 비밀번호를 입력하면 된다. 성공적으로 USER가 생성되었다면 커맨드라인에 "CREATE ROLE"이 뜰 것이다.

 

3) 인코딩, isolation, timezone 설정

ALTER ROLE user_id SET client_encoding TO 'utf8';
ALTER ROLE user_id SET default_transaction_isolation TO 'read committed';
ALTER ROLE user_id SET TIME ZONE 'Asia/Seoul';

문제 없이 설정됐다면 각 명령어 실행시 "ALTER ROLE"이 뜰 것이다.

 

4) USER에게 데이터베이스 접근 권한 주기

GRANT ALL PRIVILEGES ON DATABASE 데이터베이스 명 To user_id;

데이터베이스 명과 user_id에는 본인이 작성했던 데이터베이스와 유저 이름을 넣어주면 되는데, 나의 경우는 데이터 베이스 명을 mysite로 지정하였으므로 mysite를 입력하였다. 접근 권한이 성공적으로 부여됐다면 "GRANT"가 뜰 것이다.   

여기까지 끝났다면 shell을 "\q"를 입력해 종료하자. 이제 Django쪽을 세팅할 차례이다. 

 

5) setting.py편집

setting.py에 DATABASE부분을 살펴보면 아래와 같이 작성되어 있을 것이다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

이 부분을 아래와 같이 변경시켜준다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': '데이터베이스이름',
        'USER': 'user_id',
        'PASSWORD' : 'password',
        'HOST' : 'localhost',
        'PORT' :'',
    }
}

user_id와 password는 위에 데이터 베이스에서 설정한 것을 입력해주고 'NAME'에는 데이터베이스 이름을 입력하면 된다. 

 

6) 테이블 만들어보기

 잠깐 mysite/setting.py의 INSTALLED_APPS부분에 대해 언급하자면, INSTALLED_APPS에는 Django를 설치시 함께 설치되는 기본 어플리케이션들의 목록을 확인할 수 있다.

[Note] INSTALLED_APPS

■ django.contrib.admin ; 관리용 사이트
■ django.contrib.auth ; 인증 시스템
■ django.contrib.contenttypes ; 컨텐츠 타입을 위한 프레임워크
■ django.contrib.sessions ; 세션 프레임워크
■ django.contrib.meaages ; 메세징 프레임워크
■ django.contrib.saticfiles ; 정적 파일을 관리하는 프레임워크

 이러한 기본 어플리케이션 중 몇 개는 최소한 하나 이상의 데이터 베이스 테이블을 사용하는데 그러기 위해서는 데이터 베이스에서 테이블을 미리 만들 필요가 있다. 그전에 psycopg2를 설치할 필요가 있다. cmd창에서 프로젝트가 있는 mysite 폴더로 이동한 후 다음의 명령어를 실행해보자.

pip install psycopg2
[Note] psycopg2 설치 후 Error loading psycopg2 module: No module named 'psycopg2'가 계속 발생하는 경우


psycopg2를 설치했으나 계속 모듈을 찾지 못했다. 검색해보니 Django2버전이상, python 3의 경우 pip3로 설치하라는 댓글을 찾았고 실행해보니 문제 없이 작동했다.
즉, 아래와 같이 작성하라는 것이다.

pip3 install psycopg2

그 이후에 아래의 명령어를 실시하자.

python manage.py migrate

문제가 없다면 아래와 같은 커맨드 라인을 볼 수 있을 것이다.

  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

여기까지 문제가 없다면 정상적으로 연동됐음을 알 수 있다.


참고 자료

seulcode.tistory.com/111

velog.io/@ikswary/django-%EA%B5%AC%EC%A1%B0

tutorial.djangogirls.org/ko/django_start_project/

docs.djangoproject.com/ko/3.1/intro/install/

 

728x90