3. 어떻게 장고 프로젝트를 구성할 것인가

장고 프로젝트의 기본 레이아웃과 책의 저자가 추천하는 레이아웃을 다룹니다.

3.1 장고의 기본 프로젝트 구성

장고는 프로젝트 디렉터리 내부에 앱(어플리케이션) 디렉터리들이 존재하는 계층적인 구조를 기본 레이아웃으로 합니다.
django를 설치하면 django-admin이라는 command-line utility를 사용할 수 있으며, 이를 통해 project와 app의 기본적인 디렉터리를 자동으로 생성할 수 있습니다.

# test_PJ라는 장고 프로젝트를 생성합니다.
django-admin startproject test_PJ

# test_PJ 디렉터리로 이동합니다.
cd test_PJ

# test_PJ 디렉터리 내부에 test_APP 어플리케이션을 생성합니다.
django-admin startapp test_APP

위와 같은 명령어를 command-line에 입력하면 다음과 같은 구조의 프로젝트가 생성합니다.

test_PJ/
    manage.py
    test_PJ/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    test_APP/
    	__init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py



3.2 우리가 선호하는 프로젝트 구성

위와 같이 django-admin을 이용하면 삼단(three-tiered) 방식에 기반한 프로젝트가 생성되며 우리 또한 이를 기반으로 프로젝트를 구성합니다.
우선 앞선 방법을 통해 생성되는 프로젝트를 깃 저장소의 루트(root)로 사용되는 디렉터리 안으로 모두 옮겨줍니다.
그리하여 우리가 만든 프로젝트의 구성은 다음과 같게 됩니다.

<repository_root>/
	<django_project root>/
    	<configuration root>/

각 계층을 자세히 살펴보도록 하겠습니다.

3.2.1 최상위 레벨 : 저장소 루트 (repository_root)

최상위 디렉터리는 프로젝트의 최상위 절대 루트이며 깃 저장소의 루트로 사용될 디렉터리입니다.
<django_project root> 이외에 README.md, docs/ 디렉터리, .gitignore, requirements.txt, 외 배포에 필요한 다른 파일 등 중요한 내용들이 위치합니다.

3.2.2 두 번째 레벨 : 프로젝트 루트 (django_project root)

프로젝트 루트는 장고 프로젝트의 소스들이 위치하는 디렉터리이며 모든 파이썬 코드들이 <django_project root>/ 디렉터리 아래와 그 하부 디렉터리들에 위치하게 됩니다.

3.2.3 세 번째 레벨 : 설정 루트 (configuration_root)

설정 루트는 settings 모듈과 기본 URLConf(urls.py) 등 프로젝트의 설정 관련 파일들이 저장되는 디렉터리입니다.
이 디렉터리는 init.py 모듈이 존재하는 유효한 파이썬 패키지 형태여야 합니다.




3.3 예제 프로젝트 구성

본 책에서 다루는 예제인 간단한 아이스크림 평가 사이트를 사용하여 설명하겠습니다.
프로젝트의 구성은 다음과 같습니다.

icecreamratings_project/
	.gitignore
    Makefile
    docs/
    README.md
    requirements.txt
    icecreamratings/
    	manage.py
        media/
        products/
        profiles/
        ratings/
        static/
        templates/
        config/
	        __init__.py
        	settings/
        	urls.py
        	asgi.py
        	wsgi.py

각 레벨 별로 내부의 파일들과 디렉터리들을 설명드리겠습니다.

3.3.1 최상위 레벨 (repository_root : icrecreamratings_project)

파일/디렉터리설명
.gitignore깃이 처리하지 않을 파일과 디렉터리를 작성한 파일입니다.
README.md개발자들을 위한 프로젝트 문서입니다.
docs/개발자들을 위한 프로젝트 문서들이 들어있는 디렉터리입니다.
Makefile간단한 배포 작업 내용과 매크로들을 포함한 파일입니다.
requirements.txt프로젝트에 이용되는 파이썬 패키지 목록을 작성한 파일입니다.
pip을 이용하여 해당 패키지들 설치할 수 있습니다.
icecreamratings/해당 프로젝트의 <django_project root>입니다.

3.3.2 두 번째 레벨 (django_project root : icrecreamratings)

파일/디렉터리설명
config프로젝트의 <configuration root>로 프로젝트 전반에 걸친 settings 파일, urls.py, asgi와 wsgi 모듈이 자리하는 곳입니다.
manage.pymanage.py는 django-admin과 같이 프로젝트 관리 및 실행 작업을 진행하는 모듈입니다.
media/사용자가 올리는 사진 등의 미디어 파일이 올라가는 디렉터리입니다.
큰 프로젝트의 경우 사용자들이 올리는 미디어 파일들은 독립된 서버에서 호스팅합니다.
products/아이스크림 브랜드를 관리하고 보여주는 앱입니다.
ratings/이용자가 매긴 아이스크림 점수를 관리하는 앱입니다.
static/CSS, 자바스크립트, 이미지 등 사용자가 올리는 것 이외의 정적 파일들을 위치시키는 디렉터리입니다.
media/디렉터리와 마찬가지로 큰 프로젝트의 경우 독립된 서버에서 호스팅합니다.
templates/시스템 통합 템플릿 파일을 저장하는 디렉터리입니다.

정적 미디어 디렉터리(static/)의 이름은 장고 기본 설정을 따른 상황입니다.
만약 이를 변경하려면 settings에서 STATICFILES_DIRS 세팅을 변경한 이름으로 업데이트해주어야 합니다.


3.3.3 세 번째 레벨 (configuration root : config)

파일/디렉터리설명
settings/프로젝트의 설정관련 모듈이 들어가는 디렉터리입니다.
개발환경에 따라 각기 다른 설정 모듈을 사용하는 것이 좋습니다.
urls.py프로젝트의 전반적인 URL을 관리하는 모듈입니다.
wsgi.py프로젝트의 WSGI 웹 서버 관련 모듈입니다.
asgi.py프로젝트의 ASGI 웹 서버 관련 모듈입니다.
__init__.pyconfig 폴더를 패키지화 하기 위한 빈 파일입니다.



3.4 virtualenv 설정

지금까지 함께 본 프로젝트의 레이아웃에 가상환경(virtualenv) 관련 디렉터리가 존재하지 않는다는 사실을 눈치채셨나요?
본 책의 저자는 가상환경들을 모아 놓은 독립된 디렉터리에 프로젝트의 가상환경을 개별적으로 관리하는 것을 추천합니다.
가상환경까지 Git과 같은 VSC를 통해 관리할 필요는 없기 때문입니다.
물론, .gitignore와 같은 VCS의 파일관리 시스템을 이용해서 가상환경을 제외하는 방식도 존재합니다.

# 저자의 추천 방식

envs/
	icecreamratings/
       	venv/
    marketing_data_project/
       	venv/
    ...        



3.5 프로젝트 템플릿 생성 도구

3.5.1 startproject

장고의 startproject 명령은 기본적인 장고 프로젝트 템플릿을 생성해주는 강력한 도구입니다.
django-admin startproject <project_name> 과 같은 명령어로 앞서 언급된 삼단 방식의 프로젝트 템플릿을 생성할 수 있습니다.

3.5.2 cookiecutter-django

설명하기 앞서 cookiecutter가 무엇인지 알아보겠습니다.
쿠키커터는 특정 언어나 프레임워크의 프로젝트를 진행할 때 여러 질문을 통해 각종 설정 변수를 입력하면 이에 기반해 프로젝트 탬플릿을 만들어주는 프로그램입니다. (https://github.com/cookiecutter/cookiecutter)
github에 cookiecutter를 검색하면 다양한 언어와 프레임워크에 기반한 쿠키커터들을 만나보실 수 있습니다.

이 중 cookiecutter-django는 장고 프로젝트 템플릿을 생성해주는 쿠키커터입니다. (https://github.com/cookiecutter/cookiecutter-django)
project_name, repo_name, version, timezone, cloud_provider 등 프로젝트의 설정부터 배포까지의 다양한 설정 변수를 입력하면 이에 맞는 프로젝트 템플릿을 생성합니다.

cookiecutter-django를 이용하려면, 다음과 같은 프로그램들이 준비되어야 합니다.

  • Python 3.9
  • PostgreSQL.
  • Redis (Celery 사용 프로젝트의 경우)
  • Cookiecutter

3.5.3 다른 대안들

앞서 언급된 도구들이 생성하는 프로젝트 템플릿의 레이아웃이 절대적으로 '정답'이라고는 할 수 없습니다.
중요한것은 프로젝트 레이아웃이 이와 다르더라도 프로젝트 구성 요소의 위치가 루트의 README.md에 잘 정리되어 있다면 큰 문제는 없습니다.




요약

이번 챕터에서 우리는 장고 프로젝트의 기본 레이아웃과 책의 저자가 추천하는 레이아웃을 다뤄보았습니다.
프로젝트 레이아웃은 개발자 또는 개발자 그룹마다 서로 다른 모습을 보입니다.
작은 팀에서 최적의 효과를 내던 레이아웃이 분산된 자원을 공유하는 큰 팀에서는 잘 적용되지 않을 수 있습니다.
핵심은 어떤 레이아웃을 선택하더라도 반드시 명확하게 문서로 남겨야 한다는 것입니다.



본 포스트는 "Two Scoops of Django" 를 기반으로 작성되었습니다.
공부하며 새롭게 배운 내용 위주로 작성하여 책의 부분적인 내용만을 포함합니다.

profile
우보천리

0개의 댓글