두숟갈 스터디 - 6

무엇을 공부했나요?

이번 시간에는 지난 시간에 이어 Two Scoops of Django 8~9장 내용을 살펴보았습니다.

설명하는 남홍님

진홍님께서 8장을, 문수(미주)님께서 9장 요약 자료를 준비하였고, 남홍님께서 심화 자료를 준비하여 이번 스터디를 진행하였습니다.

이번 스터디부터 본격적으로 Django에 대해 다룬다는 느낌이 들었고, 어떻게 보면 난이도가 조금 올라간 듯 한 내용들도 보였습니다. 스터디 내 대략적으로 뷰에 대해 심도있게 살펴보았는데요. 이제 간단하게 스터디 내용들을 살펴볼까요?

8장 함수 기반 뷰와 클래스 기반 뷰

# 함수로서의 장고 함수 기반 뷰
HttpResponse = view(HttpRequest)

# 수학에서 이용한 함수 식
y = f(x)

# 클래스 기반 뷰
HttpResponse = View.as_view()(HttpRequest)
 # 위의 함수와 아래 함수의 차이점을 찾는데 얼마나 걸리는가?
 def ice_cream_store_display(request, store_id):
   store = get_object_or_404(Store, id=store_id)
   date = timezone.now()
   return render(request, 'melted_ice_cream_report.html', locals())
 
 def ice_cream_store_display(request, store_id):
   store = get_object_or_404(Store, id=store_id)
   now = timezone.now()
   return render(request, 'melted_ice_cream_report.html', locals())
 
 def ice_cream_store_display(request, store_id):
   return render(request, 'melted_ice_cream_report.html', dict{
     'store' : get_object_or_404(Store, id=store_id),
     'now' : timezone.now()
   })

9장 함수 기반 뷰의 모범적인 이용

# 간단한 데코레이터 템플릿
import functools

def decorator(view_func):
    @functools.wraps(view_func)
    def new_view_func(request, *args, **kwargs):
        # 여기에서 request(HttpRequest) 객체를 수정하면 된다.
        response = view_func(request, *args, **kwargs)
        # 여기에서 response(HttpResponse) 객체를 수정하면 된다.
        return response
    return new_view_func
# sprinkles/decorators.py
from functools import wraps

from . import utils

def check_sprinkles(view_func):
    """사용자가 스프링클을 추가할 수 있는지 확인한다."""
    @wraps(view_func)
    def new_view_func(request, *args, *kwargs):
        # request 객체를 utils.can_sprinkle()에 넣는다 
        request = utils.can_sprinkle(request)
        
        # 뷰 함수를 호출
        response = view_func(request, *args, *kwargs)
        
        # HttpResponse 객체를 반환
        return response
    return new_view_func
# view.py
from django.shortcuts import get_object_or_494, render

from .decorators import check_sprinkles
from .models import Sprinkles

# 뷰에 데코레이터를 추가
@check_sprinkles
def sprinkle_detail(request, pk):
    """표준 상세 뷰"""
    sprinkle = get_object_or_404(Sprinkle, pk=pk)
    
    return render(request, 
        "sprinkles/sprinkle_detail.html", 
        {"sprinkle": sprinkle})

심화 내용

남홍님께서 현재 장고에서 쓰이고 있는 뷰에 대해 먼저 정리를 해주셨습니다. 이후 URL, URN, URI 등을 설명해 주셨고, Explicit이 implicit보다 을 예시와 함께 설명해 주셨습니다. 이후 Decorator(장식자)에 대해 심도 깊은 내용을 설명해 주셨습니다. 이를 통해 실제 decorator가 어떻게 쓰이고 회사에서 어떤 식으로 적용 되었으며, 실제로 사용하려면 어떻게 써야하는지 알 수 있었습니다.

어땠을까?

이제 본격적으로 스터디 내용도 어려워 지는 것 같네요. 그래도 배워가는게 많고 얻어가는게 많은 것 같아서 좋았습니다. 이런 스터디를 통해서 스스로 더 발전해 나갈 수 있는 기회를 만들 수 있었으면 좋겠네요. 앞으로 쭉 지속되는 스터디가 되길 바랍니다.