Loading...
Loading...
본 페이지는 사이트에 표시되는 모든 가격이 어디서 나오는지, 어떻게 비교 가능한 단위로 정규화하는지, 어떤 공식으로 프리미엄을 계산하는지, 데이터를 어떻게 캐시하는지, 상위 소스가 장애일 때 무엇이 일어나는지, 그리고 결과 수치의 한계는 무엇인지를 기술적으로 상세하게 설명합니다. 여기에는 숨겨진 것이 없습니다 — 공식과 소스 목록을 읽을 수 있다면, 동일한 결과를 직접 재현할 수 있습니다.
저희는 가능한 한 각 거래소를 직접 조회합니다. 단일 글로벌 현물에서 "현지 가격"을 파생시키면 프리미엄이 기계적으로 0이 되어 사이트의 존재 이유가 사라지기 때문입니다. 아래는 실제로 호출하는 소스 목록입니다.
파이프라인에 들어오는 모든 가격은 저장 및 프리미엄 계산 전에 USD/oz(트로이온스당 USD)로 변환됩니다. 이것이 단일 기준 단위이며, 내부적으로 대시보드와 API는 USD/oz로만 값을 처리합니다. 변환 계수는 고정 상수입니다 — 1 트로이온스 = 31.1034768g, 1kg = 1000g, 1 톨라 = 11.6638g — `src/lib/calculations/`에 정의되어 있으며 외부 소스에서 갱신되지 않습니다.
SGE Au9999가 580 CNY/g, 환율 USD/CNY = 7.20일 때
(580 / 7.20) × 31.1034768 = 80.56 × 31.1034768 ≈ 2,506.40 USD/oz
MCX 금이 6,150 INR/g, 환율 USD/INR = 83.5일 때
(6,150 / 83.5) × 31.1034768 ≈ 73.65 × 31.1034768 ≈ 2,290.79 USD/oz
LBMA PM fix가 1,850 GBP/oz, 환율 USD/GBP = 0.79일 때
1,850 / 0.79 ≈ 2,341.77 USD/oz
SGE Ag(T+D) 은이 7,800 CNY/kg, 환율 USD/CNY = 7.20일 때
7,800 ÷ 1000 = 7.80 CNY/g → (7.80 / 7.20) × 31.1034768 ≈ 1.0833 × 31.1034768 ≈ 33.70 USD/oz
USD가 아닌 가격은 ExchangeRate-API에서 가져와 72시간 캐시한 크로스 환율로 환산합니다(위의 데이터 소스 표 참조). Metals.dev 스팟 호출과는 별도의 상위 호출이며, 두 응답은 원자적으로 획득되지 않아 크론 시점에 몇 분 정도 차이가 날 수 있습니다. 관측되는 오차는 크지 않지만 0은 아닙니다. ExchangeRate-API가 실패하고 캐시된 값도 없는 경우, 파이프라인은 하드코딩된 환율을 대입하지 않고 해당 카드에 "data unavailable"을 표기합니다.
모든 가격이 USD/oz로 정규화된 뒤, 시장 `M`의 프리미엄은 USD 스팟 기준가 대비 단순 백분율 차이로 계산됩니다:
양수는 현지 시장이 USD 스팟 기준가보다 비싸다는 의미(프리미엄)입니다. 음수는 더 싸다는 의미(디스카운트)입니다. 결과는 항상 소수점 둘째 자리까지 표시합니다. 표시 전에 평활화·평균·노이즈 제거를 하지 않습니다 — 오늘의 7.34% 프리미엄과 내일의 1.20% 프리미엄은 모두 있는 그대로 표시됩니다. 트래커에서 변동성을 숨기는 것은 트래커의 존재 이유에 반하기 때문입니다.
파이프라인은 두 개의 일일 Vercel cron 작업으로 구성됩니다(vercel.json 참조). UTC 00:00에 warm-cache 작업이 상위 피드를 각각 한 번씩 호출하여 대시보드·시장별 페이지가 사용하는 Vercel KV(Redis) 캐시에 최신 값을 기록합니다. 15분 뒤인 UTC 00:15에는 snapshot-history 작업이 그 캐시를 읽어 금은비·순위 페이지의 차트를 구동하는 이력 데이터셋에 날짜·시장별 행을 추가합니다. 공개 사용자 요청은 캐시에 저장된 데이터만 읽습니다. 값이 캐시에 없으면 외부 공급자(Metals.dev·GoldAPI·SGE·ExchangeRate-API)를 호출하지 않고 일시적인 "데이터 없음" 상태(HTTP 503)를 반환합니다. 외부 호출은 위 두 개의 예약 cron 작업과 인증된 관리 엔드포인트(ADMIN_API_KEY 인증)에서만 수행합니다.
| 데이터 타입 | TTL |
|---|---|
| 현물 가격(Metals.dev/GoldAPI) | 72 h |
| FX 크로스 환율 | 72 h |
| SGE 호가 | 72 h (rejects sentinel values) |
| 과거 스냅샷 데이터셋(날짜·시장별) | Redis에서 90일 TTL; 같은 날짜의 새 스냅샷은 기존 값을 대체 |
72시간 TTL은 의도된 값입니다. 크론이 하루 1회 실행되므로 주말·휴장·1회 실패까지 카드가 비지 않게 하기 위한 여유가 72시간입니다. 상위 피드가 plausibility 체크에 실패하면 파이프라인은 기존 캐시 값을 다시 기록합니다. 원래 수집 시각은 그대로 유지되므로 값이 새 데이터처럼 표시되지는 않지만, Redis TTL 자체는 갱신되어 카드가 사라지지 않도록 합니다. 원래 시각이 하루 정도 지난 카드는 UI에서 "오래됨" 배지가 붙습니다.
각 가격 피드는 다음을 검사하는 리졸버를 거칩니다. (a) 상위 호출 성공, (b) 응답에 예상 필드 존재, (c) 값이 양수. SGE는 추가로 비거래일에 엔드포인트가 반환하는 알려진 sentinel 값 -2.0을 거부합니다. 이 필드 단위 체크 외에 런타임 JSON 스키마 검증 계층은 없습니다. 어느 하나라도 실패하면 리졸버는 null을 반환하고, 상위 레이어가 다음 순서로 폴백을 시도합니다.
핵심 원칙: 어떤 값도 최신인 것처럼 조용히 재표시되지 않습니다. 기준가와 환율로 계산한 값(시장 피드에서 직접 온 값이 아닌 값)은 처음부터 "derived" 소스 플래그로 저장되며 UI가 그렇게 표시합니다. 그리고 하루 정도 이상 갱신되지 않은 카드는 원래 읽기 타임스탬프와 함께 "오래됨" 배지를 얻습니다.
USD 스팟 기준가, MCX 관련 필드, SGE 피드, LBMA 관련 필드는 같은 일정이나 같은 시각에 갱신된다고 볼 수 없습니다. 주말과 휴장일에는 데이터 소스가 직전 값이나 더미 값을 반환할 수 있습니다. 이 사이트는 원래 기록 시각을 유지하고 오래됨 상태를 표시하며 실시간 값처럼 안내하지 않습니다.
Ag(T+D)는 CNY/kg, Au9999는 CNY/g로 호가됩니다. 저희는 USD/oz 환산 전에 은을 1000으로 나눕니다. 이 제수에 과거 버그가 있었다면 은 프리미엄이 1000배 부풀려졌을 것이며, 재발 방지를 위해 명시적으로 기록해 둡니다.
저희가 게시하는 프리미엄은 도매·세전 비교 값입니다. 국가별 세금은 표시 프리미엄에 더해지지 않습니다. 대표 예: 인도의 금 우대 수입세율(2024년 7월 예산 이후 CBIC 고시 기준 기본 관세 5% + AIDC 1% = 6%, 소매 단계에서 3% GST 별도 부과, 실제 부담은 금의 형태·수입 주체·과세표준에 따라 달라지며 CBIC 최신 세율표를 확인해야 함), 영국의 은 20% 부가세, 중국의 비SGE 금 13% 부가세 등입니다. 소매가를 추론하려는 독자는 세금 비교 페이지와 함께 현지 세무 당국의 최신 세율을 확인해 주세요.
피드, 환산 계수, 또는 위의 공식에 대한 변경은 모두 방법론 변경으로 다룹니다. 변경이 릴리스되면 본 페이지와 아래 변경 로그가 같은 릴리스에서 함께 업데이트됩니다. 과거 스냅샷은 날짜·시장별로 Redis에 90일 TTL로 저장되며, 이미 존재하는 날짜에 일일 크론이 새 스냅샷을 쓰면 기존 값을 대체합니다. 차트 해석에 영향을 주는 장기적 정정이나 변곡점은 개별 데이터 포인트에 주석을 다는 방식이 아니라 아래 변경 로그 항목에 정리해 둡니다.
방법론은 정확하게 유지되어야만 가치가 있습니다. 피드 형태가 바뀌었거나, 세율이 옛것이거나, 한정월이 롤되었거나, 번역이 어색하다면 문의 페이지로 알려주십시오. 모든 정정 요청에 회신합니다.