B. 포토카드 16번 (총 발행량 10장, 유저 16이 모두 소유)

필드 프론트엔드 활용 로직
id 16 CardType.id
title '포토카드 16번' CardType.title
author 'user16' CardType.authorId
total 10 CardType.totalIssuedCount
myOwnedCount 10 (유저가 소유한 총 수량)
myListedTotal 7 (나의 판매 등록 총합) 5 + 2
myUnlistedCount 3 (마이 갤러리 잔여 수량) 10 - 7
saleOptions (아래 표 참고) SaleListing 리스트

JavaScript

`// Data for Card ID 16 { id: 16, title: '포토카드 16번', genre: '사물', grade: 'LEGENDARY', author: 'user16', price: 14, total: 10, // CardType.totalIssuedCount image: 'img_card', created_at: '2025-12-04T10:00:00',

// (추가 데이터) 유저의 소유 및 리스팅 현황 myOwnedCount: 10, // 유저가 소유한 총 수량 myListedTotal: 7, // 판매 등록 수량 합계 myUnlistedCount: 3, // 마이 갤러리 잔여 수량 (10 - 7)

saleOptions: [ // SaleListing 정보 { type: 'SALE', remain: 5, status: 'AVAILABLE', }, // 5장 판매 등록 (판매 중) { type: 'EXCHANGE', remain: 2, status: 'AVAILABLE', }, // 2장 교환 등록 (교환 제안 대기 중 - 제안이 없는 상태) ], },`


2. 각 페이지별 데이터 처리 및 표시 로직

A. 마켓 플레이스 (Marketplace)

조회 대상: 모든 CardType 데이터 (위 통합 데이터)

포토카드 전체 잔여 수량 SOLD OUT 판단 마켓 표시 내용
15번 2 (SALE) + 1 (EXCHANGE) = 3장 SOLD OUT 아님 가격 6, 판매 중 (3장 남음)
16번 5 (SALE) + 2 (EXCHANGE) = 7장 SOLD OUT 아님 가격 14, 판매 중 (7장 남음)

B. 나의 포토카드 판매 페이지 (My Selling Cards)

조회 대상: 유저가 등록한 SaleListing 데이터 (saleOptions 배열을 항목별로 분리)

포토카드 saleOption 항목 type remain status 페이지 표시 상태 SOLD OUT 아이콘
15번 항목 1 SALE 2 AVAILABLE 판매 중 X
15번 항목 2 EXCHANGE 1 EXCHANGE_OFFER 교환 제시 대기 중 X
16번 항목 3 SALE 5 AVAILABLE 판매 중 X
16번 항목 4 EXCHANGE 2 AVAILABLE 판매 중 (교환 대기) X

만약 포토카드 15번의 remain이 0이었다면?

saleOptions: [{ type: 'SALE', remain: 0, status: 'SOLD_OUT' }]

이 경우, 나의 판매 포토카드에는 해당 항목이 type: SALE, remain: 0, 상태: 품절로 표시됩니다.

C. 마이 갤러리 (My Gallery)

조회 대상: 유저가 소유한 미등록 재고 (myUnlistedCount > 0인 데이터)

포토카드 잔여 수량 (myUnlistedCount) 표시 내용
15번 4장 포토카드 15번 (4장 소유)
16번 3장 포토카드 16번 (3장 소유)

핵심: 마이 갤러리에는 유저가 소유하고 있는 총 7장(4+3)의 포토카드가 미등록 재고로 표시됩니다.

판매중