[Django 3일차] Django 함수형 뷰 vs 클래스형 뷰 + ORM 4/4 (short_url 프로젝트)(250514)

2025. 5. 14. 16:04·특강

📘 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 개발을 학습할 예정입니다. 🚀

'특강' 카테고리의 다른 글

[Django 4일차] Django REST Framework 핵심 요약: Serializer와 View의 실전 활용 3/4 (short_url 프로젝트)(250515)  (0) 2025.05.15
[Django 4일차] Django를 백엔드 프레임워크로 활용하기 - DRF 입문 가이드 1/4 (short_url 프로젝트)(250515)  (0) 2025.05.15
[Django 3일차] Django Race Condition 해결 및 삭제 기능 구현 3/4 (short_url 프로젝트)(250514)  (0) 2025.05.14
[Django 2일차] Django로 만드는 숏 URL 생성기 4/4 (250513)  (0) 2025.05.13
[Django 2일차] Django로 숏 URL 생성 서비스 만들기 3/4 (250513)  (0) 2025.05.13
'특강' 카테고리의 다른 글
  • [Django 4일차] Django REST Framework 핵심 요약: Serializer와 View의 실전 활용 3/4 (short_url 프로젝트)(250515)
  • [Django 4일차] Django를 백엔드 프레임워크로 활용하기 - DRF 입문 가이드 1/4 (short_url 프로젝트)(250515)
  • [Django 3일차] Django Race Condition 해결 및 삭제 기능 구현 3/4 (short_url 프로젝트)(250514)
  • [Django 2일차] Django로 만드는 숏 URL 생성기 4/4 (250513)
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787) N
      • Python (32)
      • 프로젝트 (110) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    global politics
    life reflection
    chinanightlife
    urbantrends
    trumpmuskclash
    homebartrend
    newpoliticalparty
    btsjungkook
    americaparty
    chatgpterror
    smartphonedurability
    basalcellcarcinoma
    livebroadcast
    remittance
    btscomeback
    youngprofessionals
    lawsuitculture
    뷔
    RM
    btsreunion
    self-growth
    bts
    hotcoffeecase
    travel ban
    gpterror
    college reunions
    americanlaw
    titaniumcase
    classaction
    btsdischarge
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
[Django 3일차] Django 함수형 뷰 vs 클래스형 뷰 + ORM 4/4 (short_url 프로젝트)(250514)
상단으로

티스토리툴바