{"title":"Class-based views","version":"2.1","locale":"ko","docname":"topics/class-based-views/index","url":"/ko/2.1/topics/class-based-views/","canonical":"https://djangodocs.dev/ko/2.1/topics/class-based-views/","summary":"뷰(view)는 요청(request)을 받아 응답(response)를 반환(return)하는 역할로 호출 가능합니다.","html":"<h1>Class-based views<a class=\"heading-anchor\" href=\"#class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>뷰(view)는 요청(request)을 받아 응답(response)를 반환(return)하는 역할로 호출 가능합니다. 뷰(view)는 단순한 함수(function) 이상일 수 있는데, Django에서는 뷰(view)로 사용할 몇 가지 클래스(class)로 정의된 예제들을 제공합니다. 이를 통해 상속(inheritance)과, 믹스인(mixins)을 이용하여, 뷰(view)를 구조화하고 코드 재사용 또한 할 수 있습니다. 간단한 일을 처리 하기 위한 몇 가지 제너릭 뷰(generic views)가 있지만 usecase 에 맞는 재사용 가능한 뷰 구조를 직접 디자인 할 수 도 있습니다. 자세한 내용은 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>클래스 기반의 뷰(class-based view) 레퍼런스 문서&lt;/ref/class-based-views/index&gt;`를 참조하세요</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ko/2.1/topics/class-based-views/intro/\">클래스 기반의 뷰 소개</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ko/2.1/topics/class-based-views/generic-display/\">내장된(Built-in) 클래스 기반의 제너릭 뷰</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ko/2.1/topics/class-based-views/generic-editing/\">Form handling with class-based views</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ko/2.1/topics/class-based-views/mixins/\">Using mixins with class-based views</a></li>\n</ul>\n</div>\n<section id=\"basic-examples\">\n<h2>기본 예제<a class=\"heading-anchor\" href=\"#basic-examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django는 다양한 어플리케이션에 알맞은 기본 뷰 클래스(base view classes)를 제공합니다. 모든 뷰들은 <a class=\"reference internal\" href=\"/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\">View</code></a> 클래스를 상속받는데, 이것은 뷰와 URLs 을 연결짓고 HTTP 메소드를 b디스패칭하거나, 다른 간단한 기능들을 처리합니다. :class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.views.generic.base.RedirectView`는 간단한 HTTP 리다이렉트를 하고, :class:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>~django.views.generic.base.TemplateView`는 기본 클래스(base class)를 확장하여 템플릿을 렌더(render) 합니다.</p>\n</section>\n<section id=\"simple-usage-in-your-urlconf\">\n<h2>URLconf에서의 간단한 사용<a class=\"heading-anchor\" href=\"#simple-usage-in-your-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>제너릭 뷰(generic view)를 사용하는 가장 간단한 방법은 URLconf 에 직접 작성하는 것입니다. 클래스 기반 뷰의 몇가지 속성(attributes)들을 바꾸고, <a class=\"reference internal\" href=\"/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\">as_view()</code></a> 메소드를 호출할때 바꾼 속성들을 전달 할 수 있습니다.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic</span> <span class=\"kn\">import</span> TemplateView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;about/&#39;</span><span class=\"p\">,</span> TemplateView<span class=\"o\">.</span>as_view<span class=\"p\">(</span>template_name<span class=\"o\">=</span><span class=\"s2\">&quot;about.html&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p> <a class=\"reference internal\" href=\"/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\">as_view()</code></a> 에 전달한 인자는 클래스의 속성(attributes)을 오버라이드(override)합니다. 이 예제에서는 <code class=\"docutils literal notranslate\">TemplateView``에 ``template_name</code> 을 설정합니다. 마찬가지로 <code class=\"docutils literal notranslate\">url</code> 속성(attirubte) 오버랑이딩 패턴을 :class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.views.generic.base.RedirectView`에도 사용 할 수 있습니다.</p>\n</section>\n<section id=\"subclassing-generic-views\">\n<h2>제너릭 뷰의 상속(subclassing)<a class=\"heading-anchor\" href=\"#subclassing-generic-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>둘째로,  보다 유용한 제너릭 뷰를 사용하는 방법은 기존에 있는 뷰를 상속받아, 서브클래스의 속성(<code class=\"docutils literal notranslate\">template_name``같은 것) 또는 메소드(``get_context_data``같은 것)를 오버라이드 하여, 새로운 값이나 메소드를 \\b제공하는 것입니다. 예를들어 하나의 템플릿 ``about.html</code>. 만 보여주는 경우를 생각해 보세요. Django는 이러한 일을 처리하는 -<a class=\"reference internal\" href=\"/ko/2.1/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a> - 라는 제너릭 뷰를 가지고 있습니다. 이 클래스를 하위클래스로(subclass)두고 템플릿 이름(template name)을 재정의 하기만 하면 됩니다.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># some_app/views.py</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic</span> <span class=\"kn\">import</span> TemplateView\n\n<span class=\"k\">class</span> <span class=\"nc\">AboutView</span><span class=\"p\">(</span>TemplateView<span class=\"p\">):</span>\n    template_name <span class=\"o\">=</span> <span class=\"s2\">&quot;about.html&quot;</span>\n</code></pre></div>\n<p>그 다음 새로 작성한 뷰를 URLconf에 추가하면 됩니다. <a class=\"reference internal\" href=\"/ko/2.1/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a> 는 함수가 아닌 클래스이므로 URL에  <a class=\"reference internal\" href=\"/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\">as_view()</code></a> 클래스 메소드를 가르키게 하여 함수 형태처럼 클래스 기반 뷰에 접근 가능 하도록 합니다.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># urls.py</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">some_app.views</span> <span class=\"kn\">import</span> AboutView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;about/&#39;</span><span class=\"p\">,</span> AboutView<span class=\"o\">.</span>as_view<span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>내장 제너릭 뷰의 사용법에 대한 자세한 내용은, 다음 토픽 :doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>generic class-based views&lt;/topics/class-based-views/generic-display&gt;`를 참조하세요.</p>\n<section id=\"supporting-other-http-methods\">\n<span id=\"id1\"></span><h3>다른 HTTP 메소드 지원<a class=\"heading-anchor\" href=\"#supporting-other-http-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>누군가 뷰를 API로 사용하여 HTTP를 통해 도서 라이브러리에 접근을 시도할 경우를 생각해 봅시다. API 클라이언트는 매 순간 접속하여 지난 방문 이후 새롭게 발행b된 서적에 대한 도서 데이터를 다운로드 할 것 입니다. 하지만 그 이후로 새로운 도서가 나타나지 않으면, 데이터베이스에서 서적을 가져와 응답을 전체를 렌더링하여 클라이언트에게 보내는 것은 CPU의 시간과 대역폭을 낭비하는 것입니다. b이 경우, API에게 최근의 업데이트 도서에 대해 묻는것이 보다 나은 방법입니다.</p>\n<p>URLconf 에서 URL을 book list 뷰와 매핑합니다:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">books.views</span> <span class=\"kn\">import</span> BookListView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;books/&#39;</span><span class=\"p\">,</span> BookListView<span class=\"o\">.</span>as_view<span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>그리고 뷰에서는:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic</span> <span class=\"kn\">import</span> ListView\n<span class=\"kn\">from</span> <span class=\"nn\">books.models</span> <span class=\"kn\">import</span> Book\n\n<span class=\"k\">class</span> <span class=\"nc\">BookListView</span><span class=\"p\">(</span>ListView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Book\n\n    <span class=\"k\">def</span> <span class=\"nf\">head</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        last_book <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>latest<span class=\"p\">(</span><span class=\"s1\">&#39;publication_date&#39;</span><span class=\"p\">)</span>\n        response <span class=\"o\">=</span> HttpResponse<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n        <span class=\"c1\"># RFC 1123 date format</span>\n        response<span class=\"p\">[</span><span class=\"s1\">&#39;Last-Modified&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> last_book<span class=\"o\">.</span>publication_date<span class=\"o\">.</span>strftime<span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"si\">%a</span><span class=\"s1\">, </span><span class=\"si\">%d</span><span class=\"s1\"> %b %Y %H:%M:%S GMT&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> response\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">GET</code> 요청(request)에서 뷰에 접근 할 경우 일반적인 오브젝트 리스트들이 응답(response)에 반환됩니다(<code class=\"docutils literal notranslate\">book_list.html</code> 템플릿을 통해). 그러나 클라이언트가  <code class=\"docutils literal notranslate\">HEAD</code> 요청을 발행하면 응답에 empty body 와 함께  <code class=\"docutils literal notranslate\">Last-Modified</code> 헤더에 가장 최근의 책이 언제 발행되었는지를 알려 줄 것입니다. 이 정보를 바탕으로 클라이언트는 전체 오브젝트 리스트를 다운로드 할 수도 있고 하지 않을 수도 있습니다.</p>\n</section>\n</section>","rootId":"class-based-views","toc":[{"title":"기본 예제","anchor":"basic-examples","children":[]},{"title":"URLconf에서의 간단한 사용","anchor":"simple-usage-in-your-urlconf","children":[]},{"title":"제너릭 뷰의 상속(subclassing)","anchor":"subclassing-generic-views","children":[{"title":"다른 HTTP 메소드 지원","anchor":"supporting-other-http-methods","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django 사용하기","url":"/ko/2.1/topics/"}],"prev":{"docname":"topics/templates","title":"템플릿","url":"/ko/2.1/topics/templates/"},"next":{"docname":"topics/class-based-views/intro","title":"클래스 기반의 뷰 소개","url":"/ko/2.1/topics/class-based-views/intro/"},"formats":{"html":"/ko/2.1/topics/class-based-views/","markdown":"/ko/2.1/topics/class-based-views.md","json":"/ko/2.1/topics/class-based-views.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/topics/class-based-views/index.txt","official":"https://docs.djangoproject.com/ko/2.1/topics/class-based-views/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}