- 이 저장소는 개인용 URL 단축 서비스
Shortly이다. - Python 3.10 이상, Flask, SQLite를 사용한다.
- 관리자 계정은 한 개이며 로그인한 사용자만 링크 생성·목록 확인·삭제를 할 수 있다.
- 단축 URL 접속 시 원본 URL로 리디렉션하고 조회수를 증가시킨다.
- 프로토콜이 없는 입력에는
https://를 자동으로 붙인다. http://,https://뿐 아니라obsidian://,mailto:,tel:같은 커스텀 프로토콜도 허용한다.javascript:,data:,vbscript:처럼 위험한 스킴은 차단한다.- 동일한 원본 URL이 이미 있으면 새 행을 만들지 말고 기존 단축 URL을 재사용한다.
- 링크 생성 또는 중복 감지 후 단축 URL과 복사 버튼을 입력 영역 아래에 표시한다.
- 다크 모드는
system,light,dark를 지원한다. 명시적인 사용자 선택만localStorage에 저장하고,system상태에서는 운영체제 설정 변경을 따른다. - 화면 문구는 자연스러운 한국어를 사용하고 모바일 및 키보드 접근성을 유지한다.
app.py: Flask 애플리케이션, 인증, SQLite, URL 검증 및 리디렉션templates/: 로그인 및 대시보드 템플릿static/style.css: 라이트·다크 테마와 반응형 스타일static/theme.js: 테마 감지, 저장 및 전환tests/test_app.py: 핵심 애플리케이션 테스트instance/urls.sqlite3: 로컬 데이터이며 Git에 포함하지 않는다.
- 작업을 시작하기 전에
git status --short로 기존 변경사항을 확인한다. - 사용자의 기존 변경사항과 SQLite 데이터를 보존한다.
- 요청 범위를 넘어서는 리팩터링이나 동작 변경은 하지 않는다.
- 비밀정보를 코드에 하드코딩하거나 출력하지 않는다.
.env,.venv/,instance/는 Git에 추가하지 않는다.- 모든 코드와 텍스트 파일의 줄바꿈은 LF를 사용한다.
- 모든 코드는 의도와 구조를 쉽게 파악할 수 있도록 human-readable하게 작성한다.
- HTML, CSS, JavaScript, Python은 기존 파일의 포맷을 유지하며 여러 문장이나 선언을 한 줄로 압축하지 않는다.
- CSS는 선택자와 선언을 여러 줄로 나누고, 선언당 한 줄과 2칸 들여쓰기를 사용한다.
- CSS를 수정한 뒤에는 기존 pretty-print 형식을 유지한다.
- 커밋은 사용자가 명시적으로 요청한 경우에만 만든다.
- 작업 완료 응답에는 항상 핵심
git diff와 실행한 검증 결과를 함께 보여준다.
기능 또는 템플릿을 변경한 뒤 전체 테스트를 실행한다.
.\.venv\Scripts\python.exe -m pytest -qLinux 또는 WSL에서는 다음 명령을 사용한다.
.venv/bin/python -m pytest -qstatic/theme.js를 변경했다면 JavaScript 문법 검사도 실행한다.
node --check static/theme.js포맷 변경 후에는 git diff --check를 실행한다. 작업 완료 전 git status --short와 git diff를 다시 확인한다.
개발 서버는 다음 주소에서 실행한다.
http://127.0.0.1:5000
Windows 실행 예시:
.\.venv\Scripts\python.exe -m flask --app app run --host 0.0.0.0 --port 5000- 서버를 시작하거나 재시작하기 전에 포트 5000의 기존 리스너를 확인한다.
- 이 환경에서는 터미널의
Ctrl+C가 Flask 하위 프로세스를 종료하지 못할 수 있다. 종료 후 반드시 실제 포트 점유 상태를 재확인한다. - 중복 서버가 있으면 이 프로젝트에서 실행한 정확한 PID만 종료한다. 관련 없는 프로세스를 종료하지 않는다.
- 서버 실행 후 포트 5000을 점유한 리스너가 정확히 하나인지 확인한다.
- Python 또는 템플릿 변경 후 실행 중인 서버가 이전 코드를 제공하면 단일 프로세스로 재시작한다. 정적 파일 변경은 일반적으로 재시작 없이 반영된다.
- 요청한 동작이 구현되어 있다.
- 기존 로그인, URL 생성, 중복 재사용, 리디렉션, 조회수, 삭제, 커스텀 프로토콜 및 테마 기능이 깨지지 않는다.
- 관련 테스트와 검사가 통과한다.
- 실행 서버와 현재 소스 코드가 일치한다.
- 최종 응답에 변경 내용, diff, 테스트 결과 및 서버 상태를 간결하게 보고한다.