Django - Mini Project - Learn

김기훈·2025년 12월 4일

부트캠프 프로젝트

목록 보기
13/39

views.py 분리

구분views.py(API)views_html.py(HTML)
응답JSONHTML
사용 기술DRF(Class-based APIView)Django Template, Form
목적앱/프론트엔드/외부 연동웹페이지 렌더링
주요 로직serializer, 필터, orderingrender, GET/POST form 처리
장점엄격하고 깔끔한 API 설계템플릿 변경 자유, UI 편함
위험성HTML과 섞이면 유지보수 지옥API와 섞이면 버그 유발

views.py(API 전용)

  • ListCreateAPIView, RetrieveUpdateDestroyAPIView 같은 DRF 전용 View를 사용하는 파일

  • 장점

    • API 설계가 깔끔해지고 예측 가능해짐(URL → JSON 응답만 담당)
      • HTML 템플릿과 전혀 섞이지 않음 | RESTful 구조 유지하기 쉬움 (GET/POST/PUT/DELETE)
    • 필터링 / ordering / serializer / 권한 같은 API 기능을 독립적으로 잡기 좋음
      • filter_backends = [DjangoFilterBackend, OrderingFilter]
      • filterset_class = TransactionFilter
      • ordering_fields = ['transacted_at', 'amount']
    • 프론트엔드, 앱 개발자와 협업 쉬움
      • React/Vue/모바일 앱 등은 JSON API만 필요
    • API 테스트 쉬움 | 협업 & 유지보수 좋음 | JSON 전용이라 코드가 단순하고 깔끔

views_html.py(HTML 전용)

  • 화면 템플릿 + Form 처리 담당

  • 장점

    • 템플릿 렌더링 로직과 API 로직이 분리되어 HTML 유지보수에 최적
      return render(request, "transactions/transaction_list.html", {
          "transactions": qs,
      })
    • Form 처리(View + Template) 구조가 API 영향을 주지 않음
      • form = TransactionForm(request.POST, user=request.user)
        • HTML form은 validation과 redirect 흐름을 포함함
    • API는 JSON 기반 serializer validation을 사용
      • serializer.save(user=self.request.user)
    • 화면 기능(필터, 조회, UI 상태 관리)을 자유롭게 설계 가능
      • category = request.GET.get("category")

  • “같은 데이터를 조회하는데 API와 HTML에서 둘 다 코드를 쓰는 건 중복 아닌가?”

# API 조회
class TransactionListCreateView(ListCreateAPIView):
    def get_queryset(self):
        return Transaction.objects.filter(user=self.request.user)

# HTML 조회
def transaction_html_view(request):
    qs = Transaction.objects.filter(user=request.user)
구분APIHTML
최종 출력JSONHTML 템플릿
사용 위치모바일 앱 · React · Vue · 외부 서비스Django 템플릿
response 형태Response(serializer.data)render(request, template, context)
확장 방향REST 구조 확장, POST/PUT/DELETEUI, 템플릿 변경, 부트스트랩, 필터 UI
인증 흐름JWT, 토큰 인증, API 권한 중심로그인 기반, redirect, 메시지

  • 기능이 겹치는 것이 아니라 “사용자 대상이 다르다”

    • 1) API 대상
      • 모바일 앱
      • React/Vue SPA
      • 외부 서비스
      • Postman / 자동화 스크립트
        • 이들은 HTML이 필요 없음 / 반드시 JSON 형태여야 함
    • 2) HTML 대상
      • 웹 브라우저에서 실제 화면을 볼 유저
      • 버튼, 입력폼, 필터 선택, SweetAlert 등 UI가 필요

  • Form vs Serializer — 역할 자체가 완전히 다름

    • 겹치는 것처럼 보이는 가장 큰 이유는 "유효성 검사" 때문
      • HTML(Views_html)은 Form을 쓰고 API는 Serializer을 씀
    • 1. Form: HTML용

      • 필드 렌더링 / Bootstrap 적용 / POST → redirect / 템플릿에서 {{ form }} 로 렌더링
    • 2. Serializer: API용

      • JSON validation / JSON response / request.data 처리 / API 표준 예외 처리

따라서

  • 웹 접속자: Django 템플릿(views_html.py) 사용
  • 모바일 앱: API(views.py) 사용
  • Django 템플릿으로만 웹을 만들 거면 API는 ‘필수는 아니다’

    • 하지만 API는 지금이 아니라 “미래의 확장”을 위해 존재


profile
안녕하세요.

0개의 댓글