본문 바로가기
Web/Django

[Django] 개발환경 세팅하기

by DUSTIN KANG 2023. 11. 22.

Django?

django는 파이썬을 기반으로하는 웹 풀 스택 개발 프레임워크다.

기본적으로 제공되는 기능이 많고 풀스택 기능을 제공하기 때문에 편리하게 웹 페이지를 개발할 수 있다. 또한, React, Flutter, Vue와 같은 프론트 엔트 프레임워크와 같이 연동하면 ORM, Admin등의 백엔드 기능으로 좀 더 완성도 있는 플랫폼을 만들 수 있다. 개인적인 기준으로 다른 프레임워크보다 많은 기능과 자료들이 있어 올인원하기 좋은 프레임워크인 것 같다. 다만 단점도 있다. 기능이 많은 만큼 무겁고 복잡하며 Flask나 FastAPI 보다 자유도가 떨어진다. 

 

Django 공식 문서 를 참고

 

MVT 패턴 시스템

Django는 어떤 시스템으로 동작을 하게 되는 것일까? 기본적으로 Django는 요청이 들어오면 URL를 통해 View를 호출하고 데이터를 응답하는 방식으로 동작을 하게된다. View는 무슨 역할을 할까? 끝없는 궁금증을 해결하기 위해 MVT 패턴에 대한 이해가 필요한 것이다.

Django 아키텍처 패턴은 다음과 같이 Model-Template-View로 이루어져 있다.

  • Model : 데이터베이스와 소통을 하며 Django의 데이터 구조를 클래스로 선언하며 생성할 수 있다. 
  • Template : 사용자에게 보여지는 화면 구성을 담당한다. Template Language를 통해 동적으로 화면을 구성할 수도 있다.
  • View : 웹 사이트의 중요한 로젝을 담당하게 되는데 Model과 template 사이에서 요청을 응답하는 역할을 한다.

 

MVC 아키텍처 패턴과 비슷해보이지만 MVC의 View 역할을 Template이 담당하고 Controller가 View 역할을 담당한다. 중요한 점은 MVC와 다르게 실제로 입력이 들어오는 부분을 Django 프레임워크가 처리한다. 덕분에 나머지 MTV 부분만 집중할 수 있게 된다.

 

가상환경 구성하기

가상환경을 구성하는 방법에는 다양한 방법이 있다.

일반적으로 로컬에서 가상환경을 구성할 땐, `venv`를 이용하거나 `poetry` `pipenv` Docker 등 목적에 따라 다양하게 구성할 수 있다.

가상환경을 구성하는 이유는 의존성 모듈을 일관된 환경에서 실행할 수 있게 가상환경을 생성한다. 이번에는 `venv`로 가상환경을 설정했다. 

python -m venv myvenv
source myvenv/bin/activate
pip install django # 파이썬 패키지 관리자로 django를 설치한다.
django-admin --version

 

만약, 해당 프로젝트 파일을 Github에 업로드할 예정이라면 `.gitignore`을 추가하는 것이 좋다. 해당 사이트↗에서 `gitignore`양식을 쉽게 만들 수 있다.

 

다양한 가상환경 적용하는 방법은 해당 블로그↗를 참고하자. (가상환경 - gahyeon.log)

 

이제부터는 DRF나 Pillow등 다양한 라이브러리를 설치할 경우가 많이 생긴다. `pip freeze > requirements.txt` 명령어로 패키지들을 정리해두자. 추후, 다른 환경에서 해당 프로젝트를 설치할 때 의존성이 깨지지 않고 설치할 수 있다. `pip install -r requirements.txt`

더보기

보안을 위한 환경 변수 설정

애플리케이션을 배포할 때 환경변수를 이용해 외부의 침입을 막을 수 있다.

그러나 우리는 개발을 할 때도 git에 프로젝트를 올려야 하기 때문에 public 상태에서 외부에 침입이 올 수 있기 때문에 환경변수 관리를 미리 해두는 것이 좋다. 민감한 정보를 관리하기 위해서 `.env`파일과 `.gitignore`를 사용해 관리할 수 있다.

 

먼저 프로젝트 디렉토리에 `.env`와 `.gitignore`를 생성한다.

 

파이썬에서 환경 변수를 가져오는데 `os.environ.get('')`과 `os.getenv`가 있다. 이 둘의 결과는 크게 다르지 않지만 후자가 기본 값을 지정할 수 있고 코드를 더 간결하게 만들 수 있기 때문에 유용하다.

 

먼저 `pip install python-dotenv`로 해당 모듈을 설치해주고 settings.py에서 하드 코딩된 값들을 `.env`에 저장한다.

 

from dotenv import load_dotenv
import os
    
load_dotenv()
    
SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG = os.getenv('DEBUG') == 'True'
DB_HOST = os.getenv('DB_HOST')
DB_PORT = int(os.getenv('DB_PORT', 5432))  # 기본값으로 5432 사용

 

대표적으로 `SECRET_KEY`, `DEBUG`, `DB_HOST`, `DB_PORT` 등을 `.env`에 저장한다.

그다음, `.gitignore`에 `.env`를 추가해 Git 저장소에 올리지 않도록 한다.

Django 프로젝트 생성하기

가상환경에 django 프레임워크를 설치했다면, django 프로젝트를 실행해보자.

python manage.py 다음 `tab` 키를 누르면 명령어들을 확인할 수 있다.

django-admin startproject {프로젝트 이름} .

python manage.py runserver // 장고 프로젝트 실행

해당 프로젝트를 실행하게 되면 제대로 설치가 완료됬다면서 로켓을 띄우는 페이지를 볼 수 있다.

그러나 터미널에는 예상과 다르게 터미널에서는 마이그레이션 오류가 발생했다는 것을 볼 수 있다. 

 

 

`python manage.py migrate`를 입력해서 빈 데이터베이스에 마이그레이션 파일들을 적용하라고 한다. 이 18개의 마이그레이션 파일들은 Django에서 기본적으로 제공하는 DB 테이블이기 때문에 DB에 아무것도 없으면 아직 admin 페이지를 사용할 수 없다.

 

마이그레이션 파일은 데이터베이스의 상태를 변경하는 파이썬 파일이다. 마이그레이션 파일로 마이그레이션 작업을 할 수 있다.

 

  • makemigrations : DB 모델의 변경사항을 하나의 파일로 생성한다.
  • migrate : 변경 사항을 DB에 적용한다
💡 manage.py로 사용하는 다양한 명령어
이외에도 다양한 명령어들이 존재한다. 
- inspectdb [*테이블명] : DB에 있는 테이블을 클래스 형태로 가져오는 명령어
- createsuperuser : 관리자 계정 생성
- shell : django cli 실행
- test : 테스트를 할때 실행

 


Django 구조 확인하기

1. Django 프로젝트 구조 확인하기

django 프로젝트 구조

Django 프로젝트의 구조는 위와 같다. 

이외에도 `templates`, `statics`, `forms.py` `app/urls.py` 등 추가로 생성할 파일도 있다. 또, view나 test를 패키지 형태로 만들어 사용할 수 있다. 이 내용들은 차차 알아가보도록 하자.

 

settings.py

`settings.py` 파일은 Django에서 전반적인 설정을 관리하는 파일이다.

그렇다면 이 파일이 어떻게 구성되어있는지 간단히 살펴보자.

  • BASE_DIR : 루트 디렉토리 경로를 의미한다. 기본적으로 `manage.py`가 있는 디렉토리를 기준으로 위치가 설정된다.
  • SECRET_KEY : 프로젝트 설정 보안을 위해 임의로 생성된 50글자의 암호화된 key 값이다. 외부로 노출되면 안되기 때문에 환경 변수로 설정하기도 한다.
  • DEBUG : 개발 중일 때는 `True`로 설정하여 오류 내역을 자세히 볼 수 있다. 그러나 배포를 할 때는 외부 침입 요인이 되니 `False`로 설정한다.
  • ALLOWED_HOSTS : 접근 가능한 IP를 제한할 수 있다. 보통 개발 모드에서는 `*`로 모든 IP에 대한 접근을 허용한다. `False`일 경우에만 허용된 호스트만 접근이 가능하다.
  • INSTALLED_APPS : 앱을 생성할 때 등록하는 리스트(list)이다.  
  • MIDDLEWARE : django의 URL이나 View, Templates 이 요청/응답을 하는 중간에 연결하는 미들웨어를 관리하는 리스트이다. 특정 서비스가 필요한 경우 app과 비슷하게 Middleware를 구현하여 추가한다.
  • ROOT_UPCONF : django 프로젝트이 URL을 설정하는 파일을 지정하는 부분으로 `프로젝트명.urls`으로 urls.py를 가리킨다. 
  • TEMPLATES : Django 프로젝트 내 Template 디렉토리의 설정을 나타낸다. 기본적으로 앱 별 templates 위치로 설정된다.
  • WSGI_APPLICATION : 웹 서버와 연결 할 때 어떤 세팅을 이용하는지 세팅 값과 연결을 시켜준다. 기본적으로 프로젝트내 `wsgi.py`의 `application` 부분으로 설정되어 있다.
  • DATABASES : 프로젝트와 연결할 DB 정보를 설정한다. 기본적으로 `SQLite3`를 사용한다.
  • AUTH_PASSWORD_VALIDATORS : PW 유효성에 대한 검증을 관리하는 내용이다.
  • LANGAUG_CODE : 기본 언어를 지정하는 부분으로 한국어에 경우, `ko-kr`로 변경하면 된다.
  • TIME_ZONE/USE_TZ : 표준 시간대를 설정하는 부분으로 기존 표준시 UTC로 설정되어 있으며 한국시간대(UTC +9)에 경우, `Asia/Seoul`로 설정 한다. `USE_TZ`는 타임존 사용 여부를 묻는 옵션이다. `False`일 경우 자신이 설정한(Custom) 타임존으로 움직인다. 
  • USE_I18N, USE_L10N : 다국어 페이지 작성시 지원하는 기능인데, 국제화(I18N)과 현지화(L10N)로 이루어져 있고 기본적으로 `True`로 되어 있다.  
  • STATIC_URL / MEDIA_URL : django를 실행할 때 불러올 정적파일 url를 설정한다. 기본값으로 `프로젝트/static`이 접근 경로가 된다. 
  • DEFAULT_AUTO_FIELD : django 3.2 버전부터 업데이트 되었는데 ORM에서 자동으로 생성하는 PK를 설정을 말한다. `apps.py`에 보면 자동으로 들어있는 것을 확인할 수 있다.

 

이 포스팅에서는 이 전부의 설정을 다룰 수 없으니 차차 알아가보도록하자.

초기에 settings.py에서 설정해야할 것들이다.

 

2. 프로젝트 구조 설정

루트 디렉토리 경로 설정

기본적으로 루트 디렉토리는 아래와 같이 설정되어 있다.

 

from pathlib import Path
import os

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# Path(__file__).resolve() == os.path.abspath(__file__)
# Path(__file__).resolve().parent = os.pathdirname(os.path.abspath(__file__))
# Path(__file__).resolve().parent.parent == os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# os.path.join(BASE_DIR, 경로) : BASE_DIR 경로에서 새로운 경로를 만들어 낼 수 있다.

 

하나하나 살펴보면 쉽게 이해할 수 있다. 

  • `Path(__file__)` : 현재 이 코드 파일이 실행되는 시스템 경로를 나타낸다. 
  • `resolve()` : 해당 경로의 절대 경로를 의미한다.
  • `.parent.parent`: 부모 경로로 두 번 이동하는 것을 의미한다.

즉, 위 코드는 `/Users/dongwoo/example/프로젝트/프로젝트패키지/settings.py`에서 실행된 구조이기 때문에 `/Users/dongwoo/example/프로젝트`로 이해하면 된다.

 

💡 패키지 디렉토리 이름 변경 방법
프로젝트를 생성하게되면 패키지 디렉토리와 동일하기 때문에 가독성이 떨어짐을 알 수 있다. 이러한 이유로 프로젝트의 패키지 디렉토리를 변경하는데 변경 이후에 연관된 파일에 설정이 필요하다.
- settings.py에 ROOT_URLCONF와 WSGI_APPLICATION을 새 프로젝트 이름으로 변경한다.
- wsgi.py(asgi.py)와 manage.py에서도 변경이 필요하다.

 

 

2. 앱 생성 및 경로 설정

그 다음, 앱을 생성한다.

앱을 사용하려면 `INSTALLED_APP`에 앱을 등록해야 프로젝트에서 사용할 수 있다.

만약 여러 앱을 관리하는 경우 여러 앱을 관리하는 폴더를 만들고 하위 경로로 여러 앱을 위치 시킨다.

 

python manage.py startapp {앱이름}

 

INSTALLED_APPS = [
	# ...
	'project.apps.app',
]

 

 

 

2. 정적 파일 경로 설정

정적 파일을 관리하는 방법은 로컬 환경과 배포 환경을 따로 설정해야하기 때문에 복잡한 부분이 있다. 

여기서 Static과 Media의 차이점이 있는데 Static은 개발자가 보여주기를 위해 올리는 정적인 파일이고 media는 사용자가 웹에서 업로드하는 파일이다. 이는 개발하는 단계에서 관리를 할 수 없기 때문에 따로 분류해야한다.

 

`settings.py`에 보면 STATIC_URL에 `/static/`로 정의되어 있음을 확인할 수 있다. 그러면 우리는 `app/static/app/css/main.css`에서 정적 파일을 템플릿에 불러와 사용할 수 있다.

 

정적 파일 관련해서 3가지 설정이 존재한다.

 

  • `STATIC_ROOT` : 배포 환경에서 Django의 정적 파일을 웹서버에 제공하기 위해 사용하며 모든 정적 파일을 한곳으로 모아 놓는다. 
  • `STATICFILES_DIRS` : 기본 Static 경로 말고도 추가적인 경로를 정의하는 리스트이다. 
  • `STATIC_URL` : 개발 환경에서 정적 파일을 참조할 때 사용하는 URL이다. 반드시, `/`로 끝나야 하며 폴더 내 앱 이름으로 폴더를 추가해야 한다. 이는 추후에 `collectstatic` 명령어로 정적 파일을 STATIC_ROOT로 모으게 되면 충돌 나지 않게 찾게끔 하기 위해서다. 
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = 'static/' # 앱 디렉토리의 static
STATICFILES_DIRS = [
    BASE_DIR / 'static', # 프로젝트 디렉토리의 static
]

STATICFILES_FINDERS = [
	'django.contrib.staticfiles.finders.FileSystemFinder', # DIRS 경로에 정적 파일을 탐색하는 함수
    'django.contrib.staticfiles.finders.AppDirectoriesFinder' # 앱 별로 정적 파일 탐색하는 함수
]

STATIC_ROOT = '' # 배포 환경

 

Media File

미디어 파일은 주로, 이미지(ImageField)나 파일(FileField) 업로드에 사용한다. 사용자가 업로드를 하기위해 `form`이 필수적으로 있어야 한다. 

 

# Media files (Images, File)
# upload_to : MEDIA_URL의 하위 경로

MEDAI_URL = '/media/' # 웹 서버 사용자가 사용하는 URL (업로드된 파일의 URL)
MEDIA_ROOT = BASE_DIR / 'media' # 프로젝트 디렉토리의 media (URL를 통해 참조하는 파일 위치)

 

위와 같이 설정이 끝나면 프로젝트 패키지 디렉토리 내 urls.py에 static 함수를 추가한다.

 

from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 


django-extensions

django를 조금 더 확장성 있게 사용할 수 있도록 도와주는 유용한 툴이다.

django-extentions은 여러가지 기능이 존재하지만 이번 포스팅에서는 유용한 5가지 기능들을 소개하려고 한다.

공식문서를 참고해도 된다.

$ pip install django-extensions

 

외부 앱이기 때문에 settings.py에 추가해줘야 한다. `django_extensions`

shell_plus

장고에서 제공하는 shell의 향상된 버전이며 import를 추가할 필요도 없고 tab키로 자동 완성해주는 유용한 기능을 가지고 있다.

반드시 `IPython`이 설치되어 있어야 한다.

python manage.py shell_plus --ipython

runscript

Django 컨텍스트 내에서 파이썬  명령어를 사용할 수 있다.

참고자료

graph_models

graph로 각 모델 간의 관계를 그림을 표현해주는 정말 유용한 기능으로 쉽게 ERD를 보여준다.

만약 MacOs라면 `brew install graphviz` 후 `pip install pygraphviz `를 설치해야한다.

https://github.com/pygraphviz/pygraphviz/issues/11#issuecomment-278633077

python manage.py graph_models {app} {model} -o /temp/models.png

sqldiff

데이터베이스 스키마와 실제 DB 테이블을 비교하는 명령어이다.

`-t` 파라미터는 SQL 대신에 차이점만 출력하는 파라미터이다.

memo가 실제 DB에 없고 db와 model이 varchar 문자열의 길이 차이가 있다.

 

python manage.py sqldiff -a -t

syncs3

MEDIA_ROOT와 STATIC_ROOT에 있는 모든 파일들을 AWS S3의 같은 디렉토리 구조로 업로드하는 명령어 이다.

`--media-only` 파라미터로 따로 지정이 가능하다.

python manage.py sync_s3 mybucket

 

Lint & Formatter

black

자동으로 코드를 포맷팅해주는 일관성 도구, 주로 불필요한 공백을 줄어준다. 

  • line-length : 기본 88줄
  • target-version. : 파이썬 타겟 버전
  • check
  • diff :  전 후 차이
  • workers
  • quiet / verbose
  • include/ exclude (`--exclude '/(migrations|env)/'`)
pip install black
black {파일 이름 혹은 폴더}
python -m black {파일 이름 혹은 폴더}

isort

import 문을 정리해주는 도구으로 팀 작업에서 Git 충돌 가능성을 줄임.

pip install isort

flake8

코드 스타일, 문법적 오류를 체크해서 조금더 깔끔하게 프로그래밍할 수 있게 도와줌(수정은 하지 않는다.)

pip install flake8
flake8 {폴더, 파일}

 

mypy

타입 힌트로 정적 타입을 검사한다.

pip install mypy
mypy {파일 이름 혹은 폴더}

 

 

 

☕️ 포스팅이 도움이 되었던 자료

오늘도 저의 포스트를 읽어주셔서 감사합니다.

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.

 

 

 

 

 

'Web > Django' 카테고리의 다른 글

[Django] CRUD 구현  (0) 2023.11.29
User Model 커스텀 하기  (0) 2023.11.28
Static 파일 관리하기 with AWS S3 연동하기  (0) 2023.11.27
[Django] 애플리케이션 요청 및 처리  (0) 2023.11.21
[Django] 데이터베이스 모델링  (0) 2023.11.18