MAKITTDocs

Market

docs/domain/market.md

Market

개요

마켓(국가/지역)별 메타데이터를 관리하는 도메인. 각 마켓의 통화, 세금 체계, 사업자 정보 필드, 필수 정책, 권장 결제/인증 수단 등을 정의한다.

MarketMeta는 **Shop 생성/설정을 위한 참고 데이터(SSOT)**이다. Shop이 마켓을 선택하면 해당 마켓의 메타데이터를 기반으로 온보딩 항목, 사업자 폼, 필수 정책 페이지 등을 동적으로 구성한다.

서버 패키지: com.makitt.core.domain.market


DynamoDB Entity

MarketMeta

패턴예시
PKMARKET#{marketCode}MARKET#KR
SKMETAMETA
GSI1 PKSYSTEMSYSTEM
GSI1 SKMARKET#{marketCode}MARKET#KR

필드 목록

필드DynamoDB Attribute타입설명
marketCodemarket_codeString마켓 코드 (KR, US, JP, SG)
namenameString마켓 이름
currencycurrencyString통화 코드 (KRW, USD, JPY, SGD)
localelocaleString로케일 (ko, en, ja)
taxestaxesList<MarketTax>세금 체계 정의
businessInfoFieldsbusiness_info_fieldsList<BusinessInfoFieldDef>사업자 정보 필드 (전체, 레거시)
businessInfoFieldsByTypebusiness_info_fields_by_typeMap<String, List<BusinessInfoFieldDef>>사업자 유형별 필드 정의
requiredPoliciesrequired_policiesList<RequiredPolicyDef>필수 약관/정책 정의
recommendedProcessorsrecommended_processorsList<String>권장 결제 프로세서
recommendedOAuthrecommended_oauthList<String>권장 소셜 로그인
timezonetimezoneString기본 타임존
numberingSystemnumbering_systemString숫자 표기 체계
dateTimeFormatdate_time_formatString날짜/시간 포맷

Nested Objects

MarketTax

마켓의 세금 체계를 정의. 실제 세율 계산이 아닌, "이 마켓은 어떤 세금 체계인가"에 대한 참고 정보.

필드타입설명
codeString세금 코드 (KR_VAT, US_SALES_TAX, JP_CT, SG_GST)
nameString세금 이름 (부가가치세, Sales Tax, 消費税, GST)
typeTaxType세금 유형 enum (VAT, SALES_TAX, CONSUMPTION_TAX, GST)
priceInclusiveDefaultBoolean가격 포함 표시 기본값 (true=포함, false=별도)
rateModeRateMode세율 결정 방식 (FIXED, LOOKUP)
displayRateHintStringUI 표시용 세율 힌트 ("10%", "VARIES")
setupChecklistList<String>셀러 준비 항목 목록

소비되는 곳:

  • Admin 마켓 관리 페이지: 세금 정의 생성/수정
  • Shop 생성 시: 마켓 정보 패널에 세금 체계 표시

BusinessInfoFieldDef

마켓별 사업자 정보 폼 필드를 정의. 어떤 필드를 어떤 섹션에, 어떤 순서로, 필수 여부와 함께 보여줄지를 결정.

필드타입설명
fieldString필드 키 (businessNumber, representativeName, ein 등)
sectionString섹션 분류: registration, contact, hours
requiredBoolean필수 여부
displayOrderInteger섹션 내 정렬 순서

소비되는 곳:

  • 온보딩 위저드 BusinessInfoStep: registration 섹션 필드만 렌더링
  • VendorManagement 페이지: 전체 섹션 필드 렌더링
  • MarketBusinessInfoForm: 섹션별 그룹핑 + displayOrder 정렬
  • ShopMarketProfileApplication (서버): 필수 필드 검증

i18n 번역 키: shopGeneral.businessInfo.fields.{field} (예: shopGeneral.businessInfo.fields.businessNumber → "사업자등록번호")

businessInfoFieldsByType (사업자 유형별 필드)

businessInfoFields가 모든 사업자 유형에 동일한 필드를 제공하는 반면, businessInfoFieldsByType은 유형별로 다른 필드 세트를 정의한다.

키는 사업자 유형 문자열: INDIVIDUAL, SOLE_PROPRIETOR, CORPORATION

KR 마켓 예시:

유형registration 필드
INDIVIDUALrepresentativeName, postalCode, businessAddress
SOLE_PROPRIETORbusinessNumber, onlineBusinessNumber(선택), companyName, representativeName, postalCode, businessAddress
CORPORATIONbusinessNumber, onlineBusinessNumber, companyName, representativeName, postalCode, businessAddress

소비되는 곳:

  • 온보딩 위저드 BusinessInfoStep: businessInfoFieldsByType[businessType] 우선 사용, 없으면 businessInfoFields fallback
  • VendorManagement 페이지: 사업자 유형 선택에 따라 필드 변경 (향후 적용)

RequiredPolicyDef

마켓별 법적으로 필요한 약관/정책 페이지를 정의.

필드타입설명
slugString정책 슬러그 (terms-of-service, privacy-policy, refund-policy)
labelString정책 이름 (이용약관, 개인정보처리방침)
categoryString카테고리: TERMS, POLICY, LEGAL_NOTICE
legalBasisString법적 근거 (전자상거래법 제10조, CCPA 등)
placementsList<String>배치 위치 (footer, checkout, signup)
mandatoryBoolean필수 여부
displayOrderInteger정렬 순서

소비되는 곳:

  • StaticPageApplication (서버): Shop 생성 시 마켓별 필수 정책 페이지 자동 생성
  • PolicyManagement 페이지 (클라이언트): 정책 편집기에서 필수 정책 정의 표시

Enums

TaxType

설명마켓
VAT부가가치세KR
SALES_TAX판매세 (주/지역별 상이)US
CONSUMPTION_TAX소비세JP
GST상품서비스세SG

RateMode

설명
FIXED고정 세율 (KR 10%, JP 10%/8%, SG 9%)
LOOKUP주소/상품 기반 조회 (US Sales Tax)

API

조회 API (일반 사용자)

GET /api/v1/markets              -> 전체 Market 목록
GET /api/v1/markets/{code}       -> 특정 Market 메타데이터

Admin CRUD API

POST   /api/v1/admin/markets             -> 새 마켓 생성
PUT    /api/v1/admin/markets/{code}      -> 마켓 수정
DELETE /api/v1/admin/markets/{code}      -> 마켓 삭제

데이터 소비 맵

MarketMeta의 각 필드가 어디서 소비되는지를 정리한다.

서버 소비

필드소비자용도
businessInfoFieldsShopMarketProfileApplication필수 사업자 정보 필드 검증, 온보딩 BUSINESS_INFO_SET 완료 판단
requiredPoliciesStaticPageApplicationShop 생성 시 마켓별 필수 정책 StaticPage 자동 생성
timezone, currency, localeShopMarketProfileApplicationMarketLocaleSettings 초기화 → Shop 기본 로케일 설정

클라이언트 소비

필드소비자 (컴포넌트/페이지)용도
marketCode, nameCreateShopPage, MarketSelector, MarketConfigSection마켓 선택 UI, 검색/필터
currencyMarketConfigSection통화 표시
taxesAdmin 마켓 관리 페이지세금 정의 생성/수정/표시
businessInfoFieldsMarketBusinessInfoForm, VendorManagement사업자 정보 폼 필드 렌더링 (레거시, 유형 무관)
businessInfoFieldsByTypeBusinessInfoStep (온보딩 위저드)사업자 유형별 폼 필드 렌더링
requiredPoliciesPolicyManagement정책 편집기에서 필수 정책 정의 매칭
recommendedProcessorsAdmin 마켓 목록결제 프로세서 로고/이름 표시
recommendedOAuthAdmin 마켓 목록OAuth 제공자 표시

데이터 흐름

MarketMeta (DynamoDB)
    │
    ├──→ MarketService → MarketApplication → MarketController
    │       GET /api/v1/markets
    │
    ├──→ ShopMarketProfileApplication
    │       - 필수 사업자 필드 검증
    │       - MarketLocaleSettings 초기화
    │
    ├──→ StaticPageApplication
    │       - 필수 정책 페이지 자동 생성
    │
    └──→ Client (React Query 캐시)
            │
            ├──→ 온보딩 위저드 (BusinessInfoStep, CreateShopStep)
            ├──→ VendorManagement (사업자 정보 관리)
            ├──→ PolicyManagement (정책 관리)
            ├──→ CreateShopPage (샵 생성, 마켓 선택)
            └──→ Admin 마켓 관리 (CRUD)

현재 마켓 데이터

KR (한국)

항목
currencyKRW
localeko
timezoneAsia/Seoul
taxesKR_VAT (VAT, 10%, FIXED)
recommendedProcessorsTOSS_PAYMENTS, STRIPE
recommendedOAuthKAKAO, NAVER, GOOGLE, APPLE
requiredPolicies이용약관, 개인정보처리방침, 반품/환불 정책

US (United States)

항목
currencyUSD
localeen
timezoneAmerica/New_York
taxesUS_SALES_TAX (SALES_TAX, VARIES, LOOKUP)
recommendedProcessorsSTRIPE
recommendedOAuthGOOGLE, APPLE, FACEBOOK
requiredPoliciesTerms of Service, Privacy Policy, Refund Policy

JP (日本)

항목
currencyJPY
localeja
timezoneAsia/Tokyo
taxesJP_CT (CONSUMPTION_TAX, 10%/8%, FIXED)
recommendedProcessorsSTRIPE
recommendedOAuthGOOGLE, APPLE, LINE
requiredPolicies利用規約, プライバシーポリシー, 返品・返金ポリシー, 特定商取引法に基づく表記

SG (Singapore)

항목
currencySGD
localeen
timezoneAsia/Singapore
taxesSG_GST (GST, 9%, FIXED)
recommendedProcessorsSTRIPE
recommendedOAuthGOOGLE, APPLE, FACEBOOK
requiredPoliciesTerms of Service, Privacy Policy, Refund Policy

서버 아키텍처

makitt-core/
  com.makitt.core.domain.market/
    entity/
      MarketMeta.java              # DynamoDB Entity
      MarketTax.java               # 세금 체계 Nested Object
      BusinessInfoFieldDef.java    # 사업자 정보 필드 정의
      RequiredPolicyDef.java       # 필수 정책 정의
      TaxType.java                 # 세금 유형 Enum
      RateMode.java                # 세율 결정 방식 Enum
    service/
      MarketService.java           # Service (Repository 래핑)
    repository/
      MarketRepository.java        # DynamoDB Repository
    vo/
      MarketResponseVo.java
      MarketTaxVo.java
      CreateMarketRequestVo.java
      UpdateMarketRequestVo.java

makitt-application/
  com.makitt.application.market/
    MarketApplication.java         # Application (비즈니스 로직)

makitt-api/
  com.makitt.api.controller.market/
    MarketController.java          # 조회 API
  com.makitt.api.controller.admin/
    MarketAdminController.java     # Admin CRUD API
  com.makitt.api.dto.market/
    MarketResponse.java
    BusinessInfoFieldDefDto.java
    RequiredPolicyDefDto.java
    MarketTaxResponse.java
    CreateMarketRequest.java
    UpdateMarketRequest.java
  com.makitt.api.config/
    MarketSeedDataInitializer.java # 시드 데이터 초기화

GSI (Global Secondary Index)

GSIPK 패턴SK 패턴용도
EntityLookupIndexSYSTEMMARKET#{marketCode}전체 마켓 목록 조회

MarketMeta는 소규모 데이터(4~10개)이므로 SYSTEM을 PK로 고정하여 전체 목록을 한 파티션에서 조회.


Key Builder

MarketKey.pk(marketCode)          -> "MARKET#{marketCode}"
MarketKey.sk()                    -> "META"
MarketKey.gsi1Pk()                -> "SYSTEM"
MarketKey.gsi1Sk(marketCode)      -> "MARKET#{marketCode}"
MarketKey.gsi1SkPrefix()          -> "MARKET#"
MarketKey.extractMarketCode(pk)   -> marketCode