앱의 크기가 커지면 커질수록 뷰 파일의 함수도 늘어나게 된다. 그러면서 원하는 기능을 찾기가 어려워지게 되고, 뷰 파일의 크기가 방대해지게 된다.
그래서 views.py 파일을 분리하고자 한다. 이에 두가지 방법이 존재한다.
첫번째 방법
폴더를 하나를 만들어 views.py안에 있는 함수를 기능별로 분류하는 방법이다.
내 경우 테이블이 두 개가 있다. 질문과 답변을 받아 데이터를 관리하는데, 이를 가지고 세 가지로 분류하고자 한다.
파일명 기능 함수
base_views.py | 기본관리 | index, detail |
question_views.py | 질문관리 | question_create, question_modify, question_delete |
answer_views.py | 답변관리 | answer_create, answer_modify, answer_delete |
그리고 나서 views.py파일에 있던 코드를 위에서 분류한 것처럼 기능에 따라 파일에 코드를 넣어준다. 그리고 나서 views.py파일을 삭제하고, 폴더 안에 **init**.py파일을 만들어준다.
from .base_views import *
from .question_views import *
from .answer_views import *
위와 같이 작성하고 보면
위와 같이 되어 있고, 홈페이지에서 제대로 실행되고 있다면 잘 동작하는 것이다.
두번째 방법
장고는 디버깅시 보통 urls.py 파일에서 URL에 매핑된 함수를 찾는다. 하지만 첫번째 방법을 사용하면 urls.py 파일에 매핑된 함수명은 알 수 있지만 어떤 뷰 파일의 함수인지는 알 수가 없다. 이는 views 디렉터리의 모든 뷰 파일을 찾아봐야 하는 불편함을 초래하게 한다.
혼자가 아닌 여러 명이 함께 하는 프로젝트라면 첫번째 방법은 절대로 추천하지 않는다.
두번째 방법은 views 디렉터리의 __init__.py 파일을 제거하고 앱의 urls.py에서 views.index 대신 base_views.index 와 같이 전체 경로를 써주는 방법이다.
첫번째 방법으로 한 것을 기반으로
1) views/init.py 파일 제거
del __init__.py
views 디렉터리의 __init__.py 파일을 제거한다.
2) 앱 안의 urls.py 수정하기
from django.urls import path
from .views import base_views, question_views, answer_views
app_name = 'pybo'
urlpatterns = [
# base_views.py
path('',
base_views.index, name='index'),
path('<int:question_id>/',
base_views.detail, name='detail'),
# question_views.py
path('question/create/',
question_views.question_create, name='question_create'),
path('question/modify/<int:question_id>/',
question_views.question_modify, name='question_modify'),
path('question/delete/<int:question_id>/',
question_views.question_delete, name='question_delete'),
# answer_views.py
path('answer/create/<int:question_id>/',
answer_views.answer_create, name='answer_create'),
path('answer/modify/<int:answer_id>/',
answer_views.answer_modify, name='answer_modify'),
path('answer/delete/<int:answer_id>/',
answer_views.answer_delete, name='answer_delete'),
]
URL 매핑시 views.index 를 base_views.index 와 같이 해당 모듈명이 표시되도록 바꾸었다. 모듈명이 있기 때문에 이제 누가 보더라도 어떤 뷰 파일의 함수인지 명확하게 인지할 수 있다.
3) config의 urls.py 수정하기
from django.contrib import admin
from django.urls import include, path
from pybo.views import base_views
urlpatterns = [
path('pybo/', include('pybo.urls')),
path('common/', include('common.urls')),
path('admin/', admin.site.urls),
path('', base_views.index, name='index'), # '/' 에 해당되는 path
]
config/urls.py의 index에 해당되는 URL 매핑도 views 대신 base_views를 사용하도록 다음처럼 수정한다.