📘 Django: 함수형 뷰 vs 클래스형 뷰 + ORM 실전 활용 가이드
1. 🛠️ 클래스형 뷰의 장점과 사용법
- 함수형 뷰(FBV)는 하나의 함수에 GET, POST 등의 로직이 포함되어 코드가 길고 복잡해지기 쉬움
- Django는 이를 해결하기 위해 클래스형 뷰(CBV) 도입
- View 클래스를 상속받고 get(), post() 등의 메서드를 구현하여 메소드별 로직을 명확하게 분리 가능
tfrom django.views import View
from django.shortcuts import render, redirect
class ShortURLDetailView(View):
def get(self, request, code):
# GET 요청 처리
...
def post(self, request, code):
# POST 요청 처리
...
- URLconf에 연결할 때 .as_view() 메서드로 뷰 함수를 생성해야 함
path('<str:code>/', ShortURLDetailView.as_view(), name='detail')
2. 📚 Django의 메소드 사용과 데이터 조회
- __str__() 메서드를 모델에 정의하면 객체의 출력 형태를 커스터마이징 가능
- ORM에서 .get()은 단일 객체 조회, .filter()는 쿼리셋 반환
# 단일 객체 조회
ShortURL.objects.get(id=1)
# 조건 불일치 시 예외 발생
ShortURL.objects.get(id=999) # DoesNotExist
# 여러 개 혹은 조건 모를 경우 안전한 접근
qs = ShortURL.objects.filter(id=1)
url = qs.first() # 없으면 None 반환
3. 🔍 get() vs filter() 차이점 요약
항목 get() filter()
반환값 | 단일 객체 | QuerySet (리스트 형태) |
데이터 없음 시 | 예외 발생 | 빈 QuerySet 반환 |
용도 | 존재 확실 시 | 존재 여부 불확실 시 |
- get_object_or_404() 사용 시, 없으면 404 예외 자동 발생
from django.shortcuts import get_object_or_404
url = get_object_or_404(ShortURL, id=1)
4. 📊 필드 룩업 및 필터링 기법
- 쿼리 조건 다양하게 사용 가능 (필드 룩업)
ShortURL.objects.filter(access_count__gte=1) # 1 이상
ShortURL.objects.filter(code__startswith='a')
ShortURL.objects.filter(id__in=[1, 2, 3])
- 참조 문서: https://docs.djangoproject.com/en/5.1/ref/models/querysets/#field-lookups
- 데이터가 없을 때 404 대신 다른 응답 처리
qs = ShortURL.objects.filter(id=100)
url = qs.first()
if not url:
return HttpResponse("No Data", status=204)
5. 🗃️ ORM을 활용한 데이터 수정 및 삭제
5.1. 단일 객체 수정
url = ShortURL.objects.get(id=1)
url.code = 'y'
url.save()
5.2. 다수 객체 일괄 수정
ShortURL.objects.filter(access_count__gte=1).update(access_count=0)
- .update() 메서드는 변경된 객체 수를 반환
5.3. 조건 기반 삭제
ShortURL.objects.filter(id__gte=5).delete()
6. 🧠 ORM의 핵심 요약
- get(): 단일 조회 (예외 발생 가능)
- filter(): 다수 조회 또는 조건 불확실 시 사용 (쿼리셋)
- first(): 쿼리셋에서 첫 객체 안전하게 추출
- update(): 일괄 수정
- delete(): 조건 기반 다중 삭제
- 필드 룩업(__gte, __icontains, __startswith 등)을 통해 유연한 조건 검색
7. 🌐 URL과 라우팅 & HTTP 요청 처리 흐름
- URLConf로 클라이언트 요청 → 특정 뷰 연결
- 동적 파라미터 예시: <int:blog_pk>/
- 함수형 뷰에서는 request.method 조건 분기
- 클래스형 뷰에서는 get(), post() 등의 메서드 자동 매핑
8. ⚠️ 실전 팁과 주의사항
- ✅ DB 변경 시 .save() 호출 필수
- ✅ 클래스형 뷰 연결 시 .as_view() 잊지 말 것
- ❌ get()은 예외 발생에 유의
- ✅ filter().first() 또는 get_object_or_404()로 안전한 조회
- ✅ 레이스 컨디션 방지 시 F() 표현식 활용
from django.db.models import F
url.access_count = F('access_count') + 1
url.save()
✅ 다음 학습 예고
다음 시간에는 Django REST Framework(DRF)를 활용한 API 개발을 학습할 예정입니다. 🚀