본문 바로가기
Programming/Django

[Django] Form 처리, 함수형 뷰에서 클래스 기반 뷰(CBV)로 리팩토링하기

by Mandy's 2025. 7. 24.

“코드가 너무 길어졌어요… 뷰를 더 깔끔하게 쓸 수 없을까요?”

장고를 배우면서 가장 먼저 접하게 되는 건 함수형 뷰(Function-Based View)입니다.

하지만 프로젝트가 커지면 점점 코드가 길어지고 반복되는 부분도 많아지죠. 이럴 때 좋은 대안이 클래스 기반 뷰(Class-Based View)입니다.

오늘은 제가 직접 구현했던 리뷰 폼 기능을 CBV로 리팩토링한 과정을 소개드리며, 왜 이렇게 고쳐야 했는지도 함께 정리해볼게요.


1️⃣ 기존 함수형 뷰 코드

def review(request):
    if request.method == 'POST':
        form = ReviewForm(request.POST)

        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/thank-you")

    else:
        form = ReviewForm()

    return render(request, "reviews/review.html", {
        "form": form
    })

기능은 잘 작동하지만, GET과 POST 처리 로직이 if-else에 뒤섞여 있어서 가독성이 떨어졌습니다. 테스트하기도 어렵고, 조건이 많아지면 유지보수도 힘들어져요.


2️⃣ CBV로 리팩토링한 코드

from django.views import View
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import ReviewForm

class ReviewView(View):
    def get(self, request):
        form = ReviewForm()
        return render(request, "reviews/review.html", {"form": form})

    def post(self, request):
        form = ReviewForm(request.POST)

        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/thank-you")

        # ✨ 폼 유효성 검사 실패 시, 에러와 함께 다시 렌더링
        return render(request, "reviews/review.html", {"form": form})

✅ 왜 이렇게 고쳐야 할까?

1. 가독성과 역할 분리가 명확해짐

  • get()은 폼을 보여주는 역할
  • post()는 폼을 처리하는 역할
  • 각 메서드가 명확한 책임을 가지므로 유지보수가 쉬워집니다.

2. 중복 제거

  • render() 호출 구문이 더 이상 반복되지 않아요.
  • form 생성과 전달 로직이 훨씬 깔끔해졌습니다.

3. 유효성 검사 실패 시 대응 추가

  • 기존에는 form.is_valid() 실패 시 아무것도 리턴하지 않아 에러 메시지가 화면에 안 보였어요.
  • CBV에서는 실패한 경우에도 form을 다시 템플릿에 넘겨줘야 <form> 안에 에러 메시지가 보입니다.

💡 참고: 템플릿 코드도 에러 메시지를 잘 출력해야 해요!

{% for field in form %}
  <div class="form-control {% if field.errors %} errors{% endif %}">
    {{ field.label_tag }}
    {{ field }}
    {{ field.errors }}  <!-- 이 부분이 중요! -->
  </div>
{% endfor %}

마무리

CBV는 처음엔 생소하지만, 익숙해지면 훨씬 강력한 방식이에요.
특히 FormView, CreateView 같은 Django의 제너릭 뷰까지 익히면 뷰 코드를 3줄로 끝낼 수도 있어요.

작은 프로젝트라도 이렇게 연습해보면, 앞으로 훨씬 효율적인 개발이 가능해질 거예요.
혹시 리팩토링이나 CBV에 대한 질문이 있다면 댓글로 남겨주세요 :)