안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

장고 (Django)

[Django] 프로젝트 구조 설정 (앱, 템플릿, Static 파일 등)

피그브라더 2020. 6. 1. 10:26

이전 포스팅과 연결 : [Django] 개발 환경 세팅 : CentOS7 (VirtualBox + Vagrant), PyCharm

 

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의 값은 기본적으로 다음과 같이 설정되어 있다.

 

  • BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

 

이를 해석하기 위해 각 부분의 의미를 파악해보면 다음과 같다.

 

  • __file__ : 현재 파일(settings.py)의 절대 경로

  • os.path.abspath(__file__) : 인자로 주어지는 경로의 절대 경로

  • os.path.dirname() : 인자로 주어지는 파일/폴더의 경로

 

이를 통해, BASE_DIR은 settings.py 파일이 위치한 폴더가 위치한 폴더, 즉 프로젝트 폴더를 가리킨다는 것을 파악할 수 있다. 장고는 이 경로를 기준으로 프로젝트 내 필요한 파일들을 찾아다닐 것이다.

 

이후 경로 관련 설정에서 BASE_DIR의 하위 경로를 나타내야 하는 경우가 생기면 다음과 같이 쓰면 된다. os.path.join 함수는 첫 번째 인자에 해당하는 BASE_DIR 경로에 두 번째 인자에 해당하는 경로를 덧붙여서 새로운 경로를 만들어 낸다.

 

  • os.path.join(BASE_DIR, ...)

 

3. 설정 폴더 이름 변경

기본적으로 장고는 프로젝트 폴더와 동일한 이름의 설정 폴더를 제공한다. 여기에는 settings.py, urls.py 등과 같이 프로젝트 설정과 관련된 파일들이 모여 있다. 필자의 경우, 가독성을 위해 해당 설정 폴더의 이름을 config로 변경하고자 한다. 하지만 단순히 폴더의 이름만 바꾼다고 끝이 아니다. 다음과 같이 몇 군데 설정을 수정해줘야 한다.

 

  1. PyCharm에서 [Run > Edit Configurations]를 선택하여 장고 서버 실행 설정 창을 띄우고, DJANGO_SETTINGS_MODULE 환경 변수의 값을 바뀐 설정 파일의 경로로 수정해준다(EX. config.settings).

  2. manage.py와 wsgi.py에서도 DJANGO_SETTINGS_MODULE 환경 변수의 기본값을 동일하게 수정해준다.

  3. settings.py에 존재하는 ROOT_URLCONF, WSGI_APPLICATION 변수의 값을 바뀐 경로로 수정해준다.

  4. 마지막으로, PyCharm에게 장고 설정 파일의 경로가 변경되었음을 알려줘야 한다. [File > Settings]을 선택하거나 [Alt + Ctrl + S] 단축키를 통해 설정 창을 띄운 뒤, 좌측 탭에서 [Languages & Frameworks > Django] 메뉴를 선택한다. 그리고 [Settings]에서 settings.py 파일을 찾아 지정해준다.

 

4. 앱 폴더 경로 설정

프로젝트 폴더에서 앱을 추가(생성)하는 명령어는 다음과 같다.

 

  • python manage.py startapp {app_name}

 

그러면 기본적으로 프로젝트 폴더 하위에 해당 앱 폴더가 생성될 것이다. 그러나 필자의 경우, 여러 앱 폴더들을 프로젝트 하위의 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 앱의) 함수이다.

 

  • STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]

  • STATICFILES_FINDERS = ['django.contrib.staticfiles.finders.FileSystemFinder',]

 

후자의 경우(앱 단위로 정적 파일 관리), 각 앱 폴더에 static 폴더를 만들고 그 안에 다시 해당 앱의 이름을 가진 폴더를 만들어서 정적 파일들을 관리한다. 이 경우에는 STATICFILES_FINDERS에 'django.contrib.staticfiles.finders.AppDirectoriesFinder'를 추가해줘야 한다. 이는 각 앱 폴더의 static 폴더에서 정적 파일들을 탐색하는 (django.contrib.staticfiles 앱의) 함수이다.

 

참고로, static 폴더 안에 굳이 해당 앱의 이름을 가진 폴더를 다시 만드는 이유는 추후 실서버 배포 시 collectstatic 명령어가 수행될 때 파일 이름들이 충돌 나지 않게 하기 위함이다. collectstatic 명령어는 장고 프로젝트의 정적 파일들을 전부 모아서 STATIC_ROOT 변수에 지정된 경로로 옮겨주는 역할을 수행한다. 이는 실서버 배포 시에 STATIC_URL로 정적 파일에 대한 요청이 들어올 때 웹 서버가 STATIC_ROOT 경로에서 필요한 정적 파일들을 찾을 수 있게 하기 위함이다. 그런데 만약 각 앱 폴더의 static 폴더 안에서 해당 앱의 이름으로 다시 폴더를 생성하여 정적 파일들을 관리하지 않으면, 서로 다른 앱 폴더에 위치한 정적 파일들이라 하더라도 동일한 이름에 의해 충돌이 발생할 수 있다. 따라서 각 앱 폴더의 static 폴더 안에서도 앱 이름으로 다시 폴더를 만들어줄 것을 권장한다.