Django 뷰 소개

뷰는 Django 아키텍처 패턴의 핵심이며, 이를 제대로 이해하고 활용하는 것은 프레임워크를 다루는 개발자에게 필수적입니다. Django로 웹 앱을 처음 개발하거나 뷰에 대한 개념을 다시 정리하고 싶은 분들을 위해 이 가이드를 준비했습니다.
뷰를 더 잘 이해하면 Django 프로젝트를 더 빠르게 진행하는 데 도움이 됩니다. API 백엔드에서 작업하든 웹 UI 흐름에서 작업하든 뷰 사용 방법을 아는 것은 매우 중요하기 때문이죠.
계속 읽으면서 Django 뷰의 정의, 다양한 뷰 유형, 작업의 모범 사례, 사용 사례를 알아보세요.
Django 뷰란?
뷰는 Django의 MTV(모델-템플릿-뷰) 아키텍처 패턴의 핵심 구성 요소입니다. 뷰는 기본적으로 모델과 템플릿 사이의 중개자 역할을 하며 사용자 요청을 처리하고 응답을 반환합니다.
MVC(모델-뷰-컨트롤러) 패턴에서 뷰를 접해 보셨을 수도 있을 겁니다. 그러나 이는 Django 뷰와 다소 차이가 있으며 완전히 동일하게 대응되지는 않습니다. Django 뷰는 본질적으로 MVC의 컨트롤러에 해당하며, Django 템플릿은 MVC 뷰와 유사한 역할을 합니다. 따라서 MVC 패턴의 뷰를 알고 있더라도, Django 뷰의 차이를 이해하는 것이 중요합니다.
뷰는 Django에서 사용자 인터페이스의 일부이며, Django 기반 앱과 사이트에 대한 웹 요청을 처리하는 로직과 데이터를 다룹니다. 뷰는 템플릿을 렌더링하여 사용자가 웹 페이지에서 보는 화면을 생성합니다. 각 함수 기반 또는 클래스 기반 뷰는 사용자의 요청을 받고, 모델에서 데이터를 가져오고, 비즈니스 로직 또는 데이터 처리를 적용한 다음, 템플릿에 HTTP 응답을 준비하여 반환합니다.
이 응답은 웹 브라우저에서 표시할 수 있는 모든 형태가 될 수 있으며 대개는 HTML 웹 페이지입니다. 그러나 Django 뷰는 이미지, XML 문서, 리디렉션, 오류 페이지 등을 반환할 수도 있습니다.
템플릿에 데이터 렌더링 및 전달
Django는 뷰에서 템플릿을 간편하게 렌더링할 수 있도록 간편한 render()
를 제공합니다. render()
를 사용하면 템플릿을 직접 로드하고 응답을 생성하는 반복적인 코드를 줄일 수 있습니다.
PyCharm은 뷰에 입력을 시작할 때 django.shortcuts
에서 render()
함수를 자동으로 제안하는 스마트 코드 완성 기능을 제공합니다. 또한 템플릿 이름을 인식하고 템플릿 경로에 대한 자동 완성 기능을 제공하여 오타 및 오류를 방지할 수 있습니다.
사용자는 요청, 템플릿 이름, 템플릿에 전달할 데이터를 담은 컨텍스트 딕셔너리를 제공합니다. 필요한 데이터가 확보되면 뷰는 이를 템플릿으로 전달하여 렌더링하고 사용자에게 표시할 수 있습니다.
from django.shortcuts import render def my_view(request): # Some business logic to obtain data data_to_pass = {'variable1': 'value1', 'variable2': 'value2'} # Pass the data to the template return render(request, 'my_template.html', context=data_to_pass)
이 예에서 data_to_pass
는 템플릿으로 전달하는 데이터가 포함된 딕셔너리입니다. 그런 다음 render
함수를 사용하여 제공된 컨텍스트 데이터로 템플릿(my_template.html
)을 렌더링합니다.
이제 템플릿(my_template.html
)에서 데이터에 액세스하고 표시할 수 있습니다.
<!DOCTYPE html> <html> <head> <title>My Template</title> </head> <body> <h1>{{ variable1 }}</h1> <p>{{ variable2 }}</p> </body> </html>
템플릿에서는 이중 중괄호({{ }}
)를 사용하여 템플릿 변수를 표시합니다. 이 변수는 뷰에서 전달된 컨텍스트 데이터의 값으로 대체됩니다.
PyCharm은 Django 템플릿 태그, 변수 및 루프에 대한 코드 완성 및 구문 강조 표시 기능을 제공합니다. 또한 일반적인 실수를 방지할 수 있도록 에디터 내 린팅 기능도 제공합니다. 이를 통해 템플릿 요소를 수동으로 채우거나 일반적인 오류를 디버그하는 데 시간을 소비하는 대신 뷰를 빌드하고 로직을 처리하는 데 집중할 수 있습니다.

함수 기반 뷰
Django에는 함수 기반 뷰와 클래스 기반 뷰라는 두 가지 유형의 뷰가 있습니다.
함수 기반 뷰는 간단한 Python 함수를 사용하여 구축되며 일반적으로 생성, 조회, 업데이트 및 삭제(CRUD)의 네 가지 기본 카테고리로 나뉩니다. 이는 모든 개발 프레임워크의 핵심 기반입니다. 함수 기반 뷰는 HTTP 요청을 받아 HTTP 응답을 반환합니다.
from django.http import HttpResponse def my_view(request): # View logic goes here context = {"message": "Hello world"} return HttpResponse(render(request, "mytemplate.html", context))
이 스니펫은 뷰의 로직을 처리하고, 렌더링되는 템플릿에 데이터를 전달하기 위한 컨텍스트 딕셔너리를 준비하며, 최종 템플릿 HTML을 응답 객체로 반환합니다.
함수 기반 뷰는 간단하고 직관적입니다. 로직이 클래스의 메서드에 분산되어 있지 않고 단일 Python 함수에 포함되어 있으므로 처리가 간단한 사용 사례에 적합합니다.
PyCharm에서는 라이브 템플릿을 사용하여 def my_view(request)
구조를 자동으로 생성할 수 있습니다. 라이브 템플릿은 미리 정의된 코드 스니펫으로, 이를 확장하여 상용구 코드를 빠르게 작성할 수 있습니다. 이 기능을 사용하면 시간을 절약하고 뷰 정의의 일관된 구조를 유지할 수 있습니다.
라이브 템플릿은 ⌘J 키를 누르고 Listview
를 입력한 후 Tab 키를 누르면 호출할 수 있습니다.
또한 PyCharm에는 Django 프로젝트의 모든 뷰 목록을 앱별로 정리하여 볼 수 있는 Django 구조 도구 창이 포함되어 있습니다. 이를 통해 뷰를 빠르게 찾고, 뷰 간을 탐색하고, 각 뷰가 속한 파일을 식별할 수 있습니다.
클래스 기반 뷰
Django는 사용자가 동일한 코드를 반복해서 작성할 필요가 없도록 클래스 기반 뷰를 도입했습니다. 함수 기반 뷰를 대체하는 것은 아니지만, 특별히 복잡한 로직이 필요한 경우 특정 용도와 장점이 있습니다.
Django의 클래스 기반 뷰는 웹 애플리케이션 뷰에 일반적으로 필요한 다양한 패턴과 기능을 구현하는 재사용 가능한 상위 클래스를 제공합니다. 이러한 상위 클래스에서 뷰를 가져와 상용구 코드를 줄일 수 있습니다.
클래스 기반 뷰는 다음과 같은 제네릭 상위 클래스를 제공합니다.
ListView
DetailView
CreateView
- 기타 다양한 기능.
다음은 간단한 BookListView
를 보여주는 두 개의 유사한 코드 스니펫입니다. 첫 번째는 기본 클래스 기반 규칙을 사용하는 기본 구현을 보여주고, 두 번째는 추가 매개변수를 지정하여 뷰를 사용자 지정하는 방법을 보여줍니다.
기본 구현:
from django.views.generic import ListView from .models import Book class BookListView(ListView): model = Book # The template_name is omitted because Django defaults to 'book_list.html' # based on the convention of _list.html for ListView.
BookListView
가 렌더링되면 자동으로 Book 레코드를 쿼리하여 이를 Book 변수에 담아 book_list.html
렌더링 시 전달합니다. 즉, 기본 로직을 다시 작성할 필요 없이 객체를 나열하는 뷰를 빠르게 만들 수 있습니다.
사용자 정의 구현:
from django.views.generic import ListView from .models import Book class BookListView(ListView): model = Book # You can customize the view further by adding additional attributes or methods def get_queryset(self): # Example of customizing the queryset to filter books return Book.objects.filter(is_available=True)
두 번째 코드 조각에서는 뷰에 표시되는 레코드를 보다 정확하게 필터링할 수 있는 사용자 정의 get_queryset()
메서드를 추가했습니다. 이는 클래스 기반 뷰를 기본 기능 이상으로 확장하여 애플리케이션의 요구 사항을 충족하는 방법을 보여줍니다.
클래스 기반 뷰는 다음과 같이 요청 및 응답 수명 주기의 주요 부분과 연결되는 메서드도 정의합니다.
get()
–GET
요청을 처리하는 로직.post()
–POST
요청을 처리하는 로직.dispatch()
–get()
또는post()
중 어떤 메서드를 호출할지 결정.
이러한 뷰는 구조를 제공하면서도 필요한 부분을 사용자 정의할 수 있어, 복잡한 사용 사례에 적합합니다.
PyCharm은 ListView
, DetailView
및 TemplateView
와 같은 클래스 기반 뷰를 위한 라이브 템플릿을 제공하므로 상용구 메서드와 docstring까지 포함된 뷰 클래스를 몇 초 만에 생성할 수 있습니다.

사용자 지정 클래스 기반 뷰 만들기
Django의 제네릭 뷰를 하위 클래스화하고 요구 사항에 맞게 사용자 지정하여 고유한 뷰 클래스를 만들 수도 있습니다.
고유한 클래스를 만들면 좋을 몇 가지 사용 사례는 다음과 같습니다.
- 복잡한 계산과 같은 비즈니스 로직 추가.
- 여러 제네릭 상위 클래스를 조합하여 기능을 결합.
- 여러 요청에 걸쳐 세션 또는 상태 관리.
- 사용자 지정 쿼리로 데이터베이스 액세스 최적화.
- 여러 영역에서 공통 렌더링 로직 재사용.
사용자 지정 클래스 기반 뷰는 다음과 같습니다.
from django.views.generic import View from django.shortcuts import render from . import models class ProductSalesView(View): def get(self, request): # Custom data processing sales = get_sales_data() return render(request, "sales.html", {"sales": sales}) def post(self, request): # Custom form handling form = SalesSearchForm(request.POST) if form.is_valid(): results = models.Sale.objects.filter(date__gte=form.cleaned_data['start_date']) context = {"results": results} return render(request, "search_results.html", context) # Invalid form handling errors = form.errors return render(request, "sales.html", {"errors": errors})
여기에서 사용자 지정 get
및 post
핸들러를 활용하면 요청 간 기존 핸들러를 확장할 수 있습니다.
각 뷰 유형을 사용해야 하는 경우
함수 기반 뷰와 클래스 기반 뷰는 뷰 로직의 복잡성과 요구 사항에 따라 모두 유용할 수 있습니다.
클래스 기반 뷰의 주요 차이점은 다음과 같습니다.
- 하위 클래스화 및 상위 클래스 동작 상속을 통해 재사용성을 촉진합니다.
- 요청 간의 상태 관리에 이상적입니다.
- 더 체계적인 구조를 제공하고 엄격한 규칙을 적용합니다.
사용할 수 있는 작업은 다음과 같습니다.
- 복잡한 렌더링 로직이 있는 대시보드 페이지.
- 동적 데이터를 표시하는 공개용 페이지.
- 콘텐츠 관리를 위한 관리자 포털.
- 데이터베이스 모델과 관련된 목록 또는 상세 페이지.
반면에 함수 기반 뷰는 다음과 같은 특징을 갖습니다.
- 더 간단하며 적은 코드로 생성할 수 있습니다.
- Python 개발자가 더 쉽게 이해할 수 있습니다.
- 유연성이 높으며 제약이 적습니다.
사용 사례에는 다음이 포함됩니다.
- 아이디어 프로토타이핑.
- 간단한 CRUD 또는 데이터베이스 뷰.
- 랜딩 또는 마케팅 페이지.
- 웹 요청을 처리하기 위한 API 엔드포인트.
요컨대, 함수 기반 뷰는 유연하고 간단하며 추론하기가 더 쉽습니다. 그러나 더 복잡한 경우에서는 재사용할 수 없는 코드를 더 많이 만들어야 합니다.
Django의 클래스 기반 뷰는 코드의 구조를 강제하고 재사용성이 뛰어나지만, 이해와 구현이 어렵고 디버그 또한 더 까다로울 수 있습니다.
뷰 및 URL
앞서 설명했듯이, Django에서 뷰는 템플릿이 렌더링되는 방식을 결정하는 함수 또는 클래스입니다. 각 뷰는 특정 URL 패턴과 연결되어 있어, 들어오는 요청을 정확한 뷰로 안내합니다.
애플리케이션의 흐름을 효과적으로 관리하려면 뷰와 URL 간의 관계를 이해하는 것이 중요합니다.
모든 뷰는 Django 앱의 urls.py
파일에 정의된 URL 패턴과 대응합니다. 이 URL 매핑을 통해 사용자가 애플리케이션의 특정 주소로 이동할 때 Django는 어떤 뷰를 호출할지 정확히 알 수 있습니다.
간단한 URL 구성을 살펴보겠습니다.
from django.urls import path from .views import BookListView urlpatterns = [ path('books/', BookListView.as_view(), name='book-list'), ]
이 설정에서는 사용자가 /books/
를 방문하면 BookListView
가 시작되어 책 목록을 렌더링합니다. URL을 뷰에 명확하게 매핑하면 코드 베이스를 더 읽기 쉽고 체계적으로 만들 수 있습니다.
PyCharm으로 URL 관리 간소화
애플리케이션이 성장함에 따라 Django에서 엔드포인트를 관리하고 시각화하는 것이 어려워질 수 있습니다. PyCharm은 Endpoints(엔드포인트) 도구 창으로 이 문제를 해결하여 앱의 모든 URL 패턴, 연결된 뷰 및 HTTP 메서드에 대한 중앙 집중식 뷰를 제공합니다. 이 기능을 사용하면 프로젝트의 모든 엔드포인트 목록을 볼 수 있으므로 특정 URL에 연결된 뷰를 더 쉽게 추적할 수 있습니다.
여러 개의 urls.py
파일을 검색하는 대신 클릭 한 번으로 해당하는 뷰를 즉시 찾아서 탐색할 수 있습니다. 이는 URL 구성이 여러 파일에 걸쳐 있는 대규모 Django 프로젝트나 컨텍스트를 빠르게 설정하는 것이 중요한 팀에서 작업할 때 특히 유용합니다.
또한 Endpoints 도구 창에서는 모든 엔드포인트를 테이블 형식의 인터페이스에서 시각화할 수 있습니다. 각 행에는 URL 경로, HTTP 메서드(GET
, POST
등), 특정 엔드포인트에 연결된 뷰 함수 또는 클래스가 표시됩니다.
이 기능을 통해 생산성을 높일 수 있을 뿐만 아니라 코드 탐색을 개선하여 누락되거나 중복된 URL 패턴을 쉽게 발견할 수 있습니다. 이러한 수준의 가시성은 라우팅 문제를 디버그하거나 프로젝트에 새로운 개발자를 온보딩하는 데 매우 유용합니다.
Endpoints 도구 창과 이를 활용하는 방법에 대한 자세한 내용은 다음 동영상을 확인하세요.
Django 뷰 사용을 위한 모범 사례
다음은 체계적이고 유지 관리하기 쉬운 뷰를 만드는 데 도움이 되는 몇 가지 지침입니다.
뷰의 집중도 유지
뷰는 요청 처리, 데이터 가져오기, 템플릿으로의 데이터 전달, 흐름 제어 및 리디렉션에 집중하도록 설계해야 합니다. 복잡한 비즈니스 로직이나 복합적인 처리는 모델 메서드나 전용 서비스 클래스와 같은 다른 곳에서 수행해야 합니다.
그러나 지나치게 많은 로직으로 모델에 과부하가 걸리지 않도록 주의해야 합니다. 이는 Django에서 ‘fat model’ 안티 패턴을 초래할 수 있기 때문입니다. Django의 뷰 관련 문서는 뷰를 적절하게 구조화하는 방법에 대한 더 많은 인사이트를 제공합니다.
뷰와 템플릿을 간결하게 유지할 것
뷰와 템플릿을 모두 간결하게 유지하는 것이 가장 좋습니다. 뷰는 요청 처리와 데이터 검색을 처리하고 템플릿은 최소한의 로직으로 프레젠테이션에 집중해야 합니다.
복잡한 처리는 유지 관리 및 테스트를 개선하기 위해 템플릿 외부에서 Python으로 수행해야 합니다. 이에 대한 자세한 내용은 Django 템플릿 문서를 참조하세요.
데이터베이스 쿼리의 분리
데이터베이스 쿼리를 뷰에 직접 배치하는 대신 별도의 모델 관리자나 저장소로 추출하면 중복을 줄이는 데 도움이 될 수 있습니다. 데이터베이스 상호 작용을 효과적으로 관리하는 방법에 대한 지침은 Django 모델 문서를 참조하세요.
최대한 제네릭 클래스 기반 뷰를 사용할 것
DetailView
및 ListView
와 같은 Django의 제네릭 클래스 기반 뷰는 코드를 많이 작성할 필요 없는 재사용성을 제공합니다. 불필요하게 동일한 기능을 다시 구현하기보다 이미 제공되는 기능을 활용하여 시간을 더 효율적으로 사용하세요. 제네릭 뷰 문서는 이러한 기능을 이해하는 데 훌륭한 리소스입니다.
간단한 경우에는 함수 기반 뷰를 사용할 것
API 제공과 같은 기본 뷰의 경우 클래스보다 함수가 더 효과적일 수 있습니다. 복잡한 UI 흐름이 필요한 경우에만 클래스 기반 뷰를 활용하세요. 뷰 작성 문서 페이지에서 유용한 예시를 제공합니다.
경로와 URL을 깔끔하게 구조화할 것
기능별로 앱으로 그룹화하여 경로와 뷰 핸들러를 구성합니다. 이렇게 하면 소스를 더 쉽게 찾고 탐색할 수 있습니다. URL 구성을 구조화하는 모범 사례를 보려면 Django URL 디스패처 문서를 확인합니다.
다음 단계
이제 Django 뷰에 대한 기본 개념을 이해했으므로, 프레임워크를 더 깊이 탐색하고 다음 단계를 살펴보겠습니다.
- 초보자나 전문 지식을 다시 점검하고자 하는 분들에게 적합한 Django 학습 방법 블로그 게시물을 통해 Django에 대한 지식을 쌓으세요.
- PyCharm에서 첫 번째 Django 프로젝트를 생성하고 실행하는 방법을 배우고, 기본적인 To-Do 애플리케이션을 만드는 튜토리얼을 확인하세요. 더 많은 영감을 얻고 싶다면 Django 프로젝트 아이디어 목록도 탐색해 보세요.
- 최신 Django 개발 동향을 확인하고 더 많은 영감을 얻고 싶다면 Django 현황을 탐색해 보세요.
- 아직 어떤 Python 프레임워크를 사용할지 결정하지 못했다면 Django vs. Flask 및 Django vs. FastAPI 비교 가이드가 도움이 될 수 있습니다.
PyCharm의 Django 지원
PyCharm Professional은 Django 개발을 위한 동급 최강의 IDE입니다. Django 전용 코드 지원, 프로젝트 전반의 탐색 및 리팩터링, Django 템플릿에 대한 완벽한 지원으로 더 빠르게 코딩할 수 있습니다. 클릭 한 번으로 데이터베이스에 연결하고 TypeScript, JavaScript 및 프런트엔드 프레임워크에서 작업할 수 있습니다. PyCharm은 Flask 및 FastAPI도 기본적으로 지원합니다.
더 나은 애플리케이션을 만들고 코드를 간소화하세요. 지금 바로 PyCharm을 시작하여 손쉬운 Django 개발을 경험하세요.
게시물 원문 작성자