? Generic vs Viewsets 차이

heeyoung_1023·2026년 3월 6일

Generic vs Viewsets 차이


📊 한눈에 비교

GenericViewsets
코드량중간가장 적음
URL 설정직접 설정자동 생성
난이도중간조금 더 복잡
유연성높음중간

2️⃣ Generic (2번 수업)

# views.py
from rest_framework.generics import ListCreateAPIView

class TodoListCreate(ListCreateAPIView):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer

class TodoDetail(RetrieveUpdateDestroyAPIView):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer
# urls.py - URL 직접 설정해야 함
urlpatterns = [
    path("todo/", TodoListCreate.as_view()),    # 목록+생성
    path("todo/<int:pk>/", TodoDetail.as_view()), # 조회+수정+삭제
]
URL이 2개 필요!
/todo/         → 목록, 생성
/todo/1/       → 조회, 수정, 삭제

3️⃣ Viewsets (3번 수업)

# views.py
from rest_framework.viewsets import ModelViewSet

class TodoViewSet(ModelViewSet):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer
# 이게 끝! CRUD 전부 자동으로 만들어짐
# urls.py - Router가 URL 자동 생성
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register("todo", TodoViewSet)

urlpatterns = [
    path("", include(router.urls)),  # URL 자동 생성!
]
URL이 자동으로 생성됨!
/todo/         → GET(목록), POST(생성)
/todo/1/       → GET(조회), PUT(수정), DELETE(삭제)

🔄 발전 과정

함수형 뷰 (1단계)
──────────────────
def todo_list(request):
    if request.method == "GET":
        ...
    elif request.method == "POST":
        ...
# 코드가 길고 반복이 많음 ❌

      ↓

Generic (2단계)
──────────────────
class TodoListCreate(ListCreateAPIView):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer
# 코드가 줄어듦 ✅

      ↓

Viewsets (3단계)
──────────────────
class TodoViewSet(ModelViewSet):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer
# 코드가 최소화됨 ✅✅

💡 언제 뭘 쓰나?

Generic 사용               Viewsets 사용
─────────────────────────────────────────
일부 기능만 필요할 때       CRUD 전부 필요할 때
URL 커스텀이 필요할 때      빠르게 개발할 때
세밀한 제어가 필요할 때     코드를 줄이고 싶을 때

💡 한 줄 요약

Generic   → "필요한 기능만 골라서 사용"
Viewsets  → "CRUD 전부 한번에 자동으로!"

둘 다 같은 결과지만 Viewsets이 코드가 훨씬 짧아요! 😊

profile
개발언어를 배우는 과정 기록

0개의 댓글