Hydrogen
Commerce primitives for you and your coding agents. Add cart, products, money, and accounts to the framework you already use.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
요즘 정가에 물건을 구매해 웃돈을 붙여서 파는, 일명 되팔램이 중고거래에 성행하면서 정작 갖고 싶어하는 사람들이 돈을 더 주고 사야하는 불편함이 늘어나고 있습니다. 또 같은 제품을 파는 가게가 저렴한 가게의 제품을 대량 구매한 후 가격을 올려서 팔아 소비자들이 같은 제품을 비싸게 주고 사야하는 경우가 많아지고 있습니다. 이런 불편함을 줄이기 위해 한 사람당 한 물건을 최대 5개까지만 구매할 수 있는 정책을 추가한 쇼핑몰을 만들게 되었습니다. 전시용, 보관용, 예비용1, 예비용2, 선물용으로 생각해서 넉넉하게 5개로 정하게 되었습니다. 배포 사이트 : https://nextgacha.vercel.app 관리자 페이지 : https://nextgacha.vercel.app/manager 1. 사람1이 A가챠의 a캐릭터를 5개 구매 • 상품 확인, 배송중 상태일 때 사람1은 A가챠 a캐릭터는 구매 불가능, A가챠 b캐릭터 / B가챠 a캐릭터는 각각 5개 구매 가능 • A가챠의 a캐릭터 3개가 배송 완료가 되면 사람1은 A가챠 a캐릭터를 다시 최대 5개까지 구매할 수 있음檢視完整 README ↗
요즘 정가에 물건을 구매해 웃돈을 붙여서 파는, 일명 되팔램이 중고거래에 성행하면서 정작 갖고 싶어하는 사람들이 돈을 더 주고 사야하는 불편함이 늘어나고 있습니다. 또 같은 제품을 파는 가게가 저렴한 가게의 제품을 대량 구매한 후 가격을 올려서 팔아 소비자들이 같은 제품을 비싸게 주고 사야하는 경우가 많아지고 있습니다. 이런 불편함을 줄이기 위해 한 사람당 한 물건을 최대 5개까지만 구매할 수 있는 정책을 추가한 쇼핑몰을 만들게 되었습니다.
전시용, 보관용, 예비용1, 예비용2, 선물용으로 생각해서 넉넉하게 5개로 정하게 되었습니다.
배포 사이트 : https://nextgacha.vercel.app 관리자 페이지 : https://nextgacha.vercel.app/manager
사람1이 A가챠의 a캐릭터를 5개 구매
사람1이 A가챠의 a캐릭터 3개 구매
1명 (기획, 프론트, 백, 디자인)
| 분류 | 기술 |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | TypeScript |
| Database | MongoDB |
| Auth | NextAuth v5 (카카오 OAuth) |
| 결제 | TossPayments SDK |
| 서버 상태 | TanStack React Query v5 |
| 전역 상태 | Jotai |
| 스타일링 | Vanilla Extract |
| 이미지 저장 | Vercel Blob |
| 테스트 | Node test runner (node:test) |
| 배포 & 모니터링 | Vercel |
장바구니(보유) + 배송중(keep) + 임시 수량을 실시간으로 합산해 최대 5개를 넘지 않도록 검증합니다. 재고가 5개 미만이면 재고 수를 상한으로 적용합니다.
총 소유 = 장바구니 수량 + 배송중 수량 + 현재 선택 수량
유효 상한 = min(5, 재고)
추가 가능 여부 = 총 소유 < 유효 상한
검증은 클라이언트(hook), API, 결제 확인 시 3단계로 이루어집니다.
결제 승인 시 포인트 차감 → 재고 감소 → 주문 생성 → 장바구니 초기화를 MongoDB 트랜잭션으로 묶어 원자성을 보장합니다. 어느 단계에서든 실패하면 전체 롤백됩니다.
await mongodbSession.withTransaction(async () => {
await reducePoint({ ... });
await reduceStock({ ... });
await addOrder({ ... });
await resetCart({ ... });
});
장바구니 수량 변경 시 서버 응답을 기다리지 않고 UI를 즉시 업데이트합니다. 요청 실패 시 이전 상태로 자동 복원합니다.
| 구분 | 저장소 | 설명 |
|---|---|---|
| 임시 장바구니 | Jotai (메모리) | 상품 상세 페이지에서 수량 조정 |
| 실제 장바구니 | MongoDB | 담기 버튼 클릭 후 DB에 저장 |
실수로 장바구니에 추가되는 상황을 방지하고 탐색 중 자유로운 수량 조정을 지원합니다.
장바구니 조회 시 $facet으로 장바구니, 배송중 항목, 재고 데이터를 단일 쿼리로 동시에 가져옵니다. 품절된 상품은 자동으로 장바구니에서 제거됩니다.
src/components/
├── atoms/ # 버튼, 태그, 슬라이더 등 기본 단위
├── molecules/ # 카드, 검색바, 장바구니 항목 등 조합
├── organisms/ # 헤더, 모달, 구매 패널 등 독립 섹션
├── templates/ # 페이지 레이아웃
└── pages/ # 페이지 단위 컴포넌트
src/
├── app/
│ ├── (router)/ # 사용자/관리자 페이지
│ ├── api/ # API 라우트 (30+)
│ └── hooks/ # 커스텀 훅
├── components/ # Atomic Design 컴포넌트
├── lib/ # 서버 유틸리티 (결제, 재고, 주문)
├── jotai/ # 전역 상태 정의
├── api/ # 서버 데이터 페칭 함수
├── shared/ # 공유 타입 및 유틸
└── styles/ # 전역 테마
Vanilla Extract를 사용해 빌드 타임에 CSS를 생성합니다. 런타임 오버헤드 없이 타입 안전한 스타일링이 가능합니다.
/api/protected/*, /mypage/* 는 미들웨어로 보호