Python과 Django로 만든 중고거래 플랫폼 프로토타입이다. 회원가입, 상품 등록·검색, 구매자와 판매자의 1:1 문의, 차단·신고, 구매 요청, 연결 계좌 결제, 구매 확정과 판매자 정산, 관리자 기능을 제공한다.
| 요구사항 | 구현 내용 |
|---|---|
| 플랫폼 가입 | Django 인증 기반 회원가입·로그인·로그아웃 |
| 상품 등록과 조회 | 상품 등록·목록·상세·수정·소프트 삭제·이미지 업로드 |
| 사용자 간 소통 | 상품별 구매자-판매자 비공개 1:1 문의 |
| 악성 사용자·상품 차단 | 사용자 개인 차단, 신고 접수, 관리자 계정 비활성화·상품 차단 |
| 결제와 정산 | 계좌 연결, 상품 가격 결제, 구매 확정 대기, 판매자 정산, 결제 취소 환불 |
| 상품 검색 | 제목·설명·지역 검색, 카테고리·거래 상태 필터, 가격 정렬 |
| 관리자 관리 | Django Admin에서 사용자·상품·신고·거래·결제 원장 관리 |
사용자 화면과 데이터 흐름은 일반 결제 서비스처럼 동작한다.
구매 요청 -> 판매자 승인 -> 구매자 결제 -> 구매 확정 대기
-> 구매자 구매 확정 -> 판매자 정산 완료
-> 결제 취소 -> 환불 완료
은행 계좌 연결 부분은 외부 은행 API를 대신하는 프로토타입 어댑터이다. 입력한 계좌번호 전체 값은 저장하지 않고 끝 4자리와 임의 연결 토큰만 저장한다. Payment 원장에는 주문 번호, 상품 가격, 구매자·판매자, 결제·정산·환불 상태가 기록된다. 실제 은행망 연결 시에는 계좌 연결과 출금·환불·정산 호출 부분을 정식 금융 API로 교체해야 한다.
cd [해당 프로젝트 폴더]Windows PowerShell:
py -m venv .venv
.\.venv\Scripts\Activate.ps1macOS 또는 Linux:
python3 -m venv .venv
source .venv/bin/activate--> Visual Studio Code 등으로 사용 시 프로젝트 폴더를 VSC로 열면 됨
python -m pip install -r requirements.txtpython manage.py migrate기존 데이터베이스에는 0002_replace_wallet_with_payments 마이그레이션이 적용되면서 계좌 연결과 결제 원장 구조가 생성된다.
python manage.py seed_demo --confirm-local-demo이 명령은 화면 확인용 판매자·구매자, 마스킹된 연결 계좌와 상품을 만든다. --> 이 데모 데이터를 생성하기 위해선 DEBUG 모드가 True여야 한다. 하지만 이로 인해 잘못된 주소를 접속할 때 사전에 마련된 URL이 아닌 다른 URL들이 보이는 오류 페이지가 뜨게 되는데 실제 배포 시에는 DEBUG 모드를 False로 해서 실행하면 URL 정보가 나오지 않고 따로 마련된 404.html이 실행되는 것을 확인할 수 있다.
python manage.py runserverCF) DEBUG를 False로 바꾸고 실행하고 싶은 경우
$env:DJANGO_DEBUG = "false"
python manage.py runserver --insecure브라우저에서 http://127.0.0.1:8000/으로 접속한다. runserver 대신 실제 배포에서는 운영용 WSGI/ASGI 서버를 사용해야 한다.
- 판매자와 구매자가 각각
계좌 관리에서 계좌를 연결한다. - 구매자가 상품 상세 화면에서 구매 요청을 보낸다.
- 판매자가
거래화면에서 요청을 승인한다. - 구매자가
결제하기를 눌러 상품 금액과 연결 계좌를 확인하고 결제한다. - 결제 상태가
결제 완료 - 구매 확정 대기로 표시된다. - 구매자가 상품 수령 후
구매 확정을 누르면정산 완료로 바뀐다. - 구매 확정 전 취소하면 결제 원장은
환불 완료로 바뀌고 상품은 다시 판매 중이 된다.
python manage.py createsuperuser관리자 계정으로 /admin/에 접속하면 사용자, 상품, 구매 요청, 신고, 대화, 연결 계좌 상태와 결제 원장을 조회할 수 있다. 결제 원장은 분쟁 확인을 위해 관리자도 새로 만들거나 삭제할 수 없고 주요 필드가 읽기 전용이다.
python manage.py test
python manage.py makemigrations --check --dry-run운영 환경 보안 설정도 검사할 수 있다.
$env:DJANGO_SETTINGS_MODULE="config.settings_production"
$env:DJANGO_SECRET_KEY="충분히-길고-무작위인-운영용-비밀키"
$env:DJANGO_ALLOWED_HOSTS="example.com"
$env:DJANGO_REDIS_URL="redis://127.0.0.1:6379/1"
python manage.py check --deploy- 비밀번호는 Django의 비밀번호 해시로 저장하고 로그인 연속 실패를 제한합니다. 운영에서는 Redis로 여러 웹 프로세스가 같은 실패 횟수를 공유한다.
- 상품 수정, 구매 승인, 결제, 대화 조회마다 서버에서 현재 사용자의 객체 권한을 검사한다.
- 상태 변경은 POST와 CSRF 토큰을 사용한다.
- 검색은 Django ORM, 출력은 템플릿 이스케이프와 CSP를 적용한다.
- 업로드 이미지는 파일 크기, 실제 형식, 픽셀 수, 예상 디코딩 메모리와 재인코딩 결과 크기를 검사한다.
- 판매자는 정산 계좌가 있어야 구매 요청을 승인할 수 있다.
- 결제 금액은 브라우저 입력을 믿지 않고 서버의 상품 가격에서 결정한다.
- 계좌번호 전체 값은 저장하지 않고 끝 4자리와 연결 토큰만 저장한다.
- 결제 전 현재 비밀번호를 다시 확인하고 일회성 주문 UUID로 이중 결제를 막는다.
- 구매 확정과 환불은 트랜잭션과 행 잠금으로 결제·구매·상품 상태를 함께 변경한다.
- 상품 수정도 행 잠금으로 현재 상태를 다시 확인하고, DB는 상품별 승인·완료 거래를 하나만 허용한다.
- 결제·정산·환불 직전에 상품 차단, 계정 활성, 사용자 차단 관계를 다시 확인한다.
- 존재하지 않는 주소는 내부 URL 목록을 노출하지 않는 일반 404로 응답하며, 관리자 상품 차단은 상품 변경 권한과 처리자 로그를 요구한다.
상세 설계와 검증 결과는 개발 보고서와 보안 체크리스트에 기록했다.
- Python 3.12
- Django 5.2 LTS
- SQLite(로컬 개발), PostgreSQL 전환 가능
- Django Template, HTML, CSS
- Pillow 이미지 검증·재인코딩