특강
[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)로 전환하기
을 진행할 예정입니다. 끝까지 실습하셨다면 웹 서비스의 핵심 구성인 입력 → 처리 → 저장 → 출력 흐름을 모두 익히신 것입니다!