Akashic Records

[추가자료] 8.3 웹 프레임워크 - Django View 본문

Python for Beginners

[추가자료] 8.3 웹 프레임워크 - Django View

Andrew's Akashic Records 2024. 6. 19. 13:34
728x90

Django

Django에서 뷰(View)는 웹 애플리케이션의 핵심 로직을 처리하는 컴포넌트로, 웹 요청을 받아서 웹 응답을 반환합니다. 뷰의 주된 목적은 요청의 세부사항을 캡슐화하고, 요청에 따라 필요한 데이터를 처리하여 적절한 응답을 생성하는 것입니다. 여기에는 HTTP 요청을 파싱, 세션 관리, 데이터 검증, 쿼리 실행, 템플릿 렌더링 등이 포함됩니다.

Django View

Django의 뷰는 웹 애플리케이션의 로직과 데이터 흐름의 중심지로, 효율적이고 안전한 웹 서비스를 제공하기 위한 다양한 기능과 도구를 개발자에게 제공합니다.

 

1. 요청 처리

Django에서 모든 뷰는 첫 번째 인자로 HttpRequest 객체를 받습니다. 이 객체는 사용자의 요청에 대한 모든 정보를 담고 있으며, 뷰에서는 이 정보를 사용하여 필요한 작업을 수행합니다. 예를 들어, GET 또는 POST 파라미터를 읽거나, 쿠키 또는 세션 데이터에 접근할 수 있습니다.

2. 로직 실행

뷰 내부에서는 비즈니스 로직을 실행합니다. 이는 데이터베이스 조회, 데이터 처리, 외부 API 호출 등 다양한 형태를 취할 수 있습니다. Django의 ORM(Object-Relational Mapping)을 사용하면 데이터베이스 작업을 Python 코드로 간단히 처리할 수 있으며, 결과를 템플릿 시스템에 전달하기 전에 가공할 수 있습니다.

3. 응답 반환

뷰에서 처리한 결과를 사용자에게 반환해야 합니다. Django에서는 이를 위해 여러 종류의 응답 클래스를 제공합니다:

  • HttpResponse: 기본 응답 객체로, HTTP 상태 코드, 콘텐츠, 헤더를 포함할 수 있습니다.
  • JsonResponse: JSON 형식의 응답을 쉽게 생성할 수 있도록 도와주는 클래스입니다.
  • HttpResponseRedirect: 특정 URL로 리다이렉트 할 때 사용합니다.

4. 템플릿 렌더링

동적인 HTML 콘텐츠를 생성하기 위해 Django의 템플릿 시스템과 연계할 수 있습니다. render() 함수는 HttpRequest 객체, 템플릿 이름, 그리고 템플릿에 전달할 데이터(컨텍스트)를 받아 HTML 콘텐츠를 생성하고 HttpResponse 객체로 반환합니다.

5. 예외 및 에러 처리

뷰에서 처리 중에 예외가 발생할 수 있습니다. Django는 여러 종류의 내장 예외 처리 기능을 제공하며, 예를 들어 Http404 예외를 발생시키면 사용자에게 404 Not Found 에러 페이지를 자동으로 보여줍니다.

6. 보안 기능

Django는 CSRF(Cross Site Request Forgery) 방지, SQL 인젝션 방지 등 여러 보안 기능을 내장하고 있으며, 이는 뷰를 통해 자동 또는 수동으로 활성화될 수 있습니다.

 

FBV와 CBV

Django에서 뷰는 크게 함수 기반 뷰(Function-Based Views, FBV)와 클래스 기반 뷰(Class-Based Views, CBV) 두 가지 형태로 구현될 수 있습니다.

함수 기반 뷰와 클래스 기반 뷰는 각각의 사용 사례와 선호에 따라 선택할 수 있으며, 둘 다 Django의 강력한 기능들을 충분히 활용할 수 있도록 설계되어 있습니다.

함수 기반 뷰 (FBV)

함수 기반 뷰는 Django에서 전통적으로 사용되는 뷰의 형태로, 간단하게 한 개의 함수로 요청을 처리합니다. 이 방식은 작은 애플리케이션 또는 단순한 로직을 처리하는 데 적합하며, 코드의 이해가 직관적입니다.

 

장점:

  • 간단하고 명확한 로직 표현
  • 직관적인 구조로 빠른 개발 가능
  • 데코레이터를 이용한 기능 확장이 용이

단점:

  • 중복 코드 발생 가능성 높음
  • 복잡한 뷰에서 가독성 저하
  • 재사용성과 확장성이 낮음

예시: 기본적인 간단한 텍스트 응답 반환

from django.http import HttpResponse

def my_view(request):
    if request.method == 'GET':
        return HttpResponse('Hello, World!')

 

예시: 데이터를 템플릿에 렌더링

from django.shortcuts import render

def greeting(request):
    context = {'name': 'Visitor'}
    return render(request, 'greeting.html', context)

 

예시: GET 파라미터 사용

def show_details(request):
    item_id = request.GET.get('item_id', None)
    if item_id:
        return HttpResponse(f"Details for item ID: {item_id}")
    else:
        return HttpResponse("No item ID provided.")

클래스 기반 뷰 (CBV)

클래스 기반 뷰는 뷰의 로직을 클래스로 구조화하여 관리합니다. 이 방식은 코드의 재사용성과 유지보수성을 높여주며, 복잡한 웹 애플리케이션을 개발할 때 특히 유용합니다. Django는 다양한 내장 제네릭 뷰를 제공하여 흔히 사용되는 패턴들을 손쉽게 구현할 수 있도록 돕습니다.

 

장점:

  • 재사용성과 확장성이 높음
  • 코드 중복 최소화
  • 다중 상속을 통한 유연한 기능 확장
  • 표준화된 구조로 일관된 패턴 적용 가능

단점:

  • 초보자에게 다소 복잡하고 이해하기 어려울 수 있음
  • 함수 기반 뷰에 비해 설정해야 할 것이 많음
  • 뷰 로직의 흐름을 파악하기 어려울 수 있음

예시: 간단한 텍스트 응답 반환

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

class HomeView(View):
    def get(self, request):
        return HttpResponse("Welcome to the class-based home page!")

 

예시: 템플릿 렌더링을 위한 CBV

from django.views.generic import TemplateView

class GreetingView(TemplateView):
    template_name = 'greeting.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['name'] = 'Visitor'
        return context

 

예시: 모델 데이터 표시

from django.views.generic import ListView
from .models import Article  # 가정: Article 모델이 이미 정의되어 있음

class ArticleListView(ListView):
    model = Article
    template_name = 'articles.html'  # 또는 Django가 기본적으로 'app_name/article_list.html'을 찾음
    context_object_name = 'articles'

뷰와 URL 연결

Django에서는 urls.py 파일을 통해 특정 URL과 뷰를 매핑합니다. 이 매핑을 통해 사용자가 특정 URL을 요청할 때 Django는 해당 요청을 처리할 적절한 뷰를 찾아 실행할 수 있습니다.

urls.py 예시:

from django.urls import path
from .views import home, greeting, show_details, HomeView, GreetingView, ArticleListView

urlpatterns = [
    path('', home, name='home'),
    path('greeting/', greeting, name='greeting'),
    path('details/', show_details, name='details'),
    path('cbv/', HomeView.as_view(), name='home_cbv'),
    path('cbv/greeting/', GreetingView.as_view(), name='greeting_cbv'),
    path('articles/', ArticleListView.as_view(), name='article_list'),
]

 

선택 기준

  • 간단한 로직 처리: 함수 기반 뷰가 적합
  • 재사용 및 확장이 필요한 경우: 클래스 기반 뷰를 사용
  • 표준화된 구조 유지: 클래스 기반 뷰를 통해 일관된 패턴 적용
  • 개발자의 선호도 및 경험: 개인 또는 팀의 경험에 따라 적합한 방식 선택

함수 기반 뷰와 클래스 기반 뷰 각각의 장단점을 이해하고 프로젝트의 요구사항에 맞춰 적절히 선택하여 사용하는 것이 중요합니다.

728x90
Comments