๐Ÿ“† date-fns vs Moment.js โ€” ์–ด๋–ค ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ• ๊นŒ?

JavaScript๋กœ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋งˆ๋„ Moment.js์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๊ทผ ๋ช‡ ๋…„ ์‚ฌ์ด, ๋” ๊ฐ€๋ณ๊ณ  ํ˜„๋Œ€์ ์ธ ๋Œ€์•ˆ์ธ date-fns๊ฐ€ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ข‹์„์ง€ ์•ˆ๋‚ดํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.


๐Ÿฅ‡ ์†Œ๊ฐœ: Moment.js vs date-fns

ํ•ญ๋ชฉMoment.jsdate-fns
์ดˆ๊ธฐ ๋ฆด๋ฆฌ์ฆˆ20112014
์œ ์ง€ ์ƒํƒœ๋น„ํ™œ์„ฑ (Legacy)ํ™œ๋ฐœํ•œ ์œ ์ง€๋ณด์ˆ˜ ์ค‘
๋ชจ๋“ˆํ™”๋ถˆ๊ฐ€๋Šฅ (์ „์ฒด ๋ถˆ๋Ÿฌ์•ผ ํ•จ)๊ฐ€๋Šฅ (ํ•จ์ˆ˜๋ณ„ tree-shaking)
๋ฒˆ๋“ค ํฌ๊ธฐ์•ฝ 300KB ์ด์ƒ์•ฝ 16~20KB (์‚ฌ์šฉ ํ•จ์ˆ˜๋งŒ)
๋ถˆ๋ณ€์„ฑ ์ง€์›โŒ (๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•จ)โœ… (๋ถˆ๋ณ€ ๋ฐฉ์‹)
i18n ์ง€์›๋‚ด์žฅ๋‚ด์žฅ, but ์ผ๋ถ€ ์ˆ˜๋™ ์„ค์ • ํ•„์š”
๋Ÿฌ๋‹ ์ปค๋ธŒ๋‚ฎ์Œ๋‚ฎ์Œ
TypeScript ์ง€์›๋ฏธํก (ํƒ€์‚ฌ ํƒ€์ž…)โœ… ๊ณต์‹ ์ œ๊ณต


โš–๏ธ ์ฃผ์š” ๋น„๊ต ํฌ์ธํŠธ

1. ๋ฒˆ๋“ค ํฌ๊ธฐ

Moment.js๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค์— ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ํŠธ๋ฆฌ ์…ฐ์ดํ‚น์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, date-fns๋Š” ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์–ด ํ•„์š” ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

// moment
import moment from 'moment';

// date-fns
import { format } from 'date-fns';


โœ… ํŠธ๋ฆฌ ์…ฐ์ดํ‚น์ด ํ•„์š”ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์—์„œ๋Š” date-fns๊ฐ€ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.


2. ๋ถˆ๋ณ€์„ฑ(Immutability)

Moment.js๋Š” ๋‚ ์งœ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, date-fns๋Š” ์ž…๋ ฅ ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ๋ฐฉ์‹์œผ๋กœ, ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

// moment
const m = moment();
m.add(1, 'day'); // m์ด ๋ณ€๊ฒฝ๋จ

// date-fns
import { addDays } from 'date-fns';
const today = new Date();
const tomorrow = addDays(today, 1);


3. ๊ตญ์ œํ™” (i18n)

Moment๋Š” ๋‹ค๊ตญ์–ด ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€๋งŒ, ๋ชจ๋“  ์–ธ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ๋ผ ์šฉ๋Ÿ‰์ด ์ปค์ง‘๋‹ˆ๋‹ค. date-fns๋Š” ์–ธ์–ด๋ณ„ locale ๋ชจ๋“ˆ์„ ์„ ํƒ์ ์œผ๋กœ importํ•  ์ˆ˜ ์žˆ์–ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

import { format } from 'date-fns';
import { ko } from 'date-fns/locale';

format(new Date(), 'PPP', { locale: ko }); // "2025๋…„ 5์›” 15์ผ"


4. ์ง€์› ํ˜„ํ™ฉ๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ

  1. Moment.js: 2020๋…„ ์ดํ›„ "legacy project"๋กœ ์ „ํ™˜๋จ
  2. date-fns: ํ™œ๋ฐœํ•˜๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ์ค‘, ํ˜„๋Œ€ JS/TS์— ์ ํ•ฉ


โœ… ๊ฒฐ๋ก : ์–ธ์ œ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์จ์•ผ ํ• ๊นŒ?

์ƒํ™ฉ์ถ”์ฒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์‹ ๊ทœ ํ”„๋กœ์ ํŠธdate-fns โœ…
๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ์œ ์ง€Moment.js (ํ•„์š” ์‹œ)
๋ถˆ๋ณ€์„ฑ / ํŠธ๋ฆฌ ์…ฐ์ดํ‚น ์ค‘์š”date-fns โœ…
๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘Moment.js (์ต์ˆ™ํ•˜๋‹ค๋ฉด)
๋‹ค๊ตญ์–ด ํฌ๋งท, ๊ฒฝ๋Ÿ‰ํ™”date-fns โœ…


โœ๏ธ ๋งˆ๋ฌด๋ฆฌ

Moment.js๋Š” ํ•œ๋•Œ ๋‚ ์งœ ์ฒ˜๋ฆฌ์˜ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์ด์—ˆ์ง€๋งŒ, ํŠธ๋ฆฌ ์…ฐ์ดํ‚น, ๋ถˆ๋ณ€์„ฑ, ๋ชจ๋“ˆํ™” ์ธก๋ฉด์—์„œ ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ๊ณผ๋Š” ๋‹ค์†Œ ๋งž์ง€ ์•Š๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. date-fns๋Š” ์ด๋ฅผ ๋ณด์™„ํ•˜๋Š” ๋Œ€์ฒด์ œ๋กœ์„œ, ๋” ์ž‘๊ณ , ๋” ๋น ๋ฅด๋ฉฐ, ํ•จ์ˆ˜ํ˜• ๋ฐฉ์‹์œผ๋กœ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์‚ฌ๋ž‘๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฏธ๋ž˜๋ฅผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด date-fns๊ฐ€ ๋”์šฑ ์ข‹์€ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.