Python 🐍/Django

[Django] 장고 개발의 다양한 프로젝트 폴더 구조

SeongJo 2023. 3. 12. 13:00
반응형

안녕하세요. 성조입니다.

이 포스팅은 Django 기반의 프로젝트 구조를 설명하고 있습니다. 또한 장고 폴더 구조에 대해서 작성하고, 정리하는 포스팅입니다.

현업에서는 backend를 Django로 구성하면 frontend는 많은 프로젝트에서 React를 활용하기 때문에 더욱 다양한 프로젝트 구조가 있을 수 있습니다.

 

언제든지 피드백은 환영입니다.


1-1. 모든 앱이 하나의 프로젝트에 있는 기본적인 폴더 구조

project_name/
├── manage.py
└── project_name/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── asgi.py
    └── wsgi.py
├── app_name/
│   ├── templates/
│   │   ├── base.html
│   │   ├── home.html
│   │   └── ...
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py
│   └── migrations/
│       └── __init__.py
└── static/
    ├── css/
    ├── js/
    ├── images/
    └── ...

- project_name/ 폴더: Django 프로젝트의 루트 폴더이다.

- manage.py: Django 관리 도구이다. 프로젝트를 관리하기 위한 다양한 명령어를 실행할 수 있다.

- project_name/ 폴더: Django 프로젝트를 구성하는 핵심 파일이 있는 폴더이다.

- __init__.py: Python 패키지로 인식하기 위한 파일이다.

- settings.py: Django 프로젝트의 설정 파일이다. 데이터베이스, 템플릿, 정적 파일 등의 설정을 담고 있다.

- urls.py: Django 프로젝트의 URL 패턴을 정의하는 파일이다.

- asgi.py: ASGI(Asynchronous Server Gateway Interface) 서버 진입점이다.

- wsgi.py: WSGI(Web Server Gateway Interface) 서버 진입점이다.

- app_name/ 폴더: Django 애플리케이션의 폴더이다.

- __init__.py: Python 패키지로 인식하기 위한 파일이다.

- admin.py: Django Admin 사이트에서 사용할 모델 등록 파일이다.

- apps.py: 앱 설정 파일이다. 앱에 대한 설정을 수정할 때 사용한다.

- models.py: 애플리케이션의 데이터 모델을 정의하는 파일이다.

- tests.py: 테스트 케이스를 작성하는 파일이다.

- views.py: 애플리케이션의 뷰를 정의하는 파일이다.

- migrations/ 폴더: 데이터베이스 스키마 변경 이력을 관리하는 폴더이다.

- templates 폴더 : html 들을 가지고 있는 폴더이다.

 

 

 

1-2. Django와 React를 하나의 프로젝트에서 운용하는 경우의 폴더 구조이다.

project_name/
├── manage.py
├── project_name/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py
└── app_name/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py
│   └── migrations/
│       └── __init__.py
└── react_app/
    ├── public/
    │   ├── index.html
    │   ├── favicon.ico
    │   └── ...
    └── src/
        ├── App.js
        ├── index.js
        ├── index.css
        └── ...

 

설정 간단 설명

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'react_app' / 'build'],
        'APP_DIRS': True,
        ...
    },
    ...
]

STATICFILES_DIRS = [
    BASE_DIR / 'react_app' / 'build' / 'static',
]

DIRS 설정에서 React 디렉토리 내부의 build 디렉토리를 추가해서 Django API를 React 앱에서 호출해서 활용할 수 있도록 지정해 주면 Frontend - React / Backend - Django로 프로젝트를 운용할 수 있게 된다.

 

 

 

 

2-1. 여러 개의 앱 서비스에서 Django만 활용하는 경우.

project_name/
├── manage.py
└── project_name/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── asgi.py
    └── wsgi.py
├── apps/
│   ├── app_name1/
│   │   │  ├── templates/
│   │   │  ├── base.html
│   │   │  ├── home.html
│   │   │  └── ...
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── views.py
│   │   └── migrations/
│   │       └── __init__.py
│   ├── app_name2/
│   │   │  ├── templates/
│   │   │  ├── base.html
│   │   │  ├── home.html
│   │   │  └── ...
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── views.py
│   │   └── migrations/
│   │       └── __init__.py
│   └── ...
└── static/
    ├── css/
    ├── js/
    ├── images/
    └── ...

상위에서 static 하나로 운용하고, 각각 앱 서비스에 맞는 html을 위치시켜서 표현하는 방법이다.

 

 

2-2. 여러 개의 앱 서비스에서 Django와 React를 활용하는 경우

project_name/
├── manage.py
└── project_name/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── asgi.py
    └── wsgi.py
├── apps/
│   ├── app_name1
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── views.py
│   │   └── migrations/
│   │       └── __init__.py
│   ├── app_name2/
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── views.py
│   │   └── migrations/
│   │       └── __init__.py
│   └── ...
├── static/
│   ├── css/
│   ├── js/
│   ├── images/
│   └── ...
├── react_project/
│   ├── node_modules/
│   ├── public/
│   ├── src/
│   ├── package.json
│   ├── package-lock.json
│   └── ...
└── ...

프론트에서도 필요한 static 파일들을 관리하고, 백엔드에서도 필요한 static을 각각 저장하는 구조이다.

일반적으로는 활용되지 않는다.

 

2-3. 여러 개의 앱 서비스에서 Django를 가져오는 경우.

project_name/
├── manage.py
└── project_name/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── asgi.py
    └── wsgi.py
└── apps/
    ├── app_name1/
    │   ├── manage.py
    │   └── app_name1/
    │   │   │  ├── templates/
    │   │   │  ├── base.html
    │   │   │  ├── home.html
    │   │   │  └── ...
    │       ├── __init__.py
    │       ├── admin.py
    │       ├── apps.py
    │       ├── models.py
    │       ├── tests.py
    │       ├── views.py
    │       ├── migrations/
    │       └── static/
    │           ├── css/
    │           ├── js/
    │           ├── images/
    │           └── ...
    ├── app_name2/
    │   ├── manage.py
    │   └── app_name2/
    │       │  ├── templates/
    │       │  ├── base.html
    │       │  ├── home.html
    │       │  └── ...
    │       ├── __init__.py
    │       ├── admin.py
    │       ├── apps.py
    │       ├── models.py
    │       ├── tests.py
    │       ├── views.py
    │       ├── migrations/
    │       └── static/
    │           ├── css/
    │           ├── js/
    │           ├── images/
    │           └── ...
    └── ...

각각의 앱에 맞춰서 정적 파일들을 저장하는 구조이다.

 

 

2-4. 여러 개의 Django API와 React를 활용하는 경우

project_name/
├── manage.py
├── project_name/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py
├── apps/
│   ├── app_name1/
│   │   ├── manage.py
│   │   └── app_name1/
│   │       ├── __init__.py
│   │       ├── admin.py
│   │       ├── apps.py
│   │       ├── models.py
│   │       ├── tests.py
│   │       ├── views.py
│   │       ├── migrations/
│   │       └── static/
│   ├── app_name2/
│   │   ├── manage.py
│   │   └── app_name2/
│   │       ├── __init__.py
│   │       ├── admin.py
│   │       ├── apps.py
│   │       ├── models.py
│   │       ├── tests.py
│   │       ├── views.py
│   │       ├── migrations/
│   │       └── static/
│   └── ...
└── frontend/
    ├── public/
    │   ├── index.html
    │   ├── favicon.ico
    │   └── ...
    └── src/
        ├── index.js
        ├── App.js
        ├── components/
        │   └── ...
        └── ...

살짝은 이상적인 장고(Django) 프로젝트 구조라고 개인적으로는 생각한다.

React를 활용해서 다양한 Django API 앱을 운용하는 폴더 구조이다.

 

 

 

 

3-1. 다중의 Django 프로젝트인 경우

project_root/
├── project1/
│   ├── manage.py
│   ├── project1/
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   ├── asgi.py
│   │   └── wsgi.py
│   └── app_name1/
│       ├── __init__.py
│       ├── admin.py
│       ├── apps.py
│       ├── models.py
│       ├── tests.py
│       ├── views.py
│       └── migrations/
│           └── __init__.py
└── project2/
    ├── manage.py
    ├── project2/
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   ├── asgi.py
    │   └── wsgi.py
    └── app_name2/
        ├── __init__.py
        ├── admin.py
        ├── apps.py
        ├── models.py
        ├── tests.py
        ├── views.py
        └── migrations/
            └── __init__.py

- project_root: 프로젝트 루트 디렉토리

- project1, project2: Django 프로젝트 디렉토리

- manage.py: Django 프로젝트를 관리하기 위한 스크립트 파일

- project1/project1: Django 프로젝트의 패키지 디렉토리

- project1/project1/settings.py: Django 프로젝트의 설정 파일

- project1/project1/urls.py: Django 프로젝트의 URL 설정 파일

- project1/project1/asgi.py: ASGI 프로토콜을 사용하는 서버를 위한 ASGI 파일

- project1/project1/wsgi.py: WSGI 프로토콜을 사용하는 서버를 위한 WSGI 파일

- project1/app_name1: Django 애플리케이션 디렉토리

- project1/app_name1/models.py: Django 애플리케이션의 데이터 모델을 정의하는 파일

- project1/app_name1/views.py: Django 애플리케이션의 뷰를 정의하는 파일

- project1/app_name1/urls.py: Django 애플리케이션의 URL을 정의하는 파일

- project1/app_name1/admin.py: Django 애플리케이션의 관리자 페이지를 위한 파일

- project1/app_name1/tests.py: Django 애플리케이션의 테스트를 정의하는 파일

- project1/app_name1/migrations: Django 애플리케이션의 데이터베이스 마이그레이션 파일이 저장되는 디렉토리

- project2: 다른 Django 프로젝트도 동일한 구조를 가짐

 

 

3-2. 다중의 Django 프로젝트와 React를 운용하는 경우

project_root/
├── project1/
│   ├── manage.py
│   ├── project1/
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   ├── asgi.py
│   │   └── wsgi.py
│   └── app_name1/
│       ├── __init__.py
│       ├── admin.py
│       ├── apps.py
│       ├── models.py
│       ├── tests.py
│       ├── views.py
│       └── migrations/
│           └── __init__.py
├── project2/
│   ├── manage.py
│   ├── project2/
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   ├── asgi.py
│   │   └── wsgi.py
│   └── app_name2/
│       ├── __init__.py
│       ├── admin.py
│       ├── apps.py
│       ├── models.py
│       ├── tests.py
│       ├── views.py
│       └── migrations/
│           └── __init__.py
└── react_project/
    ├── node_modules/
    ├── public/
    │   ├── index.html
    │   ├── favicon.ico
    │   └── ...
    ├── src/
    │   ├── App.js
    │   ├── index.js
    │   └── ...
    ├── package.json
    ├── package-lock.json
    ├── .gitignore
    └── README.md

위 폴더에서 React를 추가해서 활용한 구조이며, react는 하나지만 Django로 구성된 프로젝트가 n개 이상이므로 여러 개의 프로젝트를 한번에 배포하거나 활용할 수 있다. 한번에 다양한 프로젝트를 컨트롤할 수 있으나, 너무 복잡해질 수 있다는 단점이 존재한다.

 


올바르지 못한 내용이나, 궁금한 내용이 있다면 언제든지 댓글로 지식을 얘기해 주시면 감사드리겠습니다.

더 좋은 포스팅 작성할 수 있도록 잘 하겠습니다.

다음 포스팅 때 뵙겠습니다.

반응형