1. 장고 프로젝트 구조
장고 개발자마다 선호하는 프로젝트 구조가 다르겠지만, 필자는 다음과 같은 프로젝트 구조를 선호한다. 프로젝트 구조란 프로젝트 폴더 내에 필요한 파일들을 어떤 구조(위치)로 배치하느냐에 관한 문제이다. 그리고 만약 그 구조가 장고가 기본적으로 제공하는 구조와 다르다면 별도의 설정을 해줘야 한다(아래의 구조는 기본 구조와 다르다). 이번 포스팅은 그 설정 방법에 관해 설명한다.
프로젝트 폴더/
config/
apps/
{app_name_1}/
{app_name_2}/
{app_name_3}/
templates/
static/
css/
font/
img/
js/
2. 장고 프로젝트 루트 디렉토리 경로 (BASE_DIR)
설정 작업을 하기 전에 먼저 이해해야 할 것이 하나 있다. 바로 장고 프로젝트의 루트 디렉토리 경로 설정이다. 장고 웹 어플리케이션이 실행되는 동안, 장고가 프로젝트 폴더 내 이곳저곳을 누비면서 필요한 파일을 찾기 위해서는 기본적으로 해당 프로젝트의 루트 디렉토리 경로를 알고 있어야 한다. 이는
settings.py
의 BASE_DIR
변수에 설정되어 있다. BASE_DIR
의 값은 기본적으로 다음과 같이 설정되어 있다.이를 해석하기 위해 각 부분의 의미를 파악해보면 다음과 같다.
__file__
: 현재 파일(settings.py
)의 절대 경로
os.path.abspath(__file
__
)
: 인자로 주어지는 경로의 절대 경로
os.path.dirname()
: 인자로 주어지는 파일/폴더의 경로
이를 통해,
BASE_DIR
은 settings.py
파일이 위치한 폴더가 위치한 폴더, 즉 프로젝트 폴더를 가리킨다는 것을 파악할 수 있다. 장고는 이 경로를 기준으로 프로젝트 내 필요한 파일들을 찾아다닐 것이다.이후 경로 관련 설정에서
BASE_DIR
의 하위 경로를 나타내야 하는 경우가 생기면 다음과 같이 쓰면 된다. os.path.join
함수는 첫 번째 인자에 해당하는 BASE_DIR
경로에 두 번째 인자에 해당하는 경로를 덧붙여서 새로운 경로를 만들어 낸다.3. 설정 폴더 이름 변경
기본적으로 장고는 프로젝트 폴더와 동일한 이름의 설정 폴더를 제공한다. 여기에는
settings.py
, urls.py
등과 같이 프로젝트 설정과 관련된 파일들이 모여 있다. 필자의 경우, 가독성을 위해 해당 설정 폴더의 이름을 config
로 변경하고자 한다. 하지만 단순히 폴더의 이름만 바꾼다고 끝이 아니다. 다음과 같이 몇 군데 설정을 수정해줘야 한다.- PyCharm에서 [Run > Edit Configurations]를 선택하여 장고 서버 실행 설정 창을 띄우고,
DJANGO_SETTINGS_MODULE
환경 변수의 값을 바뀐 설정 파일의 경로로 수정해준다(EX.config.settings
).
manage.py
와wsgi.py
에서도DJANGO_SETTINGS_MODULE
환경 변수의 기본값을 동일하게 수정해준다.
settings.py
에 존재하는ROOT_URLCONF
,WSGI_APPLICATION
변수의 값을 바뀐 경로로 수정해준다.
- 마지막으로, PyCharm에게 장고 설정 파일의 경로가 변경되었음을 알려줘야 한다. [File > Settings]을 선택하거나 [Alt + Ctrl + S] 단축키를 통해 설정 창을 띄운 뒤, 좌측 탭에서 [Languages & Frameworks > Django] 메뉴를 선택한다. 그리고 [Settings]에서
settings.py
파일을 찾아 지정해준다.
4. 앱 폴더 경로 설정
프로젝트 폴더에서 앱을 추가(생성)하는 명령어는 다음과 같다.
그러면 기본적으로 프로젝트 폴더 하위에 해당 앱 폴더가 생성될 것이다. 그러나 필자의 경우, 여러 앱 폴더들을 프로젝트 하위의
apps
폴더 내부에 위치시키고자 한다. 즉, 모든 앱 폴더들을 {프로젝트 폴더}/apps
폴더로 이동시키기로 한다. 이를 위해서는 장고가 추가한 앱들을 해당 경로(apps
폴더)에서 찾을 수 있도록 다음과 같이 설정 파일(settings.py
)의 내용을 일부 수정해줘야 한다.settings.py
의INSTALLED_APPS
에apps.{app_name}
을 추가한다.
5. 템플릿 파일 경로 설정
템플릿(
.html
) 파일들은 프로젝트 단위로 관리할 수도 있고, 앱 단위로 관리할 수도 있다. 필자의 경우 전자를 선호한다. 따라서 프로젝트 폴더 하위에 templates
폴더를 만들어서 이곳에서 모든 템플릿 파일들을 관리하기로 한다. 이를 위해서는 장고가 템플릿 파일들을 해당 경로(templates
폴더)에서 찾을 수 있도록 다음과 같이 설정 파일(settings.py
)의 내용을 일부 수정해줘야 한다.settings.py
의TEMPLATES
에서DIRS
에os.path.join(BASE_DIR, 'templates')
를 추가한다.
6. 정적(Static) 파일 경로 설정
정적 파일의 관리 방법은 약간 더 복잡하다.
STATICFILES_DIR
, STATICFILES_FINDERS
, STATIC_URL
, STATIC_ROOT
등 정적 파일 관리와 관련된 변수들이 복잡하게 존재할 뿐만 아니라, 로컬 개발 환경과 실서버 배포 환경을 따로 생각해줘야 하기 때문이다. 이에 대해서는 가능하다면 추후 포스팅으로 다루도록 하고, 여기서는 정적 파일의 경로 설정과 관련한 간단한 내용만 다루도록 한다.정적 파일도 프로젝트 단위로 관리할 수도 있고, 앱 단위로 관리할 수도 있다. 필자는 우선 전자의 방법을 택하기로 한다. 이 경우 보통 프로젝트 폴더 하위의
static
폴더에서 각종 정적 파일들을 관리하게 된다. 이를 위해서는 장고가 필요한 정적 파일들을 해당 경로(static
폴더)에서 찾을 수 있도록 다음과 같이 설정 파일(settings.py
)의 내용을 일부 수정해줘야 한다. FileSystemFinder
는 STATICFILES_DIRS
에 지정된 경로에서 정적 파일들을 탐색하는 (django.contrib.staticfiles
앱의) 함수이다.후자의 경우(앱 단위로 정적 파일 관리), 각 앱 폴더에
static
폴더를 만들고 그 안에 다시 해당 앱의 이름을 가진 폴더를 만들어서 정적 파일들을 관리한다. 이 경우에는 STATICFILES_FINDERS
에 django.contrib.staticfiles.finders.AppDirectoriesFinder
를 추가해줘야 한다. 이는 각 앱 폴더의 static
폴더에서 정적 파일들을 탐색하는 (django.contrib.staticfiles
앱의) 함수이다.참고로,
static
폴더 안에 굳이 해당 앱의 이름을 가진 폴더를 다시 만드는 이유는 추후 실서버 배포 시 collectstatic
명령어가 수행될 때 파일 이름들이 충돌 나지 않게 하기 위함이다. collectstatic
명령어는 장고 프로젝트의 정적 파일들을 전부 모아서 STATIC_ROOT
변수에 지정된 경로로 옮겨주는 역할을 수행한다. 이는 실서버 배포 시에 STATIC_URL
로 정적 파일에 대한 요청이 들어올 때 웹 서버가 STATIC_ROOT
경로에서 필요한 정적 파일들을 찾을 수 있게 하기 위함이다. 그런데 만약 각 앱 폴더의 static
폴더 안에서 해당 앱의 이름으로 다시 폴더를 생성하여 정적 파일들을 관리하지 않으면, 서로 다른 앱 폴더에 위치한 정적 파일들이라 하더라도 동일한 이름에 의해 충돌이 발생할 수 있다. 따라서 각 앱 폴더의 static
폴더 안에서도 앱 이름으로 다시 폴더를 만들어줄 것을 권장한다.