Moment: ์ˆœ๊ฐ„์„ ๋Œ€๋ถ€๋ถ„ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ํ•˜๋‹ค

์— ๋งŒ๋“  2014๋…„ 07์›” 03์ผ  ยท  163์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moment/moment

์ด์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ์˜ ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

utc , local , zone , add , subtract , startOf ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋Š” 3.0.0์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. endOf , lang , duration . add , subtract ๋ฐ lang .

์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์ด methodNameMute ๋ณ€ํ˜•์œผ๋กœ ๋ณต์ œ๋ฉ๋‹ˆ๋‹ค. methodNameImmute ๋ผ๋Š” ๋ถˆ๋ณ€ ๋ณ€ํ˜•๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 3.0๋ถ€ํ„ฐ ํ‰๋ฒ”ํ•œ ์ด์ „ ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ immutable ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • lang ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  getter/setter( get / set )๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „๊ณผ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์˜ ์ด๋ฆ„ ์ง€์ •
  • ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  -- ์šฐ๋ฆฌ๊ฐ€ ์ „ํ™˜์„ ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ API์—์„œ ๋ฉˆ์ถ”์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ๋ถ€๋ถ„์€ ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ๋ฉ”์†Œ๋“œ์˜ ๋ถˆ๋ณ€ ๋ฒ„์ „์„ ๋งŒ๋“ค๊ณ  ๋‚˜์ค‘์— ๋ฌด์—‡์„ ํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „ํ™˜ํ•˜๋ฉด 3.x ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ 2.x ๋ถ„๊ธฐ๊ฐ€ ๊ฝค ์˜ค๋žซ๋™์•ˆ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

@icambron @timrwood @gregwebs @yang @lfnavess @soswow @langalex

Enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ œ 2์„ผํŠธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์™„์ „ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์ถ”๊ตฌํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ณ ( startOf , add ) ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( year , get ). ์–ด๋Š ๊ฒƒ์ด ์–ด๋Š ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  163 ๋Œ“๊ธ€

์ œ 2์„ผํŠธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์™„์ „ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์ถ”๊ตฌํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ณ ( startOf , add ) ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( year , get ). ์–ด๋Š ๊ฒƒ์ด ์–ด๋Š ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. getter๋Š” ์ด๋ฏธ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์˜์‚ฌ ๋ถˆ๋ณ€์„ฑ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์„ฑ์ƒ ์šฐ๋ฆฌ๋Š” ์ง„์ •ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“  ๋‹ค์Œ ๊ทธ ๋ณต์‚ฌ๋ณธ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  public ๋ฉ”์†Œ๋“œ๋ฅผ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋ž˜ํ•‘ํ•˜์—ฌ ๋‹จ์ˆœํžˆ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ญ์ƒ ๋ณต์‚ฌํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ m._d = new Date() ๋˜๋Š” m._d.setHours(1) ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@icambron์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ณ€์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์™„์ „ํ•œ ๋ณ€๊ฒฝ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ๊ฐ„์— ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์€ ๋Œ€์‹  ์ˆœ๊ฐ„์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ  ๋Œ€์‹  ๋ณต์‚ฌ๋ณธ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

API ํ‘œ๋ฉด์ 

์˜์‚ฌ ๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ์˜ ๋ถˆํ–‰ํ•œ ์ ์€ ๋ณ€๊ฒฝ์„ฑ์„ ๊ณ„์† ์ง€์›ํ•˜๋ ค๋ฉด ๋งŽ์€ ์ƒˆ API๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „์—๋Š” ์ˆœ๊ฐ„ ๋ณ€ํ˜•์—์„œ ์ˆœ๊ฐ„ ๋ณต์ œ ๋ฐ ๋ณ€ํ˜•์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— .clone() ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  setter์— ๋Œ€ํ•ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” API ํ‘œ๋ฉด์ ์— ์ƒ๋‹นํžˆ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ~20๊ฐœ์˜ setter ๋ฉ”์„œ๋“œ, add/subtract, local/utc/zone/tz, startOf/endOf, lang ๋ฐ ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐํƒ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ

์ด์ œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ƒˆ๋กœ์šด ์ˆœ๊ฐ„์€ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๋˜์ง€๋งŒ ์ด ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ๋น„์šฉ์€ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ setter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ผํšŒ์šฉ ํด๋ก ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ๋งŽ์€ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ž‘์€ ํ•จ์ˆ˜ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

for (var method in moment.fn) {
  moment.fn[method] = (function (fn, method) {
    return function () {
      console.log(method);
      return fn.apply(this, arguments)
    }
  })(moment.fn[method], method)
}

์ด์ œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ”„๋กœํ† ํƒ€์ž…์˜ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๋ฐฉ๋ฒ•์ด ์ˆœ๊ฐ„์„ ๋ณต์ œํ•  ํ•„์š”๋Š” ์—†์œผ๋ฏ€๋กœ ๋ณต์ œ๊ฐ€ ํ•„์š”ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

moment().isSame(moment(), 'year')
isSame
clone        // clone
startOf      // clone
month        // clone
date         // clone
year         // clone
date         // clone
hours        // clone
minutes      // clone
seconds      // clone
milliseconds // clone
valueOf
local        // clone
zone         // clone
startOf      // clone
month        // clone
date         // clone
year         // clone
date         // clone
hours        // clone
minutes      // clone
seconds      // clone
milliseconds // clone
valueOf

์ฆ‰ 21๊ฐœ์˜ ์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋œ ํ›„ ์ฆ‰์‹œ ํ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฒ„์ „๋งŒ ๋…ธ์ถœํ•˜๋Š” ์ผ๋ถ€ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณต์ œ๊ฐ€ ํ•„์š”ํ•œ ์ˆœ๊ฐ„๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ์ˆœ๊ฐ„์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ๋ณต์žก์„ฑ์„ ํฌ๊ฒŒ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ฌธ์ œ

์ˆœ๊ฐ„์„ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์€ ์ˆœ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ jsperf ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ํ–ˆ์Šต๋‹ˆ๋‹ค.

http://jsperf.com/moment-cloning

http://jsperf.com/moment-cloning-2

๋‚˜๋Š” ๋‘ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ๊ฐ€ ์˜์‚ฌ ๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ ์„ฑ๋Šฅ ์†์‹ค์„ ํ›จ์”ฌ ๋” ์ž˜ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ๊ณผ์— ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ 21๊ฐœ์˜ ๋ณต์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณฑํ•˜๋ฉด ์‹คํ–‰ ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.

์ˆœ๊ฐ„ ๋ณต์ œ๋ฅผ ์œ„ํ•ด ๊ฒฝ๋กœ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ์–ป์œผ๋ ค๋ฉด ์†๋„๋ฅผ 50๋ฐฐ ๋” โ€‹โ€‹๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ API์˜ ๋ณต์žก์„ฑ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ์ฃผ์š” ์„ฑ๋Šฅ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋น„์šฉ์ด ๋ถˆ๋ณ€์„ฑ์ด ์ œ๊ณตํ•˜๋Š” ์ด์ ์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์š”์ ์„ ๋†“์น˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐ .clone()์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ API์—์„œ clone()์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹ค๋ฅธ ์ฃผ์š” ์‚ฌ๋ก€๋Š” ๋‹ค์ค‘ ์ˆœ์ฐจ์  ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ๋ชจ๋“  ๋Œ์—ฐ๋ณ€์ด๊ฐ€ ๋‹จ์ผ ํด๋ก ์—์„œ ๋Œ์—ฐ๋ณ€์ด๋กœ ์ˆ˜ํ–‰๋˜๋„๋ก ๋นŒ๋” API๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์›๋ž˜ ๋ฌธ์ œ๋Š” startOf ๋ฐ endOf ๋ฉ”์„œ๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ ์ด ์ด๋ฆ„์€ "์ด ์ˆœ๊ฐ„์„ ํ•œ ๋‹ฌ์˜ ์‹œ์ž‘์œผ๋กœ ์„ค์ •"์ด ์•„๋‹ˆ๋ผ "ํ•œ ๋‹ฌ์˜ ์‹œ์ž‘"๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. add ๋ฐ subtract add ์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋Š” ์˜๋ฏธ๋ก ์  ์˜๋ฏธ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ฐœ์ฒด์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ toStartOf ๋ฐ toEndOf ์™€ ๊ฐ™์€ startOf ๋ฐ endOf ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ toEndOf (์˜ˆ: "์ด ์ˆœ๊ฐ„์„ ํ•œ ๋‹ฌ์˜ ์‹œ์ž‘์œผ๋กœ ์ด๋™")์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ. ์ž„ํ˜ธ

@gregwebs ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ set ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

@soswow์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค toStartOf ๋Š” toISOString ๋Œ€์ฒด ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ถˆ๋ณ€์„ฑ์„ ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ์•”์‹œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ "Moments setters๋Š” moment๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค" ๋˜๋Š” "Moments setters๋Š” ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ์ง„์ˆ ์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@timrwood ์˜ ์šฐ๋ ค ์‚ฌํ•ญ:

JS ๊ฐ์ฒด๊ฐ€ ์ง„์ •์œผ๋กœ ๋ถˆ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์€ ๋‚˜๋ฅผ ๊ดด๋กญํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์š”์ ์€ API๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ณ„์•ฝ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‚ฌ์šฉ์ž๋Š” ๋ฐ‘์ค„ ์นœ ์†์„ฑ์„ ์กฐ์ž‘ํ•˜์—ฌ ์†์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์ธ ์–ธ์–ด์—์„œ๋„ ์†์ž„์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ๋ฉด์  ๋ฐ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด: CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ mutator๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค[1]. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋Š ์ •๋„ ์ง€์›ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ setYear() ๋“ฑ๊ณผ ๊ฐ™์ด ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ‘œ๋ฉด์ ์ด ๋งŽ์ด ์ถ”๊ฐ€๋˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋ณต์žก์„ฑ์ด ๋งŽ์ด ์ถ”๊ฐ€๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋น„๋ช…์‹œ์  ๋Œ์—ฐ๋ณ€์ด์ž์˜ ๊ฒฝ์šฐ ์™ธ๋ถ€์ ์œผ๋กœ ๋ณต์ œํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ๋Œ์—ฐ๋ณ€์ดํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ณด๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์ฝ”๋“œ์—์„œ ๋ณต์ œํ•ด์•ผ ํ•˜๋ฏ€๋กœ Moment๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์œ„์น˜์—์„œ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋นŒ๋” ์ธํ„ฐํŽ˜์ด์Šค(Greg์˜ ์•„์ด๋””์–ด์— ๋”ฐ๋ผ) ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋ณ€๊ฒฝ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์‹ธ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋”๋Š” ๋ณต์žกํ•จ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค[2]. ๊ทธ๋ž˜์„œ ์ €๋Š” ๋ช…์‹œ์  mutator ๋Œ€์•ˆ์„ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Moment๋Š” ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ด๋ฏ€๋กœ ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์ด API ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ ์„ฑ๋Šฅ ํ•ด์น˜๊ฐ€ ์žˆ๋Š” ๋ฉ‹์ง„ ๋ถˆ๋ณ€ API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

[1] FP ๋žœ๋“œ์˜ ๋ฉ‹์ง„ ์•„์ด๋“ค์€ _๊ตฌ์กฐ์  ๊ณต์œ _๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ๋Š” ์•„๋งˆ๋„ ๋น„ํ˜„์‹ค์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[2] ์ „ํ†ต์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์€ ๋ณ„๋„์˜ ๊ฐ์ฒด์ธ ๋นŒ๋”๋ฅผ ๋งŒ๋“ค์ง€๋งŒ ์ „์ฒด setter API๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ๋Š” ์ •๋ง ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ฑ‰์–ด๋‚ด์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ๋Œ€์•ˆ์€ .chain() ๊ฐ€ isBuilding ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ ๋ณต์ œ ์ˆœ๊ฐ„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด๋ถ€ ํด๋ก ์€ ๋ฌด์‹œ๋˜๊ณ  ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ build() ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ • ํ•ด์ œํ•˜๊ณ  ํ•ด๋‹น ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊นƒ๋ฐœ์ด ์„ค์ •๋˜๋ฉด ๊ฒŒํ„ฐ๊ฐ€ ํ”ผ๋น„๋ฆฐ๋‚ด ๋‚˜๋Š” ์‚ด์ธ์„ ์™ธ์ณ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ฐ‘์ž๊ธฐ ๋Œ์—ฐ๋ณ€์ด๊ฐ€ ๋˜๋Š” ์—ฐ๊ฒฐ๋˜์—ˆ์ง€๋งŒ ๊ตฌ์ถ•๋˜์ง€ ์•Š์€ ์ˆœ๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์™ธ๋ถ€ ๋ฐ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒŒํ„ฐ๋ฅผ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ ˆํ. ๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ ๋นŒ๋”๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฏน์Šค์ธ์œผ๋กœ ๋ถ„ํ•ดํ•˜์—ฌ ๋นŒ๋”์™€ Moment ๋ชจ๋‘์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ฝ”๋“œ ๊ตฌ์„ฑ ๊ด€์ ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์€ ํ•จ์ˆ˜์— ์ถ”๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ”Œ๋ž˜๊ทธ(๋‚˜๋Š” self๋ผ๊ณ  ํ•จ)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€(๋ณต์‚ฌ๋ณธ ๋˜๋Š” ์ƒˆ ๊ฐ์ฒด ๋ฐ˜ํ™˜)์ด๋ฉฐ, ์„ฑ๋Šฅ์„ ๊ฐ์ง€ํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž…์žฅ์€ ๋งŽ์€ ๊ฐˆ๋“ฑ์„ ํ•ด๊ฒฐํ–ˆ๊ณ ,
๊ฑฐ์˜ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์œ ์‚ฌํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
๋˜๋Š” ์„ฑ๋Šฅ ํฌ์ธํŠธ๋ฅผ ๊ฐ์ง€ํ•  ๋•Œ ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ์—์„œ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ํ”Œ๋ž˜๊ทธ๊ฐ€ true์ธ ๋‹ค์Œ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์œผ๋กœ ๋‚˜๋Š” ๋˜ํ•œ ๊ธฐ๋Šฅ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋‚ด ์ฝ”๋“œ์—์„œ ๋ฐฐ์—ด ๋ฐฐ์—ด(์˜ˆ: ํ…Œ์ด๋ธ”, ํ–‰ ๋ฐฐ์—ด)๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด์ „์— ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ์ƒˆ ๋ฐฐ์—ด์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ํ•„ํ„ฐ๋ง, ํ†ตํ•ฉ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ–ˆ์Œ์„ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ  ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ฐฐ์—ด ๋ฐ ๋‹ค์Œ ํ˜ธ์ถœ์—์„œ ๋‚ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋™์ผํ•œ ๋ฐฐ์—ด ์‚ญ์ œ ํ–‰์œผ๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์˜ˆ:
moment.add = function(์ธก์ •, ๊ธˆ์•ก, ์ž์ฒด){
}

moment.add = ํ•จ์ˆ˜(์ธก์ •, ๊ธˆ์•ก, ์ž์ฒด) {
var $moment = ์ž๊ธฐ ? this : this.clone();
// ์‹ค์ œ ์ฝ”๋“œ
$ ์ˆœ๊ฐ„ ๋ฐ˜ํ™˜;
}

2์„ผํŠธ๋ฅผ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

ํ”„๋กœํ† ์ฝœ์˜ ๊ฒฝ์šฐ @icambron ์˜ ๋ชจ๋“  ์š”์ ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๋ฌผ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ํฐ ์งˆ๋ฌธ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์‰ฌ์šด ๊ฒƒ์€ ์ƒˆ API๊ฐ€ ๋ฌด์—‡์ด์–ด์•ผ ํ•˜๋Š”์ง€, ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
1.1 ๋‹ค๋ฅธ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ(๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ๋ฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€) year / setYear , startOf / setStartOf
1.2 ๋˜๋Š” builder api chain().mutators().build() , @lfnavess๊ฐ€ ์ œ์•ˆํ•œ

๋นŒ๋” API๋Š” ํ™•์‹คํžˆ ๋” ์„น์‹œํ•ด ๋ณด์ด์ง€๋งŒ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋นŒ๋“œ ๋ชจ๋“œ์— ๋„ˆ๋ฌด ์˜ค๋ž˜ ๋จธ๋ฌด๋ฅด์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ์™€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” ์ƒˆ ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
2.1 ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ฏธ์นœ ์ •๊ทœ์‹์€ 1.1์—์„œ ์ž‘๋™ํ•˜๊ณ  1.2์—์„œ๋Š” AST ์ˆ˜์ค€ ์†”๋ฃจ์…˜์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Œ -- ์•„๋ฌด๋„ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ year ๋ฐ month ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด). python์€ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์–ธ์–ด๊ฐ€ ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!
๋นŒ๋” API๋ฅผ ํ•ญ์ƒ ์ผœ๋Š” 2.2 ์˜ต์…˜(ํ˜„์žฌ์™€ ๋™์ผ) ๋ฐ ์ƒˆ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ด๊ฒƒ์€ ๋” _์ง„ํ™”์ ์œผ๋กœ_ ๋ณด์ด์ง€๋งŒ, ์ด๋กœ ์ธํ•ด ์•ผ๊ธฐ๋  ํ˜ผ๋ž€์˜ ์ •๋„๋Š” ์•„๋งˆ๋„ ๊ฐ€์น˜๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆœ๊ฐ„์—๋Š” ์ด์ œ ๋‘ ๊ฐœ์˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€์™€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ -- ์—„๊ฒฉํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ์ง€(๊ฒŒํ„ฐ ์—†์Œ) ๋˜๋Š” ๊ณผ๋„๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ์ง€(getters ok). ํ•จ์ˆ˜์—์„œ ๋ชจ๋ฉ˜ํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ , ๋ชจ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค... ์ด ์–ผ๋งˆ๋‚˜ ์—‰๋ง์ง„์ฐฝ์ธ์ง€!


๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ๋‚˜์—๊ฒŒ ์˜จ ๋ฏธ์นœ ์•„์ด๋””์–ด

Copy-On-Write ํด๋ก 

m = moment();
funcIDontTrust(m.clone());  // doesn't actually clone

function funcIDontTrust(m) {
  m.year(2005);  // perform the clone here
  console.log(m);
}

์ธ์Šคํ„ด์Šค๊ฐ€ ๋งค์šฐ ๊ฐ€๋ณ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๋Œ์—ฐ๋ณ€์ด์ž๋Š” ์ด์ œ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋‹ค์–‘ํ•œ ์„ฑ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์†Œ์‹์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ ์šฐ๋ฆฌ์™€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด๊ฒƒ์ด ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ์–ป๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ๋Š” ๋งŽ์€ ๊ด€๋ จ ๋น„์šฉ์ด ์ˆ˜๋ฐ˜๋˜๋ฉฐ ์–ด์ฉŒ๋ฉด ์ œ๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ
๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์ด์ ์€ ๊ฐœ๋ฐœ์ž ์„ ํ˜ธ๋„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๊นŒ?
๊ทธ๊ฒƒ์„ ์ „๋‹ฌํ•  ๋•Œ ์ˆœ๊ฐ„์˜ ์†Œ์œ ๊ถŒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋ ค๋ฉด?

๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์ „ํ™˜ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฒ„๊ทธ๊ฐ€ ๋œ ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฒ„๊ทธ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. @ichernev ์˜ ์˜ˆ๋Š” ๋ฒ„๊ทธ์˜ ์ •ํ™•ํ•œ ์ข…๋ฅ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šด ํ‘œ๋ฉด์ž…๋‹ˆ๋‹ค.

m = moment();
funcIDontTrust(m.clone());  // doesn't actually clone

function funcIDontTrust(m) {
  m.year(2005);  // perform the clone here
  // m is still in 2014
  // m.year(2005) created a clone but did not assign it to anything
  // it should be `m = m.year(2005)`
  console.log(m);
}

๋‹ค์Œ์€ ๊ฐ€๋ณ€์„ฑ๊ณผ ๋ถˆ๋ณ€์„ฑ์˜ ์žฅ๋‹จ์  ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์นœ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด,
์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ด ๋Œ“๊ธ€์„ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

| ๋ถˆ๋ณ€ | ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ |
| --- | --- |
| ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค | ์ผ๋ถ€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค |
| ์ˆœ๊ฐ„์„ ์ง€๋‚˜๊ฐˆ ๋•Œ ๋ฒ„๊ทธ๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค | ๋ณต์ œ๋œ ์ˆœ๊ฐ„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์„ ๋•Œ ๋ฒ„๊ทธ ๋ฐฉ์ง€ |
| ์ˆ˜์‹ญ ๊ฐœ์˜ ์ƒˆ๋กœ์šด API ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. | ๊ธฐ์กด .clone() ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ด๋ฏธ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. |
| | 10๋ฐฐ ๋น ๋ฅธ |
| | ํ›จ์”ฌ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ |

๋ถˆ๋ณ€์„ฑ์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ JavaScript์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ณ€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Elm๊ณผ ๊ฐ™์ด ๋ถˆ๋ณ€์„ฑ์ด ์˜ˆ์ƒ๋˜๋Š” ์–ธ์–ด์—๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ JavaScript์˜ ๊ฒฝ์šฐ ๊ฐ€๋ณ€์„ฑ์ด ์˜ˆ์ƒ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

typeof a === "object" ๋‚ด์žฅ API์˜ ๋Œ€๋ถ€๋ถ„์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Array#push,pop,reverse,sort,shift,splice,unshift ๋ชจ๋‘ ์ƒˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. Date#setX ๋ฉ”์„œ๋“œ์˜ 16๊ฐœ ๋ชจ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ˆœ๊ฐ„์ด ๋ณ€ํ•œ๋‹ค๊ณ  ๋ถˆํ‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋งŽ์ด ๋ดค๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ „ํ™˜ํ•˜๋ฉด ๋ถˆํ‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ๊ทธ๋งŒํผ ๋งŽ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ 2๋…„ ์ „์— eod/sod ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ๋งŽ์€ ์˜ค๋ž˜๋œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณธ ํ›„ ์—ฌ๊ธฐ์—์„œ ๋‚ด๊ฐ€ ์•„๋งˆ ๊นจ์ง„ ๋ ˆ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋“ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–‘์ธก ๋ชจ๋‘ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ์ œ๊ธฐ๋œ ๋™์ผํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ API๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋…ผ์Ÿ์ด ํ† ๋ก ์—์„œ ํ‘œํ˜„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@timrwood ์ข‹์€ ๋น„๊ต์ด์ง€๋งŒ, ๋ถˆ๋ณ€์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„

๋ฒ„๊ทธ ๋น„๊ต๋„ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. momentjs๋Š” ์—ฐ๊ฒฐ API๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var newM = m.year(2005) // wrong, these are both the same!

๋”ฐ๋ผ์„œ immutable๊ณผ mutable์€ ํ˜„์žฌ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ API๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ˜„์žฌ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์œผ๋กœ ์ด๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๊ฐ„์— ์ˆœ๊ฐ„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” API๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋ณด๋‹ค ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์œผ๋กœ ๊ธฐ๋Šฅ ์‚ฌ์ด์— ์ˆœ๊ฐ„์„ ์ „๋‹ฌํ•˜๋ฉด 2 ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) ๋ฏธ์นœ ๋ฒ„๊ทธ ๋ฐฉ์‹(์•„๋งˆ๋„ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ž„): ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์กฐ์‚ฌํ•˜์—ฌ ์›์น˜ ์•Š๋Š” ๋Œ์—ฐ๋ณ€์ด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์›์น˜ ์•Š๋Š” ๋Œ์—ฐ๋ณ€์ด๊ฐ€ ์นจํˆฌํ•˜์ง€ ์•Š๋„๋ก ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.
2) ์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•(๋Œ€์‹  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž), ๋ฐฉ์–ด์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋‚ด ํ•จ์ˆ˜์—์„œ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— clone() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.

๋ถˆ๋ณ€ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๋ฒˆ clone()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ์šฐ๋ฆฌ๋Š” ๋ณต์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” API ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ •ํ™•์„ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ฑ๋Šฅ ์ตœ์ ํ™”์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋“ค์ด์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๊ณต์ •ํ•œ ๋ฐœ์–ธ์ž…๋‹ˆ๋‹ค. ์ œ ์ฃผ์žฅ์€ ์ด์ ์ด ์žˆ์ง€๋งŒ ๋น„์šฉ๋ณด๋‹ค ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์‚ฌ์ด์— ์ž ์‹œ ์‹œ๊ฐ„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํด๋ก ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

์ด๊ฒƒ์€ ๋ถˆ๋ณ€์„ฑ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์€ ๊ฒƒ์ด ๋” ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ์œ ์ผํ•œ ์ฃผ์žฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@timrwood ๋„ค, ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ์‚ฌ๋ก€๊ฐ€ _against_ ๋ถˆ๋ณ€์„ฑ(๋”์ฐํ•œ ์„ฑ๋Šฅ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ API์— ์—†๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ฒ„๊ทธ๋ฅผ ์กฐ์žฅํ•จ)์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•˜๋Š” ํ‘œ์‹œ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

freeze()๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ecmascript 5 ๊ด€์ ์„ ๊ณ ์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , ์•„๋งˆ๋„ ํ˜„์žฌ ๊ฐ์ฒด๋ฅผ ์™„์ „ํžˆ ๊ณ ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ํ”„๋ฆฌ์ฆˆ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ „์—ญ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

http://blogorama.nerdworks.in/preventextensionssealandfreeze/

๊ณ ์ • ๊ฐ์ฒด๋Š” ๊ณ ์ • ํ•ด์ œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž์— ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@lfnavess ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ์‚ฌ๋ณธ์„ ์–ธ๊ธ‰ํ•˜๊ธฐ ์ „์— freeze ์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ... ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค / ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ์ง€๋„ ๋ชปํ•˜๊ณ  ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๋•Œ๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋น„์—„๊ฒฉ ๋ชจ๋“œ์—์„œ) -- ์‹ค์ œ๋กœ ์ถ”์ ํ•  ๋ฏธ์นœ ๋ฒ„๊ทธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@timrwood ๋‚˜๋Š” ๋‚ด ์˜ˆ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. m.year(2014) // clone here ๋ผ์ธ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆœ๊ฐ„์ด ์‹ค์ œ๋กœ ํด๋ก ์„ ๋งŒ๋“ค๊ณ (๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น) m์ด ์ž๋™์œผ๋กœ ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์ž„์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ clone() ๊ฐ€ ์•ฝ๊ฐ„์˜ ์…ธ ๋ฉ”๋ชจ๋ฆฌ(๋‚ด๋ถ€ ๋‚ ์งœ ํ‘œํ˜„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ)๋„ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ณต์ œํ•˜๊ณ  ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ(๊ณต์œ  ์ €์žฅ์†Œ์—์„œ ์ธ์Šคํ„ด์Šค๋ณ„์œผ๋กœ)์„ ๋ณต์ œํ•˜๋Š” clone ์˜ ๋ฐ˜์ž๋™ ๋ฒ„์ „์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ Date ๊ฐ์ฒด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น„์‹ผ์ง€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ ์€ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค this._storage._d ๋Œ€์‹  this._d , ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ˜œํƒ์„ ๊ทน๋ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ˆœ๊ฐ„์˜ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์‚ฌ์šฉ์ž ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์— ๋‚˜์—ด๋œ ์˜ต์…˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ญํ˜ธํ™˜์„ฑ์€ ์ด์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ธ IMO์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์—„์ฒญ๋‚œ ๋ณ€ํ™”๋ผ๋Š” ๊ฒƒ์„ ๋ฐ›์•„๋“ค์—ฌ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

re:perf๋Š” ๋ถˆ๋ณ€์„ฑ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํฐ ์ด์ ๋„ ์žˆ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์กฐ๋กœ์šด ์„ฑ๋Šฅ ํžˆํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐœ์ฒด ์ˆ˜์ค€์—์„œ ํ•ญ๋ชฉ์„ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ญ๋ชฉ์€ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ clone() ์—์„œ ์‚ด์•„์žˆ๋Š” ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. AFAIK์—๋Š” ๋‚ ์งœ๋ฅผ ๋ณต์ œํ•˜๊ณ  5๊ฐœ์˜ ๊ฐ’์ฒ˜๋Ÿผ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. newThing._offset = oldThing._offset ์™€ ๊ฐ™์ด ํ•˜๋“œ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Edit, arg, no - ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์—ฌ๊ธฐ ).

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์—ด๋ง์„ ๊ฐ์•ˆํ•  ๋•Œ ์•„์ง ๊ฒฝ๋Ÿ‰์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค๋ฅผ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค์—์„œ ๋˜๋Š” ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•จ). ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ 1์‹œ๊ฐ„ ์ด์ƒ์˜ ๋„์„œ๊ด€์„ ์œ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ: ๊ตฌ์กฐ์  ๊ณต์œ ์— ๋Œ€ํ•œ @ichernev ์˜ ์•„์ด๋””์–ด, ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์€ ๊ณต์œ  ์ƒํƒœ ๊ฐœ์ฒด๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋Œ€์‹  ํ”„๋กœํ† ํƒ€์ž… ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

WhoopInc์˜ ์šฐ๋ฆฌ๋Š” ์ด ํ† ๋ก ์— ๊ฝค ์˜ค๋žซ๋™์•ˆ ์ˆจ์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ† ๋ก ์ด ์›์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ์ฃผ๋ง์— ๋นŒ๋” API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถˆ๋ณ€ ๋ฒ„์ „์˜ ์ˆœ๊ฐ„์ด ์–ด๋–ค ๋ชจ์Šต์ผ์ง€ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. (์ €๋Š” ์ดˆ๋Œ€๋ฐ›์ง€ ์•Š๋Š” ํ•œ ์ˆœ๊ฐ„์— ๋Œ€ํ•œ PR์„ ์ œ์ถœํ•  ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ˆœ๊ฐ„ ์ž์ฒด์ ์œผ๋กœ ๊ตฌํ˜„๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•œ API ๋ณ€๊ฒฝ์„ ์˜๋„์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.) ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github. com/WhoopInc/frozen-moment

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

์˜ค๋Š˜ ๋ฐค ๊ทธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์—…๋ฐ์ดํŠธ๋œ ๋ฌธ์„œ๋ฅผ ๊ฒŒ์‹œํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  setter ๋ฐ mutation ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ„๋„์˜ ๋นŒ๋” ๊ฐœ์ฒด๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ frozenMoment("2014-07-21").thaw().subtract(1, "day").startOf("day").freeze().format("YYYY-MM-DD") ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ด ํŠน์ • ์˜ˆ์—์„œ๋Š” frozenMoment.build("2014-07-21").subtract... ์‚ฌ์šฉํ•˜์—ฌ frozenMoment์—์„œ ๋นŒ๋”๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋Œ€์‹  ๋นŒ๋”๋กœ ์ฒด์ธ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด์ง€๋งŒ)

FWIW, ์ˆœ๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ FP ์›์น™์„ ๋”ฐ๋ฅด๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

var now = moment();
var yesterday = now.subtract(1, 'days');
var dayBeforeYesterday = now.subtract(2, 'days');

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

์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์ด ์˜์‚ฌ ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

var now = now;
var yesterday = now - 1day;
var dayBeforeYesterday = now - 2days;

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋Œ€์‹ ์— ๋‚˜์—๊ฒŒ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

var now = now;
var yesterday = now = now - 1day;
var dayBeforeYesterday = now = now - 2days;

์ง€๊ธˆ์€ ๊ฝค ์ง€๋ฃจํ•˜์ง€๋งŒ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์—ฌ๊ธฐ์ €๊ธฐ .clone() ํ•ฉ๋‹ˆ๋‹ค.

var now = moment();
var yesterday = now.clone().subtract(1, 'days');
var dayBeforeYesterday = now.clone().subtract(2, 'days');

IMO, Javascript๋Š” ๋ฏธ๋ฌ˜ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ FP ์›์น™์ด ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด๋ ค์šด ๊ฒฐ์ •์ด๋ผ๋Š” ์ ์— ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋…ธ๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Moment.js๋Š” ๋†€๋ž์Šต๋‹ˆ๋‹ค.

100% ๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1.

๋ถˆ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์†”์งํžˆ ์ข€ ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 3์—์„œ 100% ๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ API๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ํŠนํžˆ .NET DateTime ๋ฐ Joda Time / Noda Time) ์‚ฌ์šฉ์ž๋กœ์„œ ์ง๊ด€์ ์œผ๋กœ add ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚ ์งœ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

100% ๋ถˆ๋ณ€์„ฑ์˜ ๊ฒฝ์šฐ +1

๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•œ ๊ฒฐ์ •์ด ๋‚ด๋ ค์ง„๋‹ค๋ฉด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๊บผ์ด ์‹œ๊ฐ„์„ ํ• ์• ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™”์ƒ ํ†ตํ™”๋ฅผ ํ†ตํ•ด ํŽ˜์–ด๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค์— ๋” ๋งŽ์€ ๊ธฐ์—ฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์š”๋ น์„ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ๋Š” ๋ถˆ๋ณ€์„ฑ์ด ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธ‰๊ฒฉํ•œ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค. ๋ถˆ๋ณ€์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ด ํ”„๋กœ์ ํŠธ์˜ ํฌํฌ๋Š” ๋” ๋‚˜์€ ์•„์ด๋””์–ด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dsherret ๊ทธ๊ฒƒ์ด ์šฉ๋„ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฃผ์š” ๋ฒ„์ „์„ ์ถฉ๋Œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•ฝ๊ฐ„์˜ ๋…ธ๋ ฅ์œผ๋กœ ๊ตฌ์„ฑ ์˜ต์…˜์œผ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋ชจ๋“  ๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? True ๋˜๋Š” False"์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์ง€์›๋˜์ง€ ์•Š๋Š” ๋น„๊ณต์‹ ymmv ๋ถˆ๋ณ€ ์ˆœ๊ฐ„ ํ”Œ๋Ÿฌ๊ทธ์ธ: https://gist.github.com/timrwood/fcd0925bb779f4374a7c

ใ…‹! ๋‚˜๋Š” ํ›จ์”ฌ ๋‚˜์ค‘์— ์—ฌ๊ธฐ์— ์™€์„œ ๋” ๋ถˆ๋ณ€ API์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ง€์ง€์ž ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋†€๋ž์Šต๋‹ˆ๋‹ค. :)

๊ทธ๋ฆฌ๊ณ  ๋„ค, ์ €๋Š” ๋‹ค์Œ ๋ฉ”์ด์ € ๋ฒ„์ „์˜ ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•ด +1์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ˆœ๊ฐ„์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ +1์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ๋‚ด '์ˆœ๊ฐ„' ์กฐํ•ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค: https://gist.github.com/idrm/a91dc7a4cfb381dca24e (์ž์‹ ์˜ ์ฑ…์ž„ํ•˜์— ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค!). ์ˆœ๊ฐ„() ํ˜ธ์ถœ์„ imoment()๋กœ ๋ฐ”๊พธ๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •์  moment.xyz()(์˜ˆ: moment.min(), moment.max() ๋“ฑ) ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+1๋ฐฑ๋งŒ ๋‹ฌ๋Ÿฌ

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

๋˜ํ•œ ์ด ํ† ๋ก  ์Šค๋ ˆ๋“œ์˜ ์ด์ „ ์ œ์•ˆ์— +1์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ผ๋ถ€ ๊ธฐ๋Šฅ์˜ ์ด๋ฆ„์„ ๋” ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค("startOf"์—์„œ "toStartOf", "add"์—์„œ "plus", "month"์—์„œ "withMonth) ", ๋“ฑ.)? ์ฆ‰, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Joda Time์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด "date.withDayOfMonth(1).withDayOfWeek(DateTimeConstants.MONDAY)"๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ๋“ค์€ ๋ฉ”์ธ ๋ฐฐํฌํŒ JS์— ์žˆ์„ ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‹๋ผ JS ์œ„์— ์ด๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋Š” ์• ๋“œ์˜จ๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(์  ์žฅ, ๋‚˜๋Š” ๋‚ด "์ˆœ๊ฐ„" ๋ชจ๋“œ์™€ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋Ÿฌํ•œ Joda Time-aligned ์• ๋“œ์˜จ์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

@ichernev , @icambron , ์ด๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ์…จ์Šต๋‹ˆ๊นŒ? 3.0์—์„œ ์ˆœ๊ฐ„์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„๊นŒ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด: 3.0์ด ์–ธ์ œ ๋‚˜์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ? ๋‚˜๋Š” frozen-moment๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ž‘์€ ๋ž˜ํผ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, frozen-moment๋Š” ์ตœ๊ทผ ๋Œ€๋ถ€๋ถ„ ๋ณด๋ฅ˜ ํŒจํ„ด์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ Moment์—์„œ ๋งŽ์€ PR์„ ์ด์‹ํ–ˆ์ง€๋งŒ ํ•ด๋‹น ํฌํฌ์—์„œ ์ด์ƒ์ ์œผ๋กœ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฆฌํŒฉํ† ๋ง์— ๋Œ€ํ•ด์„œ๋Š” ์‹ค์ œ๋กœ ์ž‘์—…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๊ธฐ๋ณธ ์˜์–ด ๋กœ์บ˜๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ frozen-moment๊ฐ€ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (๋ชจ๋“  ๊ฒƒ์ด ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜๋ฉฐ Moment์˜ ๋†’์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๋ฅผ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.) ์˜์–ด๊ฐ€ ์•„๋‹Œ ์–ธ์–ด๋Š” Moment์˜ ์ตœ๊ทผ ๋ฆฌํŒฉํ„ฐ๋ง๋œ ๋กœ์ผ€์ผ API๋ฅผ ์ด์‹ํ•œ ํ›„ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊นจ์กŒ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ Moment 3.0์— ๋Œ€ํ•œ ๊ฒฐ์ •์ด ๋‚ด๋ ค์ง€๋ฉด Moment์˜ ๋ถˆ๋ณ€์„ฑ ์ž‘์—…์ด๋‚˜ ์ ์ ˆํ•œ ๊ฒฝ์šฐ frozen-moment ํฌํฌ์— ๋Œ€ํ•ด ์ข€ ๋” ์ง„์ง€ํ•˜๊ฒŒ ์ž‘์—…ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๋‚˜์˜ ์ดˆ๊ธฐ ๋ชฉํ‘œ๋Š” ๋กœ์ผ€์ผ ์ง€์›์„ ์ˆ˜์ •ํ•˜๊ณ  Moment 3.0์˜ API์™€ ๊ธฐ๋Šฅ ํŒจ๋ฆฌํ‹ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1. ๋˜ํ•œ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” format ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์— +1.js
์•„๋‹ˆ๋ฉด moment.js์˜ ํฌํฌ? ๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„.js? ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

:100:
์ด๋ชจํ„ฐ๋ธ”์„ ํ•ด!

+1 ์š”์ฆ˜ ๋ถˆ๋ณ€์„ฑ์€ ์ข‹์€ JS API์—์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

:+1: ์˜ˆ, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋งค์šฐ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” .clone()์„ ๋„์ฒ˜์— ๋ฟŒ๋ฆฝ๋‹ˆ๋‹ค.

+1 ์ด๊ฒƒ์€ ์•„์ฃผ ์ข‹์€ ๊ฐœ์„ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

:+1: ๋ชจ๋“  ๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ

๋ถˆ๋ณ€์˜ ๊ฒฝ์šฐ +1

๋ชจ๋“  ๊ฒƒ์„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” now ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๊ธฐ ์ „์— ๋งค ์ˆœ๊ฐ„(now) ๋ณ€์ˆ˜๋ฅผ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ด ์ง€๊ฒน์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  now๋Š” ๋‹ค์‹œ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

๋‚˜๋Š” startOf('day') ๊ฐ€ ๋ณ€์ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์žฌ๋ฏธ์žˆ๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ moment.js ์—ฐ์‚ฐ์ž๊ฐ€ ๊ฐ€๋ณ€์„ฑ์—์„œ ์–ด์ƒ‰ํ•˜๋‹ค๋Š” ๋ฐ ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. mmnt.startOf('day') ์€ mmnt ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ์ ์—์„œ ๋งค์šฐ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งŽ์€ ๋ฃจํ”„์™€ ๋‚ ์งœ ๋น„๊ต๊ฐ€ ์žˆ๋Š” ๋‹ฌ๋ ฅ ์œ ํ˜• ์‚ฌ์šฉ ์‚ฌ๋ก€์— moment.js๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” clone() ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๊ณ  ๊ทธ๋“ค์€ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ํด๋ก  ์–ด๋–ค ๋ณ€์ด ์ผ๋ถ€ ์ œ์–ด๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์•„๋งˆ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ•„์ˆ˜์ ์ด๋‹ค.
๋ชจ๋“  ๊ณณ์— clone() ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์—๋Š” ์–ด์ƒ‰ํ•ด ๋ณด์ผ์ง€๋ผ๋„ ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ์€ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง์„ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋” ๋‚˜์€ API๋ฅผ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ clone() ๋งน๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์š”์ ์„ ๋†“์นœ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด 2ยข :-)

@jdurand ๋ช…์‹œ์ ์œผ๋กœ ๋ณต์ œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@dsherret ๋‚˜๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ์•„๋ฌด ๊ฒƒ๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ๋งค์šฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์ด๋ฏ€๋กœ ์•”์‹œ์ ์œผ๋กœ ๋ณต์ œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€๋Š” setters๊ฐ€ ๋ณต์ œ๋œ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์ €๋ฅผ ๋‘๋ ต๊ฒŒ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋น„ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ฐธ๊ณ : ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค... ์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€์‹  ๊ณผ๊ฑฐ์˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์ด ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ €์žฅํ•˜์—ฌ ๋ณต์ œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: add(1, 'days') ). ๊ฒฐ๊ณผ๋Š” .toString() , .format() , .toDate() , .day() ๋“ฑ์ด ํ˜ธ์ถœ๋  ๋•Œ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜์—ฌ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทน์ ์ธ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ ๋” ๋นจ๋ผ์ง€์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ... ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋˜ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณธ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋ณต์ œ ๋ฐฉ๋ฒ• ์ด์™ธ์˜ moment.js์—์„œ).

@dsherret ๋‚˜๋Š” _builder_/_lazy_ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋Œ์ด์ผœ๋ณด๋ฉด ์•„๋งˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด๋ ‡๊ฒŒ ์ง€์–ด์กŒ์–ด์•ผ ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ง์”€ํ•˜์‹ ๋Œ€๋กœ API ํ˜ธํ™˜์„ฑ์„ ์—ผ๋‘์— ๋‘” ๋ถˆ๋ณ€์˜ ํฌํฌ๊ฐ€ ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

2์„ผํŠธ ๋”:

  1. ์„ฑ๋Šฅ๋ณด๋‹ค๋Š” ํŽธ์˜์„ฑ์„ ์œ„ํ•œ ๋ชจ๋ฉ˜ํŠธ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ์ถ•๋œ ์ƒํ™ฉ์—์„œ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•ด์•ผ ํ• ๊นŒ์š”? m.add('year',1)์—์„œ '์—ฐ๋„'๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ๋ณต์ œ๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  2. ์ „์ฒด ํฌํฌ(๋‹ค๋ฅธ ์ด๋ฆ„, ๋‹ค๋ฅธ ๋ฌธ์„œ)๊ฐ€ ์—†๋Š” ํ•œ 2๊ฐ€์ง€ ๋ฒ„์ „์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜‘๋˜‘ํ•œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฐ™์€ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ moment.immutable.min.js์™€ moment.min.js๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•ด ๋‚ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

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

๋‘ ๊ฐœ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๊ณ ํ†ต์Šค๋Ÿฝ๊ณ  ์†๋„๋ฅผ ๋Šฆ์ถ”๋ฉฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ/๋ถˆ๋ณ€ ๋ฒ„์ „์„ ๋ณด์œ ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ์™„์ „ํžˆ ๋ถˆ๋ณ€ํ•˜๋Š” ์ˆœ๊ฐ„์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ๋ฒ”ํ•˜๊ณ  ๋๋ƒ…์‹œ๋‹ค :๋Œ„์„œ:

๋ฐฉ๊ธˆ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์•˜์ง€๋งŒ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋ถ€์ž‘์šฉ์œผ๋กœ ๋ณด์ด๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

๋ป”๋ป”ํ•œ ํ”Œ๋Ÿฌ๊ทธ: ์—ฌ๊ธฐ์„œ ํ™•๊ณ ํ•œ ๊ฒฐ์ •์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ์ง€์ณค์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ๋‚˜๋Š” Frozen Moment๋ฅผ ๋ถ€ํ™œ์‹œํ‚ค๊ณ  Moment ์ž์ฒด์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—ญํ• ์„ ํ•˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋ง์— ์ฒซ ๋ฒˆ์งธ ํ”„๋ฆฌ๋ทฐ ๋ฆด๋ฆฌ์Šค๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€ @wyantb ์—๊ฒŒ ๋ชจ์ž ํŒ.

Frozen Moment๋Š” Moment์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๋ถˆ๋ณ€ ์œ ํ˜•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฒ„์ „์€ Moment์˜ ๊ธฐ๋Šฅ์„ ๋ž˜ํ•‘ํ•˜๊ณ  ์ ์ ˆํ•  ๋•Œ๋งˆ๋‹ค .clone() ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋นŒ๋” API๋ฅผ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด Moment ์ž์ฒด๋ฅผ ๋นŒ๋” ๊ฐ์ฒด์˜ ์•„์ฃผ ์ข‹์€ ๊ตฌํ˜„์œผ๋กœ ์ƒ๊ฐํ•˜๋„๋ก ๋„์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! Frozen Moment๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์›ํ•˜๋Š” ํ•ต์‹ฌ ๋ถˆ๋ณ€ ์œ ํ˜•๊ณผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ Moment์—์„œ ๋ถˆ๋ณ€์˜ Frozen Moment๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ๋ฆฌํ•œ ๋ถˆ๋ณ€ API๋กœ ์ž‘์—…ํ•˜๊ณ  ์‹ถ์€ ๋ถ„๋“ค์„ ์œ„ํ•ด -- ์ €๋„ ์ง€์›ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง Frozen ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ๋นŒ๋“œํ•  ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•˜์ง€๋งŒ TODO ๋ชฉ๋ก์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ๊ธฐ์ ์œผ๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ moment().freeze() ๋˜๋Š” moment.utc().freeze() ๋ชจ๋“  ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Frozen Moment๋Š” ๋ถ„๋ช…ํžˆ ์ Š์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์ด๋ฏ€๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ฑฐ์นœ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ ์žˆ๋Š” ๋ˆ„๊ตฌ๋ผ๋„ ์‹œ๋„ํ•ด ๋ณด๊ณ  ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์•„, ํ•œ ๊ฐ€์ง€ ๋”: ์ €๋Š” ์•„์ง ์ด๊ฒƒ์„ ๊ด‘๊ณ ํ•˜์ง€ ์•Š์ง€๋งŒ Frozen Moment ์ธ์Šคํ„ด์Šค๋Š” ๋Œ€๋ถ€๋ถ„์˜ Moment ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ "๊ทธ๋ƒฅ ์ž‘๋™"ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  Moment ํ”Œ๋Ÿฌ๊ทธ์ธ์ด Frozen Moment ์ „์— ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ Frozen Moments์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•ด ์ฃผ์‹œ๋ฉด ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ +1

๋ถˆ๋ณ€์˜ ๊ฒฝ์šฐ +1

์•„๋ฌด๋„ Immutable JS ์œ„์— ์ˆœ๊ฐ„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๊นŒ? JS์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

+1
๋‚˜๋Š” ์ด๊ฒƒ์œผ๋กœ ์ธํ•ด 3๋…„ ๋œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/Saleslogix/argos-saleslogix/commit/87b35b22c1a42670da369701b15e2bdb3786cabc

๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์š”๊ตฌํ•˜์ง€๋งŒ ํ•ต์‹ฌ ํŒ€์€ ๊ทธ๊ฒƒ์„ ํ•˜์ง€ ์•Š์„ ํ•‘๊ณ„๋ฅผ ์ฐพ์Šต๋‹ˆ๊นŒ? :NS
์—ฌ๋Ÿฌ๋ถ„, ์ด ๋ณ€๊ฒฝ์€ ES6์—์„œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ^^ ํ˜„์žฌ ํ˜•์‹์—์„œ API๋Š” ๋‹จ์ˆœํžˆ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ(ํ•„ํ„ฐ, ์—ฐ๊ฒฐ ๋“ฑ)๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” JS Array์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ผ๋ถ€๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์ œ์•ฝ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ๋ฌดํ•œํžˆ ๋†’๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” (์—ญ๋ฐฉํ–ฅ, ์ •๋ ฌ) ์•„๋‹™๋‹ˆ๋‹ค.

+1

ํ•ญ์ƒ ๋‚˜๋ฅผ ์–ป๋Š” ์ž‘์€ ํ•จ์ • (IMHO ์ด๊ฒƒ์€ ๋ถˆ๋ณ€์„ฑ์˜ ์ข‹์€ ์ด์œ ์ž…๋‹ˆ๋‹ค):

var today = moment();
for (var i = 0; i < 7; i++) {
   week.push(today.subtract(i, 'days').format('dd').toUpperCase());
}

์ด๊ฒƒ์€ ์Šฌํ”„๊ฒŒ๋„ ๋‚ ์งœ ์ด๋ฆ„์ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์ง€๋งŒ ์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚ ์งœ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•œ ๊ฒƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

i = 0 = today -0;
i = 1 = today -0 -1;
i = 2 = today -0 -1 -2;
etc

๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

var today = moment();
for (var i = 0; i < 7; i++) {
            if (i == 0) {
                week.push(today.subtract(0, 'days').format('dd').toUpperCase());
            }
            else {
                week.push(today.subtract(1, 'days').format('dd').toUpperCase());
            }
        }

@faebser ํ›Œ๋ฅญํ•œ ์˜ˆ

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

+1

@faebser๋Š” ์˜ค๋Š˜ ์•„์นจ์— ๋‚˜์—๊ฒŒ ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. Angular์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ + ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์€ **s์—์„œ ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ๋ณต์ œ ๋‚ ์งœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ์ค๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1, ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋ช‡ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

:+1:

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

๋‚˜๋Š”์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์ฐข์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๋‚ด ์•ˆ์˜ ์ˆœ์ˆ˜์ฃผ์˜์ž๋Š” "๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1! ์ˆœ๊ฐ„ ๊ฐ์ฒด๋Š” ๋ถ„๋ช…ํžˆ ValueObject ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค."๋ผ๊ณ 

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” moment.js๊ฐ€ GitHub์—์„œ 13๋ฒˆ์งธ๋กœ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ €์žฅ์†Œ์ด๊ณ (์ „์ฒด์ ์œผ๋กœ 24๋ฒˆ์งธ ), bower.io์—์„œ "moment"๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด 111๊ฐœ์˜ ์ผ์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋”์—๊ฒŒ ๋ถˆ๋ณ€ ๋ฒ„์ „์˜ ์ˆœ๊ฐ„์„ ๊ตฌํ˜„ํ•˜๋Š” ์ ์ง„์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ์ข…์†์„ฑ ๊ฐ„์— ์—„์ฒญ๋‚œ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ichernev ์•„๋งˆ๋„ ๋” ๊ฒธ์†ํ•œ ์ œ์•ˆ: ์ˆœ๊ฐ„ ๋ฌธ์„œ ํŽ˜์ด์ง€์˜ ์ž‘์€ ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝ์„ฑ ๋Œ€ ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๋ฐ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ณต์‹ ์ž…์žฅ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์ฃผ์žฅ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์š”์•ฝ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ํ† ๋ก  ์ž…๋ ฅ์„ ์›ํ•  ๊ฒฝ์šฐ CTA์ฒ˜๋Ÿผ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฌธ์„œ ํŽ˜์ด์ง€์—๋Š” "๋ถˆ๋ณ€"์ด๋ผ๋Š” ์šฉ์–ด๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "moment immutable"์„ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€๋งŒ ์ฝ๋Š” ๋ฐ 2์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ณ  ํ•ด๋‹น ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ํ˜„์žฌ ์ž…์žฅ์ด ์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "์ˆœ๊ฐ„ ๋ถˆ๋ณ€"์— ๋Œ€ํ•œ Google์˜ ์ตœ๊ณ  ํžˆํŠธ๊ฐ€ ์ˆœ๊ฐ„ ๋ถˆ๋ณ€์˜ ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ๋น ๋ฅธ ๋‹ต๋ณ€์„ ์ฃผ์—ˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

@jehoshua02 ์ธ์šฉ:
"์ด๊ฒƒ์ด ์–ด๋ ค์šด ๊ฒฐ์ •์ด๋ผ๋Š” ์ ์— ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋…ธ๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Moment.js๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค."

์—ฌ๊ธฐ ๋‚ด ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ชจ๋ฉ˜ํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“œ๋Š” ๋Œ€์‹  moment.immutable ํŒฉํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์€์˜ ์†์„ฑ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค moment ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ์ •ํ™•ํ•œ API ์„œ๋ช… ๋ฌถ์œผ ๊ฒƒ moment , ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆ๋ณ€.

๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ moment ํŒฉํ† ๋ฆฌ์˜ ํ”„๋กœํ† ํƒ€์ž… ํ™•์žฅ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋Œ€์‹  ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: WhoopInc/frozen-moment ๊ฐ€ ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@thomasvanlankveld ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๋Š” ์ฃผ์š” ๋ฒ„์ „ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. Bower์™€ npm์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ํ˜„์žฌ ์ฃผ์š” ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ๊ณ ์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์—ญํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - ์•„๋งˆ๋„ CDN์—์„œ ์ด๊ฒƒ์„ ์ œ๊ณตํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ œ์™ธํ•˜๊ณ . ๊ทธ๋Ÿฌ๋‚˜ CDN์—์„œ momentjs๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์–ด์จŒ๋“  ๋•Œ๋•Œ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฉ”์ด์ € ๋ฒ„์ „ ๋˜๋Š” ๊ทธ ์ดํ›„ ๋ฒ„์ „์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋กœ๋“œ๋งต์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋„ ๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ์— ๋ถ€๋”ชํžŒ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://stackoverflow.com/questions/33002430/moment-js-formatting-incorrect-date

๊ทธ๋ž˜์„œ ์ €๋Š” ์ „๋ฐ˜์ ์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.

+1 ๋ถˆ๋ณ€์„ฑ

์ด ๋†€๋ž๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ–‰๋™์œผ๋กœ ์ €๋…์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹นํ•˜๋Š” ์ฃผ์š” ๋ฒ„์ „ ๋ณ€๊ฒฝ์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ +1์ž…๋‹ˆ๋‹ค.

+1 ๋ถˆ๋ณ€์„ฑ

์™„์ „ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1.
"๋•Œ๋กœ๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ"์œผ๋กœ ์ธํ•ด ์†์‹ค๋œ ์ด ์‹œ๊ฐ„์˜ ์–‘์€ ์ƒ๋‹นํžˆ ํด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜, ์ง„์‹ฌ์œผ๋กœ ๋ง์ด์•ผ. ๋ˆ„๊ฐ€ datetime ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ๋‚˜์š”? ๋งˆ์น˜.. ์ •๋ง? ์‚ฌ์šฉ์ž์˜ 99.9%๋Š” ์›๊ฒฉ์—์„œ๋„ ์ข‹์€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋‚ ์งœ ๋˜๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋‚ ์งœ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋‹น ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๋‚ ์งœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์†Œ์ˆ˜์˜ ์‚ฌ์šฉ์ž๋Š” ์ตœ์ ํ™”๋œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ API ํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์€ ์œ ์ผํ•œ ์ •์ƒ์ ์ธ ๋””์ž์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๋ถˆ๋ณ€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋ณ€ ์œ ํ˜•๋ณด๋‹ค ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋‚ฎ๋‹ค๋Š” ์—ฌ๋Ÿฌ ์—ฐ๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1. ๋ช‡ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ์ผ๋ถ€๋Š” .startOf() ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๊ธฐ๋ณธ ๊ฐœ์ฒด์˜ ๋ณ€ํ˜•์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Moment๋กœ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ฒช์—ˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ๋•Œ๋•Œ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์ด ๋ณธ์งˆ์ ์œผ๋กœ ๋œ ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋” ํšจ์œจ์ ์ผ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋…ผ์Ÿ์€ ์˜ค๋ž˜ ์ „์— Java ์„ธ๊ณ„์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ๋ณ€ ๋‚ ์งœ๊ฐ€ ์ด๊ฒผ๊ณ  ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๊ตฌํ˜„(JodaTime)์ด ๊ฒฐ๊ตญ Java 8์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Java 8์˜ LocalTime ์€ "์™œ ์šฐ๋ฆฌ๋Š” _ํ•ญ์ƒ_ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?" ์ˆœ๊ฐ„. ๋‚˜๋Š” ๊ธฐ์ˆ ์„ ๊ฑฐ์˜ ๋ณต์Œํ™”ํ•˜์ง€ ์•Š์ง€๋งŒ ์†”์งํžˆ ๋งํ•˜๋ฉด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋‚ ์งœ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์žฅ์ ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ์˜ˆ.... ์ด ์Šค๋ ˆ๋“œ๊ฐ€ +1๋กœ ๋„˜์ณ๋‚˜๋Š” ๊ฒƒ์ด ์‹ซ์ง€๋งŒ, ๋ฌธ์ œ์˜ ์ง„์‹ค์€ Moment๊ฐ€ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ถˆ๋ณ€ JS ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ๊ทผ์— JodaTime API(์˜ˆ: Java 8 ๋‚ ์งœ)์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ JS๋กœ ์ด์‹ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ƒˆ๋กœ์šด npm ๋ชจ๋“ˆ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ €์— ๋ถˆ๋ณ€์„ฑ, LocalDate ๋ฐ LocalTime๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Java์—์„œ ์ด๋Ÿฌํ•œ ๊ฐœ๋…์œผ๋กœ ์ž‘์—…ํ•œ ํ›„์—๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ๋ณต์žกํ•˜๊ณ  ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋งํฌ?

2015๋…„ 12์›” 11์ผ ๊ธˆ์š”์ผ ์˜คํ›„ 4์‹œ 30๋ถ„ Andrew Schmadel [email protected]
์ผ๋‹ค:

๋‚˜๋Š” ์ตœ๊ทผ์— ๋งŽ์€ ๊ฒƒ์„ ์ด์‹ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ƒˆ๋กœ์šด npm ๋ชจ๋“ˆ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
JodaTime API(์˜ˆ: Java 8 ๋‚ ์งœ)๋ฅผ JS๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ถˆ๋ณ€์„ฑ, LocalDate ๋ฐ LocalTime๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ €.

Java์—์„œ ์ด๋Ÿฌํ•œ ๊ฐœ๋…์œผ๋กœ ์ž‘์—…ํ•œ ํ›„์—๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด kludge-y๋กœ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.
๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/moment/moment/issues/1754#issuecomment -163964349.

์›ŒํŠธ.
(๋ชจ๋ฐ”์ผ๋กœ ํƒ€์ดํ•‘, ๊ฐ„๊ฒฐํ•œ ๋ณ€๋ช…)

๋‚˜๋Š” ์•„์ง ์ฐจ์ž„๋ฒจ์„ ์šธ๋ฆฌ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ๊ฐ„ 3.0์˜ ๋ถˆ๋ณ€์„ฑ์— ์ฐฌ์„ฑํ•œ๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ moment ์™€ ๊ฐ™์€ ๊ฐ์ฒด๋Š” _value ๊ฐ์ฒด_๋กœ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ ๋ถˆ๋ณ€์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ DDD ํ•™ํŒŒ ์ถœ์‹ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ๋”๋ผ๋„ ์—ฌ์ „ํžˆ ํ•ด์•ผ ํ•  ์ผ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ฉ˜ํŠธ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋””์ž์ธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งž์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง๊ด€์ ์ธ API๊ฐ€ ์„ฑ๋Šฅ์„ ๋Šฅ๊ฐ€ํ•˜๋ฉฐ IMHO(๊ฐ’ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋ณ€ํ˜•)๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ moment 3.0์ด Date ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ํ† ๋ก ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ @mj1856์— ์™„์ „ํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ˆœ๊ฐ„ ์ธ์Šคํ„ด์Šค์—์„œ Object.freeze ๋ฅผ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์ด ์‹คํŒจํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ :

let now = Object.freeze(moment());
if (now.isSameOrBefore(anotherTime)) { // throws exception
}

์˜ˆ์™ธ:

TypeError: Can't add property _isValid, object is not extensible
 at valid__isValid (C:\git\quick-test\node_modules\moment\moment.js:93:24)
 at Moment.moment_valid__isValid [as isValid] (C:\git\quick-test\node_modules\moment\moment.js:2195:16)
 at Moment.isSame (C:\git\quick-test\node_modules\moment\moment.js:1945:44)
 at Moment.isSameOrBefore (C:\git\quick-test\node_modules\moment\moment.js:1962:21)

์›ํ•˜๋Š” ๊ฒฝ์šฐ Object.freeze ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@wmertens ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ด๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค : https://github.com/pithu/js-joda

@ichernev , @mj1856 , ์ž ์‹œ ๋™์•ˆ ๋ชจ๋ฉ˜ํŠธ ์ฝ”์–ด ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋ถˆ๋ณ€์„ฑ์— ์ƒ๋‹นํ•œ ๊ด€์‹ฌ์ด ์žˆ์–ด ์ด์ „ ์ž…์žฅ์„ ์ฒ ํšŒํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ฐจ๋‹จ์ž์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ 3.0์˜ ๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฒƒ์ด ํŽธ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@gabrielmaldi @wmertens ๋„ค. ๊ทธ๊ฑฐ์˜€๋‹ค. ๊ฒฝ๊ณ„์„ ์ด ๋งž์ง€ ์•Š๋Š” ๋Œ“๊ธ€์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐ˜์ฏค ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ถ„๋ช…ํžˆ '์ œ์ถœ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค.

์—‡๊ฐˆ๋ฆฐ ์ƒ๊ฐ์„ ์ •๋ฆฌํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • JS์˜ ๋ถˆ๋ณ€ ๋‚ ์งœ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์–ธ์–ด์—๋Š” ์„ฑ์ˆ™ํ•œ ๋ถˆ๋ณ€ ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ JS์˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์ถ”์ง„๋ ฅ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค( immutable.js ์—๋Š” 10,500๊ฐœ์˜ ๋ณ„์ด ์žˆ์Œ). ์ตœ์†Œํ•œ, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐœ๋… ์ฆ๋ช…์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ด€์‹ฌ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ๊ฑฐ์˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. js-joda ๋Š” JS์šฉ ๋ถˆ๋ณ€ ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋Š” ์ฒซ ๋ฒˆ์งธ ์ง„์ง€ํ•œ ์‹œ๋„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์€ ๋ช‡ ๊ฐ€์ง€ ์ฒ ํ•™์  ์งˆ๋ฌธ์„ ๋˜์ง€๋Š” ์—„์ฒญ๋‚œ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์šฐ ํฐ MomentJS ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ง€์›์„ ์žƒ๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•˜์ง€๋งŒ, ๋ถˆ๋ณ€ JS ๋‚ ์งœ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์šฐ๋ฆฌ ์ค‘ ๊นจ๋—ํ•œ ํœด์‹์„ ์ทจํ•˜๊ณ  ์‹œ๋„ํ•˜๋Š” ๋Œ€์‹  js-joda์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ๋”์ฐํ•œ ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค. Moment(ํฌ๊ณ  ํ™•๋ฆฝ๋œ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์„ ๊ฐ–์ถ˜ ์„ฑ์ˆ™ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์—์„œ ์ƒ๋‹นํžˆ ๊ธ‰์ง„์ ์ธ ๋ณ€ํ™”๋ฅผ ์ถ”์ง„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ์ณ๋‘๊ณ : js-joda๋Š” ์•„์ง ์–ด๋ฆฌ๊ณ  ์ €์ž์˜ ๋ชฉํ‘œ์™€ ์˜๋„๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๋ฌด์—‡์ธ์ง€ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ทธ๋Š” ๋ผ์ด์„ ์Šค๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฉฐ Joda Time ๋˜๋Š” JSR-310์„ ์ถฉ์‹คํžˆ ์žฌ๊ตฌํ˜„ํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ JS ๊ฐœ๋ฐœ์ž์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1์„ ํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋” ์ •ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํฐ ๋…ธ๋ ฅ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  (๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•ด์™”์„) ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Moment๋Š” @butterflyhug ์˜ https://github.com/WhoopInc/frozen-moment ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋  ์ •๋„๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3.x: ์˜ต์…˜์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ false์ด๋ฉฐ ์ „์—ญ ๋ชจ๋ฉ˜ํŠธ ๋‚ด๋ณด๋‚ด๊ธฐ์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด true๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ ์‹œ console.warn(๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ)
4.x: ์˜ต์…˜์œผ๋กœ ๋ถˆ๋ณ€, ๊ธฐ๋ณธ๊ฐ’์€ true, ํ”Œ๋ž˜๊ทธ๋Š” ์—ฌ์ „ํžˆ false๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. console.warn 5.x ์ผ์ •์— ๋Œ€ํ•œ ๊ฒฝ๊ณ (๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ)
5.x: ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ถˆ๋ณ€

์žฅ๊ธฐ ๋ถˆ๋ณ€์„ฑ ๋น„์ „์„ ์„ค๋ช…ํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์•ž์— ๋‘๊ณ  ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด 3.x/4.x/5.x ๊ฐœ์š”๋ฅผ ๋”ฐ๋ผ 1๋…„์— ํ•œ ๋ฒˆ์˜ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๋ฅผ ํ•˜๋ฉด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ œ๊ณต๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๊ด€์ฐฐ:

  1. ๋‚˜๋Š” WhoopInc/frozen-moment ๋ฅผ ๋งŒ๋“ค์—ˆ

์ฆ‰, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์‚ฌ๋žŒ๋“ค์ด frozen-moment๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ๊ฒฌํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฒ„๊ทธ๊ฐ€ ์ œ ๊ฒƒ์ด๋“ , ์ˆœ๊ฐ„์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์„ ์ „ํ˜€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์ˆœ๊ฐ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋“  ์ƒ๊ด€์—†์ด ๋ง์ž…๋‹ˆ๋‹ค. frozen-moment์— ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๋ฉด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ •์ง€๋œ ์ˆœ๊ฐ„๊ณผ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋…ธ๋ ฅ์ด ๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์œผ๋กœ์˜ ์ „ํ™˜์˜ ๊ณ ํ†ต์„ ์ดํ•ดํ•˜๊ณ  ์™„ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. moment๊ฐ€ 3.0์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ถˆ๋ณ€ 3.x API ์œ„์— mutable moment 2.x API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋…์ ์œผ๋กœ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ frozen-moment์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. frozen-moment๊ฐ€ ์•”์‹œ์ ์œผ๋กœ clone() ๋ชจ๋“  ๊ณณ์—์„œ ์ด ๊ฐ€๋ณ€์„ฑ ๋ž˜ํผ๋Š” ๋Œ€์‹  ์•”์‹œ์ ์œผ๋กœ ๋‚ด๋ถ€ ์ฐธ์กฐ๋ฅผ ์ƒˆ๋กœ์šด ๋ถˆ๋ณ€ โ€‹โ€‹๋ชจ๋ฉ˜ํŠธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ moment๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ์ „ํ™˜์„ ์‰ฝ๊ฒŒ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์ˆœ๊ฐ„ 3์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๊ธฐ๊บผ์ด ๋„์›€์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. js-joda๋Š” BSD ๋ผ์ด์„ ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JSR-310 ์„ JavaScript๋กœ

@butterflyhug - frozen-moment๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ ๊ธฐ๋ปค์ง€๋งŒ, ์ง€์›์ด ์ค‘๋‹จ๋˜๋ฉด ๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋‚ด ์ฝ”๋“œ์—์„œ ํฐ ์ผ์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ frozen-moment๋กœ์˜ ์ข…์†์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋ชฉํ‘œ๊ฐ€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๋Š” ๊ฒƒ์ด๊ณ  ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ ๊ทน์ ์œผ๋กœ ์ง€์›ํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธํ•ฉ๋‹ˆ๋‹ค. :-)

์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ™์€ ์‚ฌ๊ณ  ๊ณผ์ •์„ ๊ฒช์—ˆ๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค์ด ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ Date ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๊นจ๋Š” ๊ฐœ๋…(๋˜๋Š” ์ผ์ข…์˜ ์ง€์—ฐ ํ‰๊ฐ€ ์ถ”๊ฐ€)๊ณผ ํ•จ๊ป˜ ๋ถˆ๋ณ€์„ฑ์„ ํƒ๊ตฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@schmod์—์„œ ํ•œ ๋ฒˆ์— ํ•œ ๋‹จ๊ณ„์”ฉ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ (๋ถ„๋ช…ํžˆ) ํฐ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค

@RobertMcCarter ๋„ต, ๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•œ ์ผ๋ถ€ ์˜ต์…˜์ด ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€/

๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•ด +1, endOf()๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•œ ํ›„ ๋‚ด ์•ฑ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š”๋ฐ 30๋ถ„์ด ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‚˜๋Š” ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด endOf ์›”์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ˆœ๊ฐ„ ์ธ์Šคํ„ด์Šค๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ์ƒํƒœ๋กœ ๋‘˜ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ ๋†€๋ผ์šด ์ผ์ด๋ฉฐ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์šฐ์Šค๊ฝ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ œ ์ƒ๊ฐ์—๋Š” ๋Œ€๋ถ€๋ถ„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์—„์ฒญ๋‚œ ์ด์ ์— ์ œ ๋จธ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1 :)

๋‚˜๋Š” ๋ถˆ๋ณ€์„ฑ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์ด ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ทธ๋ƒฅ ๋‚ด๋ฒ„๋ ค ๋‘ฌ๋ผ!

@es6Test ๋ถˆ๋ณ€์„ฑ์— ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ทผ๊ฑฐ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ €ํ•ญ ์™ธ์— ๊ตฌ์ฒด์ ์ธ ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?

+1
๋‚ด ์ฝ”๋“œ๊ฐ€ .clone() ๋ฉ”์„œ๋“œ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๊ณ  ๋•Œ๋•Œ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ์‰ฌ์›Œ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

+1 ๋ถˆ๋ณ€์„ฑ์„ ๋†’์—ฌ์ฃผ์„ธ์š” ^_^

@danpantry ๋ช‡ ๊ฐ€์ง€ ์•ฑ์„ ๋” ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ์ƒ๊ฐ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์„ ํ˜ธํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ผ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ข…์ข… ์ˆœ๊ฐ„์— ๋ฉฐ์น ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@es6Test let ๋ฅผ _์ •๋ง_ ์‹ซ์–ดํ•˜๋ฉด ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

let date = moment()
// with immutability
date = date.add(5)

์ €๋„ ๋ถˆ๋ณ€์„ฑ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Python์˜ datetime ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์œผ๋กœ ์ •๋ง ๋น›์„ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ์ฒด๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React/Redux ์„ธ๊ณ„์—์„œ ๋ถˆ๋ณ€์„ฑ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ๊ฐ„์ด ๋ณธ์งˆ์ ์œผ๋กœ ๋ถˆ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋ช‡ ๊ฐ€์ง€ ์งœ์ฆ๋‚˜๋Š” ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์€ ์™„ํ™”๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. Facebook์˜ ImmutableJs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด immutable์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•ด +1์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€๋Š” ๋ถˆ๋ณ€์„ฑ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ค‘๊ฐ„์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค ๋” ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค). ๋‚˜๋Š” ์ด ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ํ• ์• ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์—ฌ์ž๋Š” ์ €์—๊ฒŒ ์—ฐ๋ฝํ•˜์—ฌ ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

์šฐ๋ฆฌ๊ฐ€ ๋งŽ์€ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์€ ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ท€ํ•˜์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ๋“ค์—ˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ „์ฒด ์œ ์ง€ ๊ด€๋ฆฌ์ž ํŒ€์€ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ์„ ํƒํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Œ€๋กœ, ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์ฑ„๋„์„ ํ†ตํ•ด ์ˆœ๊ฐ„์„ ์–ป๋Š” ๋ฐ ์˜์กดํ•˜๋Š” ์…€ ์ˆ˜์—†๋Š” ์ˆ˜์˜ ์‚ฌ์šฉ์ž์™€ ํ•จ๊ป˜ ํ•œ ๋‹ฌ์— 4๋ฐฑ๋งŒ ๊ฐœ์˜ NPM ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ํ˜„์žฌ์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์„ ์˜ˆ์ƒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์— ์˜์กดํ•˜๋Š” ๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ์ž‘์„ฑํ•˜๊ธฐ ์ถฉ๋ถ„ํžˆ ์‰ฝ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ง€์› ์š”๊ตฌ๋Š” ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†Œ๊ทœ๋ชจ ํŒ€์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ๋ คํ•  ์šฉ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค:

  • ์ •์ง€๋œ ์ˆœ๊ฐ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” API(ํ•ญ์ƒ ๋ณต์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” API)๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์–ด๋–ค ์ด์œ ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ํ˜„์žฌ ์ฝ”๋“œ์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋‘ ๋ฒˆ์งธ API๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

frozen moment ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ฌธ์ œ๋Š” ์˜ตํŠธ์•„์›ƒ์ด ์•„๋‹ˆ๋ผ ์˜ตํŠธ์ธ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ 
moment() ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก .freeze() ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์„ฑ์˜ ์š”์ ์€ ๊ฐ์ฒด X๊ฐ€ ์žˆ์„ ๋•Œ
๋ช…์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š” ํ•œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณต์šฉ ๊ธฐ๋Šฅ
๋ช…์‹œ์  ๋ณ€๊ฒฝ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ ์ฝ”๋“œ์— ๋‘ ๋ฒˆ์งธ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” API ์ถ”๊ฐ€
  2. ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“œ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ „์—ญ moment() ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ƒ์„ฑ๋œ moment() ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํ˜ธ์ถœ์ด ์‹œ๋„๋˜๋ฉด
    ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋ถˆ๋ณ€์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    API ํ˜ธ์ถœ.

๋ชจ๋‘๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‚˜์š”?

2016๋…„ 5์›” 23์ผ ์›”์š”์ผ ์˜คํ›„ 12:11, Maggie Pint [email protected]
์ผ๋‹ค:

์šฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ด€์‹ฌ.

ํ˜„์žฌ ๊ท€ํ•˜์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ๋“ค์—ˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. NS
์ „์ฒด ์œ ์ง€ ๊ด€๋ฆฌ์ž ํŒ€์€ ์šฐ๋ฆฌ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ
๊ทผ๋ณธ์ ์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋กœ ์„ ํƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๊ทธ๊ฒƒ์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค
๋ฐ”๋กœ ์ง€๊ธˆ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ๋กœ, ์šฐ๋ฆฌ๋Š” ํ•œ ๋‹ฌ์— 4๋ฐฑ๋งŒ ๊ฐœ์˜ NPM ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ํ†ตํ•ด ์ˆœ๊ฐ„์„ ์–ป๋Š” ๋ฐ ์˜์กดํ•˜๋Š” ์…€ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž ์ˆ˜
์ฑ„๋„. ์ด ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์„ ์˜ˆ์ƒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ค๋Š˜์ด๋‹ค. ๋˜ํ•œ ์ˆœ๊ฐ„์— ์˜์กดํ•˜๋Š” ๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด.

์ฝ”๋“œ๋Š” ์ž‘์„ฑํ•˜๊ธฐ ์ถฉ๋ถ„ํžˆ ์‰ฝ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ž‘์€ ํŒ€์ด ์šฐ๋ฆฌ์˜ ์—ฌ์œ  ๊ณต๊ฐ„์—์„œ ์ด๊ฒƒ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™”๋ฅผ ๋ฐ›์•„๋“ค์ด๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
์‹œ๊ฐ. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ๋ คํ•  ์šฉ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค:

  • ์ •์ง€๋œ ์ˆœ๊ฐ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” API(ํ•ญ์ƒ
    ํด๋ก ), ๋˜๋Š” ์–ด๋–ค ์ด์œ ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ์ง„์ •์œผ๋กœ ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?
    ์‚ฌ๋ฌผ?
  • ํ˜„์žฌ ์ฝ”๋“œ์— ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋‘ ๋ฒˆ์งธ API๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด
    ํ•„์š”?

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/moment/moment/issues/1754#issuecomment -221062274

Gmail ๊ณ„์ •์˜ Eric Lau

@maggiepint์— ์‘๋‹ตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ณ ์ • ์ˆœ๊ฐ„ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ: ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ˆ๋ฉฐ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฉฐ ์ ๊ทน์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค. ๋ถˆ๋ณ€์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ํŠนํžˆ ๋งŽ์€ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. API๋Š” ๋ถ€์ž‘์šฉ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ ์›๋ž˜ ๊ฐœ์ฒด๋„ ์ˆ˜์ •ํ•˜๋ฉด ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋์„ ์„ ์–ธํ•  ๋•Œ ์‹œ์ž‘์„ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
start = moment();
end = start.add(10, 'minutes');
  1. 'add' ์™ธ์— 'immutableAdd'์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ž˜ํผ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
import "moment/immutable";
start = moment();
end = start.add(10, 'minutes'); // immutable version of add

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

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

ํ•˜์ง€๋งŒ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ •๋ง ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ๊ฐœ์ฒด๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ก ์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์ด์ „์— ํ•˜๋˜ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Drew์˜ ์•„์ด๋””์–ด๋ฅผ ๋‘ ๋ฒˆ์งธ๋กœ:

"์ˆœ๊ฐ„/๋ถˆ๋ณ€" ๊ฐ€์ ธ์˜ค๊ธฐ;
์‹œ์ž‘ = ์ˆœ๊ฐ„();
๋ = start.add(10, '๋ถ„'); // add์˜ ๋ถˆ๋ณ€ ๋ฒ„์ „

๊ทธ๊ฒƒ์€ ๋ถˆ๋ณ€์˜ ์˜ตํŠธ ์•„์›ƒ์ด๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ์ด๋ฆ„.

2016๋…„ 5์›” 23์ผ ์›”์š”์ผ ์˜คํ›„ 12์‹œ 53๋ถ„, Maggie Pint [email protected]
์ผ๋‹ค:

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

์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด, ์ง„์ •์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ์ฒด๋Š”
๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด
๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค
ํด๋ก ์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์ด์ „์— ํ•˜๋˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/moment/moment/issues/1754#issuecomment -221076796

Gmail ๊ณ„์ •์˜ Eric Lau

@ericlau-์†”๋ฆฌ๋“œ

  1. ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“œ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ „์—ญ moment() ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ƒ์„ฑ๋œ moment() ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํ˜ธ์ถœ์ด ์‹œ๋„๋˜๋ฉด
    ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋ถˆ๋ณ€์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    API ํ˜ธ์ถœ.

ํŽ˜์ด์ง€์— ์žˆ๋Š” 2๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ˆœ๊ฐ„์ ์œผ๋กœ ๋‹ค๋ฅธ ๋™์ž‘์„ ์˜ˆ์ƒํ•˜๋ฉด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์„ ์˜ˆ์ƒํ•˜๋Š” datepicker๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ž์‹ ์˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์„ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” API ์‚ฌ์šฉ(์–ผ๋ผ ์–ผ์–ด๋ถ™์€ ์ˆœ๊ฐ„)

ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ๋„ ์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋ถˆ๋ณ€์„ฑ์„ ๋„์ž…ํ•˜๊ณ  ๊ธฐ์กด์˜ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ธฐ ์ „์—๋Š” ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"์ˆœ๊ฐ„/๋ถˆ๋ณ€" ๊ฐ€์ ธ์˜ค๊ธฐ;

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€๋Š” ์•Š์ง€๋งŒ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•˜๊ณ  ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์— 2๊ฐœ์˜ ๋ฒ„์ „์ด ์„ค์น˜๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด datepicker๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค).

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ API๋ฅผ ํ˜„์žฌ API์™€ ๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌํฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฒฐ๊ตญ ์ž์œ  ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

"๋‘ ๋ฒˆ์งธ API ์ถ”๊ฐ€ / ํ•˜์œ„ ๋ชจ๋“ˆ ๊ฒŒ์‹œ" ์˜ต์…˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜์„ฑ์— ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด moment() (๋ชจ๋“ˆ ๋žœ๋“œ์˜ import moment; ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋นŒ๋“œ์˜ moment ์ „์—ญ์„ ํ†ตํ•ด)์˜ ์˜๋ฏธ๋Š” ์ „ํ˜€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ—ˆ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜์ธ IMO๊ฐ€ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

import moment from 'moment';
import {immutable as immoment} from 'moment';

var a = moment(); // mutable moment
var b = moment().immutable(); // immutable moment
var c = immoment(); // also an immutable moment; shorthand

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

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๊ธฐํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋‘ ๋ฐฐ๋กœ ๋Š˜์–ด๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


ํ”Œ๋Ÿฌ๊ทธ์ธ์ด "์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ" ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ฉฐ ํ•ฉ๋ฆฌ์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ API์™€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ API๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ/๊ฐ€์ •์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด์•ผ ํ•˜์ง€๋งŒ ์–ด์ƒ‰ํ•œ ๊ตฌ๋ฌธ์— ์–ฝ๋งค์—ฌ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.


๋˜ํ•œ "๋ถˆ๋ณ€" API๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ์Ÿ/๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋” ํŒจํ„ด? ์ƒ์„ฑ์ž ์ธ์Šคํ„ด์Šคํ™”? ๊ฐ€์น˜ ๊ฐœ์ฒด? ํ˜„์žฌ API๋ฅผ ๊ตฌํ˜„ํ•˜์ง€๋งŒ "setter" ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

์ €์˜ ํ•œ ๊ฐ€์ง€ ์š”์ฒญ์€ ์ƒˆ๋กœ์šด API๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์–ด๋–ค ์ˆœ๊ฐ„์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. IMO, freeze ๋Š” ํ•ด๋‹น ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•˜๊ณ  ๋‚ด๊ฐ€ ์ž ์‹œ ์ง€๋‚˜๊ฐˆ ๋•Œ๋งˆ๋‹ค clone() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ๊ฑฐ์˜ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€๋Š” ์•Š์ง€๋งŒ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•˜๊ณ  ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์— 2๊ฐœ์˜ ๋ฒ„์ „์ด ์„ค์น˜๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด datepicker๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค).

๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ๋Š” ์–‡์€ ๋ž˜ํผ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฒ„์ „์˜ moment๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. '์ˆœ๊ฐ„/๋ถˆ๋ณ€'์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ  datepicker๋Š” ๋ฌธ์ œ ์—†์ด ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ '์ˆœ๊ฐ„'์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ˆœ๊ฐ„์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ˆœ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ธํ„ฐํŽ˜์ด์Šคํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ˆœ๊ฐ„์„ ์ „๋‹ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๊นŒ์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ž ์‹œ ์‹œ๊ฐ„์ด ์ฃผ์–ด์ง€๊ธฐ ์ „์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ํ”„๋กœ์ ํŠธ ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์›ํ•  ์‹œ๊ฐ„์„ ๊ฐ€์ง„ ํ›„์— ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž‘์„ฑ์ž์˜ ๊ฒฝ์šฐ).

๋ฐ˜๋Œ€๋กœ ๋ถˆ๋ณ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ถˆ๋ณ€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€ํ™˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ „๋‹ฌ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์œ ํ˜•์˜ ์ˆœ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@maggiepint ์˜ˆ, ๊ท€ํ•˜์˜ ์š”์ ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ํฐ ๋„์•ฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋‹จ์ˆœํžˆ clone ๊ฐ€ ์ปคํŠผ ๋’ค์— ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๊ผฌ์ž„์ด ํ•ด๊ฒฐ๋˜๋Š” ๋™์•ˆ.

@tacomanator ์ €๋„ ํ•˜๊ณ  ์‹ถ์€ ์ผ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋‹จ์ง€ ์–ด๋–ค ์ด์œ ๋กœ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์›ํ–ˆ๋Š”์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

@schmod freeze ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ API๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ•จ์ˆ˜ ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๊ท€์—ฌ์šฐ๋ฉด Frozen Moment์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ํ•ด๋‹น ์ €์žฅ์†Œ์˜ ๋ฌธ์ œ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ๋Œ€ํ•œ ๋…ผ์Ÿ์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์—์„œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ(๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋กœ) ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์•ฝ๊ฐ„์˜ ํ† ๋ก ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” Frozen Moment๋„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ผ ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋” ๋‚˜์€ API๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๋Š” ๋Œ€๋žต์ ์ธ ํ•ฉ์˜๋ฅผ ์–ป๋Š”๋‹ค๋ฉด ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ.

@maggiepint ๊ธฐ๋ณธ์ ์œผ๋กœ Frozen Moment์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๊ฒƒ์œผ๋กœ "ํ˜„์žฌ ์ฝ”๋“œ์— ๋‘ ๋ฒˆ์งธ, ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” API ์ถ”๊ฐ€"๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ? ๋„์›€์ด ๋œ๋‹ค๋ฉด Frozen Moment ๋˜๋Š” ๊ทธ ์•„์ด๋””์–ด์˜ ์ผ๋ถ€๋ฅผ ์ˆœ๊ฐ„ ์กฐ์ง์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ (๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋˜๋Š” ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€๋กœ) ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋•๊ฒ ์Šต๋‹ˆ๋‹ค.

@butterflyhug @ichernev ๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ์„ ์ •ํ™•ํžˆ ๋ง์”€ํ•˜๊ณ 

@butterflyhug

freeze ๋Š” ์ข‹์€ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ˆœ๊ฐ„์˜ _๋ชจ๋“  ๋‹จ์ผ_ ํ˜ธ์ถœ ํ›„์— ์ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ์งœ์ฆ๋‚˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ import 'moment/immutable' ์—๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์žŠ์–ด ๋ฒ„๋ฆฌ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ, ๋‹น์‹ ์€ semver๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ชจ๋“  ๊ฒƒ์ด _๊ธฐ๋ณธ์ ์œผ๋กœ_ ๋ถˆ๋ณ€์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ณ  ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฒด ์ฃผ์š” ๋ฒ„์ „์œผ๋กœ ๋ฆด๋ฆฌ์Šคํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ผ์ • ๊ธฐ๊ฐ„(12๊ฐœ์›”?) ํ›„์— ๋” ์ด์ƒ ์ด์ „ ๋ฒ„์ „์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ/์ˆ˜์ • ์‚ฌํ•ญ์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ„ํš๊ณผ ํ•จ๊ป˜ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ํŠธ๋ž™๊ณผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํŠธ๋ž™ ๋ชจ๋‘์— ๋ณ‘ํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ 12๊ฐœ์›” ํ›„์— ์ด์ „ ๋ฒ„์ „์€ _์—ฌ์ „ํžˆ_ ์ž‘๋™ํ•˜์ง€๋งŒ TLC๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋งŽ์€ ์˜ค๋ฒ„ ํ—ค๋“œ์ด์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ€๊ฒฝ์„ ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ํ•ต์‹ฌ ๊ฐœ๋ฐœ ํŒ€์˜ ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฐ๋ผ.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋˜ ๋‹ค๋ฅธ ์ž ์žฌ์ ์ธ ๋‹จ์ ์€ ์‚ฌ์šฉ์ž๊ฐ€ CDN์—์„œ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ช…์‹œ์  ๋ฒ„์ „์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์–ด๋–ค ์ด์œ ๋กœ๋“ ). ์ด๋กœ ์ธํ•ด ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” API๊ฐ€ ์ถœ์‹œ๋˜๋ฉด ์‚ฌ์ดํŠธ๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ "๋‹น์‹ ์—๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ์–ด์š”."๋ผ๋Š” ๋ง๋ฟ์ด์ง€๋งŒ, ์ด๊ฒƒ์ด ํ˜„์žฌ๋กœ์„œ๋Š” ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ „์—ญ ๊ฐœ์ฒด์— ์˜์กดํ•˜๊ณ  freeze() ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์‹ค์ œ๋กœ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


TLDR์€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ semver์— ์˜ํ•ด ํ•ด๊ฒฐ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ค‘๋‹จ๋˜๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ๋Š” ์ „์—ญ moment ๋ณ€์ˆ˜์— ์˜์กดํ•˜๊ณ  CDN์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด์จŒ๋“  ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

๋‚ด ํˆฌํ‘œ๋Š” semver ๋ฐ ๋ถˆ๋ณ€ 3.0 ๋ฆด๋ฆฌ์Šค์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” freeze ์ด๋ฆ„์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ˆœ๊ฐ„์ด ๊ณ ์ •๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์•ˆ์ „ํ•œ ๊ฐ€์ •์„ ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ด ๋ณธ์งˆ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ( Object.freeze() ์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋ถˆ๋ณ€์˜ ์ˆœ๊ฐ„์€ ๋™๊ฒฐ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ, ๋™๊ฒฐ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋นŒ๋” ํŒจํ„ด์˜ ์—„๊ฒฉํ•œ ๋ณ€ํ˜•์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: .build() ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ _only_ ๊ฐ์ฒด์—๋Š” setter๊ฐ€ ์žˆ๊ณ  ๊ทธ ํ›„์—๋Š” _only_์— getter๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค). ๋ชจ๋“  setter๊ฐ€ ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ธ์Šคํ„ด์Šคํ™”๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

/* BUILDER PATTERN */
var bldr = moment.immutable()
  .hours(5)
  .minutes(30)
  .seconds(25);

bldr.hours();  // throws exception.  builder has no getters

var time = bldr.build();

time.hours(); // 5
time.hours(6); // throws, OR returns a clone

/*  A more explicit variant:  */
var bldr = moment.immutable()
  .setHours(5);

bldr.getHours; // undefined

var time = bldr.build();
time.getHours(); // 5
time.setHours;   // undefined
/* VALUE OBJECT */
var time = moment.immutable()   // 00:00:00
  .hours(5)       // new object => 05:00:00
  .minutes(30)    // new object => 05:30:00
  .seconds(25);   // new object => 05:30:25

/*  Same thing, but more efficient:  */
var time2 = moment.immutable(5,30,25); // 05:30:25

time.hours();   // 5
time.hours(6);  // new object => 06:30:25

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

๋นŒ๋“œ๋œ ๋ชจ๋ฉ˜ํŠธ์˜ ์„ค์ •์ž๊ฐ€ ์˜ˆ์™ธ๋ฅผ throwํ•˜๋„๋ก ํ•˜๋ฉด ์ด ๋™์ž‘์ด ๋ชจํ˜ธ์„ฑ์„ ๋”์šฑ ์ค„์ด๊ณ (์ž์„ธํ•œ ๋‚ด์šฉ์„ ํฌ์ƒํ•˜๋ฉด์„œ) ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๋ชจ๋ฉ˜ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ธ์ •ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ๋งŽ์€ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑ(๋ฐ ํ๊ธฐ)ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ ํ™”์˜ ์—ฌ์ง€๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€ GC๋Š” ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Moment ๊ฐ์ฒด๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ Date ). (๋น„๊ต๋ฅผ ์œ„ํ•ด ์ด ํŒจํ„ด์€ JavaScript์—์„œ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค)


์ €๋Š” semver์˜ ํŒฌ์ด์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฌธ์ œ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ชจ๋“ˆ ๋กœ๋” ์—†์ด ๊ฐ™์€ ํŽ˜์ด์ง€์— ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์˜ moment๊ฐ€ ์žˆ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Moment์— ์˜์กดํ•˜๋Š” _๋งŽ์€_ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์›ํ™œํ•œ ์ „ํ™˜ ๊ธฐ๊ฐ„์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ๋‘ ํŒจํ„ด์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๋ฆด๋ฆฌ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ˆœ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๋ถˆ๋ณ€์ธ์ง€๋„ ์ƒ๊ด€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ•œ ์ค„(2๊ฐœ ๋Œ€์‹ )์— ๋ณ€ํ˜•๋œ ์ˆœ๊ฐ„์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alexyuly ๋ณต์ œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ธ๋ผ์ธ์œผ๋กœ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var a = moment();
var b = a.clone().subtract(1, 'week').startOf('day');

๋˜๋Š” ๋ฌด์—‡์ด๋“ .

@maggiepint ๊ธ€์Ž„์š”, ์ €๋Š” ์–ด๋ฆฌ์„์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŒ ๊ณ ๋งˆ์›Œ. ๋ฌธ์„œ์—์„œ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ: http://momentjs.com/docs/#/manipulating/start -of/ <- ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•œ ์–ธ๊ธ‰ ์—†์Œ.

์•ฝ๊ฐ„์˜ ์—…๋ฐ์ดํŠธ - ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์€ ํ˜„์žฌ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚ด ์ž…์žฅ์ž…๋‹ˆ๋‹ค: https://maggiepint.com/2016/06/24/why-moment-js-isnt-immutable-yet/

๋‚˜๋Š” ๋‚˜๋จธ์ง€ ํŒ€์— ๋Œ€ํ•ด ๋งํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ๋ณด์•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋น„์Šทํ•œ ์œ„์น˜์— ์žˆ๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@maggiepint ํ›Œ๋ฅญํ•˜๊ณ  ๋งค์šฐ ์œ ํšจํ•œ ํฌ์ธํŠธ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. redux์—์„œ๋Š” ๋ถˆ๋ณ€์„ฑ์ด ์™•์ด๋ฏ€๋กœ js-joda๋กœ ํ™•์‹คํžˆ ์ „ํ™˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒ๋Œ€์ ์ธ ์‹œ๊ฐ„์„ ์œ„ํ•ด ์—ฌ์ „ํžˆ ์ˆœ๊ฐ„์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—๋ฆญ ๋ผ์šฐ - Gmail

2016๋…„ 6์›” 24์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 11์‹œ 12๋ถ„ -0700์‹œ์— "Maggie Pint" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ฝ๊ฐ„์˜ ์—…๋ฐ์ดํŠธ - ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์€ ํ˜„์žฌ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚ด ์ž…์žฅ์ž…๋‹ˆ๋‹ค: https://maggiepint.com/2016/06/24/why-moment-js-isnt-immutable-yet/

๋‚˜๋Š” ๋‚˜๋จธ์ง€ ํŒ€์— ๋Œ€ํ•ด ๋งํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ๋ณด์•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋น„์Šทํ•œ ์œ„์น˜์— ์žˆ๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

๋Œ์—ฐ๋ณ€์ด๋กœ ์ธํ•œ ์ข€ ๋” ์ผ๋ฐ˜์ ์ธ ๋ฒ„๊ทธ/ํ˜ผ๋ˆ: http://stackoverflow.com/questions/26131003/moment-js-start-and-end-of-given-month

+1ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Moment ์ธ์Šคํ„ด์Šค๋ฅผ Redux ์ƒํƒœ ๊ฐœ์ฒด์— ์ „ํ˜€ ๋„ฃ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋†€๋ผ์šธ ์ •๋„๋กœ ์ž‘์€ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ ์งœ ๋ฌธ์ž์—ด ๋˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„๋งŒ ๋ Œ๋” ๋ฉ”์„œ๋“œ์—์„œ Moment๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ ์งœ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด ์ž‘์—…์„ ํ•˜๋Š” ์ด์œ ๋Š” ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ์ƒํƒœ๋ฅผ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ด์ง€๋งŒ ๋˜ํ•œ React ๋ฐ Redux์—์„œ ๋Œ์—ฐ๋ณ€์ด๋ฅผ ๋ฉ‹์ง€๊ฒŒ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์ด ์—ฌ์ „ํžˆ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ํฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์€ ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Babel์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋ฉ˜ํŠธ ๋นŒ๋“œ๋ฅผ ์žฌ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ @butterflyhug ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ•ต์‹ฌ ์ €์žฅ์†Œ๋กœ ๊ฐ€์ ธ์™€ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋„๋ก ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์ •๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @butterflyhug ๋Š” ์ด๊ฒƒ์œผ๋กœ ์šฐ๋ฆฌ๋ฅผ ๋งค์šฐ ์นœ์ ˆํ•˜๊ฒŒ ๋„์™€์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ LoDash์˜ John-David Dalton(์ €ํฌ ๋‘˜ ๋‹ค Microsoft์—์„œ ๊ทผ๋ฌด)๊ณผ ๋งŒ๋‚˜ ์ด๋ฏธ LoDash ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ์˜ ์ „๋žต์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ๊ณผ RFC๊ฐ€ ๊ณง ์ œ๊ณต๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

@maggiepint๋Š” frozen-moment๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ๋™์•ˆ https://github.com/WhoopInc/frozen-moment/issues/20 ์„ ๋‹ค๋ฃฐ ๊ณ„ํš

moment() ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณ ์ •๋œ ์ˆœ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งค๋ฒˆ .freeze() ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํ•œ ์ด ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@gabrielmaldi ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ €๋Š” RFC๋ฅผ ์ž‘์„ฑ ์ค‘์ด๋ฉฐ(์ง€๊ธˆ ๋‹น์žฅ ์ž‘์„ฑํ•ด์•ผ ํ•จ), ์˜ˆ, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ „์šฉ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋” ๋‚˜์€ ์Šคํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ €์˜ ๋ช…๋ฐฑํ•œ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ WhoopInc/frozen-moment#20์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ์— ๋”ฐ๋ผ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. RFC ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ PR์„ ์—ด ๋•Œ RFC์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์—ฌ๊ธฐ์™€ ํ•ด๋‹น ๋ฌธ์ œ์— ๊ฒŒ์‹œํ•  ๊ฒƒ์ด๋ฉฐ ๊ทธ ๋‹น์‹œ ์ œ์•ˆ์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RFC ์ดˆ์•ˆ ์ž‘์„ฑ์„ ๋งˆ์น˜๊ณ  PR์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค .

๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ์ƒ๋‹นํžˆ ๊ธด ๋ฌธ์„œ์ด๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ๊ฐ•์กฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌํ˜„ ์•„์ด๋””์–ด๋Š” ๊ฝค ๊ฒฌ๊ณ ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ œ์•ˆ๋œ ์‚ฌ์šฉ์ž ๋Œ€๋ฉด API์— ๋Œ€ํ•ด ์˜ˆ์•ฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ต๋ณ€ํ•ด์•ผ ํ•  ์ฃผ์š” ์งˆ๋ฌธ์ด ํฌํ•จ๋œ RFC ์š”์•ฝ: https://maggiepint.com/2016/07/16/immutability-its-happening/

@maggiepint ํ•ด๋‹น ๊ธ€์— ๋Œ“๊ธ€์„ ์–ด์ฉ์ง€ ์‚ผ์ผœ ๋ฒ„๋ ธ๋„ค์š” . ๋‚ด๊ฐ€ ์“ด ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ ์šฐ๋ ค๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ถˆ๊ท ํ˜•์ ์œผ๋กœ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋†’์ด๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์— ๋ฐ˜์‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์กฐ์ฐจ ๋ชจ๋ฅด๋Š” ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž์˜ ์กฐ์šฉํ•œ ๋ฐฉ๋ฒฝ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

GitHub์˜ ์Šค๋ ˆ๋“œ๋Š” ๋” ๋„“์€ ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ถ•์†ŒํŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์‚ฌ์ดํŠธ๋Š” ์›น์ƒ์˜ ๋งŽ์€ ํฌ๋Ÿผ๊ณผ ๋™์ผํ•œ ์ฐธ์—ฌ ํŽธํ–ฅ์„ ๊ฒช๊ณ  ์žˆ์œผ๋ฉฐ ํŠน์ • ์œ ํ˜•์˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŽธํ–ฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ๋ณด๋‹ค ์•„์ด๋””์–ด์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐํžˆ ๋‚˜๋Š” ์‚ฌํšŒ์ ์œผ๋กœ ์ธ๊ธฐ ์žˆ๋Š” ํŠธ๋ Œ๋“œ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฒฐ์ง‘ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋ฐœ์ž๋Š” ๋ถˆ๋ณ€์„ฑ ๋ฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ฐ™์€ ์ฒ ํ•™์  ๋ช…์ œ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Œ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์–ด๋–ค ๊ทธ๋ฃน๋ณด๋‹ค ๊ท€ํ•˜์—๊ฒŒ ๋” ๊ฐ€๊นŒ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ด ๋ฐฉ์—์„œ ๊ฐ€์žฅ ํฐ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋‚ผ ๊ฒƒ์ด๋ฉฐ ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋ฅผ ์™ธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋„“์€ ์„ธ์ƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋” ๋„“์€ ์„ธ์ƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์‹ถ์–ด ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ๋ฒ„๊ทธ ์ˆ˜์ •์ด์ง€๋งŒ ์ด์ƒ์ ์œผ๋กœ๋Š” ์‚ถ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ์ž‘์€ ์ ์ง„์  ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํฌ๋Ÿผ์„ ์ ๊ทน์ ์œผ๋กœ ์ฐพ์ง€ ์•Š๊ณ  ํŠธ๋ Œ๋“œ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋‚ด๋ ค๋ฉด ๋‘๊บผ์šด ํ”ผ๋ถ€๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋‹น์‹ ์ด ์ด ๋ณ€ํ™”๋ฅผ ์˜๋„ํ•œ๋‹ค๋ฉด, ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด ๋ณ€ํ™”๊ฐ€ ๊ทธ๋“ค์˜ ์‚ถ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ์ด์œ ๋ฅผ ์ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งค์šฐ ๋ถ„๋ช…ํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ„์ ‘์ ์ธ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ๋ฐ›์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋ณธ์งˆ์ ์œผ๋กœ - ํ˜„์žฌ ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์ผ์„ ์ง€๊ธˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์ค‘์š”์„ฑ์„ ์‹ค์ œ ์šฉ์–ด๋กœ ํ™•์ธํ•˜๋Š” ๋ฐ์—๋„ ๋งค์šฐ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋˜๋Š” ๋ž˜ํผ๋กœ ๋ฆด๋ฆฌ์Šคํ•˜๊ณ  ํŠธ๋ ํฌ์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐœ์›” ๋™์•ˆ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ฌ์šฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ณ€์„ฑ์ด ํ‹ˆ์ƒˆ ์‹œ์žฅ์˜ ๊ด€์‹ฌ์‚ฌ๋กœ ๊ณผ๋„ํ•˜๊ฒŒ ํ‘œํ˜„๋˜์–ด ์™”๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ด๋Ÿฌํ•œ ๋ณด์ปฌ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ ์‚ฌ์šฉ์ž๋กœ์„œ ๋‚˜๋Š” startOf endOf๋กœ ์žƒ์–ด๋ฒ„๋ฆฐ ์‹œ๊ฐ„ ํ›„์— ์—ฌ๊ธฐ์—์„œ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋“ค์€ ๋†€๋ž๊ฒŒ๋„ ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

์™„์ „ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์œ„ํ•ด +1

์•„๋งˆ๋„ ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ momentjs์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„

๋˜ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜, ๊ฐ€๋ณ€์„ฑ์„ ์›ํ•œ๋‹ค๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๊ณ  NEW ํ‚ค์›Œ๋“œ ๋Œ€ moment() ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.

๋” ๋„“์€ ์„ธ์ƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.
...์ด ๋ณ€ํ™”๊ฐ€ ๊ทธ๋“ค์˜ ์‚ถ์„ ๋” ๋‚ซ๊ฒŒ ๋งŒ๋“œ๋Š” ์ด์œ ๋ฅผ ์ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ˆœ๊ฐ„์„ ์ฒ˜์Œ ๋ชฉ๊ฒฉํ•œ ์‚ฌ๋žŒ๋“ค์€ ๋ชจ๋‘ "์ˆœ๊ฐ„"์ด ๋Œ์—ฐ๋ณ€์ด๋˜๋Š” ํ•จ์ •์— ๋น ์ง„๋‹ค.
3๋…„์˜ ์‚ฌ์šฉ ๊ธฐ๊ฐ„ ํ›„์—๋„ ์—ฌ์ „ํžˆ "์˜ค ์  ์žฅ, ์—ฌ๊ธฐ์—์„œ .startOf๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์‚ฌ๋ณธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์Šค์Šค๋กœ์—๊ฒŒ ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋™์ž‘์€ ์ง๊ด€์ ์ด์ง€ ์•Š์œผ๋ฉฐ ์ด๋Š” ์˜ค๋žœ ์‹œ๊ฐ„์ด ์ง€๋‚œ ์ผ์ž…๋‹ˆ๋‹ค.
array.filter/map์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์žฌ๋ฏธ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์— ๊ด€ํ•˜์—ฌ...
์„ฑ๋Šฅ/๋ฉ”๋ชจ๋ฆฌ: ์ˆœ๊ฐ„์— 2๊ฐœ ์ด์ƒ์˜ func๋ฅผ ์—ฐ๊ฒฐํ•œ ์ ์ด ์—†์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ .set().get()
์˜์‚ฌ ๋ถˆ๋ณ€์„ฑ: java-pass-by-ref-gen์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋งŽ์€ ์„ธ๋Œ€๊ฐ€ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” OOP ๋˜๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ฐพ๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ @AdamHess ์˜ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์„ผํŠธ๋Š” ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ฐ˜ํ™˜๊ฐ’์ž…๋‹ˆ๋‹ค. moment.add('1', 'days') ๊ฐ€ JS์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ˜ผ๋ž€์ด ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋‚˜์—๊ฒŒ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ƒˆ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ์„ฑ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ํŠน๋ณ„ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ œ์™ธ). ์ˆœ๊ฐ„์˜ ๊ฐ€๋ณ€์„ฑ์€ ์ด๋ฏธ ์ €๋ฅผ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ ์งœ๋Š” ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž์™€ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ +1

๊ทธ๋Ÿฐ๋ฐ PHP์—๋„ ์ด์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. PHP์ฒ˜๋Ÿผ ๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?! ๐Ÿ˜†

PHP์—์„œ๋Š” DateTimeImmutable (์ผ๋ฐ˜ DateTime ์ถ”๊ฐ€)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด imoment / momenti (๋˜๋Š” ๋ฌด์—‡์ด๋“ )๊ณผ ๊ฐ™์€ ์ผ๊ธ‰ ๋Œ€์ฒด API๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•ญ์ƒ ๊ทธ๊ฒƒ์„ (๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ API๋ฅผ ํ†ตํ•ด) ์‚ฌ์šฉํ•˜๊ณ  ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „/API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ €๋„ ๋ถˆ๋ณ€์„ฑ์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ณ„ํš์ด๋ผ๋ฉด ๊ตฌํ˜„์„ ๋„์šธ ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ง์…ˆ๊ณผ ๋บ„์…ˆ์„ ํ•  ๋•Œ ์ด๋ฏธ ๊ฐ€๋ณ€์„ฑ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋กœ ์ธํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ณต์ œ ๊ธฐ๊ฐ„์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํ•ดํ‚น๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@ngerritsen ๊ฐ€์žฅ ์ข‹์€ ์˜ต์…˜์€ moment.duration(existingDuration) ์ž…๋‹ˆ๋‹ค.

Re: ๊ตฌํ˜„, #3548์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ™œ์„ฑ PR์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ˆ˜์ค€ ์ž‘์—…์ด ๋งŽ์ด ๋‚จ์•„ ์žˆ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ผ์ง€๋งŒ ํฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ˆˆ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ฒฐ์ฝ” ๋‚˜์  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆด๋ฆฌ์Šคํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฃผ์š” ๋ฒ„์ „ ๋ฒ”ํ”„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋ฌธ์„œ ๋ฐ ๊ธฐํƒ€ ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜€

.startOf()๊ฐ€ ์›๋ž˜ ๋‚ ์งœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ํ•œ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค... ๋…ธ๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. momentjs๋Š” JS๋ฅผ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์ „ํ™˜ ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๊ฐ€ ๋งค์šฐ ๋ฏธ๋ฌ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๊ณ  (์ฃผ๋กœ React, Redux ๋ฐ ELM ๋•๋ถ„์—) ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ FP ๊ฐœ๋…์„ ์†Œ๊ฐœํ•œ ํ›„ ๋ถˆ๋ณ€์„ฑ์˜ ์ผ๋ฐ˜์ ์ธ ์ด์ ์„ ์ดํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— lodash๋Š” ์ด๋ฏธ lodash/fp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋งŽ์€ FP ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค. lodash/fp๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋ž˜ํ•‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— lodash/fp๊ฐ€ ๊ตฌํ˜„๋œ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Lodash ์‚ฌ๋žŒ๋“ค์€ ๋˜ํ•œ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ๋งค์šฐ ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ @mull์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ง„์งœ ๋ฌธ์ œ๋Š” ์ด ๊ฒฝ์šฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ(์˜ˆ: jQuery) IMO์— ๋ช‡ ๊ฐ€์ง€ ํฐ ์„ค๊ณ„ ๊ฒฐํ•จ์ด ์žˆ๋Š” ์—ฐ๊ฒฐ API ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ ์งœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋‚˜์—๊ฒŒ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์ž…๋‹ˆ๋‹ค)

moment.frozen ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ž‘์—… ์ค‘์ด์ง€๋งŒ ์ด์ „ ํฌ์Šคํ„ฐ์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ date-fns ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์œผ๋กœ ์ธํ•ด ๋˜ ๋‹ค๋ฅธ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค ๐ŸŽ‰

์ ‘์„ ์ ์œผ๋กœ ๊ด€๋ จํ•˜์—ฌ 3.0์ด ES6 ํด๋ž˜์Šค๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

let mom1 = new Moment();
let mom2 = Moment.parse('2019-03-01T14:55');
// etc

๊ทธ๋Ÿฌํ•œ ์›€์ง์ž„์€ ๋˜ํ•œ ๋ถˆ๋ณ€์„ฑ ๋…ผ์˜๋ฅผ ์ด๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐฉ๋ฒ•์€ ํ•œ ๊ฐ€์ง€ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ถˆ๋ณ€์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. .set('minute/hour/year/etc', 18) ๋ผ๋Š” ๋ฉ”์†Œ๋“œ.

์ €๋Š” Moment๋ฅผ ๋ง‰ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„์ „ํžˆ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์— _๋ฌด์„œ์› ์Šต๋‹ˆ๋‹ค_. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์ˆœ๊ฐ„ ๋ถˆ๋ณ€์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@alancnet ์ˆœ๊ฐ„์€ ์•„๋งˆ ์ ˆ๋Œ€ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ณ€ํ™”์ด๋ฉฐ ํ˜„์žฌ ํ–‰๋™์„ ์ˆ˜์šฉํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ถฉ๋ถ„ํ•œ ๋ฐ˜๋ฐœ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์˜ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: luxon
๊ทธ๊ฒƒ์€ ๋งค์šฐ ํ›Œ๋ฅญํ•˜๊ณ  ํ˜„๋Œ€์ ์ด๋ฉฐ ๋ถˆ๋ณ€(!)์ด๋ฉฐ ๋ชจ๋“  ๊ฒƒ์„ .clone() ํ˜ธ์ถœ๋กœ ๊ฐ์‹ธ๋Š” ์ˆœ๊ฐ„ ๋ถˆ๋ณ€๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

momentjs์—์„œ ํ˜„๋Œ€์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์€ https://github.com/you-dont-need/You-Dont-Need-Momentjs ๋ฅผ ํ™•์ธ

๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค!

๋ฃฉ์Šจ ์€ ๋Œ€์ฒดํ’ˆ์ด ๋˜๊ธฐ๊นŒ์ง€ ์–ด๋Š ์ •๋„์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ Moment.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์‹œ๊ฐ„๋Œ€ ์ง€์›์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ํ”„๋กœ์ ํŠธ์— ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

@alamothe ๊ทธ ์งˆ๋ฌธ์€ ์›น ์‚ฌ์ดํŠธ์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‹ต๋ณ€๋ฉ๋‹ˆ๋‹ค: https://moment.github.io/luxon/docs/manual/moment.html

๋‹ซ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ง€์ ํ–ˆ๋“ฏ์ด ๋Œ€๋ถ€๋ถ„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ API๋ฅผ ์›ํ•œ๋‹ค๋ฉด Luxon์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌ ํ•ด์š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰