개발 이슈,해결법

[Django] Django 프로젝트 생성 방법 여러가지 (cookie-cutter 포함)

난쏘공돌이 2022. 5. 24. 16:25

장고 프로젝트를 진행 중에 Two scoops of Django 라는 책을 접하게 되었는데

그 책에서 장고프로젝트를 시작하는 방법으로 cookie-cutter을 소개하는 것을 보아 기존의 프로젝트 생성 방법과는 어떤 점이 다른지를 한번 알아보고자 한다.

[기존의 방법]

기존에 우리는 가상 환경을 만들고, pip install Django 등을 설치해서 $django-admin startproject 같은 방법을 사용해 프로젝트를 생성하곤 한다.

첫 번째 방법 $django-admin startproject [projectname]

해당 방법을 통한 프로젝트 생성은 

다음과 같이 생성이 되게 된다.
settings.py 와 같은 파일이 들어가 있는 폴더가 projectname과 같은 폴더로 생성되어 만들어지는 것을 볼 수 있다.

*app의 생성은 manage.py 와 같은 디렉터리 레벨에 생성된다.

 

두 번째 방법 $django-admin startproject [projectname] .

. 에 집중하면, 이 명령은 현재 폴더를 기준으로 생성하겠다는 의미를 가진다.
settings.py의 경로 등은 첫 번째와 달라진 바가 없지만, 내가 명령을 실행한 바로 그 폴더가 프로젝트의 시작 폴더가 된다는 점이 첫 번째 방법과 다르다.

 

세 번째 방법 $django-admin startproject config .

이 방법은 점프 투 장고에서도 소개하는 방법인데, 현재 폴더를 프로젝트 폴더로 하되 settings.py 와 같은 파일들은 config/ 폴더 이하에서 관리하겠다는 소리이다.

django-admin을 통한 방법은 요 세 가지 정도로 마무리하도록 하고..


[cookie-cutter 사용]

4번째 방법 cookiecutter

다음 방법은 cookie-cutter을 통한 방법을 소개하려고 한다.

https://github.com/cookiecutter/cookiecutter-django#cookiecutter-django

해당 사이트를 들어가야만 무언가를 할 수 있는 것은 아니지만, 사용하기 전에 한 번쯤 들어가 readme.md를 읽어보는 것을 추천한다.

사용방법은 

$ pip install "cookiecutter>=1.7.0"

$ cookiecutter https://github.com/cookiecutter/cookiecutter-django

를 치게 되면 터미널 환경에 질문이 하나씩 나오게 된다.

해당 부분에서 project_slug라는 것을 물어보는데, https://github.com/audreyfeldroy/cookiecutter-pypackage/issues/487

이 분의 답변에 의하면 정규화된 프로젝트 이름 정도로 볼 수 있겠다. 해당 값은 프로젝트 폴더 이름으로 생성된다.

이 외에도

project_name [My Awesome Project]: projectname
project_slug [projectname]: projectslug
description [Behold My Awesome Project!]: dongd's project
author_name [Daniel Roy Greenfeld]: dongd
domain_name [example.com]: test.com
email [dongd@example.com]:
version [0.1.0]:
Select open_source_license:
1 - MIT
2 - BSD
3 - GPLv3
4 - Apache Software License 2.0
5 - Not open source
Choose from 1, 2, 3, 4, 5 [1]: 5
timezone [UTC]: UTC+9
windows [n]: n
use_pycharm [n]: y
use_docker [n]: n
Select postgresql_version:
1 - 14
2 - 13
3 - 12
4 - 11
5 - 10
Choose from 1, 2, 3, 4, 5 [1]: 1
Select cloud_provider:
1 - AWS
2 - GCP
3 - None
Choose from 1, 2, 3 [1]: 1
Select mail_service:
1 - Mailgun
2 - Amazon SES
3 - Mailjet
4 - Mandrill
5 - Postmark
6 - Sendgrid
7 - SendinBlue
8 - SparkPost
9 - Other SMTP
Choose from 1, 2, 3, 4, 5, 6, 7, 8, 9 [1]: 1
use_async [n]: n
use_drf [n]: n
Select frontend_pipeline:

1 - None
2 - Django Compressor
3 - Gulp
Choose from 1, 2, 3 [1]: 1

use_celery [n]: n
use_mailhog [n]: n
use_sentry [n]: n
use_whitenoise [n]: n
use_heroku [n]: n
Select ci_tool:
1 - None
2 - Travis
3 - Gitlab
4 - Github
Choose from 1, 2, 3, 4 [1]: 4
keep_local_envs_in_vcs [y]: y
debug [n]: y

이런 많은 것들을 물어보는데, 그만큼 폴더 생성 구조도 디테일하게 생성된다.

아래 접은 글 누르시면 전체 구조를 볼 수 있어요

더보기

폴더구조 전체보기

odroid@odroid:~/Django_space/project4$ tree -L 5
.
└── projectslug
    ├── CONTRIBUTORS.txt
    ├── LICENSE
    ├── README.md
    ├── config
    │   ├── __init__.py
    │   ├── settings
    │   │   ├── __init__.py
    │   │   ├── base.py
    │   │   ├── local.py
    │   │   ├── production.py
    │   │   └── test.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── docs
    │   ├── Makefile
    │   ├── __init__.py
    │   ├── conf.py
    │   ├── howto.rst
    │   ├── index.rst
    │   ├── make.bat
    │   ├── pycharm
    │   │   ├── configuration.rst
    │   │   └── images
    │   │       ├── 1.png
    │   │       ├── 2.png
    │   │       ├── 3.png
    │   │       ├── 4.png
    │   │       ├── 7.png
    │   │       ├── 8.png
    │   │       ├── f1.png
    │   │       ├── f2.png
    │   │       ├── f3.png
    │   │       ├── f4.png
    │   │       ├── issue1.png
    │   │       └── issue2.png
    │   └── users.rst
    ├── locale
    │   └── README.rst
    ├── manage.py
    ├── projectslug
    │   ├── __init__.py
    │   ├── conftest.py
    │   ├── contrib
    │   │   ├── __init__.py
    │   │   └── sites
    │   │       ├── __init__.py
    │   │       └── migrations
    │   ├── static
    │   │   ├── css
    │   │   │   └── project.css
    │   │   ├── fonts
    │   │   ├── images
    │   │   │   └── favicons
    │   │   └── js
    │   │       └── project.js
    │   ├── templates
    │   │   ├── 403.html
    │   │   ├── 404.html
    │   │   ├── 500.html
    │   │   ├── account
    │   │   │   ├── account_inactive.html
    │   │   │   ├── base.html
    │   │   │   ├── email.html
    │   │   │   ├── email_confirm.html
    │   │   │   ├── login.html
    │   │   │   ├── logout.html
    │   │   │   ├── password_change.html
    │   │   │   ├── password_reset.html
    │   │   │   ├── password_reset_done.html
    │   │   │   ├── password_reset_from_key.html
    │   │   │   ├── password_reset_from_key_done.html
    │   │   │   ├── password_set.html
    │   │   │   ├── signup.html
    │   │   │   ├── signup_closed.html
    │   │   │   ├── verification_sent.html
    │   │   │   └── verified_email_required.html
    │   │   ├── base.html
    │   │   ├── pages
    │   │   │   ├── about.html
    │   │   │   └── home.html
    │   │   └── users
    │   │       ├── user_detail.html
    │   │       └── user_form.html
    │   ├── users
    │   │   ├── __init__.py
    │   │   ├── adapters.py
    │   │   ├── admin.py
    │   │   ├── apps.py
    │   │   ├── context_processors.py
    │   │   ├── forms.py
    │   │   ├── migrations
    │   │   │   ├── 0001_initial.py
    │   │   │   └── __init__.py
    │   │   ├── models.py
    │   │   ├── tests
    │   │   │   ├── __init__.py
    │   │   │   ├── factories.py
    │   │   │   ├── test_admin.py
    │   │   │   ├── test_forms.py
    │   │   │   ├── test_models.py
    │   │   │   ├── test_urls.py
    │   │   │   └── test_views.py
    │   │   ├── urls.py
    │   │   └── views.py
    │   └── utils
    │       ├── __init__.py
    │       └── storages.py
    ├── pytest.ini
    ├── requirements
    │   ├── base.txt
    │   ├── local.txt
    │   └── production.txt
    ├── setup.cfg
    └── utility
        ├── install_os_dependencies.sh
        ├── install_python_dependencies.sh
        ├── requirements-bionic.apt
        ├── requirements-bullseye.apt
        ├── requirements-buster.apt
        ├── requirements-focal.apt
        ├── requirements-jessie.apt
        ├── requirements-stretch.apt
        ├── requirements-trusty.apt
        └── requirements-xenial.apt

27 directories, 98 files

 

대단하지 않나요,, 좀 물어보는게 많아서 귀찮기는 해도 확실하게 만들어 주기는 합니다.

특히 배포용과 개발용 세팅등을 나누는 작업을 나중에 하기보다 cookiecutter은 자신이 알아서 나눠주니 때문에 나중에 오류가 생길일도 훨씬 적겠죠

이 때문에 확장하기에 나중에 들일 노력이 상당히 줄기는 할 것 같습니다.

하지만 그만큼 필요한 것과 필요없는 것을 알고 있어야 문제없이 사용할 수 있을 것 같네요.