Django 기본 명령어 및 설명
Django 프로젝트 생성
Django 프로젝트를 생성하려면 다음 명령어를 사용합니다.
django-admin startproject core .
Django 앱 생성
프로젝트 내에서 새로운 앱 (App) 을 추가하려면 다음 명령어를 사용합니다.
python manage.py startapp name_of_app
프로젝트의 폴더 구조는 다음과 같은 형태로 구성됩니다.
/your_project/
├── backend/
│ ├── core/
│ ├── home/
│ ├── app1/
│ ├── app2/
- core: 프로젝트 전체의 공통 설정을 담당하는 앱의 이름으로, 프로젝트 생성 시 지정합니다.
- home: 여러 앱들을 관리하는 메인 앱으로, 필요한 경우 생성합니다.
- app1, app2: 새로운 기능이 필요할 때마다 추가되는 개별 앱입니다. 필요하지 않다면 해당 앱 디렉터리를 삭제할 수 있습니다.
Django 서버 실행
개발 서버를 실행하려면 다음 명령어를 사용합니다:
python manage.py runserver
Django 의 MVT 패턴 및 흐름
Django 는 MVT (Model-View-Template) 패턴을 사용하여 요청을 처리합니다. URL 요청이 들어오면 해당 URL 을 처리할 View 함수가 호출되고, View 는 Model 과 Template 을 조합하여 최종 응답을 반환합니다. 흐름은 다음과 같이 요약할 수 있습니다.
url -> view (model, template 조합)
전체 프로젝트의 흐름을 더 구체적으로 살펴보면 다음과 같습니다.
core/urls.py -> app/urls.py -> app/views.py (app/models.py, app/templates 조합)
앱 추가 및 구현 흐름
- core/settings.py 의 INSTALLED_APPS 에 앱을 등록합니다.
- core/urls.py 에서 앱의 기본 URL 패턴을 등록합니다.
- 각 앱의 app/urls.py 에서 세부 URL 패턴을 정의합니다.
- app/models.py 에서 모델을 정의합니다.
- 정의한 모델을 app/admin.py 에 등록하여 Django 관리자 페이지에서 쉽게 관리할 수 있게 합니다.
모든 URL 패턴은 urlpatterns 에 등록되어야 해당 View 함수에서 처리가 가능합니다.
URL 별칭 및 Template 구현 방식
app/urls.py 에서 URL 패턴을 정의할 때, 아래 예시와 같이 name 인자를 통해 URL 에 별칭을 지정할 수 있습니다.
app_name = 'menu_chat'
urlpatterns = [
path('', views.index, name='index'),
path('<int:chat_id>/', views.detail, name='detail'),
]
- views.detail 에 int 형 chat_id 인자 전달
- views.detail 함수에 chat_id 로 매개변수 설정되어 있음
- 예: def detail(request, chat_id):
- Template 파일에서 URL 을 직접 지정하지 않고 별칭을 사용하면 코드를 더 간결하게 작성할 수 있으며, urlpatterns 에 등록된 URL 패턴이 바뀌어도 자동으로 대응 가능
- URL 별칭 사용 전: /app/{{ chat.id }}
- URL 별칭 사용 후: {% url 'app:detail' chat.id %} 혹은 {% url 'app:detail' question_id=question.id page=2 %} 이런 식으로 작성 가능
Template 상에서 /app/{{ chat.id }} 대신 app/{{ chat.id }} 처럼 / 을 생략하고 작성하면 이 경로는 현재 페이지의 URL 을 기준으로 상대 경로로 해석됩니다. 예를 들어 현재 URL 이 /app/ 일 때 최종 경로는 /app/app/1/ 처럼 잘못된 경로가 될 수 있습니다.
- 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생하여 이를 방지하기 위해 app/urls.py 상단에 app_name 지정
- app_name 지정 전: {% url 'detail' question_id=question.id %}
- app_name 지정 후: {% url 'app:detail' question_id=question.id %}
app_name 을 지정했을 경우 Template 상에서 {% url 'app_name:detail' chat.id %} 와 같이 반드시 app_name: 을 포함시켜주어야 합니다.
templates 및 static 폴더 구조
Django 에서 templates 와 static 파일은 다음과 같은 폴더 구조로 관리하는 것이 좋습니다.
/your_project/
├── backend/
│ ├── core/
│ ├── home/
│ │ ├── static/
│ │ │ └── home/
│ │ │ ├── css/
│ │ │ ├── img/
│ │ │ └── js/
│ │ └── templates/
│ │ └── home/
│ ├── app1/
│ │ ├── static/
│ │ │ └── app1/
│ │ │ ├── css/
│ │ │ ├── img/
│ │ │ └── js/
│ │ └── templates/
│ │ └── app1/
│ └── app2/
│ ├── static/
│ │ └── app2/
│ │ ├── css/
│ │ ├── img/
│ │ └── js/
│ └── templates/
│ └── app2/
- 각 앱별로 templates 와 static 폴더를 생성하여 관리
- templates 및 static 폴더 바로 아래 파일을 생성할 경우 다른 앱 간에 파일 이름 중복이 발생할 수 있어 위의 폴더 구조와 같이 폴더 하위에 앱 이름으로 폴더를 하나 더 만들고 그 아래 파일을 생성하는 것이 안전
- static 폴더는 css, img, js 등으로 세분화하여 관리하면 더욱 유리
static 및 template 관리 설정
STATIC_ROOT: python manage.py collectstatic 명령을 실행할 때 모든 정적 파일이 모이는 최종 경로입니다. STATICFILES_DIRS 와 각 앱의 static 폴더에서 수집된 파일이 STATIC_ROOT 로 복사되며 배포 환경에서는 이 경로에서 정적 파일을 제공하게 됩니다.
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS: 전역적으로 사용할 정적 파일 경로를 지정합니다. template 파일에서 정적 파일을 요청할 경우 먼저 STATICFILES_DIRS 내부를 탐색하고, 파일이 존재하지 않으면 각 앱의 static 폴더를 탐색합니다.
STATICFILES_DIRS = [
BASE_DIR / 'static',
'/var/www/static',
]
TEMPLATES 설정: DIRS 에서 전역 template 경로를 설정할 수 있습니다. template 파일을 요청할 때 DIRS 에 명시된 경로부터 탐색하며, 존재하지 않으면 각 앱 내 templates 디렉터리를 탐색합니다.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
# ...
}
}
Template 파일 작성 예시
base.html 을 상속받아 index.html 을 작성하는 예시입니다.
base.html 을 상속받을 파일에서 작성해야 할 부분을 {% block %} 태그로 지정합니다.
{% block content %}{% endblock %}
상속받는 template 파일에서 다음과 같이 선언하여 base.html 을 상속받습니다.
{% extends 'app1/base.html' %}
이후 각 {% block %} 영역만 불러와서 해당 영역에 내용을 추가합니다.
{% block title %}
index page
{% endblock %}
static 파일을 사용하기 위해 다음과 같이 선언합니다. 보통 HTML 파일의 가장 첫 줄에 작성합니다.
{% load static %}
다음과 같이 static 파일을 적용합니다.
<link rel="stylesheet" href="{% static 'menu_text/css/sample.css' %}">
경로 지정 시 / 유무 정리
- loader.get_template('menu_chat/index.html')
- 'menu_chat/index.html': 정상 작동. TEMPLATES['DIRS'] 와 앱별 templates/ 폴더에서 파일을 찾음.
- '/menu_chat/index.html': 오류 발생. / 가 붙어 경로를 절대 경로로 해석. 정확한 절대 경로 입력시 정상 작동하지만 비추천.
- {% extends 'menu_chat/base.html' %}
- 'menu_chat/base.html': 정상 작동. TEMPLATES['DIRS'] 와 앱별 templates/ 폴더에서 파일을 찾음.
- '/menu_chat/base.html': 오류 발생. / 가 붙어 경로를 절대 경로로 해석. 정확한 절대 경로 입력시 정상 작동하지만 비추천.
- <link rel="stylesheet" href="{% static 'menu_chat/css/sample.css' %}">
- 'menu_chat/css/sample.css': 정상 작동. STATIC_URL 에 설정된 경로가 앞에 추가됨.
- '/menu_chat/css/sample.css': 중복된 경로 생성 가능. 예를들어 STATIC_URL = '/static/' 일 때 /static//menu_chat/css/sample.css 처럼 중복된 / 가 포함. 일부 브라우저에서는 문제없이 처리되지만, 배포 환경 (CDN 등) 에서는 오류 발생 가능.
- path('menu_chat/', include('menu_chat.urls'))
- 'menu_chat/': 정상 작동.
- '/menu_chat/': 오류 발생.
Django 마이그레이션 명령어 및 설명
Django 마이그레이션 파일 생성
모델의 변경 사항을 반영하기 위해 마이그레이션 파일을 생성합니다. 이 파일은 데이터베이스에 적용될 변경 사항을 정의합니다.
python manage.py makemigrations
Django 마이그레이션 적용
생성된 마이그레이션 파일을 기반으로 데이터베이스 스키마를 업데이트합니다.
python manage.py migrate
Django 마이그레이션 상태 확인
앱별로 생성된 마이그레이션 목록을 확인하고, 각 마이그레이션이 데이터베이스에 적용되었는지 여부를 확인할 수 있습니다.
python manage.py showmigrations
특정 앱의 마이그레이션 되돌리기
특정 앱의 모든 마이그레이션을 되돌려 초기 상태로 복원합니다.
python manage.py migrate app1 zero
특정 마이그레이션 버전으로 되돌리기
특정 앱을 지정된 마이그레이션 버전으로 되돌립니다. 예를 들어, python manage.py migrate app1 0002 는 app1 앱을 0002 버전으로 되돌립니다.
python manage.py migrate app1 0002
'Dev > Web Programming' 카테고리의 다른 글
DRF Views 정리 (7) | 2024.11.25 |
---|---|
Django REST Framework 입문 가이드 (5) | 2024.11.18 |
Django vs Django REST Framework (4) | 2024.11.12 |
React 와 Django 간의 데이터 통신: HTTP 와 REST API 로 구현하기 (5) | 2024.10.14 |