0. views.py 분리

프로젝트 규모가 커지고, 이것저것 기능이 추가되다 보면, views.py의 내용이 매우 길어져서 보기 좋지 않다. 또한, 여러명이 참여하는 프로젝트이거나 해당 프로젝트를 다른 사람에게 인수인계 해야하는 경우, 문제가 더 심각해진다. 따라서 과장님께서는, views.py의 내용을 분리해주는 것이 좋다고 하셨다.

0-1) 동작 원리?

django가 뷰 함수를 인식할 때, 확장자는 인식하지 않고 views까지만 인식한다고 한다. 따라서 views라는 이름의 디렉토리에 뷰 함수를 넣어, views.py 대신 사용할 수 있다는 것이다. 다음은 그 방법들이다.



1. 첫 번째 방법

1-1) Views 디렉토리 생성

우선, 앱 디렉토리 밑에 views 디렉토리를 생성해준다.

1-2) views.py 분리

생성한 views 디렉토리 안에, 기존 views.py 내용들을 기능별로 나누어 저장한다.

1-3) __init__.py 생성

views 디렉토리 안에 __init__.py를 생성하고, 방금 작성한 파일들을 import 해준다.

from .forgotid import *
from .forgotpw import *
from .login import *
from .signup import *

1-4) 결과

최종적으로 다음과 같은 구조가 된다.

1-5) 문제점

하지만 이 방법은 단점이 있다. 해당 프로젝트를 서비스하던 중, 특정한 뷰 함수에 문제가 생겼을 시, 해당 함수가 어디에 위치해있는지 알기 어렵다는 것이다. 가령, url이 다음과 같이 정의되어 있다고 해보자.

    ...

    path('forgotpw/', views.forgotpw, name='forgotpw'),
    path('forgotpw/changepw/', views.changepw, name='changepw'),
    path('forgotpw/changepw/modal', views.changepwmodal, name='changepwmodal'),

    ...

만약, changepwmodal 함수에 문제가 생겨서 해당 함수를 고쳐야 할 일이 생긴다면, view 디렉토리 하위에 있는 모든 파일을 일일이 전부 확인해봐야 할 것이다. 규모가 작은 프로젝트라면 금방 찾겠지만, 그렇지 않다면 이를 찾는 것은 상당한 시간/자원낭비가 될 것이다. 따라서 과장님께서는 해당 방법은 별로 추천하지 않는다고 하셨다. 그렇다면 어떻게 하는 것이 좋을까?



2. 두 번째 방법

2-1) __init__.py 제거

__init__.py를 제거한다.

2-2) urls.py 수정

url을 다음과 같이 수정하여 해결. 어떤 파일의 뷰 함수를 고쳐야 할지 확실하게 알 수 있다.

from .views import forgotpw, ...
    ...

    path('forgotpw/', forgotpw.forgotpw, name='forgotpw'),
    path('forgotpw/changepw/', forgotpw.changepw, name='changepw'),
    path('forgotpw/changepw/modal', forgotpw.changepwmodal, name='changepwmodal'),

    ... 



3. 다른 파일(Models.py …)에도 적용

views 말고 models나 urls에도 적용 가능하다.

댓글남기기