Django(장고) 용도별 App 생성

장현웅·2023년 9월 4일
0

용도별로 기능을 나눠서 코드를 관리해주기 위해서 별도의 폴더 App을 만들겠습니다.

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 앱 세팅하기


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.pyviews.py, templates폴더와 template 그리고 settings.py까지 세팅이 끝났으니 데이터베이스에 저장할 데이터인 models.py에 대해서 알아보겠다.

0개의 댓글