반응형

Django를 사용시 as_view() 메서드를 자주 마주치게 된다. URL 설정에서 클래스 기반 뷰(Class-based View)를 연결할 때 항상 이 메서드를 호출한다. 이 메서드가 어떤 일을 하는지, 그리고 왜 필요한지 알아본다.

 

as_view()의 필요성

Django의 URL 라우팅 시스템은 기본적으로 함수를 기대한다. 하지만 코드를 더 체계적으로 구조화하기 위해,   클래스 기반 뷰를 사용한다. 바로 여기서 as_view()가 등장한다. as_view()는 클래스 기반 뷰를 URL 라우터가 이해할 수 있는 함수로 변환해주는 다리 역할을 한다.

내부 동작 원리

View 클레스의 as_view()의 내부 동작을 간략화된 형태로 살펴보자. 

class View:

	# ...생략...
    
    @classonlymethod
    def as_view(cls, **initkwargs):
        # ...생략...
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.setup(request, *args, **kwargs)
            return self.dispatch(request, *args, **kwargs)
        # ...생략...
        return view
        
    # ...생략...

이 코드가 하는 일을 단계별로 살펴보면:

  1. 뷰 클래스의 새 인스턴스를 생성한다.
  2. (request 같은) 속성들을 초기화한다. 이는 뷰의 모든 메서드에 공유되는 속성이다.
  3. HTTP 메서드에 따라 적절한 핸들러로 요청을 전달한다.
    • dispatch 함수를 보면, request에서 HTTP 메서드를 알아낸 다음, 뷰가 해당 HTTP 메서드에 대해 구현하는 핸들러 함수(get()이나 post() 등)를 호출하는 것을 확인 가능하다.
    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(
                self, request.method.lower(), self.http_method_not_allowed
            )
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

 

실제 사용 예시

# views.py
from django.views import View
from django.http import HttpResponse

class BlogPostView(View):
    def get(self, request, *args, **kwargs):
        return HttpResponse("블로그 포스트를 보여줍니다")
    
    def post(self, request, *args, **kwargs):
        return HttpResponse("새 포스트를 생성했습니다")

# urls.py
from django.urls import path
from .views import BlogPostView

urlpatterns = [
    path('post/', BlogPostView.as_view(), name='blog-post'),
]

고급 사용법 - 초기화 배개면수 전달

as_view()는 뷰 클래스에 초기 설정을 전달할 수 있는 기능도 제공한다:

path('post/', BlogPostView.as_view(template_name='custom_template.html'), name='blog-post')

이렇게 전달된 매개변수는 뷰 클래스의 인스턴스가 생성될 때 적용된다.

 

요약

as_view() 메서드는 Django의 클래스 기반 뷰 시스템을 가능하게 하는 핵심 요소이다. 이 메서드를 통해, 객체 지향적인 뷰를 작성하면서도 Django의 URL 시스템과 원활하게 통합할 수 있게 된다.

반응형

'Django' 카테고리의 다른 글

[Django] Messages Framework  (0) 2025.01.23
[Django] 사용자 모델 구현 방법 비교  (0) 2025.01.22
[Django] 정적 파일(Static Files) 관리  (0) 2025.01.17
[Django] urlpatterns의 작동 원리  (0) 2024.12.29
[Django] reverse 함수  (0) 2024.12.28

+ Recent posts