옵션은 단순한 선택지가 아닙니다. 실전에서는 재고와 가격이 옵션마다 다르죠. 구조가 생명이에요!
안녕하세요! 쇼핑몰 개발을 깊이 있게 따라오신 여러분 반갑습니다.
이번 편에서는 정말 실무에서 많이들 막히는 부분, 바로 "옵션별 재고 및 가격 관리"에 대해 집중적으로 다뤄보겠습니다. “색상: 검정 / 사이즈: L”은 10개 남았고, “색상: 흰색 / 사이즈: M”은 품절 상태. 이런 상황을 코드와 DB로 정확히 표현하지 않으면, 실사용자가 엉뚱한 상품을 주문하게 되죠. 그래서 오늘은 Laravel + MySQL을 활용해, 실시간 재고 감소, 품절 처리, 가격 커스터마이징, 옵션 조합 변경까지 가능한 구조를 만들어봅니다. 정말 중요한 파트인 만큼, 최대한 상세하게 보여드릴게요.
목차
옵션별 재고/가격 구조 개요
우리가 앞서 구성한 product_option_sets
테이블이 바로 핵심입니다. 이 테이블은 각각의 옵션 조합에 대해 재고, 가격, 활성 상태를 관리하는 역할을 하죠.
예: “검정 / M” → 가격 39,000원 / 재고 8개 “흰색 / L” → 가격 41,000원 / 품절 이런 데이터가 product_option_sets에 기록됩니다.
ProductOptionSet 모델 필드 설계
Laravel의 마이그레이션으로 다음과 같이 필드를 설계할 수 있습니다.
필드명 | 설명 | 타입 |
---|---|---|
product_id | 해당 상품의 ID | unsignedBigInteger |
option_value_ids | 옵션 조합 (예: [3, 7]) | JSON or string |
stock | 남은 재고 수량 | integer |
price | 해당 조합 가격 | decimal(10,2) |
is_active | 품절 여부 / 노출 여부 | boolean |
여기서 option_value_ids
는 array로 cast
해서 사용하면 코드가 매우 깔끔해집니다. Eloquent의 $casts
속성으로 간단히 설정 가능해요.
주문 흐름에서 재고 차감 처리
재고 차감은 주문 완료 직후에 처리하는 것이 일반적입니다. Laravel에서는 OrderController
또는 OrderService
안에서 트랜잭션으로 안전하게 처리하는 걸 추천합니다.
- 클라이언트에서 선택한 옵션 조합 ID 전송
- 해당 조합의 재고를 조회 → 수량 확인
- 재고가 충분하면
stock - n
→ 저장 - 동시에 주문 테이블과 연동
- 트랜잭션으로 실패 시 롤백 처리
예외 상황(재고 부족, 동시 주문 등)을 고려해 DB Lock을 걸거나 Optimistic Lock (version 필드)을 적용하면 더욱 안정적이에요.
Vue 기반 실시간 재고 UI 구성
재고와 가격을 사용자에게 실시간으로 보여주는 건 매우 중요합니다. Vue에서는 옵션 조합이 선택되면, 해당 조합의 stock, price 정보를 불러와 보여줄 수 있어요.
- 옵션 선택 → 조합 ID 계산 → API 호출로 재고/가격 fetch
- "재고 있음 / 품절" 텍스트 표시 및 구매 버튼 제어
- 재고가 0이면 장바구니 버튼 자동 비활성화
실시간 반영이 되지 않으면 사용자 경험이 급격히 나빠지기 때문에, computed, watch, debounce 처리를 함께 사용하면 UX가 훨씬 부드러워집니다.
옵션별 가격 변동 처리 방법
색상이나 사이즈에 따라 가격이 달라지는 경우도 많죠? 예: XL은 +2,000원, 특수 색상은 +5,000원. 이런 경우도 product_option_sets 테이블의 price
필드를 활용하면 해결됩니다.
- 기본 상품 가격은
products
테이블에 존재 - 옵션 조합의
price
는 해당 조합 기준으로 덮어쓰기 - 조합 가격이 없으면 기본가를 fallback으로 사용
프론트(Vue)에서는 조합 선택 시 API 응답에 따라 가격을 변경 표시하면 되고, 백엔드에서는 주문 저장 시 해당 옵션 조합의 가격을 기준으로 금액 계산을 진행하면 됩니다.
운영 경험 기반 Best Practice
- 재고 = 0일 때는 품절 처리 + 버튼 비활성화
- 재고 음수 방지 → 트랜잭션/락 처리
- 가격 변경은 관리자 UI에서 조합별로 직접 입력
- 재고 부족 상품은 목록에서 숨기기 or 표시 옵션 선택
이 구조는 실제 쇼핑몰 수백개를 유지보수하며 검증된 패턴입니다. “품절이지만 계속 노출할지”, “조합이 너무 많아지는 경우 페이지 속도 문제는?” 이런 이슈는 다음 고급편에서 다뤄보겠습니다!
상품 옵션이 많아질수록 복잡해지는 재고와 가격 관리…
이번 글을 통해 여러분이 이 구조를 제대로 이해하고 직접 적용해볼 수 있기를 바랍니다. 특히 Laravel의 관계형 모델, Vue의 실시간 반응형 UI, 그리고 MySQL의 성능까지 모두 조화롭게 연결되어야 고객이 오류 없이, 빠르게, 원하는 상품을 주문할 수 있어요. 저는 실무에서 이 구조로 수십만건의 재고를 관리하면서 정말 효율적으로 운영할 수 있었습니다.
다음 편에서는 “옵션 조합 캐싱 및 속도 최적화”에 대해 다뤄볼까 해요.
댓글이나 DM으로 질문도 편하게 주세요! 항상 감사합니다 🙏
'💻 쇼핑몰 자동화 & 웹 개발 가이드' 카테고리의 다른 글
[쇼핑몰 개발] 주문 처리 & 정산 시스템 설계 가이드 (2) | 2025.05.26 |
---|---|
[쇼핑몰 개발] Laravel 옵션 캐싱 + 속도 최적화 핵심 전략 (2) | 2025.05.23 |
[쇼핑몰 개발] 상품 옵션 & 카테고리 연동 시스템 완전 정복 (3) | 2025.05.21 |
[쇼핑몰 개발] Vue + Laravel 상품 등록 시스템 만들기 실습 (3) | 2025.05.20 |
[쇼핑몰 개발] PHP + MySQL로 구축하는 실전 쇼핑몰 설계 전략 (4) | 2025.05.19 |