Django에서 뷰를 어떻게 작성해야 하는지에 대한, 다소 주관적인 가이드.
URL: https://spookylukey.github.io/django-views-the-right-way/
Django에서 뷰를 어떻게 작성해야 하는지에 대한, 다소 주관적인 가이드에 오신 것을 환영합니다!
이 글은 15년이 넘는 기간 동안 다양한 Django 및 Python 프로젝트에서 저지른 실수와 그로부터 배운 교훈의 결과물입니다.
또한 ‘클래스 기반 뷰’(이하 CBV)가 어떤 커뮤니티에서는 Django 뷰를 가르치고 배우는 기본 방식이 되어 버린 듯하고, 그 결과 어떤 사람들은 ‘함수 기반 뷰’(FBV)를 작성하는 것조차 두려워한다는 사실도 이 글을 쓰게 된 계기입니다.
어쩌면 최악인 점은, Django 공식 문서 일부가 선의에서 나온 조언으로 믹스인 고문을 계속하게 도와주지만, 당신을 완전히 죽여서 고통에서 해방시키지는 못한다는 것입니다. (약간 “git blame”을 해 보니, 그 페이지에 대한 커밋 로그에 제가 크레딧으로 올라가 있더군요. 이런 일이 생기면 정말 싫습니다…)
그러니 이런 모든 상황을 고려하여, 제가 오늘은 여러분을 구하러 왔습니다. 올바른 방법(The Right Way)을 보여 드리겠습니다 :-)
이 가이드의 핵심은 아주 짧습니다. FBV는 매우 쉽고 단순하기 때문입니다. 사실 Django 뷰 튜토리얼에 이미 필요한 내용이 모두 들어 있습니다. 그것만 읽고 CBV 관련 부분은 건너뛰면 충분합니다.
하지만 같은 내용을 다른 관점에서 보고 싶다면, 이 가이드가 도움이 될지도 모릅니다. 또한 CBV를 해결책으로 제안하는 경우가 많은, FBV에서의 흔한 작업과 패턴을 위한 추가 내용도 넣었습니다. 제 목표는 몇 가지가 있습니다:
뷰가 얼마나 단순하고 쉬울 수 있는지 보여 주고 싶습니다.
삶을 더 어렵게 만들고(그리고 나쁜 패턴을 가르치던) 추가 API 더미를 배우지 않도록, 여러분을 그로부터 해방시키고 싶습니다.
Django에만 특화된 API 잔뜩을 배우는 대신, 훨씬 더 전이 가능한(다른 곳에도 적용 가능한) 지식을 다루고 싶습니다:
그리고 덤으로, 뷰 함수의 모든 URL 파라미터를 타입 체크하는 방법 같은 것도 다룹니다.
각 페이지는 두 부분으로 구성되어 있으며, 서로 다른 두 독자층을 대상으로 합니다.
첫 번째는 실무(비즈니스) — 무엇을, 어떻게: 올바른 방법(The Right Way)에 대한 짧고 단정적인 가이드입니다. 경험이 적은 개발자(일반적으로든 Django 지식 면에서든)라면 이 부분만으로 충분합니다. 이 가이드는 레퍼런스 문서가 목적이 아니므로, 공식 Django 레퍼런스 문서로 가는 다양한 링크를 포함하겠습니다. 모든 예제 코드는 GitHub 저장소에서 전체를 확인할 수 있습니다.
두 번째는 토론 — 왜: 왜 다른 식으로 말하는 사람들은 다 틀렸는지에 대한 :-) 더 길고 심층적인 설명입니다. 조금 더 경험 있는 개발자, 특히 다른 사람을 가르치거나 코드베이스에서 사용할 패턴을 결정해야 하는 사람들을 대상으로 합니다. 이 토론 섹션들은 실제로는 일반적인 프로그래밍 원리와 그것이 Python과 Django에 어떻게 적용되는지에 관한 이야기입니다.
그럼 시작해 봅시다!
무언가 빠졌나요? 이 가이드는 **진행 중인 작업(work in progress)**이며, 제가 아무리 많이 추가해도 아마 영원히 그럴 겁니다! 포함했으면 하는 내용 요청이 있다면 GitHub에 이슈를 남겨 주세요.
네, 실제로는 올바른 방법(Right Way)이 하나 이상일 수도 있습니다. 하지만 이 가이드에서는 아닙니다!
저는 여러분이 ‘전통적인’ 웹 앱 또는 웹사이트를 만들고 있다고 가정합니다. 즉, 대부분의 페이지가 서버 사이드 렌더링된 HTML이고, 그 페이지에 약간의 JavaScript가 로드될 수는 있지만, 서버가 주로 데이터(예: JSON)를 클라이언트 사이드 JavaScript 웹 앱에 보내고 그 앱이 페이지를 조립하는 방식의 사이트는 아니라는 가정입니다.
제 코멘트는 주로 Django에 기본 포함된 CBV에 적용됩니다. 구체적으로 말하면, 제 비판 중 상당수는 Django Rest Framework, Django admin(일종의 CBV를 사용합니다), 그리고 다른 구현체들에는 적용되지 않습니다. 이에 대해서는 뒤에서 더 논의합니다.
저는 Django 코어 개발자이지만, 모든 Django 개발자를 대변하는 것은 아닙니다. 사실 CBV가 Django에 처음 추가되던 시절부터 있었고, 설계에도 약간 관여했지만, 당시에는 지금 제가 말하는 것들을 보지 못했습니다. 그러니 제 비판을 공격으로 받아들이기보다는, “학습 과정에서의 토론”으로 이해해 주세요!
Python 3.9 이상, 그리고 (작성 시점 기준) Django 3.2 이상의 ‘최근’ 버전을 가정합니다. 거의 모든 내용은 더 오래된(또는 더 새로운) 버전에도 적용될 것입니다.