용도별로 기능을 나눠서 코드를 관리해주기 위해서 별도의 폴더 App을 만들겠습니다.
Django에서 앱 생성을 위한 명령어는 아래와 같다.
[터미널]
python manage.py startapp 앱이름 (아무거나 기능과 관련있게)
APP이란?
Django App은 Django에서 사용하는 파이썬 패키지이다. Django App은 자신의 모델, 뷰, 템플릿, URL 등을 독자적으로 가지고 있다. App은 프로젝트라는 하나의 웹 페이지 안에서 관리자 기능, 게시판 기능 등 특정한 기능을 수행한다.
todo 리스트를 만들기 위해 앱 이름을 todo로 해주겠습니다.
프로젝트 디렉토리에 앱이 설치되었다면, 해당 앱을 프로젝트의 메인(루트) 디렉토리 settings.py
파일에 추가해줘야한다.
[settings.py]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'todo',
]
- 장고 프레임워크에서 app을 생성한 후, 해당 앱을 settings.py 파일에 추가하는 이유
settings.py는 장고가 서버를 실행하면서 알아야할 정보가 적혀있다.
쉽게 말해 장고에게 '얘 기능 쓸 수 있게 관리해줘' 라고 알려주는 것이다. 웹 페이지에서의 앱 기능의 구동, 데이터베이스에 데이터를 저장하는 등의 앱 기능을 처리하려면 settings.py에 설치된 앱을 추가해야 한다.
- 모듈성
- 장고 프로젝트는 app 단위로 모듈화되어있다.
- 각 app은 특정 기능이나 컴포넌트를 담당한다.
- 컴포넌트(component)란?
여러 개의 프로그램 함수들을 모아 하나의 특정한 기능을 수행할 수 있도록 구성한 작은 기능적 단위- app을 생성하여 관련된 기능들을 분리하고, 프로젝트 전체에서 각 app별로 코드를 더 구조화하여 재사용할 수 있다.
ㅤ- 확장성 & 유지보수성
- app을 사용하여 프로젝트를 여러 개의 독립적인 부분으로 나누면, 프로젝트의 규모가 커질 때 더 효과적인 확장성을 제공
- 각 app은 독립적으로 개발, 수정, 테스트 및 유지보수할 수 있으므로 전체 프로젝트를 효율적으로 관리할 수 있다.
ㅤ- URL 라우팅
- 장고의 URL 라우팅 시스템이 app의 URL 패턴을 인식할 수 있게 되어 앱 간의 URL 경로가 충돌하지 않고, 각 앱의 View와 연결될 수 있다.
settings.py
에 생성한 앱을 추가해주면, 앱 템플릿도 자동으로 인식된다.
[settings.py/TEMPLATES]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR/'basiclecture'/'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
'APP_DIRS': True
가 앱 디렉토리에 템플릿을 자동으로 인식해준다는 의미이다.
이제 장고가 todo 앱을 인식할 수 있게 되었으니 메인(route) 디렉토리에서 연습했던 todo 요소들을 가져와보겠다.
ToDo List 기반다지기에서 썼던 urls.py의 path함수
와, views.py의 View함수
들을 todo앱에 가져오겠다. 템플릿은 todo 앱 내에 TEMPLATES 폴더
를 만들어서 넣어주겠다. (ToDo List 기반 다지기 참고)
[todo앱 urls.py]
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('todo/', views.todo),
path('getdata/', views.getdata),
]
[todo앱 views.py]
from django.http import HttpResponse
from django.shortcuts import render
def todo(request):
return render(request, 'todo_add.html')
def getdata(request):
print(request.POST.get('added_todo1'))
print(request.POST.get('added_todo2'))
print(request.POST.get('added_todo3'))
return HttpResponse('POST 완료!')
클라이언트가 요청한 URL은 먼저 메인(루트) 디렉토리
에서 URL 패턴을 확인한다. 하지만 지금 todo의 url 경로는 앱 내의 urls.py파일 안
에 정의되어있다.
그래서 메인(루트) 디렉토리의 urls.py
에서 클라이언트가 요청한 URL 패턴
과 앱의 URL패턴
을 합성해주기 위해 path(경로)를 추가해준다. (urls.py 참고)
[main(route) Directory/urls.py]
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('ping/', views.pingpong),
path('index/', views.index),
path('',include('todo.urls')),
]
Django에서
다른 앱의 urls.py 파일을 임포트
할 때, path('',include('todo.urls'))에 빈 '경로'를 사용하는 이유는 URL 합성을 위한 것이다.Django 어플리케이션은 여러 개의 앱으로 구성될 수 있고, 각 앱은 자체적으로 URL 패턴을 가지고 있다.
path('',include('todo.urls'))은 'todo'앱의 URL패턴을 현재 URL패턴에 합성한다는 의미이다.
만약 path('todo/',include('todo.urls'))
와 같이 정의되었다면 'todo'앱의 URL 패턴인 'todo/'와 'getdata/' URL 패턴
은 'todo/' URL의 하위 경로
에서만 처리된다.
클라이언트가 URL 요청을 할 때,
GET http://127.0.0.1:8000/todo/todo/
GET http://127.0.0.1:8000/todo/getdata/
으로 요청해야하는 것이다.
그래서 다른 앱의 urls.py
를 임포트해올 때는 `메인(루트) 디렉토리 urls.py의 path함수의 url 패턴(경로)
를 빈 상태로 두어야 한다.
여기까지 앱을 생성해서 urls.py
와 views.py
, templates폴더와 template
그리고 settings.py
까지 세팅이 끝났으니 데이터베이스에 저장할 데이터인 models.py
에 대해서 알아보겠다.