특강

[Django 2일차] Django로 만드는 숏 URL 생성기 4/4 (250513)

Chansman 2025. 5. 13. 17:50

📌 Django로 만드는 숏 URL 생성기 튜토리얼 정리


이 튜토리얼은 Django 프레임워크를 사용하여 숏 URL 생성기를 구축하는 과정을 다룹니다. 사용자가 오리지널 URL을 입력하면, 백엔드에서 자동으로 랜덤한 문자열을 생성하여 숏 URL을 할당하고 저장합니다. HTML 폼과 모델폼을 연결하여 입력값을 받아 처리하며, CSRF 보안 토큰과 데이터 유효성 검증을 통해 안전하게 동작하도록 구성됩니다.


1. 🔗 숏 URL 추가 기능 구현

1.1 사용자 입력 기반 자동 생성 구조

  • 사용자는 오리지널 URL만 입력합니다.
  • 숏 URL은 자동으로 백엔드에서 랜덤한 문자열로 생성됩니다.

1.2 모델폼 생성 (forms.py)

from django import forms
from .models import ShortURL

class ShortURLForm(forms.ModelForm):
    class Meta:
        model = ShortURL
        fields = ['original_url']
        labels = {'original_url': '오리지널 URL'}
  • 모델폼은 모델 필드 중 original_url만 받도록 설정합니다.
  • 라벨은 사용자에게 입력 필드명을 안내합니다.

1.3 폼 템플릿 작성 (home.html 중 일부)

<form method="POST" action="{% url 'shorten_url' %}" class="d-flex align-items-center">
    {% csrf_token %}
    {{ form }}
    <button type="submit" class="btn btn-primary">생성</button>
</form>
  • POST 방식 사용
  • CSRF 토큰 포함 (보안)
  • form 변수는 뷰에서 context로 전달된 폼 객체입니다.

2. 🛠️ 장고에서의 요청 처리 흐름

2.1 뷰 함수 생성 (views.py)

from django.shortcuts import render, redirect
from .forms import ShortURLForm
from .models import ShortURL

import string, random

def generate_code():
    characters = string.ascii_letters + string.digits
    return ''.join(random.choice(characters) for _ in range(8))

def create_short_url(request):
    if request.method == 'POST':
        form = ShortURLForm(request.POST)
        if form.is_valid():
            shorturl = form.save(commit=False)
            shorturl.code = generate_code()
            shorturl.save()
            return redirect('home')
    return redirect('home')
  • 폼 유효성 검사: form.is_valid()
  • 랜덤 문자열 생성 함수 generate_code()
  • save(commit=False) 후 code 필드 채우고 저장
  • 성공 시 홈으로 리다이렉트

2.2 URL 연결 (urls.py)

from django.urls import path
from .views import create_short_url

urlpatterns = [
    path('shorten/', create_short_url, name='shorten_url'),
]

2.3 홈 페이지에서 폼 호출

  • context = {'form': ShortURLForm()}를 전달
  • 홈 페이지 템플릿에서 폼 출력 및 전송

3. 🔄 입력 데이터 검증 및 랜덤 코드 생성

3.1 입력 데이터 유효성 확인

  • 장고의 ModelForm은 URLField 등에 대해 자동 유효성 검사
  • 잘못된 입력: form.errors로 에러 메시지 출력 가능

3.2 랜덤 문자열 코드 생성

import string, random

def generate_code():
    characters = string.ascii_letters + string.digits
    return ''.join(random.choice(characters) for _ in range(8))
  • ascii_letters: 대소문자 알파벳
  • digits: 숫자 0~9
  • 총 8자리 랜덤 코드 생성

3.3 언더바(_) 사용 이유

  • 반복문에서 값이 필요 없을 때 _ 사용
for _ in range(8):
    # 반복만 필요할 경우, _ 변수는 사용하지 않음

4. 📝 인스턴스 생성과 저장 분리 처리

4.1 commit=False로 생성 후 속성 지정

shorturl = form.save(commit=False)
shorturl.code = generate_code()
shorturl.save()
  • commit=False: 객체만 생성, DB 저장 X
  • 코드 할당 후 save() 호출로 DB 저장

4.2 리다이렉트 처리

from django.shortcuts import redirect
return redirect('home')
  • POST 요청 처리 후 홈으로 리디렉션
  • URL 네임스페이스 home과 연결 필요

5. 🚀 이후 기능 확장 및 관리

5.1 중복 URL 허용 여부

  • 현재 구현은 동일한 오리지널 URL에 대해 여러 숏 URL 허용
  • 옵션으로 unique 설정 가능

5.2 삭제 기능 예정

  • 생성된 숏 URL 옆에 삭제 버튼 추가 예정
  • 클릭 시 해당 인스턴스 삭제 처리 예정

5.3 리다이렉션 구현 예정

  • 숏 URL로 접속 시 해당 오리지널 URL로 리다이렉트
  • /abc123 요청 시 https://google.com으로 이동하는 구조 구현 예정

5.4 코드 응집성 강조

  • generate_code()는 모델 내부 메서드로 이동 가능
class ShortURL(models.Model):
    ...
    def generate_code(self):
        ...
  • 로직이 모델에 모이면 유지 관리가 쉬워지고 가독성이 높아짐

5.5 DRF 기반 API 확장 예고

  • 장고 REST 프레임워크 기반 API 구현 예정
  • 추후 API로 숏 URL 생성 및 조회 기능 제공

✅ 다음 시간에는

  • 숏 URL 삭제 기능
  • 접속 시 오리지널 URL로 리다이렉션
  • CBV(Class-Based View)로 전환하기

을 진행할 예정입니다. 끝까지 실습하셨다면 웹 서비스의 핵심 구성인 입력 → 처리 → 저장 → 출력 흐름을 모두 익히신 것입니다!