URL 축소 서비스 구축: Flask와 Redis를 활용한 초보자용 튜토리얼

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 초보자: 백엔드 개발, Python, Redis 기초 이해가 필요한 사람들
  • 난이도: 기초적인 웹 프레임워크와 데이터베이스 연동 이해 수준

핵심 요약

  • 기술 스택: Flask, Redis, Base62 인코딩을 사용한 고속 URL 축소 서비스 구현
  • Redis 활용: r.incr('next_short_id')고유 ID 생성r.set()으로 빠른 URL 매핑 저장/조회
  • 모듈 설계: Blueprint 기반 분리된 라우팅, services.py비즈니스 로직 분리

섹션별 세부 요약

1. 프로젝트 개요

  • 목적: Python과 Redis를 활용한 RESTful API 기반 URL 축소 서비스 구현
  • 특징:
  • POST /shorten 요청으로 URL 축소
  • GET /원래 URL로 리디렉션
  • Redis를 사용한 고속 저장/검색
  • Base62 인코딩으로 고유 코드 생성
  • 설계 원칙: 모듈화, 에러 처리, 확장성

2. 사용 기술

  • Python 3.x, Flask (가볍고 유연한 웹 프레임워크)
  • Redis (인메모리 키-값 저장소, redis-py 라이브러리 사용)
  • redis-py: Redis와의 동기적 상호작용 지원

3. 프로젝트 구조

  • app.py: Flask 애플리케이션 초기화, Redis 연결, Blueprint 등록
  • routes.py: Blueprint 기반 라우팅 정의 (/, /shorten, /)
  • services.py: URL 생성/저장/검색 로직 (r.incr, Base62 인코딩, r.set)
  • templates/: 기본 HTML 템플릿 (index.html)
  • README.md: 프로젝트 문서

4. 동작 원리

  • 애플리케이션 초기화 (app.py):
  • create_app() 함수로 Flask 인스턴스 생성
  • services.init_redis()로 Redis 연결 설정
  • routes.pymain_bp 블루프린트 등록
  • URL 축소 (routes.py & services.py):
  1. POST /shorten 요청 수신, long_url 검증
  2. services.generate_and_store_url(long_url) 호출
  3. r.incr('next_short_id')고유 ID 생성
  4. ID를 Base62 문자열로 변환 (예: A1a)
  5. r.set(short_code, long_url)Redis에 저장
  • URL 리디렉션:
  1. GET / 요청 시 short_code 추출
  2. services.get_long_url(short_code)로 Redis에서 long_url 검색
  3. 존재 시 HTTP 리디렉션, 없으면 404 Not Found 반환

결론

  • 실무 팁: Redis의 incrset 명령어를 활용한 고속 ID 생성 및 저장이 핵심
  • 구현 예시: GitHub 링크에서 단계별 코드 확인 가능
  • 권장사항: Base62 인코딩 함수는 별도로 구현하거나 base62 라이브러리 사용 권장