본문 바로가기
Programming/Django

[Django] 2. URLs & Views 핵심 요약

by Mandy's 2025. 7. 20.

1. ✅ URLs (또는 Routes)란?

  • 사용자가 접근할 수 있는 경로(Route)를 정의
  • 하나의 Django 프로젝트는 다양한 URL을 가질 수 있으며, 각각의 URL에 다른 응답(views) 이 매핑됨
  • URLConf(urls.py)에서 URL 패턴을 등록하고 해당 URL에 맞는 뷰(view)로 연결

2. ✅ Views란?

  • URL에 대한 처리 로직을 담은 함수 또는 클래스
  • 요청(request)을 받아 데이터를 처리하고 응답(response)을 생성
  • View의 주요 역할:
    • 데이터 불러오기 / 가공
    • 비즈니스 로직 수행
    • HTML, JSON 등 응답 생성 및 반환
def my_view(request):
    # 요청 처리 로직
    return HttpResponse("Hello!")

Django에서는 function-based view와 class-based view 모두 지원


3. ✅ URL과 View 연결 흐름

Client Request
      ↓
URLConf (urls.py)
      ↓
View 함수 실행
      ↓
HttpResponse 반환
      ↓
Client 화면 출력

4. ✅ Redirects (리다이렉트)

  • 사용자를 다른 URL로 이동시키는 방법
  • 주로 다음과 같은 경우에 사용:
    • 잘못된 접근을 정상 경로로 유도
    • 입력값 유효성 검사 후 다른 페이지로 이동

방법

from django.http import HttpResponseRedirect
from django.urls import reverse

# 방법 1: 직접 URL 입력
return HttpResponseRedirect("/challenges/january")

# 방법 2: reverse() 사용 - 더 유연함
return HttpResponseRedirect(reverse("month-challenge", args=["january"]))

reverse() 함수

  • URL name을 기반으로 실제 URL 문자열을 역으로 찾아줌
  • URL이 변경되어도 name만 유지하면 그대로 사용 가능 → 유지보수 편리

5. ✅ 동적 View 처리 (예시)

def index(request):
    list_items = ""
    months = list(monthly_challenges.keys())

    for month in months:
        capitalized_month = month.capitalize()
        month_path = reverse("month-challenge", args=[month])
        list_items += f"<li><a href=\"{month_path}\">{capitalized_month}</a></li>"

    response_data = f"<ul>{list_items}</ul>"
    return HttpResponse(response_data)
  • monthly_challenges 딕셔너리 기반으로 월(month) 리스트를 동적으로 생성
  • <ul>, <li> 태그를 코드로 자동 생성 → 유지보수 및 확장에 유리

6. ✅ urlpatterns 예시

def index(request):
    list_items = ""
    months = list(monthly_challenges.keys())

    for month in months:
        capitalized_month = month.capitalize()
        month_path = reverse("month-challenge", args=[month])
        list_items += f"<li><a href=\"{month_path}\">{capitalized_month}</a></li>"

    response_data = f"<ul>{list_items}</ul>"
    return HttpResponse(response_data)
  • /challenges/1 → 숫자로 월을 받아 처리
  • /challenges/january → 문자열로 처리
  • URL name을 지정하여 reverse 함수에서 사용 가능

7. ✅ 하드코딩의 문제점 vs reverse()의 장점

하드코딩reverse() 사용
URL 변경 시 코드 전체 수정 필요 URL name만 유지하면 됨
버그 가능성 증가 유지보수 용이
협업 시 혼동 우려 명시적이고 재사용 가능
 

📝 정리 한줄 요약

  • URL은 웹 경로를 정의하고, View는 그 경로에 대한 로직을 실행
  • Redirect는 다른 URL로 자동 이동시킬 때 사용
  • reverse()를 활용해 URL 하드코딩을 피하고, 템플릿에서는 {% url %}과 같이 사용