LocalizationProvider를 만들어 통화 코드와 setter를 전역 상태로 노출합니다.exchangeRateDollars 객체로 정의하고, convertPrice 유틸에서 Intl.NumberFormat 스타일로 문자열을 뽑아냅니다.HomeHeader)에서 통화 선택 드롭다운을 열고, 선택 즉시 Context를 업데이트해 전 페이지에 반영했습니다.use client로 선언된 컴포넌트에서만 사용했어요.LocalizationProvider를 감쌌습니다.strings.ts에 상수로 정의했습니다. 환율 계산 로직은 향후 API로 교체하기 쉽게 분리했죠.환율 상수와 타입 정의
exchangeRateDollars에 지원 통화를 정리하고, ExchangeRate 타입을 추출했습니다.
// src/utils/strings.ts
export const exchangeRateDollars = {
USD: { value: 1, symbol: "$" },
KRW: { value: 1305.6, symbol: "₩" },
JPY: { value: 147.97, symbol: "¥" },
VND: { value: 24335, symbol: "₫" },
};
export type ExchangeRate = keyof typeof exchangeRateDollars;
숫자만 바꾸면 확장되는 구조라 운영팀이 환율을 손쉽게 갱신할 수 있었습니다.
Context 제공자 작성
통화 상태를 전역으로 보관하고, setter를 함께 넘겨 헤더에서 통화 코드를 바꿀 수 있도록 했습니다.
// src/utils/LocalizationProvider.tsx
"use client";
export const LocalizationContext = createContext({
currency: "USD" as ExchangeRate,
setCurrency: (_: ExchangeRate) => {},
});
export function LocalizationProvider({ children }: { children: React.ReactNode }) {
const [currency, setCurrency] = useState<ExchangeRate>("USD");
return (
<LocalizationContext.Provider value={{ currency, setCurrency }}>
{children}
</LocalizationContext.Provider>
);
}
이 Provider는 src/app/layout.tsx에서 AuthProvider와 함께 감싸고 있습니다.
가격 변환 유틸 추가
제품 카드나 주문서에서 공통으로 호출할 수 있게 convertPrice 함수를 만들었습니다.
// src/utils/utils.ts
export const convertPrice = (price: number, currency: ExchangeRate): string => {
const rate = exchangeRateDollars[currency];
return `${(price * rate.value).toLocaleString("en-US", {
style: "currency",
currency,
minimumFractionDigits: currency === "USD" ? 2 : 0,
})} ${currency}`;
};
KRW, VND처럼 소수점이 필요 없는 화폐는 자동으로 정수만 출력되도록 처리했습니다.
헤더에서 통화 토글 노출
HomeHeader에서 지구본 버튼을 눌렀을 때 통화 리스트가 펼쳐지도록 만들고, 선택하면 setCurrency를 호출합니다.
// src/components/organisms/HomeHeader.tsx
const { currency, setCurrency } = useLocalization();
<button onClick={() => setShowGlobalMenu(!showGlobalMenu)}>
<FaGlobeAmericas className="w-6 h-6" />
</button>
{showGlobalMenu && (
<div className="absolute bg-white border border-zinc-400 right-0">
<button onClick={() => { setCurrency("USD"); setShowGlobalMenu(false); }}>🇺🇸 USD</button>
<button onClick={() => { setCurrency("VND"); setShowGlobalMenu(false); }}>🇻🇳 VND</button>
...
</div>
)}
헤더가 클라이언트 컴포넌트라서 Context 소비가 자연스럽고, 장바구니 아이콘 배지 같은 UI도 통화 전환과 동시에 업데이트됩니다.
페이지 전반에서 재사용
상품 카드(ProductItem), 주문서(src/app/(home)/order/page.tsx) 등 모든 가격 표시는 convertPrice를 통해 동일한 문자열을 노출합니다. 나중에 환율 API를 붙이거나 통화당 할인율을 적용할 때도 한 곳만 고치면 됩니다.