변하는 장바구니와 남는 주문을 분리
장바구니는 수량과 옵션을 바꿀 수 있는 임시 선택입니다. 주문 후에는 OrderProduct에 구매 수량·당시 가격·옵션을 복사해 별도의 기록으로 남기는 구조를 구성합니다.
상품 탐색·옵션별 장바구니·주문과 PayPal 결제 연동을 구성한 Django 쇼핑몰 학습 프로젝트. MariaDB·ORM 기반 데이터 관리와 리뷰 기능을 구현했습니다.
상품·옵션·회원·장바구니·주문을 Django 앱과 모델로 나눈 쇼핑몰 학습 프로젝트입니다. 화면 목록을 넘어, 로그인 전후 장바구니의 소유권과 주문 완료 후 남겨야 할 데이터가 어떻게 달라지는지를 다룹니다.
회원·비회원의 임시 장바구니와 구매 완료 후 남겨야 할 주문 기록은 수명과 소유권이 다릅니다. 상품 옵션별 선택과 구매 시점의 정보를 구분해 관리해야 합니다.
상품과 옵션을 선택하고 장바구니를 관리한 뒤 주문 내역을 확인하는 흐름이 필요합니다. 로그인 전후에도 선택한 상품이 연결되어야 합니다.
장바구니는 수량과 옵션을 바꿀 수 있는 임시 선택입니다. 주문 후에는 OrderProduct에 구매 수량·당시 가격·옵션을 복사해 별도의 기록으로 남기는 구조를 구성합니다.
URL이 View로 연결되고, View는 ORM으로 모델을 조회하거나 Form으로 입력을 검증합니다. 결과는 context를 통해 Template에 전달하거나 JSON으로 응답합니다.
상품·옵션·장바구니·주문·결제·구매 항목의 데이터 모델과 관계 설계
Django 쇼핑몰 학습 프로젝트. 초기 커밋에는 팀 프로젝트로 표기되어 있어 아래 구현 전체를 개인 단독 기여로 표현하지 않았습니다. 설명은 저장소 수준의 구현과 변경 이력에 근거합니다.

실제 모델을 바탕으로 핵심 관계만 추렸습니다. Account의 주문·결제·리뷰 연결 등 일부 외래키는 가독성을 위해 생략했습니다.
브라우저 요청은 Django URL과 View를 거쳐 accounts, store와 category, carts, orders 앱으로 나뉩니다. ORM 모델에서 Category는 Product로, Product는 Variation으로 연결됩니다. Cartitem은 Product, Variation, 비회원 Cart 또는 Account를 참조합니다. OrderProduct는 Order, Payment, Product와 Variation을 참조합니다.
커스텀 계정, 이메일 활성화, 로그인과 프로필을 담당합니다. 로그인 시 세션 장바구니의 옵션을 기존 회원 장바구니와 비교하는 병합 로직이 있습니다.
상품·카테고리·색상/크기 옵션·리뷰·갤러리를 모델로 구분합니다. 검색, 카테고리 필터, 페이지네이션과 상품 상세 표시를 담당합니다.
Cartitem은 상품과 옵션 조합별 수량을 관리합니다. 주문 단계에서는 PayPal 승인 결과를 처리하고 Order·Payment·OrderProduct로 주문 정보와 구매 항목을 분리합니다.
코드에서는 URL·View·Model로 요청과 데이터를 연결하고 Form으로 주문 입력을 검증합니다. 기술 도입 당시의 비교 기준은 작성자 확인이 필요합니다.
상품 목록과 상세, 장바구니, 주문 화면을 서버 템플릿으로 구성합니다. Bootstrap은 화면 스타일에 사용됩니다.
PayPal JavaScript SDK의 createOrder → onApprove → actions.order.capture 흐름을 사용합니다. 캡처 응답의 details.id·status와 주문번호, payment_method=PayPal을 Django payments에 전달합니다. 현재 코드의 결제 금액은 테스트용 0.1 USD입니다.
Product·Variation·Cartitem·Order·Payment·OrderProduct를 구분하고 ORM 관계로 연결합니다. 프로젝트 DBMS는 MariaDB이며 상품·옵션·장바구니·주문·결제의 관계형 모델을 설계했습니다. 공개 저장소의 개발 설정 및 캡처용 로컬 환경과 프로젝트 사용 DBMS를 구분합니다.
URL에서 View를 호출하고 ORM 조회 결과를 Template에 전달합니다. 결제 화면은 PayPal JavaScript SDK를 사용하며 onApprove에서 capture한 결과를 Django payments에 전달하고 JSON 응답으로 주문 완료 흐름을 연결합니다.

현재 구현의 흐름입니다. 주황색 영역의 결제 결과 수신은 결제사 서버 검증 완료를 뜻하지 않으며, 원자적 트랜잭션으로 묶인 상태도 아닙니다.
상품과 옵션 선택 후 비회원은 세션 Cart, 회원은 Account 기준으로 장바구니를 조회합니다. 같은 상품·옵션이면 수량을 증가시키고 다르면 새 항목을 생성합니다. 로그인 후 주문 폼을 검증해 미완료 주문을 만들고, PayPal SDK 승인·캡처 후 브라우저가 보낸 결과로 Payment와 OrderProduct를 저장하고 재고를 감소시킨 뒤 장바구니를 지웁니다. 서버 측 결제사 검증과 트랜잭션은 후속 개선 과제입니다.
Product가 같아도 Variation 조합이 다르면 별도 항목입니다. add_cart는 기존 항목의 variation 목록과 요청 옵션을 비교해 같으면 quantity를 1 증가시키고, 다르면 새 Cartitem을 생성합니다.
비회원은 세션 키로 Cart를 찾고 회원은 user로 Cartitem을 조회합니다. 로그인할 때 두 장바구니의 옵션을 비교하여 회원에게 연결하는 분기가 있습니다. 병합 시 수량 처리의 정확성은 추가 개선이 필요한 부분입니다.
place_order는 장바구니에서 총액을 계산하고 OrderForm이 유효하면 주문을 저장합니다. 날짜와 DB ID를 조합해 order_number를 만들고, 아직 is_ordered가 false인 주문을 결제 화면에 전달합니다.
PayPal onApprove에서 actions.order.capture를 호출하고 결과를 payments로 전달합니다. 서버는 요청 사용자의 미완료 주문을 찾고 PayPal 결제 방법과 응답 상태를 Payment에 저장합니다. 각 장바구니 항목의 수량·상품 가격·옵션을 OrderProduct로 옮긴 뒤 재고를 차감하고 장바구니를 삭제하며, 마지막에 이메일과 JSON 응답을 처리합니다.
소스 코드가 공개된 쇼핑몰 학습 프로젝트입니다. 실제 서비스 적용 여부는 작성자 확인이 필요합니다.
저장소 수준에서 상품 탐색, 옵션별 장바구니, 주문 생성, 구매 시점 가격·수량 기록을 확인했습니다. 매출이나 사용자·회사 효과를 입증하는 운영 자료는 아직 없습니다.
공개 저장소의 PayPal SDK와 payments 코드를 확인했습니다. 별도 SQLite 시연 DB에서 상품 목록·상세·장바구니 화면을 실행해 캡처하고 비회원 상품 추가를 확인했습니다. PayPal 거래를 실행하지 않았으며 서버 측 결제 검증과 원자적 주문 처리 등은 추가 확인이 필요합니다.