---
title: "Class-based views"
version: 2.1
locale: ko
source: https://docs.djangoproject.com/ko/2.1/topics/class-based-views/
canonical: https://djangodocs.dev/ko/2.1/topics/class-based-views/
---
# Class-based views

뷰(view)는 요청(request)을 받아 응답(response)를 반환(return)하는 역할로 호출 가능합니다. 뷰(view)는 단순한 함수(function) 이상일 수 있는데, Django에서는 뷰(view)로 사용할 몇 가지 클래스(class)로 정의된 예제들을 제공합니다. 이를 통해 상속(inheritance)과, 믹스인(mixins)을 이용하여, 뷰(view)를 구조화하고 코드 재사용 또한 할 수 있습니다. 간단한 일을 처리 하기 위한 몇 가지 제너릭 뷰(generic views)가 있지만 usecase 에 맞는 재사용 가능한 뷰 구조를 직접 디자인 할 수 도 있습니다. 자세한 내용은 클래스 기반의 뷰(class-based view) 레퍼런스 문서\</ref/class-based-views/index\>\`를 참조하세요

- [클래스 기반의 뷰 소개](/ko/2.1/topics/class-based-views/intro/)
- [내장된(Built-in) 클래스 기반의 제너릭 뷰](/ko/2.1/topics/class-based-views/generic-display/)
- [Form handling with class-based views](/ko/2.1/topics/class-based-views/generic-editing/)
- [Using mixins with class-based views](/ko/2.1/topics/class-based-views/mixins/)

## 기본 예제

Django는 다양한 어플리케이션에 알맞은 기본 뷰 클래스(base view classes)를 제공합니다. 모든 뷰들은 [`View`](/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View) 클래스를 상속받는데, 이것은 뷰와 URLs 을 연결짓고 HTTP 메소드를 b디스패칭하거나, 다른 간단한 기능들을 처리합니다. :class:~django.views.generic.base.RedirectView\`는 간단한 HTTP 리다이렉트를 하고, :class:~django.views.generic.base.TemplateView\`는 기본 클래스(base class)를 확장하여 템플릿을 렌더(render) 합니다.

## URLconf에서의 간단한 사용

제너릭 뷰(generic view)를 사용하는 가장 간단한 방법은 URLconf 에 직접 작성하는 것입니다. 클래스 기반 뷰의 몇가지 속성(attributes)들을 바꾸고, [`as_view()`](/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View.as_view) 메소드를 호출할때 바꾼 속성들을 전달 할 수 있습니다.

```
from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('about/', TemplateView.as_view(template_name="about.html")),
]
```

 [`as_view()`](/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View.as_view) 에 전달한 인자는 클래스의 속성(attributes)을 오버라이드(override)합니다. 이 예제에서는 ```TemplateView``에 ``template_name``` 을 설정합니다. 마찬가지로 `url` 속성(attirubte) 오버랑이딩 패턴을 :class:~django.views.generic.base.RedirectView\`에도 사용 할 수 있습니다.

## 제너릭 뷰의 상속(subclassing)

둘째로,  보다 유용한 제너릭 뷰를 사용하는 방법은 기존에 있는 뷰를 상속받아, 서브클래스의 속성(```template_name``같은 것) 또는 메소드(``get_context_data``같은 것)를 오버라이드 하여, 새로운 값이나 메소드를 \b제공하는 것입니다. 예를들어 하나의 템플릿 ``about.html```. 만 보여주는 경우를 생각해 보세요. Django는 이러한 일을 처리하는 -[`TemplateView`](/ko/2.1/ref/class-based-views/base/#django.views.generic.base.TemplateView) \- 라는 제너릭 뷰를 가지고 있습니다. 이 클래스를 하위클래스로(subclass)두고 템플릿 이름(template name)을 재정의 하기만 하면 됩니다.

```
# some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"
```

그 다음 새로 작성한 뷰를 URLconf에 추가하면 됩니다. [`TemplateView`](/ko/2.1/ref/class-based-views/base/#django.views.generic.base.TemplateView) 는 함수가 아닌 클래스이므로 URL에  [`as_view()`](/ko/2.1/ref/class-based-views/base/#django.views.generic.base.View.as_view) 클래스 메소드를 가르키게 하여 함수 형태처럼 클래스 기반 뷰에 접근 가능 하도록 합니다.

```
# urls.py
from django.urls import path
from some_app.views import AboutView

urlpatterns = [
    path('about/', AboutView.as_view()),
]
```

내장 제너릭 뷰의 사용법에 대한 자세한 내용은, 다음 토픽 :doc:generic class-based views\</topics/class-based-views/generic-display\>\`를 참조하세요.

### 다른 HTTP 메소드 지원

누군가 뷰를 API로 사용하여 HTTP를 통해 도서 라이브러리에 접근을 시도할 경우를 생각해 봅시다. API 클라이언트는 매 순간 접속하여 지난 방문 이후 새롭게 발행b된 서적에 대한 도서 데이터를 다운로드 할 것 입니다. 하지만 그 이후로 새로운 도서가 나타나지 않으면, 데이터베이스에서 서적을 가져와 응답을 전체를 렌더링하여 클라이언트에게 보내는 것은 CPU의 시간과 대역폭을 낭비하는 것입니다. b이 경우, API에게 최근의 업데이트 도서에 대해 묻는것이 보다 나은 방법입니다.

URLconf 에서 URL을 book list 뷰와 매핑합니다:

```
from django.urls import path
from books.views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view()),
]
```

그리고 뷰에서는:

```
from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book

class BookListView(ListView):
    model = Book

    def head(self, *args, **kwargs):
        last_book = self.get_queryset().latest('publication_date')
        response = HttpResponse('')
        # RFC 1123 date format
        response['Last-Modified'] = last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT')
        return response
```

`GET` 요청(request)에서 뷰에 접근 할 경우 일반적인 오브젝트 리스트들이 응답(response)에 반환됩니다(`book_list.html` 템플릿을 통해). 그러나 클라이언트가  `HEAD` 요청을 발행하면 응답에 empty body 와 함께  `Last-Modified` 헤더에 가장 최근의 책이 언제 발행되었는지를 알려 줄 것입니다. 이 정보를 바탕으로 클라이언트는 전체 오브젝트 리스트를 다운로드 할 수도 있고 하지 않을 수도 있습니다.
