์ž‘๊ฐ€:
    ์ƒ์„ฑ:2026-09-02๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:2026-09-27

    Intl์„ ์‚ฌ์šฉํ•ด ๋กœ์ผ€์ผ๋ณ„๋กœ ๋‚ ์งœ์™€ ์ˆซ์ž ํฌ๋งทํŒ…ํ•˜๊ธฐ

    ํ…์ŠคํŠธ ๋ฒˆ์—ญ์€ ๋‹ค๊ตญ์–ดํ™”(i18n)์˜ ๋ˆˆ์— ๋ณด์ด๋Š” ์ ˆ๋ฐ˜์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ์˜ ๋‹จ๊ณจ ์›์ธ์ด ๋˜๋Š” ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜์€ ํฌ๋งทํŒ…์ž…๋‹ˆ๋‹ค. ๋…์ผ ์‚ฌ์šฉ์ž๊ฐ€ 1.234,56 ๋Œ€์‹  1,234.56์„ ๋ณด๊ฑฐ๋‚˜, ์ผ๋ณธ ์‚ฌ์šฉ์ž๊ฐ€ 08/02/2026์„ ๋ณด๊ณ  8์›”๋กœ ์˜คํ•ดํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ React ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ์—๋Ÿฌ๋กœ ํ™”๋ฉด์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค.

    ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—๋Š” Intl API๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํƒ‘์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ชฉ์ฐจ

    ์ง์ ‘ ์ž‘์„ฑํ•œ ๋‚ ์งœ ํ—ฌํผ ํ•จ์ˆ˜๋ถ€ํ„ฐ ์‚ญ์ œํ•˜์„ธ์š”

    ๊ฑฐ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—๋Š” ๋‹ค๊ตญ์–ด ์ง€์›์„ ๊ณ ๋ฏผํ•˜๊ธฐ ์ „์— ์ž‘์„ฑ๋œ formatDate ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ, ๊ตฌ๋ถ„ ๊ธฐํ˜ธ, ๊ทธ๋ฆฌ๊ณ  ๋Œ€๊ฐœ ์˜์–ด ์›” ์ด๋ฆ„์ด ์ฝ”๋“œ์— ์ง์ ‘ ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ts
    // ์ง€๊ธˆ ๋ฐ”๋กœ ์ง€์›Œ์•ผ ํ•  ์ฝ”๋“œ
    const formatDate = (d: Date) =>
      `${d.getMonth() + 1}/${d.getDate()}/${d.getFullYear()}`;
    

    Intl.DateTimeFormat์€ ์ด๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๋ฉฐ, ๋ชจ๋“  ๋กœ์ผ€์ผ์—์„œ ํ‘œ์ค€์— ๋งž๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

    ts
    new Intl.DateTimeFormat("de-DE", { dateStyle: "long" }).format(date);
    // "2. August 2026"
    new Intl.DateTimeFormat("ja-JP", { dateStyle: "long" }).format(date);
    // "2026ๅนด8ๆœˆ2ๆ—ฅ"
    

    ์ˆซ์ž๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. toFixed(2)๋Š” ์ „ ์„ธ๊ณ„ ์–ด๋””์„œ๋‚˜ 1234.56์„ ์ถœ๋ ฅํ•˜์ง€๋งŒ, ์ด๋Š” ์œ ๋Ÿฝ ๋Œ€๋ถ€๋ถ„์˜ ๊ตญ๊ฐ€ ํ‘œ๊ธฐ๋ฒ•๊ณผ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    Intl์ด ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ

    API์ฃผ ์šฉ๋„
    Intl.DateTimeFormat๋‚ ์งœ์™€ ์‹œ๊ฐ„ (dateStyle / timeStyle ํ”„๋ฆฌ์…‹ ์ง€์›)
    Intl.NumberFormat์†Œ์ˆ˜์ , ํ†ตํ™”, ๋ฐฑ๋ถ„์œจ, ๋‹จ์œ„, ์ถ•์•ฝ ํ‘œ๊ธฐ
    Intl.RelativeTimeFormat"3์ผ ์ „", "2์‹œ๊ฐ„ ํ›„" ๋“ฑ์˜ ์ƒ๋Œ€ ์‹œ๊ฐ„ ํ‘œํ˜„
    Intl.ListFormat"์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜ ๋ฐ ์˜ค๋ Œ์ง€" ๋“ฑ์˜ ๋ชฉ๋ก ๋‚˜์—ด ๊ฒฐํ•ฉ
    Intl.PluralRules์ˆ˜์น˜์— ๋”ฐ๋ฅธ ๋ณต์ˆ˜ํ˜• ๊ทœ์น™ ํŒ๋ณ„
    Intl.Collator์–ธ์–ด๋ณ„ ๊ทœ์น™์— ๋”ฐ๋ฅธ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ์ž์—ด ์ •๋ ฌ

    ํŠนํžˆ ์ž์ฃผ ๊ฐ„๊ณผ๋˜๋Š” ๊ฒƒ์ด Intl.Collator์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์— ์ผ๋ฐ˜์ ์ธ array.sort()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์•…์„ผํŠธ ๋ฌธ์ž๊ฐ€ z ๋’ค๋กœ ๋ฐ€๋ฆฌ๊ณ  ์Šค์›จ๋ด์–ด รถ๊ฐ€ ์—‰๋šฑํ•œ ์œ„์น˜์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ๋ชฉ๋ก์„ ์ •๋ ฌํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ collator๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ts
    ["zebra", "รฉdouard", "apple"].sort(new Intl.Collator("ko").compare);
    // ["apple", "รฉdouard", "zebra"]
    

    ์ง์ ‘ ์กฐํ•ฉํ•˜๊ธฐ๋ณด๋‹ค ํ”„๋ฆฌ์…‹์„ ์šฐ์„  ํ™œ์šฉํ•˜์„ธ์š”

    dateStyle๊ณผ timeStyle์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋กœ์ผ€์ผ์— ์•Œ๋งž์€ ๋…ผ๋ฆฌ์  ์ˆœ์„œ์™€ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. year, month, day๋ฅผ ์ˆ˜๋™์œผ๋กœ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ฒœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์—ญ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ˆœ์„œ ๊ทœ์น™์ด ๋‹ค๋ฅธ๋ฐ, ์ด๋ฅผ ์ž์˜์ ์ธ ์ถ”์ธก์œผ๋กœ ๋ฎ์–ด์จ CLDR์˜ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    ts
    // ๋กœ์ผ€์ผ์— ๋งž์ถ”์–ด ์ž๋™์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค
    new Intl.DateTimeFormat(locale, { dateStyle: "medium" }).format(d);
    
    // ์ˆ˜๋™์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋ฉด ๋‹ค๋ฅธ ์ง€์—ญ์—์„œ ์ž˜๋ชป๋œ ํ˜•์‹์ด ๋ฉ๋‹ˆ๋‹ค
    new Intl.DateTimeFormat(locale, {
      year: "numeric",
      month: "2-digit",
      day: "2-digit",
    }).format(d);
    

    ์ข์€ ํ…Œ์ด๋ธ” ์—ด์ฒ˜๋Ÿผ ๊ณ ์ •๋œ ๋„ˆ๋น„๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋””์ž์ธ ์ผ€์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ•ญ์ƒ ํ”„๋ฆฌ์…‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    ํฌ๋งทํ„ฐ ์ƒ์„ฑ ๋น„์šฉ์— ์œ ์˜ํ•˜์„ธ์š”

    ์„ฑ๋Šฅ ์ตœ์ ํ™”์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. Intl.NumberFormat ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋ฐฉ๋Œ€ํ•œ ๋กœ์ผ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ์ดํ›„์˜ .format() ํ˜ธ์ถœ์— ๋น„ํ•ด ํ›จ์”ฌ ๋งŽ์€ ์ž์›์„ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์˜ 1,000๊ฐœ ํ–‰์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ˆˆ์— ๋„๋Š” ๋ Œ๋”๋ง ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ts
    // ๋งค ํ–‰๋งˆ๋‹ค ํฌ๋งทํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ (๋น„ํšจ์œจ์ )
    rows.map((r) => new Intl.NumberFormat(locale).format(r.total));
    
    // ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์žฌ์‚ฌ์šฉ (ํšจ์œจ์ )
    const nf = new Intl.NumberFormat(locale);
    rows.map((r) => nf.format(r.total));
    

    toLocaleDateString()๊ณผ toLocaleString()๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๊ฐ’์„ ๋ฐ”๊ฟ€ ๋•Œ๋Š” ๋ฌธ์ œ์—†์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•  ๋•Œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ๋กœ์ผ€์ผ๊ณผ ์˜ต์…˜ ์กฐํ•ฉ์„ ํ‚ค๋กœ ํ™œ์šฉํ•˜์—ฌ ์บ์‹œํ•ด ๋‘์„ธ์š”:

    ts
    const cache = new Map<string, Intl.NumberFormat>();
    
    const getNumberFormat = (
      locale: string,
      options: Intl.NumberFormatOptions = {}
    ) => {
      const key = `${locale}:${JSON.stringify(options)}`;
      let formatter = cache.get(key);
      if (!formatter) {
        formatter = new Intl.NumberFormat(locale, options);
        cache.set(key, formatter);
      }
      return formatter;
    };
    

    ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋งŒ ํ„ฐ์ง€๋Š” ํƒ€์ž„์กด ๋ฒ„๊ทธ

    ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ณจ์น˜๋ฅผ ์•“๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. SSR ๋‹จ๊ณ„์—์„œ ์„œ๋ฒ„๊ฐ€ ๋‚ ์งœ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์–‘์ชฝ์—์„œ ์ƒ์„ฑํ•œ ๋ฌธ์ž์—ด์ด ๋‹ฌ๋ผ React๊ฐ€ Hydration Mismatch ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ฉฐ ๋ฉˆ์ถฐ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

    ์›์ธ์€ Intl.DateTimeFormat์— ํƒ€์ž„์กด์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ ํƒ€์ž„์กด์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ ์„œ๋ฒ„๋Š” ํ†ต์ƒ UTC๋กœ ์„ค์ •๋˜์–ด ์žˆ์ง€๋งŒ, ๋กœ์ปฌ ๊ฐœ๋ฐœ ์žฅ๋น„๋Š” ์‚ฌ์šฉ์ž์˜ ํ˜„์ง€ ์‹œ๊ฐ„๋Œ€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ์ปฌ์—์„œ๋Š” ์žฌํ˜„๋˜์ง€ ์•Š๊ณ  ํ”„๋กœ๋•์…˜์—์„œ๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ts
    // ์„œ๋ฒ„(UTC)์™€ ๋ธŒ๋ผ์šฐ์ €(KST) ๊ฒฐ๊ณผ๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜์—ฌ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ์‹คํŒจ
    new Intl.DateTimeFormat(locale, { dateStyle: "short" }).format(d);
    
    // ํƒ€์ž„์กด์„ ๊ณ ์ •ํ•˜์—ฌ ์–‘์ชฝ ๊ฒฐ๊ณผ๋ฅผ ์™„๋ฒฝํžˆ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค
    new Intl.DateTimeFormat(locale, { dateStyle: "short", timeZone: "UTC" }).format(
      d
    );
    

    ์‹ค์งˆ์ ์ธ 3๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…:

    • ์„œ๋ฒ„ ํƒ€์ž„์กด์„ ๊ณ ์ •ํ•˜๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜๊ณ  ๊ฒฐ์ •๋ก ์ ์ด์ง€๋งŒ ๋ชจ๋‘์—๊ฒŒ UTC ์‹œ๊ฐ„์ด ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ ์ „์šฉ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ์„œ๋ฒ„ ๋ Œ๋”๋ง ์‹œ์—๋Š” ์•ˆ์ •์ ์ธ ํ”Œ๋ ˆ์ด์Šคํ™€๋”๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •ํ™•ํ•˜์ง€๋งŒ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ๊นœ๋นก์ž„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž์˜ ํƒ€์ž„์กด์„ ์ €์žฅํ•˜์—ฌ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์–‘์ชฝ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ด์ƒ์ ์ด์ง€๋งŒ ๋ถ€๊ฐ€์ ์ธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ์–ด๋–ค ์ „๋žต์„ ์„ ํƒํ•˜๋“ , ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์–‘์ชฝ์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๋‚ ์งœ์—๋Š” ๋ฐ˜๋“œ์‹œ timeZone์„ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž„์กด์ด ์ƒ๋žต๋œ ๋‚ ์งœ๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ž ์žฌ์  ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

    ํ†ตํ™”์—๋Š” ๋กœ์ผ€์ผ์ด ์•„๋‹ˆ๋ผ ํ†ตํ™” ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

    ๋กœ์ผ€์ผ๊ณผ ํ†ตํ™”๋Š” ๋ณ„๊ฐœ์˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. fr-FR์ด ๋ฌด์กฐ๊ฑด ์œ ๋กœํ™”๋ฅผ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋ž‘์Šค ์‚ฌ์šฉ์ž๊ฐ€ ๋ฏธ๊ตญ ๋‹ฌ๋Ÿฌ ์ฒญ๊ตฌ์„œ๋ฅผ ์กฐํšŒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ts
    new Intl.NumberFormat("fr-FR", { style: "currency", currency: "USD" }).format(
      1234.5
    );
    // "1 234,50 $US"
    

    ๋กœ์ผ€์ผ์€ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ, ์ž๋ฆฟ์ˆ˜ ๊ทธ๋ฃนํ™”, ๊ธฐํ˜ธ์˜ ์œ„์น˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ™” ์ž์ฒด๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์ฃผ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ผ€์ผ๋กœ๋ถ€ํ„ฐ ํ†ตํ™”๋ฅผ ์ž„์˜๋กœ ์œ ์ถ”ํ•˜๋Š” ๊ฒƒ์€ ํšŒ๊ณ„ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

    ๋˜ํ•œ currencyDisplay ์˜ต์…˜๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋‹ฌ๋Ÿฌ ํ†ตํ™”๊ฐ€ ๊ณต์กดํ•˜๋Š” ํ™”๋ฉด์—์„œ "code"๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฏธ๊ตญ, ์บ๋‚˜๋‹ค, ํ˜ธ์ฃผ ๋‹ฌ๋Ÿฌ ๊ฐ„์˜ ํ˜ผ์„ ์„ ํ™•์‹คํ•˜๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ ˆ๋Œ€์  ์‹œ๊ฐ๋ณด๋‹ค ์ƒ๋Œ€์  ์‹œ๊ฐ„์ด ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค

    ์ตœ๊ทผ ๋ฐœ์ƒํ•œ ์ผ์ด๋ผ๋ฉด ๋ณต์žกํ•œ ํƒ€์ž„์Šคํƒฌํ”„๋ณด๋‹ค "2์‹œ๊ฐ„ ์ „"์ด ํ›จ์”ฌ ์ง๊ด€์ ์ด๋ฉฐ, Intl.RelativeTimeFormat์ด ์ด๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ˜„์ง€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

    ts
    new Intl.RelativeTimeFormat("ko", { numeric: "auto" }).format(-1, "day");
    // "์–ด์ œ"
    

    numeric: "auto"๋ฅผ ์ง€์ •ํ•˜๋ฉด "1์ผ ์ „" ๋Œ€์‹  "์–ด์ œ"๋ผ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ํ‘œํ˜„์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Intlayer๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŽธ์˜์„ฑ

    Intlayer๋Š” ์ด๋Ÿฌํ•œ API๋“ค์„ ์บ์‹ฑ์ด ๋‚ด์žฅ๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ ๋‘์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ Map ์บ์‹œ๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๋งค๋ฒˆ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ ๋กœ์ผ€์ผ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ ์šฉํ•ด ์ค๋‹ˆ๋‹ค.

    ts
    import {
      number,
      currency,
      date,
      relativeTime,
      units,
      compact,
      list,
    } from "intlayer";
    
    number(1234.5); // "1,234.5"
    currency(1234.5, { currency: "EUR" }); // "โ‚ฌ1,234.50"
    date(new Date(), "short");
    relativeTime(now, twoHoursAgo, { unit: "hour", numeric: "auto" }); // "2์‹œ๊ฐ„ ์ „"
    units(5, { unit: "kilometer", unitDisplay: "long" }); // "5ํ‚ฌ๋กœ๋ฏธํ„ฐ"
    compact(1200); // "1.2์ฒœ"
    list(["์‚ฌ๊ณผ", "๋ฐ”๋‚˜๋‚˜", "์˜ค๋ Œ์ง€"]); // "์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜, ์˜ค๋ Œ์ง€"
    

    date() ํ•จ์ˆ˜๋Š” ๊ฐ„ํŽธํ•œ ํ”„๋ฆฌ์…‹("short", "long", "dateOnly", "timeOnly", "full")์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. React์™€ Vue๋ฅผ ์œ„ํ•œ ํ›… ๋ฐ ์ปดํฌ์ €๋ธ”๋„ ์ œ๊ณต๋˜์–ด ์ปจํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ํ˜„์žฌ ๋กœ์ผ€์ผ์„ ์ž๋™์œผ๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋Š” ํ‘œ์ค€ ํ”Œ๋žซํผ API ์œ„์— ์บ์‹ฑ ๊ณ„์ธต๊ณผ ๋กœ์ผ€์ผ ์ฃผ์ž… ๊ธฐ๋Šฅ์„ ๋”ํ•œ ๊ฒƒ์œผ๋กœ, ์‹ค์ œ ํฌ๋งทํŒ… ์—ฐ์‚ฐ์€ ์˜จ์ „ํžˆ Intl์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ „์ฒด ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ํฌ๋งทํ„ฐ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

    ํ”ํ•œ ์‹ค์ˆ˜๋“ค

    • ๋กœ์ผ€์ผ์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ toLocaleDateString(). ๋Ÿฐํƒ€์ž„ ํ˜ธ์ŠคํŠธ์˜ ๋กœ์ผ€์ผ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
    • ์บ์‹ฑ ์—†์ด ๋ฃจํ”„ ๋‚ด์—์„œ ๋งค๋ฒˆ ์ƒ์„ฑ. ํฌ๋งทํ„ฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ด ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์˜ ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋™ํ˜•(isomorphic) ๋‚ ์งœ ๋ Œ๋”๋ง ์‹œ timeZone ๋ˆ„๋ฝ. ๋กœ์ปฌ์—์„œ๋Š” ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๋Š” ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ์˜ค๋ฅ˜์˜ ์ฃผ๋ฒ”์ž…๋‹ˆ๋‹ค.
    • ๋กœ์ผ€์ผ๋กœ๋ถ€ํ„ฐ ํ†ตํ™”๋ฅผ ์„ฃ๋ถˆ๋ฆฌ ์œ ์ถ”. fr-FR์ด ๋ฐ˜๋“œ์‹œ ์œ ๋กœํ™” ๊ฒฐ์ œ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ํ™”๋ฉด ํ‘œ์‹œ์šฉ ๋ฌธ์ž์—ด์— ๊ธฐ๋ณธ sort() ์‚ฌ์šฉ. ํ•ญ์ƒ Intl.Collator๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
    • ์›”์ด๋‚˜ ์š”์ผ ์ด๋ฆ„์„ ์ง์ ‘ ํ•˜๋“œ์ฝ”๋”ฉ. ๋ชจ๋“  ์–ธ์–ด์˜ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ CLDR์— ๋“ฑ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ƒ๋Œ€ ์‹œ๊ฐ„์—์„œ numeric: "always" ๋ฐฉ์น˜. "์–ด์ œ"๋ผ๋Š” ๋ช…ํ™•ํ•œ ๋‹จ์–ด๊ฐ€ ์žˆ์Œ์—๋„ ๊ธฐ๊ณ„์ ์ธ "1์ผ ์ „"์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    ๋” ์•Œ์•„๋ณด๊ธฐ

    ๋Œ“๊ธ€

    ์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ ์˜๊ฒฌ์„ ๋‚˜๋ˆ ๋ณด์„ธ์š”.

    ๊ด€๋ จ ๊ฒŒ์‹œ๋ฌผ

    ์ตœ๊ทผ ๊ฒŒ์‹œ๋ฌผ