---
title: 동기화
description: 한 명령으로 firma가 의존하는 외부 데이터를 모두 업데이트합니다. Finnhub의 실시간 주가와 FRED의 과거 환율을 가져오며, 이미 등록한 데이터를 기준으로 필요한 부분만 요청합니다.
---

export const scopeFeatures = [
  {
    icon: '📈',
    title: '주가, 현재 보유 종목 기준',
    desc: '거래 내역에서 계산한 순보유 수량이 0이 아닌 티커만 Finnhub에서 가져옵니다. 0까지 매도하면 다음 sync에서 빠집니다. 보유 종목이 4개라면 Finnhub 호출은 4번이지 400번이 아닙니다.',
  },
  {
    icon: '💱',
    title: '환율 이력, 가장 이른 데이터 기준',
    desc: '첫 실행에서는 거래, 자산, 현금흐름 항목을 훑어 가장 이른 날짜를 찾고, 그 시점부터 오늘까지의 환율을 백필합니다. 보통 FRED 호출은 5회 정도이고 10초 안팎이면 끝납니다. 이후에는 마지막 캐시 날짜 이후만 가져오므로 보통 1초도 걸리지 않습니다.',
  },
];

export const briefExchange = [{
  user: '전체 동기화하고 오늘 브리핑 줘.',
  ai: <>
    <p>
      <code>sync</code> ✓ &nbsp; <code>get_brief</code> ✓
    </p>
    <p style={{ marginTop: '0.5rem' }}>
      포트폴리오는 오늘 <code>+$1,820 (+1.1%)</code> 상승했습니다.
      NVDA가 <code>+4.3%</code>로 선두입니다. 거시경제는 risk-on (5/5),
      스트레스는 낮음 (4/100)입니다. MSFT 실적 발표는 4/29입니다. 더 깊이 살펴볼
      항목이 있나요?
    </p>
  </>,
}];

<Section label="firma sync">
기본적으로는 활성 보유 종목의 가격과 8개 지원 통화(KRW, JPY, EUR, CNY, GBP, HKD, INR, TWD)의
환율 이력을 함께 가져옵니다. 한 번 실행하면 둘 다 처리됩니다.

<div className="terminal">
  <div className="terminal-line">
    <span className="term-prompt">$</span>
    <span className="term-cmd">firma sync</span>
  </div>
  <pre className="term-pre">{`◇  Updated 4 stocks
◇  Synced 9525 FX rates across 8 currencies`}</pre>
</div>

  <Note>
    가격을 위한 <code>finnhub-key</code>와 환율을 위한 <code>fred-key</code>가 모두 필요합니다.
    먼저 <code>firma config set finnhub-key &lt;key&gt;</code>와{' '}
    <code>firma config set fred-key &lt;key&gt;</code>를 실행합니다.
  </Note>
</Section>

<Section label="범위는 데이터에서 도출">
firma는 필요한 만큼만 API에 요청합니다. sync 범위는 로컬 SQLite 데이터베이스에서
계산됩니다:

  <FeatureList items={scopeFeatures} />

따라서 **데이터를 먼저 등록한 다음 sync하는 편이 맞습니다**. 빈 데이터베이스에서는
범위를 계산할 근거가 없어서 아무 일도 일어나지 않습니다.
</Section>

<Section label="firma sync fx">
환율 이력만 새로 고칩니다. 훨씬 오래된 거래를 새로 가져와서 현재 FX 캐시가 그
시점을 덮지 못할 때, 혹은 가격은 그대로 두고 환율 이력만 갱신하고 싶을 때 유용합니다.

<div className="terminal">
  <div className="terminal-line">
    <span className="term-prompt">$</span>
    <span className="term-cmd">firma sync fx</span>
  </div>
  <pre className="term-pre">{`◇  Synced 9525 FX rates across 8 currencies`}</pre>
</div>

  <Note>
    동일한 증분 로직.{' '}
    <a href="https://fred.stlouisfed.org" target="_blank" rel="noopener noreferrer">FRED</a>의
    일별 시리즈(<code>DEXKOUS</code>, <code>DEXJPUS</code>, <code>DEXCHUS</code>,
    <code>DEXUSEU</code>, <code>DEXUSUK</code>, <code>DEXHKUS</code>, <code>DEXINUS</code>,
    <code>DEXTAUS</code>)에서 가져와 일관된 방향(USD 1당
    외화)으로 <code>~/.firma/firma.db</code>의 <code>fx_rates</code> 테이블에 저장합니다.
  </Note>
</Section>

<Section label="과거 환율이 중요한 이유">
과거 환율 캐시 없이 USD가 아닌 통화로 과거 자산을 표시하면 *오늘*의 환율이
적용됩니다. 즉 "2018년 KRW 기준 내 순자산은?" 같은 질문에 잘못된 답이 나옵니다. Firma는
각 항목을 해당 날짜의 환율로 변환하므로, 과거 수치는 그 시점에 실제로 가지고
있던 가치를 반영합니다.

날짜가 붙은 항목은 모두 과거 환율을 사용합니다. 반대로 "현재 가치"를 뜻하는 항목,
예를 들어 포트폴리오 시가, 브리핑의 MACRO TODAY 섹션, 어제 대비 FX 영향 등은
실시간 환율(<code>open.er-api.com</code>)을 사용합니다.
</Section>

<Section label="일상 루틴">
초기 설정 이후, 아침 루틴은 두 명령 또는 Claude 프롬프트 하나입니다:

<div className="terminal">
  <div className="terminal-line">
    <span className="term-prompt">$</span>
    <span className="term-cmd">firma sync &amp;&amp; firma brief</span>
  </div>
</div>

또는 Claude에서:

  <ChatDemo header="Claude Desktop · firma MCP 연결됨" exchanges={briefExchange} />
</Section>
