[Django] Views.py 분리

Django

온정완

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에도 적용 가능하다.

댓글남기기