React: React Fire: React DOM ํ˜„๋Œ€ํ™”

์— ๋งŒ๋“  2018๋…„ 08์›” 31์ผ  ยท  227์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react


์ตœ์‹  ์ƒํƒœ๋Š” 2019๋…„ 6์›” 5์ผ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. https://github.com/facebook/react/issues/13525#issuecomment -499196939


์˜ฌํ•ด React ํŒ€์€ ์ฃผ๋กœ React์˜ ๊ทผ๋ณธ์ ์ธ ๊ฐœ์„ ์— ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

์šฐ๋ฆฌ๋Š” ์ด ๋…ธ๋ ฅ์„ "React Fire"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๐Ÿ”ฅ ๋ฐ˜์‘ ๋ฐœ์‚ฌ

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

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

์ „๋žต

ํ˜„์žฌ ๊ณ„ํš์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€ ์ƒ๊ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • value ์†์„ฑ์˜ ์ž…๋ ฅ ๊ฐ’ ๋ฐ˜์˜์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค(https://github.com/facebook/react/issues/11896). ์ด๊ฒƒ์€ ์›๋ž˜ https://github.com/facebook/react/pull/6406์„ ํ†ตํ•ด React 15.2.0์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์˜ DOM ๊ฐœ๋…์  ๋ชจ๋ธ์ด DOM ๊ฒ€์‚ฌ๊ธฐ์—์„œ ๋ณด๋Š” value ๊ฐ€ value JSX ์†์„ฑ๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ DOM์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„๋“œ์— ์ž…๋ ฅํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๋Š” value ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React๋„ ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์€ CSS ์„ ํƒ๊ธฐ์— ์˜์กดํ•˜๋Š” ์ผ๋ถ€ ์ฝ”๋“œ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ จ์˜ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์—ฌ์ „ํžˆ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ์ผ๋ถ€ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/facebook/react/issues/7179 , https://github.com/facebook/react/issues/8395 , https://github.com/facebook /react/issues/7328 , https://github.com/facebook/react/issues/7233 , https://github.com/facebook/react/issues/11881 , https://github.com/facebook/react /issues/7253 , https://github.com/facebook/react/pull/9584 , https://github.com/facebook/react/pull/9806 , https://github.com/facebook/react/pull /9714 โ€‹โ€‹, https://github.com/facebook/react/pull/11534 , https://github.com/facebook/react/pull/11746 , https://github.com/facebook/react/pull/12925 . ์ด ์‹œ์ ์—์„œ ๋ธŒ๋ผ์šฐ์ €์™€ ๊ณ„์† ์‹ธ์šฐ๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๊ฐ€์น˜๊ฐ€ ์—†์œผ๋ฉฐ ๋˜๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฌ์ •์˜ ๊ธ์ •์ ์ธ ๋ถ€๋ถ„์€ DOM ๊ธฐ์—ฌ์ž( @nhunzaker , @aweary , @jquense ๋ฐ @philipp-spiess)์˜ ์ง€์น  ์ค„ ๋ชจ๋ฅด๋Š” ์ž‘์—… ๋•๋ถ„์— ์ด์ œ ํšŒ๊ท€๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ƒ์„ธํ•œ DOM ํ…Œ์ŠคํŠธ ๊ณ ์ • ์žฅ์น˜๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ React ๋ฃจํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค(https://github.com/facebook/react/issues/2043). ๋ฌธ์„œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ React ์•ฑ์„ ๋” ํฐ ์‹œ์Šคํ…œ์— ํฌํ•จํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Atom ํŽธ์ง‘๊ธฐ๋Š” ์ด์™€ ์ถฉ๋Œํ•œ ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋Œ€ํ˜• ์›น์‚ฌ์ดํŠธ๋Š” ๊ฒฐ๊ตญ stopPropagation ๊ฐ€ ๋น„ React ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ฑฐ๋‚˜ React ๋ฃจํŠธ(https://github.com/facebook/react/issues/8693, https://github)์—์„œ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋งค์šฐ ๋ณต์žกํ•œ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. .com/facebook/react/pull/8117, https://github.com/facebook/react/issues/12518). ๋˜ํ•œ ์—…๋ฐ์ดํŠธ ์ค‘์— ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ๋œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“  ๋ฃจํŠธ์— ์—ด์‹ฌํžˆ ์ด๋ฒคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • onChange ์—์„œ onInput ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ  ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ํด๋ฆฌํ•„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(https://github.com/facebook/react/issues/9657). ์ž์„ธํ•œ ๊ณ„ํš์€ ๋งํฌ๋œ ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. React๊ฐ€ DOM์—์„œ input ์ด๋ฒคํŠธ๋ผ๊ณ  ํ•˜๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํฐ ์ด์  ์—†์ด ์ด์™€ ๊ฐ™์€ ํฐ ๋ณ€๊ฒฝ์„ ํ”ผํ•˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ์ œ์–ด ์ž…๋ ฅ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์—ฃ์ง€ ์ผ€์ด์Šค์—๋งŒ ํ•„์š”ํ•œ ์ผ๋ถ€ ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋™์ž‘ ์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋‘ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด๋ฅผ ๊ธฐํšŒ๋กœ ์‚ฌ์šฉํ•˜์—ฌ onInput ๋ฐ onChange ๊ฐ€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด DOM ์ด๋ฒคํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ๋Œ€ํญ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค(https://github.com/facebook/react/issues/4751). ํ˜„์žฌ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์€ 2013๋…„ ์ฒ˜์Œ ๊ตฌํ˜„๋œ ์ดํ›„ ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. React DOM ๋ฐ React Native์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ถ”์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜๋Š” ๋งŽ์€ ํด๋ฆฌํ•„์€ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์— ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ถ€๋Š” ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ React DOM ๋ฒˆ๋“ค ํฌ๊ธฐ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์•„์ฃผ ๊ตฌ์ฒด์ ์ธ ๊ณ„ํš์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ๋ถ„๊ธฐํ•œ ๋‹ค์Œ DOM์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์— ๋” ๊ฐ€๊นŒ์ด ๋‹ค๊ฐ€๊ฐ€๋ฉด ์–ผ๋งˆ๋‚˜ ์ตœ์†Œํ•œ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ฉ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. DOM์—์„œ ๋ฒ„๋ธ”๋ง๋˜์ง€ ์•Š๊ณ  ๋ฒ„๋ธ”๋งํ•  ํƒ€๋‹นํ•œ ์ด์œ ๊ฐ€ ์—†๋Š” ๋ฏธ๋””์–ด ์ด๋ฒคํŠธ์™€ ๊ฐ™์€ ๋ฒ„๋ธ”๋ง ์ด๋ฒคํŠธ๋ฅผ ์ค‘์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฌํ„ธ์„ ํ†ตํ•œ ๋ฒ„๋ธ”๋ง๊ณผ ๊ฐ™์€ ์ผ๋ถ€ React ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๋” ๊ฐ„๋‹จํ•œ ์ˆ˜๋‹จ(์˜ˆ: ์ด๋ฒคํŠธ ์žฌ์ „์†ก)์„ ํ†ตํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ์ด๊ฒƒ์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • className โ†’ class (https://github.com/facebook/react/issues/4331, https://github.com/facebook/react/issues/13525#issuecomment- ์ฐธ์กฐ) 417818906 ์•„๋ž˜). ์ด๊ฒƒ์€ ์ˆ˜์—†์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ class ๋ฅผ React 16์˜ DOM ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ƒ์„ฑํ•˜๋Š” ํ˜ผ๋ž€์€ ๋ณดํ˜ธํ•˜๋ ค๋Š” ๊ตฌ๋ฌธ ์ œํ•œ์˜ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ณ€๊ฒฝ์„ ์ž์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ์œ„์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ๊ณ„๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๊ณ  ์—†์ด ๋‘˜ ๋‹ค ํ—ˆ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‘˜ ๋‹ค ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ์•ผ ํ•˜๋ฉฐ ์ถฉ๋Œํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ className ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—(์˜ˆ: ์ถ”๊ฐ€ํ•˜์—ฌ) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

  • React Native Web๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ํ˜„์žฌ ๋น„๊ณต๊ฐœ React ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ API๋ฅผ ๊ณ„์† ๋…ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์ค‘ ์ผ๋ถ€๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ React Fabric ์ด ๋” ๋งŽ์€ ์‘๋‹ต์ž ์‹œ์Šคํ…œ์„ ๊ธฐ๋ณธ ์ธก์œผ๋กœ ์ด๋™ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— React Native Web์€ ๊ด€๊ณ„์—†์ด ๋‹ค๋ฅธ ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

๋กค์•„์›ƒ ๊ณ„ํš

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

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง์ ‘ ์ž‘์—…ํ•  ๊ณ„ํš์ด์ง€๋งŒ ๋›ฐ์–ด๋‚œ ํ˜‘๋ ฅ์ž์ด์ž React DOM์„ ์ฃผ๋„์ ์œผ๋กœ ์ด๋Œ์–ด์˜จ @nhunzaker , @aweary , @jquense ๋ฐ @philipp-spiess์˜ ๋” ๋งŽ์€ ํ† ๋ก ๊ณผ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Fiber์—์„œ ์ผํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ„์•ผ๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ํ•ด๊ฒฐํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๊ณ„ํš์—์„œ ๋‚ด๊ฐ€ ๋†“์นœ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ”ผ๋“œ๋ฐฑ์— ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ด๋ฉฐ ์ด ๊ธ€์ด ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

DOM React Core Team Big Picture

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

className ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๊ณ  ์ด ๋ชจ๋“  ์ ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ง€์ ์ด ์ถ”๊ตฌํ•˜๋Š” ๋ชฉํ‘œ(DOM API์™€ ์ผ์น˜)์™€ ์™„์ „ํžˆ ๋ชจ์ˆœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. React๋Š” HTML ์†์„ฑ์ด ์•„๋‹Œ DOM ์†์„ฑ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์š”์ ์—์„œ๋„ ๋ช…ํ™•ํžˆ ์„ค๋ช…๋จ). DOM ์š”์†Œ ์†์„ฑ์˜ ์ด๋ฆ„์€ className ๊ฐ€ ์•„๋‹ˆ๋ผ class ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด React์—์„œ ์ด๋ฆ„์ด class ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ "ํด๋ž˜์Šค" ์†Œํ’ˆ์„ ์ค„์ด๋Š” ๊ฒƒ์€ ๋งค์šฐ ํ™˜์˜ํ•  ์ผ์ž…๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ์ผ!

๐Ÿ™‚

๊ด€์‹ฌ ์–‘์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž! ๐Ÿคฃ

์—„์ฒญ๋‚œ!

className โ†’ ์ˆ˜์—…์€ ํ™˜์ƒ์ ์ž…๋‹ˆ๋‹ค

๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? clipPath , htmlFor , tabIndex ๋“ฑ์„ ๊ณ„์† ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

class ๋„์ž…์€ ๋„์„œ๊ด€์„ ์ดˆ์‹ฌ์ž์—๊ฒŒ ๋ณด๋‹ค ์นœ์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ค‘์š”ํ•œ ๋ŒํŒŒ๊ตฌ์ž…๋‹ˆ๋‹ค. ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. class ๋กœ์˜ ์ด๋™์ด ์‹ค์ œ๋กœ ์†Œํ’ˆ๊ณผ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

({ class }) => <div class={class} /> ์ด ์ฒ˜์Œ์— ์˜ˆ์•ฝ๋œ ํ‚ค์›Œ๋“œ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋ฐ˜๊ฐ€์šด ์†Œ์‹์ž…๋‹ˆ๋‹ค @gaearon๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

className ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๊ณ  ์ด ๋ชจ๋“  ์ ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ง€์ ์ด ์ถ”๊ตฌํ•˜๋Š” ๋ชฉํ‘œ(DOM API์™€ ์ผ์น˜)์™€ ์™„์ „ํžˆ ๋ชจ์ˆœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. React๋Š” HTML ์†์„ฑ์ด ์•„๋‹Œ DOM ์†์„ฑ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์š”์ ์—์„œ๋„ ๋ช…ํ™•ํžˆ ์„ค๋ช…๋จ). DOM ์š”์†Œ ์†์„ฑ์˜ ์ด๋ฆ„์€ className ๊ฐ€ ์•„๋‹ˆ๋ผ class ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด React์—์„œ ์ด๋ฆ„์ด class ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ™˜์ƒ์ ์ด์•ผ! ๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ์— ๋Œ€ํ•œ ๋ชฉํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๐Ÿ‘

๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ clipPath, htmlFor, tabIndex ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ† ๋ก ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค( for ์ œ์™ธ).

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์žฌ์ž‘์„ฑํ•œ ๊ฒƒ์ด ์ด ์ ์—์„œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹นํ•œ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋ณด์ž!

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

๋‚˜๋Š” className ๋ณ€๊ฒฝ์„ ์ œ์™ธํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ง€์ ์ด ์ถ”๊ตฌํ•˜๋Š” ๋ชฉํ‘œ(DOM API์™€ ์ผ์น˜)์™€ ์™„์ „ํžˆ ๋ชจ์ˆœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. React๋Š” HTML ์†์„ฑ์ด ์•„๋‹Œ DOM ์†์„ฑ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์š”์ ์—์„œ๋„ ๋ช…ํ™•ํžˆ ์„ค๋ช…๋จ).

๊ทธ๋Ÿฌ๋‚˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ „๋‹ฌํ•˜๋ฉด React 16 ์ดํ›„ ์†์„ฑ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด ์˜๊ฒฌ์€ React๊ฐ€ value ์†์„ฑ์„ ์„ค์ • ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. React API๊ฐ€ API์—์„œ ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์™„์ „ํžˆ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

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

React Fire๊ฐ€ ๋น ๋ฅด๊ฒŒ ํƒ€์˜ค๋ฅด๋Š” ํ•œ.... ๐Ÿ‘

์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋Š” ๋ชจ๋‘ ํ™˜์ƒ์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ๊ณผ react-testing-library ์— ๋Œ€ํ•œ ์˜๋ฏธ์— ๋Œ€ํ•ด ๋งค์šฐ ํฅ๋ถ„๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์ด๋ฒคํŠธ๊ฐ€ ๋ฐ˜์‘ ๋ฃจํŠธ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด(๋˜๋Š” ์ตœ์‹  ํ™˜๊ฒฝ์—์„œ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฒคํŠธ ์œ„์ž„์„ ์™„์ „ํžˆ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ?), ์ž ์žฌ์ ์œผ๋กœ ํ•ฉ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐ/์žฌ์ž‘์„ฑํ•˜๊ณ , onChange -> onInput ๋Š” react-testing-library ์˜ ๊ตฌํ˜„๊ณผ ๋„๊ตฌ ์‚ฌ์šฉ ๊ฒฝํ—˜์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ฐœ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„๋˜๋Š” ๋™์•ˆ ์ด์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ˜„๋Œ€ ํ™˜๊ฒฝ์—์„œ๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฒคํŠธ ์œ„์ž„์„ ์™„์ „ํžˆ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@tannerlinsley ({ class: className }) => <div class={className} /> ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ jsx 2.0 ๊ฐ์ฒด ์•ฝ์‹ ํ‘œ๊ธฐ๋ฒ•( <div class /> )์„ ์ฃฝ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

class ๊ฐ€ ๋งˆ์นจ๋‚ด ๋ฌธ์ž์—ด ์˜†์— ๊ฐ์ฒด์™€ ๋ฐฐ์—ด btw๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ์— ๋Œ€ํ•œ ๋ชฉํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

React DOM์˜ 1/3์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณผ ๊ฒƒ์ด๋‹ค. ์„ฃ๋ถˆ๋ฆฌ ๋ง์”€๋“œ๋ฆฌ๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ ์ตœ์„ ์„ ๋‹คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์™€์šฐ, ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด React ๋‹จ์ ์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•  ๋•Œ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋””์ž์ธ ๊ฒฐ์ •์„ ์—ด๊ฑฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์„ ์‚ฌ๋ž‘ํ•˜์‹ญ์‹œ์˜ค.

className ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ React๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฒฝ๋กœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@gaearon ์˜ค๋Š˜์€ "props๋Š” HTML ์†์„ฑ์ด ์•„๋‹Œ DOM ์†์„ฑ"์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ "className์„ ์ œ์™ธํ•˜๊ณ  HTML ์ด๋ฆ„์ž…๋‹ˆ๋‹ค"๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ SVG๋ฅผ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐํ•  ์ˆ˜ ์žˆ๊ณ , React์˜ ์†์„ฑ๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด 10๋ถ„ ๋™์•ˆ ์†์„ฑ์„ ์–ด์ง€๋Ÿฝํžˆ์ง€ ์•Š๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

htmlFor ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

className -> class ์ „ํ™˜์€ ์•„๋งˆ๋„ ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒํƒœ๊ณ„์— ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ "์†Œ์œ "ํ•˜๊ณ  codemod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ ๊ดœ์ฐฎ์ง€๋งŒ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ ์œ ์ง€ ๊ด€๋ฆฌ์ž์˜ ์ž๋น„์— ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ƒํƒœ๊ณ„ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ ์œ„ํ—˜์ด ๋‚ฎ์•„ ๋ณด์ด์ง€๋งŒ className ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋งŽ์€ ๊ณ ํ†ต์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๋ณ„๋„์˜ ํ˜ธ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋‚˜๋จธ์ง€ ๐Ÿ”ฅ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๋‹ค๋ฅธ ์ผ์ •์œผ๋กœ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@felixfbecker๋‹˜ ๋ง์”€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ฒƒ์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž ๋ชจ๋‘์—๊ฒŒ ํ’ˆ์งˆ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ className์€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

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

@felixfbecker JSX ์—์„œ๋Š” class / for , JS ๋ฒ„์ „์—์„œ๋Š” className / htmlFor ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

<label class="foo" for="bar">..</label>

๋  ๊ฒƒ์ด๋‹ค

React.createElement('label', {className: 'foo', htmlFor: 'bar'}, '..')

์ข‹์€ ๊ณ„ํš! ๋ฐ˜๊ฐ€์›Œ์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘

์ด๊ฒƒ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์„ ํŒŒ๊ณ ๋“ค๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ๋Œ€ํญ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค(#4751).

์ด์ œ React๋Š” ReactDOM ์ •์˜๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ์— ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์œ„์ž„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. https://github.com/facebook/react/issues/9242

์ด๋Š” React๊ฐ€ <x-component onMyEvent={ev => {...}} /> ์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@gaearon
์ด์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

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

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด๋ฒคํŠธ ์œ„์ž„์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด #1254 ์ˆ˜์ •์˜ ๋ฌธ์„ ์—ฝ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ด๋ฒคํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค(React์˜ ๊ฒฝ์šฐ ์ „์ฒด ์•ฑ์„ ์˜๋ฏธํ•จ).

๋˜ํ•œ ์žฅ๊ธฐ์ ์œผ๋กœ ํ•ฉ์„ฑ dataSet ์†Œํ’ˆ์„ ๊ณ ๋ คํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (data-* ๋•Œ๋ฌธ์—) ํ—ˆ์šฉ๋˜๋Š” HTML props๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์—†์œผ๋ฉด props๋ฅผ DOM ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•  ๋•Œ ์ˆ˜๋งŽ์€ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ํ˜•์ด ์ง€์ •๋œ React ๊ตฌ์„ฑ ์š”์†Œ๋Š” props์˜ ์ •ํ™•ํ•œ ์œ ํ˜•๊ณผ ๋ฐ์ดํ„ฐ ์†์„ฑ ํ—ˆ์šฉ ์ค‘์—์„œ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ ์ด ๋‚œ๋‹ค

@ryanflorence ์•ฝ๊ฐ„ ์˜คํ”„ํƒ‘์ด์ง€๋งŒ (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ) ์•„๋ฌด๋„ HTML์„ ๋งคํ•‘ํ•˜๋Š” ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์œผ๋กœ React๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด html/css/svg -> jsx ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ๋งŒ๋“ค ์ƒ๊ฐ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. React props์— ๋Œ€ํ•œ ์†์„ฑ. ๋Œ€๋ถ€๋ถ„ ์ฐพ๊ธฐ ๋ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.:(

๋™์ผํ•œ ๋ฌธ์ œ(๋ฐ ์ฃผ์„)์—์„œ ๋‹ค์Œ์„ ๋ณด๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” React๊ฐ€ DOM ์ž‘๋™ ๋ฐฉ์‹์— ๋” ์ž˜ ๋งž๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํด๋ž˜์Šค๋ช… โ†’ ํด๋ž˜์Šค
์—ฌ์ „ํžˆ clipPath, htmlFor, tabIndex ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด DOM API์˜ ์ง์ ‘์ ์ธ ๋Œ€์‘๋ฌผ์ผ ๋•Œ

๊ทธ๋ฆฌ๊ณ  ์ด ์ธ์ˆ˜๋Š” ์†Œ์ง‘์„ ํ†ต๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

React๋Š” ํ•ญ์ƒ JS ์œ„์— ์žˆ๋Š” ๋งค์šฐ ์–‡์€ ๋ ˆ์ด์–ด์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JSX์˜ ๊บพ์‡  ๊ด„ํ˜ธ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ JS์˜€๊ณ  _๊ทธ๋ฆฌ๊ณ _ DOM API์™€ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋œ DOM API( className , clipPath , htmlFor , tabIndex ๋“ฑ ๋“ฑ)์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ๋Œ€์‘์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

class ๋„์ž… ๊ฒฐ์ •์œผ๋กœ React๋Š” ๋” ์ด์ƒ ์–‡์€ ๊ณ„์ธต์ด ๋˜์ง€ ์•Š๊ณ ( class ๋Š” JS์—์„œ ์˜ˆ์•ฝ์–ด์ž„) DOM API์™€ ๋” ๋งŽ์ด ํ˜ธํ™˜๋œ๋‹ค๋Š” ์„ ์–ธ๋œ ๋ชฉํ‘œ์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

DOM๊ณผ ์ผ์น˜ํ•˜์ง€ _๋ฐ_ className -> class ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์—ฌ DOM๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— "onChange์—์„œ onInput์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜"์„ ๋ชจ๋‘ ์›ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ํŠนํžˆ ์ถฉ๊ฒฉ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ๋ถ€ํ’ˆ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—(๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ ์š”๊ตฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ์›œ์˜ ์ „์ฒด ์บ”์„ ์—ฝ๋‹ˆ๋‹ค. ์ฃผ์„์—์„œ: data-* dataset ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? data-* ๊ฐ€ ์œ ํšจํ•œ JS๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—( class ์™€ ๋น„์Šทํ•จ) DOM API ์™€ ์ผ๊ด€๋˜๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ์š”? htmlFor ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? for ๋Š” ์˜ˆ์•ฝ์–ด์ด๊ณ  htmlFor ๋Š” DOM API์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—? ๋“ฑ ๋“ฑ ๋“ฑ

๊ทธ๋Ÿฌ๋‚˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ „๋‹ฌํ•˜๋ฉด React 16 ์ดํ›„ ์†์„ฑ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

@gaearon ์€ React๊ฐ€ CustomElements Everywhere ์ƒํ˜ธ ์šด์šฉ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ๋‚˜์œ ์ ์ˆ˜๋ฅผ ๋ฐ›์€ ์œ ์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. https://custom-elements-everywhere.com/
๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•˜๋Š” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/facebook/react/issues/11347 , https://github.com/facebook/react/issues/7249 , https://github.com/facebook /๋ฐ˜์‘/๋ฌธ์ œ/9230

์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ React Fire์™€ React Fiber์˜ ์œ ์‚ฌ์„ฑ์€ ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ˜ผ๋™์„ ์ค„๊นŒ์š”? ๋‚˜๋Š” ์ข…์ข… Newark Penn Station๊ณผ New York Penn Station์ด ์—ฌ๊ธฐ NYC์—์„œ ๊ฐ™์€ ๊ธฐ์ฐจ ๋…ธ์„ ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๊ด€๊ด‘๊ฐ๋“ค์—๊ฒŒ ํŠนํžˆ ์ž”์ธํ•œ ๋†๋‹ด์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ง ์šฐ๋ ค๋˜๋Š” ์ผ์ด๋ผ๋ฉด React Flame์ด๋ผ๊ณ  ํ•˜๊ณ  ์—ฌ์ „ํžˆ ๋ถˆ ๐Ÿ”ฅ ์ด๋ชจํ‹ฐ์ฝ˜์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์œ„์ž„์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด #1254 ์ˆ˜์ •์˜ ๋ฌธ์„ ์—ฝ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ด๋ฒคํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค(React์˜ ๊ฒฝ์šฐ ์ „์ฒด ์•ฑ์„ ์˜๋ฏธํ•จ).

์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  #1254๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์žฅ๊ธฐ์ ์œผ๋กœ ํ•ฉ์„ฑ dataSet ์†Œํ’ˆ์„ ๊ณ ๋ คํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋” ํฐ ํ‘œ๋ฉด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ์ด์™€ ๊ฐ™์€ ์ผ์„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DOM์„ ์œ„ํ•œ ๋” ํ’๋ถ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค( ariaSet , dataSet , classList )๋Š” ์ดํ•ด๊ฐ€ ๋˜์ง€๋งŒ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„๊ตํ•˜์—ฌ React DOM์— ์–ผ๋งˆ๋‚˜ ํˆฌ์žํ•˜๊ณ  ์‹ถ์€์ง€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ํ’๋ถ€ํ•œ DOM API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์™ธํ˜•์ ์ด์ง€๋งŒ ํ‘œ๋ฉด์ ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋ฅ˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ ๋ธ”๋ ˆ์ด์ง• ๐Ÿ”ฅ

@ryanflorence ์•ฝ๊ฐ„ ์˜คํ”„ํƒ‘์ด์ง€๋งŒ (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ) ์•„๋ฌด๋„ HTML์„ ๋งคํ•‘ํ•˜๋Š” ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์œผ๋กœ React๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด html/css/svg -> jsx ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ๋งŒ๋“ค ์ƒ๊ฐ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. React props์— ๋Œ€ํ•œ ์†์„ฑ. ๋Œ€๋ถ€๋ถ„ ์ฐพ๊ธฐ ๋ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.:(

@jxub
https://transform.now.sh/html-to-jsx/

์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋งค์šฐ ํฅ๋ถ„ํ•˜์—ฌ Facebook์˜ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์œผ๋กœ ์—ญ์‚ฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 50k ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ React Fire๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๊นŒ?
ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋Š” ๋งค์šฐ ์—„๊ฒฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. <3

React Fire์™€ React Fiber์˜ ์œ ์‚ฌ์„ฑ์€ ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ˜ผ๋™์„ ์ค„๊นŒ์š”?

๋‚œ์ฒญ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค(๋˜๋Š” ๋‹จ์–ด ์ฐจ๋ณ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋‹ค๋ฅธ ์กฐ๊ฑด์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค)์—๊ฒŒ๋„ ํ•ด๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@gaearon ๊ณต์œ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Babel ๋ฐ Typescript๋กœ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ณต๋ฐฑ ๋ฐ ์ค„ ๋ฐ”๊ฟˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” JSX 2.0 ๋ฆด๋ฆฌ์Šค๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์—ด๋ ธ๊ณ  ๊ธฐ์—ฌํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ React ํŒ€์ด JSX์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„ ๊ฒ€ํ† ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๋ฝ์ด ๋Š๊ฒผ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์–ด์จŒ๋“  dom๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ jsx๋ฅผ js๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด w3c๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค https://github.com/facebook/jsx/issues/19

๋‚ด ์˜๊ฒฌ์€ ๋งจ ๋งˆ์ง€๋ง‰์— ์žˆ์Šต๋‹ˆ๋‹ค.

className ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ณด์ž. ๋ถ€์ƒ์— ๋ชจ์š•์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์ด ๊ธฐ์กด ํ•ธ๋“ค๋Ÿฌ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ฐ’ ์†์„ฑ์— ์ž…๋ ฅ ๊ฐ’ ๋ฐ˜์˜ ์ค‘์ง€

React๋Š” ์—ฌ์ „ํžˆ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ •ํ™•ํ•œ event.target.value ์—…๋ฐ์ดํŠธ๋กœ ์ œ์–ด๋œ ์ž…๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์ด ref ๋ฐ DOM ๋…ธ๋“œ์—์„œ ๊ฐ’์„ ์ฝ๋Š” ๋ฐ์—๋งŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ?

@nickmccurdy ๋ธŒ๋ผ์šฐ์ € devtools์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

@tomdale ๋ฆฌ์•กํŠธ ์— ๋ฒ„ ๐Ÿ”ฅ

๋ฉ‹์ง„! React 17์˜ ์ „์ฒด ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ชฉ๋ก์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ReactJS์˜ ์ƒˆ๋กœ์šด ์‹œ๋Œ€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๐Ÿ”ฅโš›๏ธ

@tomdale ํ : ์›์‚ฌ, ์„ฌ์œ , ์ง๋ฌผ; ๋‹ค๋ฅธ ์˜๋ฅ˜ ๊ด€๋ จ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ˜†

๊ทธ๋Ÿฌ๋‚˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ „๋‹ฌํ•˜๋ฉด React 16 ์ดํ›„ ์†์„ฑ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

@gaearon ์€ React๊ฐ€ CustomElements Everywhere ์ƒํ˜ธ ์šด์šฉ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ๋‚˜์œ ์ ์ˆ˜๋ฅผ ๋ฐ›์€ ์œ ์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. https://custom-elements-everywhere.com/

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

React Fire์™€ React Fiber์˜ ์œ ์‚ฌ์„ฑ์€ ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ˜ผ๋™์„ ์ค„๊นŒ์š”?

๋‘˜ ๋‹ค ๋‚ด๋ถ€ ์ฝ”๋“œ๋ช…์ด๋ฉฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. React Fire๋Š” React DOM์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ์ผ ๋ฟ์ด๋ฉฐ ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ๋˜๋ฉด React DOM์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

React๋Š” ์—ฌ์ „ํžˆ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ •ํ™•ํ•œ event.target.value ์—…๋ฐ์ดํŠธ๋กœ ์ œ์–ด๋œ ์ž…๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์ด ref ๋ฐ DOM ๋…ธ๋“œ์—์„œ ๊ฐ’์„ ์ฝ๋Š” ๋ฐ์—๋งŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ?

์˜ˆ, event.target.value ๊ฐ€ ์†์„ฑ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์†์„ฑ ์—…๋ฐ์ดํŠธ ์ค‘์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธ๊ธฐ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์—†๋Š”(AFAIK) ์ˆ˜๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์— ๋Œ€ํ•œ CSS ์„ ํƒ๊ธฐ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ•œ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(์–ด์จŒ๋“  ๋‚˜์  ์ˆ˜ ์žˆ์Œ).

๋ฉ‹์ง„! React 17์˜ ์ „์ฒด ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ชฉ๋ก์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

17์‹œ๊นŒ์ง€ ์ค€๋น„ํ•œ๋‹ค๊ณ  ์•ฝ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. 18์‹œ๋‚˜ 19์‹œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…

React์™€ ๊ฐ™์€ ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊พธ์ค€ํžˆ ๋ฐœ์ „ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ๐ŸŽ‰ class ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์„ฑ์ด ํ›จ์”ฌ ๋” ์ข‹์•„์ง‘๋‹ˆ๋‹ค. ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@gaearon

์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ์™€ ์ผ๋ฐ˜ ์š”์†Œ๋Š” ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ์ฝ”๋“œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

๊ทธ ์ž์ฒด๋กœ๋„ ๊ณ ์ณ์•ผ ํ•  ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด HTML ๋ฐ DOM ์‚ฌ์–‘์˜ ์˜๋„์ž…๋‹ˆ๋‹ค.

@justinfagnani ์ด์ „์— ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋‹น์‹œ์— ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ์†์„ฑ ๋˜๋Š” ์†์„ฑ์„ ์„ค์ •ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ทœ์น™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›น ํ”Œ๋žซํผ์ด ํ”„๋กœํ† ํƒ€์ž…์— ์ƒˆ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ฏค์ด๋ฉด @robdodson ์ด ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” RFC ๋ฐ PR์— ์ด๋ฏธ ์ผ์ข…์˜ ํ•ฉ์˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ์•„๋งˆ๋„ ๊ฑฐ๊ธฐ์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘ ๐Ÿ”ฅ ๐Ÿ”ฅ ๐Ÿ”ฅ

React Fire๋Š” ๋˜ํ•œ Inferno๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜๋ฆฌํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ค‘ ์ผ๋ถ€๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์ ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ ๋‚˜๋Š” ์‹œ๊ฐ„๋“ค :)

LGTM

์ œ์•ˆ๋œ className -> class ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ๊ด€๋ จ: ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” classes ์†์„ฑ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋งŽ์€ ๋ฌธ์ž์—ด ์กฐ์ž‘(๋˜๋Š” classnames ์‚ฌ์šฉ) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

classes prop์˜ ์œ ์ผํ•œ ๋‹จ์ ์€ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์ด ์ˆœ์ˆ˜ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋Š” ๋ฐ˜๋ฉด ๋™์ผํ•œ CSS ํด๋ž˜์Šค์˜ ๋ฌธ์ž์—ด์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ, ๊ทธ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ React ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฏธ props์—์„œ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด์˜ ์žฅ๋‹จ์ ์„ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@gaearon ์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? React Fiber์™€ ๋™์ผํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ๋ฅผ ์žƒ์ง€ ์•Š๊ณ  ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ์— ์‹œ๊ฐ„์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class ๋ฐ className ๊ด€๋ จ.

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

Component API๋Š” ๊ด€์šฉ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

React๊ฐ€ "JavaScript์™€ ์ผ์น˜"ํ•˜๋ฏ€๋กœ className ๊ฐ€ ์„ ํ˜ธ๋œ๋‹ค๋Š” ๊ณตํ†ต๋œ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์žฅ์€ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์˜คํ•ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์กฐ๊ธˆ ์ง‘์ค‘ํ•ด์„œ ๋ง์”€๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

React์—์„œ ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ด€์šฉ์ ์ธ JavaScript์ฒ˜๋Ÿผ ๋Š๊ปด์ ธ์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ€์ƒ์˜ <Table> ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น props๊ฐ€ camelCase๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

<Table
  rowHeight={10}
  headerBorderInset={5}
  renderRow={this.renderRow}
/>

๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ณต๊ฐœ API ์—์„œ row_height ๋˜๋Š” row-height ์™€ ๊ฐ™์€ ์†Œํ’ˆ ์ด๋ฆ„์„ ๋ณผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Component์˜ props๋Š” ("option bag"๊ณผ ๊ฐ™์€) ๊ฐ์ฒด์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์˜ต์…˜์ด camelCase ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ DOM์—์„œ ํ•ญ์ƒ ๊ด€์šฉ์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ DOM์€ ๋งŽ์€ ๊ณณ์—์„œ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. React๋Š” camelCase ๋ฅผ ์••๋„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” JavaScript ์ƒํƒœ๊ณ„์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ DOM์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ฐ€์‹œ๊ฐ€๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

DOM ์†์„ฑ์€ "JS์˜ ์†์„ฑ"์ด ์•„๋‹™๋‹ˆ๋‹ค.

DOM์—๋Š” ์†์„ฑ๊ณผ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ HTML์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†์„ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ JS์—์„œ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ์ •์ ์œผ๋กœ DOM API๋Š” ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ  ์†์„ฑ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋ฉฐ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒƒ์„ ์„ค์ •ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

node.value = 10; // setting a property
node.setAttribute('value', '10'); // setting an attribute

๋งŽ์€ ๊ฒฝ์šฐ์— ๊ทธ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ React(๋‘˜ ๋ชจ๋‘์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์ถ”์ƒํ™”๊ฐ€ ์žˆ์Œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

React๋Š” ๋‹จ์ˆœํžˆ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์˜คํ•ด๋Š” React๊ฐ€ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ DOM props์— ๋Œ€ํ•ด camelCase ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— React๊ฐ€ DOM ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค React๋Š” ํ˜„์žฌ ์ง€์›ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  props์— ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” value ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ๋…ผ์˜ํ•œ ๋Œ€๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ๋ฅผ ์›ํ•จ). ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ง€์›๋˜๋Š” ์†์„ฑ ๋ชฉ๋ก์„ React ๋ฒˆ๋“ค์— ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ํ›„๋“œ ์•„๋ž˜์—์„œ ์†์„ฑ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ React 16์—์„œ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ œ ์š”์ ์€ React๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ ์ด๋ฉฐ React DOM ์š”์†Œ _API_๊ฐ€ ์†์„ฑ ์ด๋ฆ„, ์†์„ฑ ์ด๋ฆ„ ๋˜๋Š” ๊ธฐํƒ€ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. ์†์„ฑ๊ณผ ์†์„ฑ์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ "JavaScript์šฉ"์œผ๋กœ ํŠน๋ณ„ํžˆ ์ œ์ž‘๋œ DOM ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์ค€ํ™”ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์˜ค๋Š˜๋‚  React API๊ฐ€ ์„ค๊ณ„๋œ ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๊นŒ?

๊ธ€์Ž„์š”. ์•„๋ž˜์— ์—ด๊ฑฐ๋œ props ์ค‘ ํ•˜๋‚˜๋งŒ ์‹ค์ œ DOM ๊ฐ์ฒด ์†์„ฑ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

<div
  tabIndex={1}
  data-id="123"
  aria-live="polite"
  nopin="nopin"
  itemType="http://schema.org/Movie"
  onClick={function() { alert('hi') }}
/>

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‹ค์ œ DOM ์†์„ฑ์ด ์žˆ๋Š” ์œ„์˜ ์œ ์ผํ•œ prop(ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ tabIndex )์€ ์‹ค์ œ๋กœ React์— ์˜ํ•ด ์†์„ฑ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค!

๋”ฐ๋ผ์„œ ์ด ์‹œ์ ์—์„œ ์•„๋งˆ๋„ ๋ช…ํ™•ํ•˜์ง€๋„ ์•Š๊ณ  ์ผ๊ด€๋˜์ง€๋„ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์†์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์šฉ์ž ์ •์˜, ๋น„ํ‘œ์ค€ ์†์„ฑ). ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” React๊ฐ€ ๋” ํ’๋ถ€ํ•œ API( data- vs dataSet )๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž ์ •์˜ React ๊ตฌ์„ฑ ์š”์†Œ์— ๋” ์ ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— React๊ฐ€ ์˜๋„์ ์œผ๋กœ ํŽธ์ฐจ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค( React์˜ onClick ๋Œ€ onclick DOM ์†์„ฑ). ์ด๋Š” React ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ข…์ข… onItemClick ์™€ ๊ฐ™์€ ๋” ๋ณต์žกํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. <Button onclick> ํ•˜์ง€๋งŒ <Table onItemClick> ๋ผ๊ณ  ์“ด๋‹ค๋ฉด ๋งค์šฐ ์ผ๊ด€์„ฑ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  <Table onitemclick> ๋Š” ์ปดํฌ๋„ŒํŠธ API์—์„œ ํ”ผํ•˜๊ณ  ์‹ถ์—ˆ๋˜ camelCase๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์—์„œ ๋‚˜๋Š” React๊ฐ€ ์ด๋ฏธ "ํ•ญ์ƒ DOM ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉ"ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ผ๊ด€์„ฑ ์ด ์—†๊ณ  , React๊ฐ€ ์‹ค์ œ๋กœ ์†์„ฑ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š๋Š”๋‹ค๋Š” ์ (๊ทธ๋ž˜์„œ ๊ฒฝํ—˜ ๋ฒ•์น™๋„ ์‹ค์ œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์Œ)์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ์šฐ DOM ์†์„ฑ์€ ๋‹จ์ˆœํžˆ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์†์„ฑ ์ด๋ฆ„์„ ๊ณ„์† ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค?

๊ทธ๋ ‡๋‹ค๋ฉด ์†์„ฑ ์ด๋ฆ„ ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ทธ๋Ÿด๋“ฏํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ธฐํ•œ ์ฒซ ๋ฒˆ์งธ ๊ณ ๋ ค ์‚ฌํ•ญ์— ๋ถ€๋”ชํž™๋‹ˆ๋‹ค. React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ด€์šฉ์ ์ธ JavaScript์ฒ˜๋Ÿผ ๋Š๊ปด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์ข…์ข… ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ธฐ๋ณธ DOM ์š”์†Œ์— ์ตœ์†Œํ•œ ์ผ๋ถ€ ์†Œํ’ˆ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

<Button
  borderColor='red'
  tabIndex={1}
 />

 // renders...

 <button
   tabIndex={1}
/>

๋งž์ถค Button ์—์„œ ๋Œ€๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์†Œํ’ˆ์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์€ ์–ด์ƒ‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<Button
  borderColor='red'
  tabindex={1}
 />

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์†Œ๋น„์ž๊ฐ€ ํŠน์ • prop์ด ์‹ค์ œ DOM prop์ธ์ง€, ์•„๋‹ˆ๋ฉด ๊ตฌ์„ฑ ์š”์†Œ ๊ณ„์•ฝ์˜ ์ผ๋ถ€์ธ์ง€ ํ•ญ์ƒ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ตฌ๋ถ„์กฐ์ฐจ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋จผ์ € ํŠน์ • ์†Œํ’ˆ์„ ํ†ต๊ณผํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ถ”๊ฐ€ ๋…ผ๋ฆฌ์— ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "DOM props"์™€ "other props"์˜ ๊ฒฝ๊ณ„๋ฅผ ์–ด๋””์— ๋‘๋‚˜์š”?

์ด๊ฒƒ์ด tabIndex , cellSpacing ์™€ ๊ฐ™์€ props ๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ DOM ๊ด€๋ จ props๊ฐ€ camelCase ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ์ฃผ๋œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ API๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Button ์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ DOM์œผ๋กœ ํ˜๋Ÿฌ ๋“ค์–ด๊ฐ€๋Š” ์ง€์ ์—์„œ ์†์„ฑ ์ด๋ฆ„์œผ๋กœ "๋ณ€ํ™˜"ํ•˜์ง€ ์•Š๊ณ , ๊ทธ๋ฆฌ๊ณ  non-camelCase ์†Œํ’ˆ์„ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ API.

์ด๊ฒƒ์€ ๋˜ํ•œ data-* , aria-* ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ๊ณผ ๊ฐ™์€ ์†Œํ’ˆ์ด ํ•ฉ๋ฆฌ์ ์ธ ์˜ˆ์™ธ์ธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค(๋น„๋ก ๋” ํ’๋ถ€ํ•œ API๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ). ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑ ์š”์†Œ์— ๊ฑฐ์˜ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ DOM์— ๋„ˆ๋ฌด ๊ฒฐํ•ฉ๋˜์–ด ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋” ํ’๋ถ€ํ•œ camelCase API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ <Modal> ๋˜๋Š” <Button> ์™€ ๊ฐ™์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋ฉ๋‹ˆ๋‹ค.

React ์†์„ฑ์ด ์ด๋ฏธ DOM ์†์„ฑ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"DOM ์†์„ฑ ์ด๋ฆ„" ๊ทœ์น™์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? "์†์„ฑ ์ด๋ฆ„์˜ camelCase ๋ฒ„์ „"์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ฑฐ์˜ ํ•ญ์ƒ ์ด๋ฏธ ์ฒดํฌ ์•„์›ƒ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋„ˆ๋ฌด ๊ธ‰์ง„์ ์œผ๋กœ ๋“ค๋ฆฐ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์ด๊ฒƒ์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” srcSet ๋ผ๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ DOM ์†์„ฑ ์ด๋ฆ„์€ srcset ์ž…๋‹ˆ๋‹ค. autoCapitalize ๊ฐ€ ์žˆ์ง€๋งŒ DOM ์†์„ฑ์€ autocapitalize ์ž…๋‹ˆ๋‹ค. autoFocus ๊ฐ€ ์žˆ์ง€๋งŒ DOM ์†์„ฑ์€ autofocus ์ž…๋‹ˆ๋‹ค.

camelCase JavaScript ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๋•Œ ์ด๋ฏธ DOM ์†์„ฑ ์ด๋ฆ„์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๋ฅผ class ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ: className ๋Œ€ class

className ๋กœ ๋งŒ๋“  ์ด์œ  ์ค‘ ์ผ๋ถ€๋Š” React๊ฐ€ DOM ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ  className ๊ฐ€ DOM ์†์„ฑ์˜ ์ด๋ฆ„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ React๋Š” 3~4๊ฐœ์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋” ์ด์ƒ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ React๋Š” DOM ์†์„ฑ ์ด๋ฆ„์„ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  DOM ์†์„ฑ๊ณผ ์†์„ฑ ์ด๋ฆ„์˜ ๋‚ด๋ถ€ ๋ช…๋ช… ๋ถˆ์ผ์น˜์— ๊ด€๊ณ„์—†์ด JavaScript์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. React๋Š” ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ์˜ prop ์ด๋ฆ„์„ "JavaScripty"๋กœ ๋Š๋ผ๋„๋ก ์œ ์ง€ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์‹ ๊ฒฝ์„ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ tabindex ๋Š” "JavaScripty"๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ class ์™€ className ๋Š” ๋ชจ๋‘ "JavaScripty"์ž…๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์— class ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ฃผ์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์œ ํšจํ•œ ES3(IE8๊ณผ ๊ด€๋ จ๋จ)๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// Not valid in ES3
// Valid in ES5
var props = { class: 'foo' };

๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์€ ๋” ์ด์ƒ ES3๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Babel๊ณผ ๊ฐ™์€ ๋„๊ตฌ ๋ชจ์Œ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ IE9+๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. React๋Š” ํ˜„์žฌ IE8์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ class ์— ๋‚จ์•„ ์žˆ๋Š” ์œ ์ผํ•œ ๋ถˆํŽธ์€ ๋‹ค์Œ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// Not valid at all :-(
const class = props.class;
const { class } = props;

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

// Valid
const {class: cls} = foo;
const cls = props.class;

๊ทธ ์ด์ƒ์˜ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‚ด๋ถ€ <div> ๋˜๋Š” ๊ธฐํƒ€ ํ˜ธ์ŠคํŠธ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์€ class ๋ฅผ ์ฝ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์ฃผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ class ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋ ค๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์ฃผ <div className> ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ class ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋„์ž…๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

// Valid in ES2018

function Button({ color, ...rest }) {
  const buttonClass = rest.class +  ' Button-' + color;
  return <button {...rest} class={buttonClass} />
}

์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด class ๋ฅผ ์ฝ์ง€ ์•Š๊ณ ๋„ {...rest} ๋ฅผ ์ „๋‹ฌํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌ์กฐ ๋ถ„ํ•ด ์ œํ•œ์€ ๋” ๋‚˜์€ ๊ตฌ์„ฑ ์š”์†Œ ๋””์ž์ธ์„ ์žฅ๋ คํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ ๋ชจ๋‘?

why not both

๋งˆ์ง€๋ง‰์œผ๋กœ class ์™€ className ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•  ์ˆ˜๋Š” ์—†๋‚˜์š”? ์–ด๋–ค ๋ฉด์—์„œ๋Š” ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์ง€๋งŒ React๋Š” ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ ๋‹น์‹ ์—๊ฒŒ ๊ณ ํ•จ์„ ์ง€๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ  ์—†์ด ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์–ด๋Š ๊ฒƒ์„ ์‚ฌ์šฉํ• ์ง€ ์ชผ๊ฐœ์ง‘๋‹ˆ๋‹ค. class prop์„ ๋ฐ›๋Š” npm์˜ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‘˜ ๋‹ค ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ผ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ์†Œํ’ˆ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ํด๋ž˜์Šค๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•˜๋‹จ์— class ๋ฐ className ๊ฐ€ ๊ฐ๊ฐ "๋™์˜ํ•˜์ง€ ์•Š์Œ"์œผ๋กœ ํ‘œ์‹œ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. React๊ฐ€ ๊ทธ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ํ˜„์ƒ ์œ ์ง€๋ณด๋‹ค ๋‚˜์  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ด๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์š”์•ฝ

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

์šฐ๋ฆฌ๊ฐ€ DOM ์†์„ฑ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋‹จ์ ์œผ๋กœ ๋ณด์•˜๋˜ ๊ฒƒ์€ ๋” ์ด์ƒ DOM ์†์„ฑ์„ ์„ค์ •ํ•˜์ง€๋„ ์•Š๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์ง€๋„ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ฑฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” React ๊ตฌ์„ฑ ์š”์†Œ์˜ ์†Œ๋น„ ์ธก์—์„œ ์†์„ฑ ๊ธฐ๋ฐ˜์ด์ง€๋งŒ camelCase API๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  class="Button" ๊ฐ€ className="Button" ๋ณด๋‹ค ํ™•์‹คํžˆ ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค DOM API๊ฐ€ ์˜ค๋Š˜๋‚  ์„ค๊ณ„๋˜์—ˆ๋‹ค๋ฉด .class ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์˜ 10๋…„ ์ „์— ์ด์™€ ๊ฐ™์€ ํ• ๋‹น์—์„œ class ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ œํ•œ์ด ES5์—์„œ ํ•ด์ œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ ์ผํ•˜๊ฒŒ ๋‚จ์€ ํฐ ๋‹จ์ ์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ํ‰๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์€ ๋ณ€๊ฒฝ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ ์—ญ์‹œ ๋งŒ๋“ค๊ณ  ์˜์›ํžˆ ๊ณ ์น  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ฐ€๋ณ๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ท€ํ•˜์˜ ๋ชจ๋“  ์šฐ๋ ค ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด๊ฒƒ์€ camelCased ์†์„ฑ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ React prop ์ด๋ฆ„์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@renatoagds

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? React Fiber์™€ ๋™์ผํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ์— ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด :

๊ทธ๋ฆฌ๊ณ  Facebook์—๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์— ๋Œ€ํ•ด ์ •์งํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” 50,000๊ฐœ ์ด์ƒ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋Œ€์ƒ ์ˆ˜์ • ๋˜๋Š” ์ž๋™ํ™”๋œ ์ฝ”๋“œ ๋ชจ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ œํ’ˆ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์—ฌ์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

re: className -> class, ์–ด๋–ค ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋“  ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค ๋ณ€๊ฒฝ ์˜ˆ์™ธ์™€ ๋” ์งง์€ ์ฝ”๋“œ ์ค„์˜ ๋ถ€์ˆ˜์  ์ด์ ์„ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ camelCase ์ด๋ฆ„์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

const { class } = props;

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

const class = props.class;

๊ทธ ์ด์ƒ์˜ ๋…ธ๋ ฅ์ด ์•„๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€(์ž‘์„ ์ˆ˜๋„ ์žˆ์Œ):

  1. const class = props.class ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๊ณ  ๋น ๋ฅธ ํ…Œ์ŠคํŠธ์—์„œ Chrome์€ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๊ธฐ์‚ฌ ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  2. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด nvm๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ (๋‹ค์‹œ ํ•œ ๋ฒˆ, ์ž ์žฌ์ ์œผ๋กœ ์ž‘์€) ์ขŒ์ ˆ์˜ ์˜์—ญ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ์—…๋ฐ์ดํŠธ ์ฐธ์กฐ).

const { oneProp, twoProp, className, ...rest }  = this.props;

// do stuff with oneProp, twoProp, className

return (
  <div
    someProp={prop}
    anotherProp={anotherProp}
    className={someClassName}
    {...rest}/>
);

์ด ๋ณ€๊ฒฝ ํ›„์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const { oneProp, twoProp, ...rest }  = this.props;

// do stuff with oneProp, twoProp, this.props.className

return (
  <div
    someProp={prop}
    anotherProp={anotherProp}
    {...rest}
    class={someClassName}/>
);

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

์—…๋ฐ์ดํŠธ :

์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ,

const { class: className } = this.props;

ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์œ ์ผํ•˜๊ฒŒ ๋‚จ์€ ํฐ ๋‹จ์ ์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ํ‰๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์€ ๋ณ€๊ฒฝ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ ์—ญ์‹œ ๋งŒ๋“ค๊ณ  ์˜์›ํžˆ ๊ณ ์น  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ฐ€๋ณ๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ท€ํ•˜์˜ ๋ชจ๋“  ์šฐ๋ ค ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

์šด ์ข‹๊ฒŒ๋„ ์ด๊ฒƒ์€ Aesthetic์™€ ๊ฐ™์€ CSS-in-JS ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‰ฝ๊ฒŒ ์™„ํ™”๋ฉ๋‹ˆ๋‹ค. ๋†€๋ผ์šด ์ž‘์„ฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์†์„ฑ ์ด๋ฆ„์— ๊ด€ํ•œ ์ž„์˜์˜ ํŒ, ๋‚˜๋Š” ํ›Œ๋ฅญํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. svg2jsx ๋Š” ํฐ SVG๋ฅผ React์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค!

@jamesPlease ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ๋‚ด ๋งˆ์Œ์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๋‹น์‹  ๋ง์ด ๋งž์•„์š”. ์ˆ˜์ •๋จ.

@james ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๊ธฐ๋ณธ ๊ฐ’์— ๋Œ€ํ•ด JSON๊ณผ ์ž์ฃผ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค!

const { default: defaultVal } = property

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

className -> class ๋Š” ์ƒํƒœ๊ณ„์— ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์€ ์ˆ˜๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ ํŒจ์น˜ํ•˜์ง€ ๋ชปํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ ์ง„์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ์˜ ๋” ๊นŠ์€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” StrictMode ์™€ ๊ฐ™์€ ๋ž˜ํผ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ณ€๊ฒฝ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ (๋‹ค์‹œ ํ•œ๋ฒˆ, ์ž ์žฌ์ ์œผ๋กœ ์ž‘์€) ์ขŒ์ ˆ์˜ ์˜์—ญ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const { oneProp, twoProp, className, ...rest }  = this.props;

// do stuff with oneProp, twoProp, className

return (
 <div className={someClassName} {...rest}/>
);

๊ตฌ์กฐํ™”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

const { oneProp, twoProp, ...rest }  = this.props;

return (
  <div
    {...rest}
    class={'something ' + rest.class}
  />
);

@gaearon

React๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

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

@justinfagnani ๋ณ€๊ฒฝ ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ํŠน์ • ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ œ์•ˆํ•˜๋Š” API์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด๋„ ๋ ๊นŒ์š”? ์ด๊ฒƒ์€ ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@sompylasar

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

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ฐฌ๋ฐ˜ ์–‘๋ก ์„ ์ €์šธ์งˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ํ™•์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

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

๊ฒฐ์ •์— ๊ด€๊ณ„์—†์ด class ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ฃผ์žฅ์€ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค. JS ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ES6 ์ฝ”๋“œ์—์„œ CSS ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐพ๊ณ ์ž ํ•  ๋•Œ class ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์˜คํƒ์ง€๊ฐ€ ๋ช‡ ๊ฐœ๋‚˜ ๋ ๊นŒ์š”? ์˜ˆ, class={ ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ JS์—์„œ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋œ JSX์˜ props๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (์ €๋Š” props destructuring์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋Œ€ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.) ๋ฌผ๋ก  ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์—์„œ ๋” ๋‚˜์€ ์ปจํ…์ŠคํŠธ ์ธ์‹ AST ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ํ…์ŠคํŠธ์™€ ์ •๊ทœ ํ‘œํ˜„์‹๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๊ฐ์ฒด ์ „๋‹ฌ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ์ธ๊ตฌ๊ฐ€ ์ด๋ฅผ ์ฑ„ํƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

@GeordieP ์˜ค๋Š˜ ์ž‘๋™ํ•˜๋ฉด ๋‚ด์ผ ๊นฐ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ํ•ต์‹ฌ ์›์น™์ด์ž ๋งŽ์€ ํŠน์ง•์ด ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

@gaearon ๊ทธ๋Ÿผ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ํฐ ์Šน๋ฆฌ๋ผ๋ฉด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ๊ฐ€๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

@sompylasar ์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ className= ๋˜๋Š” className: ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ class ์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

className ๋ฅผ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๋ง™์†Œ์‚ฌ htmlFor . ์ €๋Š” DOM ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋ณธ DOM ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ์ž˜๋ชป๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ React์— ์‚ฌ๋žŒ๋“ค์„ ์˜จ๋ณด๋”ฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋„์ „์€ JSX๊ฐ€ DOM๊ณผ ๊ทธ ์ด์ƒํ•œ ๋Œ€์ฒด HTML ์†์„ฑ์— ๋Œ€ํ•ด ๋งŒ๋“œ๋Š” ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋ณ€ํ™˜๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด ์‹œ์ ์—์„œ ์˜ˆ์•ฝ์–ด์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. IMO.

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

์•ฝ๊ฐ„ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ์ด๋ฆ„์—์„œ ์ดˆ๋ณด์ž React ํ•™์Šต์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ”„๋กœ์ ํŠธ ๋ฐ ํ–‰๋™์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ตฌ์กฐ ํ•ด์ œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ๊ทœ์น™์— ๋Œ€ํ•œ ์ด ์ƒˆ๋กœ์šด ์˜ˆ์™ธ๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ $# className class ๋ผ๊ณ  ์“ฐ๋Š” ๋“œ๋ฌธ ๊ฒฝ์šฐ๋ณด๋‹ค ๋” ํฐ ์ •์‹ ์  ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ดˆ๋ณด์ž๋Š” ํ˜„์žฌ className ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ์ž๋ฃŒ(๋ธ”๋กœ๊ทธ/๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋“ฑ)์— ์—ฌ์ „ํžˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋งˆ์ง€๋ง‰์œผ๋กœ @sompylasar ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด์—์„œ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ์„ ์†์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

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

์•ฝ๊ฐ„ ์˜คํ”„ํƒ‘์ด์ง€๋งŒ (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ) ์•„๋ฌด๋„ HTML ์†์„ฑ์„ ๋งคํ•‘ํ•˜๋Š” ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์œผ๋กœ React๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด html/css/svg -> jsx ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋งŒ๋“ค ์ƒ๊ฐ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ์†Œํ’ˆ.

@jxub - 2014๋…„์— ํ•ด์ปคํ†ค ๋ฐฉ์‹์˜ ์ผ๋ถ€๋กœ HTML์—์„œ JSX๋กœ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://magic.reactjs.net/htmltojsx.htm. ๊ทธ๋Ÿฌ๋‚˜ SVG๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. hackathon ํ”„๋กœ์ ํŠธ๋Š” React(https://github.com/reactjs/react-magic)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ HTML ์‚ฌ์ดํŠธ๋ฅผ "ajaxify"ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ๊ณ  ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. HTML ๋ฉ์–ด๋ฆฌ์—์„œ HTML to JSX ๋ถ€๋ถ„์„ ๋ณ„๋„์˜ ๋…๋ฆฝํ˜• ํŽ˜์ด์ง€๋กœ ๋ฆด๋ฆฌ์Šคํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ IE11 ์ง€์›์— ์‹ ๊ฒฝ์„ ์“ฐ๊ณ  ์žˆ์ง€๋งŒ ๊ธฐ์กด์˜ ๋ธŒ๋ผ์šฐ์ € ์ฐจ์ด์  ์ค‘ ์ผ๋ถ€๋ฅผ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ์ตœ์‹  UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ทจํ•˜๋Š” ์ž…์žฅ์ž…๋‹ˆ๋‹ค.

@gaearon - ๋ธŒ๋ผ์šฐ์ € ์ฐจ์ด๋ฅผ ๋งค๋„๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ตœ์‹  UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜ˆ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ €์—๊ฒŒ ๊ทธ๊ฒƒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

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

์œ„๋Œ€ํ•œ ์—ฐ๊ทน ์˜ˆ์ˆ ๊ฐ€ Tyshler๋Š” ํ’๊ฒฝ์˜ ์Šค์ผ€์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌ์„์— ์ž‘์€ ๋…น์ƒ‰ ๊ฐœ๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…ํ•™ ์‹ฌ์‚ฌ์œ„์› ์ค‘ ํ•œ ๋ช…์ด "๋‚˜๋Š” ๋‹ค ์ข‹์€๋ฐ ์ด ๊ฐœ๋Š” ์–ด๋”” ์žˆ์ง€?"๋ผ๊ณ  ๋ฌป์ž ์•ˆํƒ€๊นŒ์šด ํ•œ์ˆจ์„ ๋‚ด์‰ฌ๋ฉฐ ๊ทธ๋…€๋ฅผ ๋ถ™์žก์•˜๋‹ค.

์ด ๋ณ€๊ฒฝ์˜ ์ง„์ •ํ•œ ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋ฏธ ์ด ์ƒˆ๋กœ์šด ์—…๊ทธ๋ ˆ์ด๋“œ ํ”„๋กœ์ ํŠธ์˜ ์ธ๊ธฐ์™€ React์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์†Œ๋ฌธ์ด ๊ธ‰์ƒ์Šนํ–ˆ์Šต๋‹ˆ๋‹ค.

Passive Event Listeners ์ง€์›์ด ๋ชจ๋ฐ”์ผ์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ธ React Fire์˜ ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

6436

์ด ์ž‘์—…์— ๋Œ€ํ•œ ๋ชจ๋“  ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ className -> class ๋ฅผ ์žฌ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ํ•œ๋•Œ React ์ดˆ๋ณด์ž์˜€์œผ๋ฉฐ className ๋Š” ์šฐ๋ฆฌ๊ฐ€ React๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‚ฌ๋ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

jsx์™€ ํ•จ๊ป˜ vue๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฏธ class ๊ฐ€ className $ ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. React๊ฐ€ Virtual DOM์˜ ์„ ๊ตฌ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— className ์ด class ๋กœ ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. , DOM ์ž์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ React ๋ฃจํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜์‹ญ์‹œ์˜ค.

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

react-dom/test-utils ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ €๋Š” ํŠนํžˆ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ Simulate ์˜ ๊ฐ€๋Šฅํ•œ ์ œ๊ฑฐ์— ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฉฐ ๋ฌผ๋ก  react-dom ์ž์ฒด์—์„œ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ. ๋ฒ”์œ„์— ํ•ด๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

/cc @kentcdodds

๋‚˜๋Š” React Fire๊ฐ€ ์ทจํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ๊ณผ ํฐ ๊ทธ๋ฆผ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๊ทธ๊ฒƒ๋“ค์€ ๋…ธ๋ ฅํ•ด์•ผ ํ•  ํฐ ๋ณ€ํ™”์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋ฐœํ‘œ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ข‹์•„ํ•˜์ง€๋งŒ className ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋Š” ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค.

React๋Š” ๊ตฌ์กฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ด ํŠน์ • ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ (...code snippet...)๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

์—„์ฒญ๋‚œ

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

๋ฐœํ‘œ๋˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ข‹์€ ๊ฒƒ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์€๋ฐ, ๋ณ€ํ™”์— ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์ •์น˜์  ์ž๋ณธ์„ ํˆฌ์žํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์„œ ์žˆ๋Š” ์œ„์น˜์—์„œ ์ •๋‹นํ™”์˜ ์ผ๋ถ€๊ฐ€ "๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ... ํ›จ์”ฌ ๋” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค."์ธ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฒฐ์ •์€ _๊ฑฐ๋Œ€ํ•œ_ ๊ธ์ •์ ์ธ ์ธก๋ฉด์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. className -> class ๋ณ€๊ฒฝ์€ ๋ฐœํ‘œ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋น„๊ตํ•  ๋•Œ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๐Ÿ”ฅ React Fire์˜ ์ฃผ์š” ๋ฐœ์ „์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

class v/s className ์— ๋Œ€ํ•ด JSX โ‰  React๋ฅผ ์ƒ๊ธฐ์‹œ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

JSX๋Š” HTML์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์„ค๊ณ„๋œ _DSL_์ด๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ HTML์— ๊ฐ€๊น๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. DOM API์—์„œ๋Š” className ๋ผ๊ณ  ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ DOM API๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ JSX๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

React์˜ API๊ฐ€ DOM API์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๋ฉด ๋ณ€ํ™˜์—์„œ ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๊ฑฐ๋‚˜ ๊ฐ€๋Šฅํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
<img src="avatar.png" class="profile" /> โ†’ React.createElement("img", { src: "avatar.png", className: "profile" }) .

JSX ๊ตฌ๋ฌธ์„ HTML์˜ ๊นจ๋—ํ•œ ์ƒ์œ„ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@mhenr18 ์ด ๋งํ•œ ๋‚ด์šฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํ™ฉ:

  • ๋ฐ˜์‘์ด ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค
  • API๋Š” camelCase์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ์ƒํ™ฉ:

  • ๋ฐ˜์‘์ด ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค
  • API๋Š” camelCase์ž…๋‹ˆ๋‹ค.
  • className -> class

์ธ์ง€๋œ ์ด์ :

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

์‹ค์ œ ๋‹จ์ :

  • className ์— ์˜์กดํ•˜๋Š” ์ „์ฒด ์ƒํƒœ๊ณ„๊ฐ€ ์ž‘๋™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค(๊ฑฐ๋Œ€ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋…ธ๋ ฅ)
  • ์ฑ…, ํŠœํ† ๋ฆฌ์–ผ, ์˜ˆ์ œ, ์ฝ”๋“œ, ๊ฒŒ์‹œ๋ฌผ, ๊ธฐ์‚ฌ์˜ ๋ฐฉ๋Œ€ํ•œ ๋ณธ๋ฌธ ์ „์ฒด๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋ฌดํšจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ๋‚จ์•„์žˆ๋Š” ์œ ์ผํ•œ ์œ ํšจํ•œ JS๋Š” ์ถ”๊ฐ€ ํƒ€์ดํ•‘ : const {class: cls} = props ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ JS์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.
  • React API๋Š” ์ผ๊ด€์„ฑ์ด ์—†๊ณ  ์ถ”๊ฐ€ ๊ฐ€์ •์„ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค( for htmlFor ๊ฐ€ ์•„๋‹Œ ์ด์œ  ๋“ฑ).

๋‚ด๊ฐ€ ์ œํ’ˆ ๊ด€๋ฆฌ์ž๋ผ๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™€ํŠธ?

@gaearon ์ด๋ฏธ ๊ณ ๋ คํ•˜์…จ์„ ํ…๋ฐ "React Fire" ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ํ‚ค์›Œ๋“œ๋กœ PR์„ ํƒœ๊ทธํ•˜์‹ญ์‹œ์˜ค.

๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€๋งŒ PR์—๋Š” ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž ์žฌ์  ๊ธฐ์—ฌ์ž์—๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์ „์ฒด Fiber ๊ฐœ๋ฐœ ์ค‘์— React Fiber ๋ฐ React Reconciler ๊ด€๋ จ ์ปค๋ฐ‹์„ ์ฐพ๋Š” git ๊ธฐ๋ก์„ ์ฝ์œผ๋ ค๊ณ  ํ•  ๋•Œ์˜ ๊ฒฝํ—˜์—์„œ ๋‚˜์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

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

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

์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค, ์ •๋ง ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” babel-plugin-react-html-attrs ๋ฅผ ๋ช‡ ๋…„ ๋™์•ˆ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค className ์˜ ์ด๋ฆ„์„ class ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

" class v className " / " for v htmlFor " ์ƒํ™ฉ ์ „์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Babel ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด ์—†์—ˆ๋‚˜์š”?

์ด๋ฏธ ๊ฒฐ์ •๋œ ๋ช…๋ช… ๊ฒฐ์ •๊ณผ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ html ์†์„ฑ์„ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

๋‚˜๋Š” React ๋‚ด๋ถ€์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์‹ค์ œ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๋งŽ์ด ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์นœํ™”์„ฑ ์ธก๋ฉด์—์„œ "ํ•ด์•ผ" ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹๋งŒ์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

className ๋Œ€ class ๋ฅผ ์žฌ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ด๋“์€ ๊ฑฐ์˜ ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ ์‹ค์งˆ์ ์ธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋Š” ๋ฐ˜์‘ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด๋กœ Hax๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์ด๊ฒƒ์€ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ _any_ ๋ฐ˜์‘ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์•„ ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ์ด... "React ํด๋ž˜์Šค"์— ๋Œ€ํ•ด Google์—์„œ ๊ฒ€์ƒ‰ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. React ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ, React ํด๋ž˜์Šค ์†์„ฑ๊ณผ ๊ฐ™์€ ํ˜ผํ•ฉ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. "React className"์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์˜ค๋ž˜๋œ ๋ฌธ์„œ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ฝ”๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ ์™ธ์— ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์—„์ฒญ๋‚œ ์–‘์˜ ์—…๊ทธ๋ ˆ์ด๋“œ ์ž‘์—…).

์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์œ„ํ•œ ๋” ๋งŽ์€ ์ž‘์—…๊ณผ ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋” ๋งŽ์€ ์žก์Œ๊ณผ ํ˜ผํ•ฉ ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ํ•˜์ง€ ํฌ๋ง.

์˜ˆ, ์›น ๋ฐ JavaScript ์ƒํƒœ๊ณ„๋Š” ๊ณผ๊ฑฐ์˜ ์–ด๋ฆฌ์„์€ ์‹ค์ˆ˜๋กœ ์—ญํ˜ธํ™˜์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ญํ˜ธํ™˜์„ ์œ„ํ•œ ์ด๋Ÿฌํ•œ ๋…ธ๋ ฅ ๋•๋ถ„์— ์ฃผ์š” ํŒŒํŽธํ™” ์—†์ด ๊ทธ๋Ÿฌํ•œ ๊ทœ๋ชจ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณ€ํ™” ์—†์ด๋Š” ์ง„์ „์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ , ๋นจ๋ฆฌ ์›€์ง์ด๊ธฐ ์œ„ํ•ด ์ผ์„ ๋ถ€์ˆ˜๋Š” ์ดˆ๊ธฐ FB์˜ ๋ชจํ† ๋ฅผ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์ด ์ •๋ง๋กœ ํ•„์š”ํ•œ ๋งŒํผ ๋ˆ๊ธฐ ์žˆ๊ฒŒ ํ–‰๋™ํ•œ๋‹ค๋ฉด ๋ณ€๊ฒฝ์˜ ์ง„์ •ํ•œ ์ด์œ ๋ฅผ ๋งํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์€ "๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด" ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•œ React Core ํŒ€์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ์–•๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ™•์‹คํžˆ ๋ญ”๊ฐ€๋ฅผ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@sompylasar ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ className= ๋˜๋Š” className:์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ํด๋ž˜์Šค์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ github์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๋Š” ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค =/

์—ฌ๊ธฐ ๋Œ“๊ธ€ ๋‹ค ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ดœ์ฐฎ์ง€๋งŒ class ์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฃผ๋œ ์ด์œ ๋Š” JSX 2.0 ๊ณ„ํš์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๊ฐ€๊ธฐ ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด (์ง€๊ธˆ ๊ฐœ์ฒด์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ).
๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ๋งค์šฐ ์ข‹์€ ๊ฐœ์„  ์‚ฌํ•ญ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ตœ์ข… ๊ฒฐ์ •์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :) ๋†€๋ผ์šด ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๊ท€ํ•˜์˜ ์˜๊ฒฌ ์ค‘ ํ•˜๋‚˜์—์„œ "์˜ค๋Š˜ ์ž‘๋™ํ•˜๋ฉด ๋‚ด์ผ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌป๊ธฐ ์ „์— ์ด๊ฒƒ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค ;).

์ €๋Š” ๋ชจ๋“  ๋ฒ„์ „์˜ React๋ฅผ 15.4๋กœ ๋˜๋Œ๋ฆฌ๋Š” RMWC https://jamesmfriedman.github.io/rmwc/ ๋ผ๋Š” UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ•ฉ API ํ‘œ๋ฉด์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ className์„ class๋กœ, onChange๋ฅผ onInput์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์ •๋ฐ€ ๊ฒ€์‚ฌํ•˜๋ฉด ๊ณ„์†ํ•˜๊ธฐ๊ฐ€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

ํ›„๋“œ ์•„๋ž˜์—์„œ ์ด ํ•ญ๋ชฉ์˜ ์ผ๋ถ€๋ฅผ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ๋Š” "ํ˜ธํ™˜" ๋ ˆ์ด์–ด์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ๋ฐ˜์‘ ํ™”์žฌ๊ฐ€ ์–ด๋–ค ๋ฒ„์ „์ด๋“  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋‚ฎ์€ ๋Ÿฐํƒ€์ž„์—์„œ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚ด ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ ๋” ์ด์ƒํ•ด์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘€

className ๊ฐ€ ์‹ค์ œ๋กœ class ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ htmlFor ๋„ for ๋กœ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.
$ props ๋ฅผ ๊ตฌ์กฐํ™”ํ•  ๋•Œ class ๋ฐ for ๊ฐ€ ์›๋ž˜ ์œ ํšจํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—.

React์— ์ผ๊ด€๋œ API๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์†์„ฑ ์ด๋ฆ„์„ ์ •๊ทœํ™”ํ•˜๋Š” ์ž์ฒด API๊ฐ€ ์žˆ๋‹ค๋ฉด ํ™•์‹คํžˆ className ๊ฐ€ ์ด์— ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. camelCase ๊ด€์šฉ๊ตฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ด€์šฉ์  ํ•™์Šต๊ณผ DOM ์†์„ฑ ์ด๋ฆ„(์ผ๋ถ€ ๋‹ค๋ฅธ JSX ์†์„ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ)์— ๋งคํ•‘๋œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋กœ ๊ตฌ์กฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•  ๋•Œ ํ™•์‹คํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. props ๊ฐ์ฒด๊ฐ€ ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

ps. ๋‹ค๋ฅธ๊ฑด ๋‹ค ๋ฉ‹์ ธ์š” btw ํŠนํžˆ ์ด๋ฒคํŠธ ๋ฌผ๊ฑด ๐Ÿ‘Œ๐Ÿป

์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

@gaearon ์ž์‹ ์˜ ์˜ˆ๋ฅผ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

const { oneProp, twoProp, ...rest }  = this.props;

return (
  <div class={'something ' + rest.class} {...rest}/>
);

๋ฒ„๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? "๊ตฌ์กฐํ™”ํ•˜์ง€ ๋งˆ์„ธ์š”"์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๊ฐ€ className์ธ ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์€ ์œ ์ผํ•œ ์‚ฌ๋žŒ์ž…๋‹ˆ๊นŒ? ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐ˜์‘ํ•˜๋Š”์ง€ ๋‚˜์—๊ฒŒ ๋ฌป๋Š”๋‹ค๋ฉด ๋‚ด ๋งˆ์Œ์„ ๊ฒฐ์ฝ” ์ƒ๊ฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์—…๋ฐ์ดํŠธ๋Š” ๊ณต์งœ์ด๊ณ  ๋‚˜๋Š” ๊ณต์งœ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๊ฐ€ className์ธ ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์€ ์œ ์ผํ•œ ์‚ฌ๋žŒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ˆ˜์—…์— ๋Œ€ํ•ด ์ „ํ˜€ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. IE11์˜ ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋” ์žฌ๋ฏธ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋ž˜๋„ ์ €๋Š” ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค)

Passive Event Listeners ์ง€์›์ด ๋ชจ๋ฐ”์ผ์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ธ React Fire์˜ ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. #6436

๋™์˜ํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ์ด ์ž‘์—…์˜ ๋ฒ”์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

Hey @gaearon - ๋จผ์ € ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

๊ฐœ์ธ์ ์œผ๋กœ ์ฐธ์—ฌํ•œ ํ”„๋กœ์ ํŠธ(Node, Bluebird ๋“ฑ)์—์„œ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.


๊ฐœ์ธ์ ์œผ๋กœ ํ•ต์‹ฌ์—์„œ ๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ: ๋” ๊ฐ„๋‹จํ•œ ๋น„์ „์—ญ ์ข…์†์„ฑ ์ฃผ์ž… ์ง€์›, ๋” ์šฐ์ˆ˜ํ•˜๊ณ  ์ผ๊ด€๋œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ(์ด๋ฏธ ๋…ผ์˜ ์ค‘์ธ)๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด react >๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋–ค API๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌด์—‡์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šด์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฌธ์กฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” react-native๊ฐ€ canny.io๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” react๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋ชจ๋“  ๋ฒ„์ „์˜ React๋ฅผ 15.4๋กœ ๋˜๋Œ๋ฆฌ๋Š” RMWC https://jamesmfriedman.github.io/rmwc/ ๋ผ๋Š” UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ•ฉ API ํ‘œ๋ฉด์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ className์„ class๋กœ, onChange๋ฅผ onInput์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์ •๋ฐ€ ๊ฒ€์‚ฌํ•˜๋ฉด ๊ณ„์†ํ•˜๊ธฐ๊ฐ€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

ํ›„๋“œ ์•„๋ž˜์—์„œ ์ด ํ•ญ๋ชฉ์˜ ์ผ๋ถ€๋ฅผ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ๋Š” "ํ˜ธํ™˜" ๋ ˆ์ด์–ด์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ๋ฐ˜์‘ ํ™”์žฌ๊ฐ€ ์–ด๋–ค ๋ฒ„์ „์ด๋“  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋‚ฎ์€ ๋Ÿฐํƒ€์ž„์—์„œ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

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

@jamesmfriedman codemod ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ) ์ƒˆ API๋กœ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ (๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ) (codemod๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) ์ด์ „ API๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋„ˆ๋ฌด ๋ณต์žกํ•˜์ง€ ์•Š์Œ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘ ๋ฒˆ๋“ค์„ ๋ชจ๋‘ ๋ฐฐ์†กํ•˜๊ณ  React ๋ฒ„์ „์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด์ง€๋งŒ (์˜ˆ๋ฅผ ๋“ค์–ด webpack ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ npm ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋กœ?) ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ด๋ ต์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•œ ๋ฒˆ ๋ฆด๋ฆฌ์Šค๋˜๊ณ  ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ข…๋ฅ˜์˜ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ˜ธํ™˜์„ฑ ๋ ˆ์ด์–ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

for์— ๋Œ€ํ•œ htmlFor ์‚ญ์ œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

className๊ณผ class๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ฆฌ์ง€ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ˜„์žฌ ์ž์‚ฌ ์ฝ”๋“œ๊ฐ€ ๋ฏธ๋ž˜์— ์ง๋ฉดํ•  ์ˆ˜ ์žˆ๋Š” ๋™์•ˆ ์ด์ „์˜ ํƒ€์‚ฌ React ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์‚ฌ ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์™„์ „ํžˆ ์ตœ์ ํ™”๋œ React DOM์„ ๊ฐ–๊ธฐ ์œ„ํ•ด ๋ธŒ๋ฆฌ์ง€ ํŒจํ‚ค์ง€๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋งŒํผ ์‰ฝ์Šต๋‹ˆ๋‹ค.

React API๋Š” ์ผ๊ด€์„ฑ์ด ์—†๊ณ  ์ถ”๊ฐ€ ๊ฐ€์ •์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค(htmlFor๊ฐ€ ์•„๋‹Œ ์ด์œ  ๋“ฑ).

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

์ „์ฒด "class v className" / "for v htmlFor" ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—†์—ˆ๋‚˜์š”?

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

const props = {
   class: "foo"
}
<div {...props} />

๋˜ํ•œ class ๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์†Œํ’ˆ์—์„œ className ๋ฅผ ์–ป๋Š” ๊ฒƒ๋„ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ”Œ๋žซํผ ์š”์†Œ๋งŒ ๋Œ€์ƒ์œผ๋กœ ํ–ˆ๋‹ค๋ฉด button ๋ฅผ Button ๋ฐ”๊พธ๋ฉด class ์†Œํ’ˆ์ด ์ปดํŒŒ์ผ๋˜๋Š” ๋Œ€์ƒ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์„ฑ ์ค‘์ธ ์ฝ”๋“œ์˜ ์˜๋ฏธ๊ฐ€ ๋ชจํ˜ธํ•ด์ง€๊ณ  ๋” ๋งŽ์€ ํ˜ผ๋ž€์ด ์•ผ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” className ๋˜๋Š” class ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: ์ด๊ฒƒ์ด JSX ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์•„์ฃผ ์˜ค๋ž˜๋œ ๋ฒ„์ „์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ๋ณ€ํ™” . . .

๋†€๋ผ์šด! ์ด๋Ÿฌํ•œ ํฅ๋ฏธ๋กœ์šด ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ ๋ชจ๋“  ๊ธฐ์—ฌ์ž์—๊ฒŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
className > class ๊ฐ€ ์ด๋ ‡๊ฒŒ ํฐ ์Šค์บ”๋“ค์ธ์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ต์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ ๋ฐ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ์ •๋ง ์œ ๋งํ•ฉ๋‹ˆ๋‹ค. ์Šˆํผ ์Šคํ† ํ‚น!

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์˜ ํด๋ฆฌํ•„์„ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ className > class๊ฐ€ ๋„ˆ๋ฌด ๊ธ‰์ง„์ ์ด๋“  React๋Š” ๋„ˆ๋ฌด ๊ด‘๋ฒ”์œ„ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

React DOM์˜ 1/3์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์›น ์•ฑ ๊ฐœ๋ฐœ์—์„œ React๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

key ๋ฐ ref $ ์™€ ๊ฐ™์€ ํŠน์ • ์†Œํ’ˆ์— ๋ฐ˜์‘ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ

<Foo @key="foo" @ref={callback} prop="hi" />

์ด๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค - https://github.com/facebook/jsx/issues/66

@elado ์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ž˜์— ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ DOM์— ํŠน์ •ํ•˜์ง€ ์•Š์€ API์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ”์œ„ ๋ฐ–์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ธด ํ•˜์ง€๋งŒ ํŠนํžˆ ๋ฒˆ๋“ค ํฌ๊ธฐ์˜ ๊ฐ์†Œ๋Š” ํ•ญ์ƒ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฑฑ์ •์€ Facebook ์‚ฌ๋žŒ๋“ค์ด API ๋ณ€๊ฒฝ์„ ๊นจ๋Š” ๊ด€์„ฑ, ๊ณ ํ†ต ๋ฐ ๋‹จํŽธํ™”๊ฐ€ ์ƒํƒœ๊ณ„์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ด€์„ฑ, ๊ณ ํ†ต ๋ฐ ๋‹จํŽธํ™”๋ฅผ ๊ณผ์†Œํ‰๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

๊ทธ ์™ธ์—๋„ React๋ฅผ ๊ตฌ์ถ•, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋…ธ๋ ฅ๊ณผ ๊ทธ ๋’ค์—์žˆ๋Š” ์—”์ง€๋‹ˆ์–ด์˜ ์—ด์ •์— ์ •๋ง ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. :)

์ด ๋ฏธ๋ž˜์˜ {...์—…๋ฐ์ดํŠธ}๋Š” ๐Ÿ”ฅ

className -> class : ํด๋ž˜์Šค ์†์„ฑ์ด JSX/๊ฐ์ฒด ์„ ์–ธ ์™ธ๋ถ€์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋™์ผํ•œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ฝ”๋“œ ๋ณต์žก์„ฑ๊ณผ ์ธ์ง€ ๋ถ€ํ•˜๊ฐ€ โ€‹โ€‹์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์†์„ฑ/์†Œํ’ˆ ์ด๋ฆ„ ๋ถˆ์ผ์น˜๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋˜๋Š” ๊ธฐ๋ณธ DOM์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ์–ด๋”˜๊ฐ€์— ์กด์žฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ช…๋ช… ๋ฌธ์ œ์— ๋Œ€ํ•ด "ํ‘œ์ค€ํ™”"๋œ(๊ทธ๋ฆฌ๊ณ  ์ด ์‹œ์ ์—์„œ ์ž˜ ํ™•๋ฆฝ๋œ) ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“  ๊ฒƒ์€ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ className ๋Š” ์–ด๋””์—์„œ๋‚˜ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ DOM์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ๋„ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒƒ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐ˜์‘์€ ๋ง ๊ทธ๋Œ€๋กœ ์œ ์ผํ•œ ์žฅ์†Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํด๋ž˜์Šค ์†์„ฑ์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด class ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
className ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒ๋‹นํžˆ ๋ถˆํ•„์š”ํ•˜๊ณ  ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์˜€์ง€๋งŒ ๋‚˜์ค‘์—๋Š” ์ƒ๋‹นํžˆ ์‹ค์šฉ์ ์ด๊ณ  ๋น„๊ต์  ์ต์ˆ™ํ•ด์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ dangerouslySetInnerHTML $์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ฐœ์ฒด { __html } ๋Š” ์ •๋ง ๋ถˆํ•„์š”ํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐํ•˜์ง€๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋Š” ๊ฐ€์น˜๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ์™€ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Œ).

๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํ›จ์”ฌ ์ ์€ ๊ฐ์ •์„ ์ƒ์„ฑํ•˜์ง€๋งŒ ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กญ๊ณ  ์ค‘์š”ํ•˜๋ฏ€๋กœ fb ํŒ€์˜ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์žˆ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

'๋ฐฐ์†ก ์ฝ”๋“œ ๊ด€์ '์—์„œ ๋ณด๋ฉด ๋ชจ๋“  ์ฃผ์š” ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ๋ชจ๋“  ์ข…์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•œ ๋‹ค์Œ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์„ฑ๊ฐ€์‹  ๊ธฐ์ˆ ์  ๋ถ€์ฑ„์˜ ๊ฑฐ๋Œ€ํ•œ ์กฐ๊ฐ์ด ๋ฉ๋‹ˆ๋‹ค. ์น˜๋ช…์ ์ธ ์ทจ์•ฝ์ ์ด ์—†๊ฑฐ๋‚˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ง„์ •์œผ๋กœ ๋น„ํ˜„์‹ค์ ์ด์ง€ ์•Š๋Š” ํ•œ(๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ธฐ์ค€์ด ๋†’์Œ) ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ 0.x ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋ฒ—์–ด๋‚ฌ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•ต์‹ฌ ์›น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋˜๋ ค๋Š” ๋…ธ๋ ฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  React๋Š” ์—ฌ์ „ํžˆ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ํœ˜์ “๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋Š” ์•ž์œผ๋กœ์˜ ํฐ ๋ณ€ํ™”๊ฐ€ ๊นจ์ง€์ง€ ์•Š๋„๋ก API๋ฅผ ๊ณ„ํšํ•ด ๋ณด์„ธ์š”.

(๋˜ํ•œ IE11์€ EOL์ด ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ฆด๋ฆฌ์Šค๋Š” 52์ผ ์ „์ž…๋‹ˆ๋‹ค. React ํŒ€์€ ์ด๊ฒƒ์ด Facebook ํŒ€๊ณผ ๋ชจ๋“  ์™ธ๋ถ€ ๋ฐ ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒ€์— ์ž‘์—…์„ ํ‘ธ์‹œํ•˜์—ฌ ์ด๋ฅผ ์™„ํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ ์—).

@urugator

๋‚˜๋Š” ๋˜ํ•œ ์‹ค์ œ๋กœ ๋ถˆํ•„์š”ํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„ํ—˜ํ•˜๊ฒŒ SetInnerHTML์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ฐ์ฒด { __html }์„ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@philipwhiuk

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋Š” ์•ž์œผ๋กœ์˜ ํฐ ๋ณ€ํ™”๊ฐ€ ๊นจ์ง€์ง€ ์•Š๋„๋ก API๋ฅผ ๊ณ„ํšํ•ด ๋ณด์„ธ์š”.

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ธฐ์ˆ ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋ฉฐ React๋Š” ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฑ…์ž„๊ฐ ์žˆ๊ฒŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. componentWillReceieveProps๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์œผ๋ฉด React Suspense์™€ ๊ฐ™์€ ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์ด์ „ API๊ฐ€ ์˜์›ํžˆ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ IE11์€ EOL์ด ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ฆด๋ฆฌ์Šค๋Š” 52์ผ ์ „์ž…๋‹ˆ๋‹ค.

์•„๋ฌด๋„ IE 11์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React์˜ ํ˜„์žฌ ๋ฒ„์ „์€ ์‹ค์ œ๋กœ IE 11์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ํด๋ฆฌํ•„์„ ํ•„์š”๋กœ ํ•˜๋ฏ€๋กœ ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ IE 11 ๊ฐœ๋ฐœ์— ๊ฑฐ์˜ ๋™์ผํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://reactjs.org/docs/javascript-environment-requirements.html

๋‚˜๋Š” ๋˜ํ•œ ์‹ค์ œ๋กœ ๋ถˆํ•„์š”ํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„ํ—˜ํ•˜๊ฒŒ SetInnerHTML์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ฐ์ฒด { __html }์„ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@urugator - Facebook ๋‚ด๋ถ€์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” __html ๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋œ HTML์„ React ๊ตฌ์„ฑ ์š”์†Œ ํŠธ๋ฆฌ์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„ ์ธก์—์„œ __html ๊ฐœ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ฆฐํŠธ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธก์—์„œ๋Š” XHP ๋ฅผ __html ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐœ์ฒด๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” XHP๊ฐ€ JSX์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ณ (์‹ค์ œ๋กœ JSX์˜ ์ฃผ์š” ์˜๊ฐ์ด ๋จ) XSS ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋””์—๋„ ๋ณด์•ˆ ํ—ˆ์ ์„ ๋„์ž…ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ __html ๊ฐ์ฒด ๋Š” ์–ด๋”˜๊ฐ€ ์—์„œ ์‚ญ์ œ๋˜์—ˆ์œผ๋ฉฐ DOM์— ์ง์ ‘ ์‚ฝ์ž…ํ•ด๋„ ์•ˆ์ „ํ•œ HTML ๋ฌธ์ž์—ด์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์›์‹œ ๋ฌธ์ž์—ด์€ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹ค์ˆ˜๋กœ ์›์‹œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€(๋”ฐ๋ผ์„œ XSS ๊ตฌ๋ฉ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€) ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์— ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋งŽ์ง€ ์•Š์•„์•ผ ํ•˜๊ณ  ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ React ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ง์ ‘ __html ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์˜คํžˆ๋ ค ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ฌธ์„œ์—์„œ createMarkup ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ฐธ์กฐ: https://reactjs. org/docs/dom-elements.html#dangerouslysetinnerhtml)

๋‚ด ๊ฑฑ์ •์€ Facebook ์‚ฌ๋žŒ๋“ค์ด API ๋ณ€๊ฒฝ์„ ๊นจ๋Š” ๊ด€์„ฑ, ๊ณ ํ†ต ๋ฐ ๋‹จํŽธํ™”๊ฐ€ ์ƒํƒœ๊ณ„์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ด€์„ฑ, ๊ณ ํ†ต ๋ฐ ๋‹จํŽธํ™”๋ฅผ ๊ณผ์†Œํ‰๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

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

๋‹ค๋ฅธ ๋งŽ์€ ํšŒ์‚ฌ์™€ ๋‹ฌ๋ฆฌ ์šฐ๋ฆฌ๋Š” ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋™์ผํ•œ ๋ฒ„์ „์˜ React๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ณ ์œ ํ•œ ๊ณผ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ผ๋ถ€ ์ œํ’ˆ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ์œ„ํ•ด "๊ธฐ๋‹ค๋ฆผ"๋งŒ ํ•  ์ˆ˜ ์—†์Œ). ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์ข‹์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์„ ๊ฐ–๊ณ  ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ์—ญํ• ์„ ํ•˜๋„๋ก ๋” ๋งŽ์€ ์••๋ ฅ์„ ๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

React.PropTypes = require('prop-types')
React.createClass = require('create-react-class')

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

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

(๋˜ํ•œ IE11์€ EOL์ด ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ฆด๋ฆฌ์Šค๋Š” 52์ผ ์ „์ž…๋‹ˆ๋‹ค. React ํŒ€์€ ์ด๊ฒƒ์ด Facebook ํŒ€๊ณผ ๋ชจ๋“  ์™ธ๋ถ€ ๋ฐ ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒ€์— ์ž‘์—…์„ ํ‘ธ์‹œํ•˜์—ฌ ์ด๋ฅผ ์™„ํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ ์—).

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” IE11์ด "๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค"๊ณ  ๋งํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

์™œ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ถ€์ •์ ์ธ์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋  ๋•Œ๊นŒ์ง€ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

class vs className ๋ฐ for vs htmlFor ์— ๋Œ€ํ•œ ํ‚ค์›Œ๋“œ ๋ฌธ์ œ๋Š” jsx ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์•ฝ์–ด๋ฅผ ์žฌ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์“ธ๋ชจ์—†๋Š” ๋‹ต๋ณ€์„ ์ œ๊ณตํ•  ๋งŒํผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ถฉ๋ถ„ํžˆ ํฐ ๊ฒฝ์šฐ์—๋งŒ ์ •๋ง ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค... "angular -angularjs -angular1.x" ๋“ฑ์„ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋„์ž…๋œ ๊ณ ํ†ต angular 2+์™€ ๊ฐ™์ด

๊ทธ ์™ธ์—๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!!!

@gaearon

๋‹น์‹ ์€ ๋งํ–ˆ๋‹ค

"์ผ๋ถ€ ์ด์ „ ๋ธŒ๋ผ์šฐ์ €์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์‚ญ์ œํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค."

๋‹ค์Œ polyfill ๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ผ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ๋“œ๋กญ ํ˜ธํ™˜์„ฑ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•”ํ‘๊ธฐ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด ๋‚ด ๊ฑฑ์ •๊ฑฐ๋ฆฌ์˜€๋‹ค.

ํ”„๋กœ์„ธ์Šค์— ๊ด€ํ•ด์„œ. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ '๋ฌธ์ œ'๊ฐ€ RFC ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„ค๊ณ„๋œ ๋ชฉ์ ์ด ์•„๋‹™๋‹ˆ๊นŒ?

๋‹ค์Œ polyfill ๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ผ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ๋“œ๋กญ ํ˜ธํ™˜์„ฑ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•”ํ‘๊ธฐ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด ๋‚ด ๊ฑฑ์ •๊ฑฐ๋ฆฌ์˜€๋‹ค.

IE10 ๋ฐ ์ด์ „ ๋ฒ„์ „์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํŠนํžˆ IE11์„ ๊ณ„์† ์ง€์›ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์˜ ์•ฝ 3%๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋„ˆ๋ฌด ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” 1% ์ปท์˜คํ”„๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค์— ๊ด€ํ•ด์„œ. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ '๋ฌธ์ œ'๊ฐ€ RFC ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„ค๊ณ„๋œ ๋ชฉ์ ์ด ์•„๋‹™๋‹ˆ๊นŒ?

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

๋„ค, ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@gaearon

ํ•ฉ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” event.currentTarget ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ์š”? ๊ธฐ๋ณธ ๊ฒฝ์šฐ์—๋Š” ํ•ญ์ƒ document ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” React๊ฐ€ ํ•ด๋‹น ์š”์†Œ๋กœ ์ „ํ™˜๋˜๋ฉด React ๋ฃจํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

React๋Š” ๋‹จ์ˆœํžˆ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

(...)

์—ฌ๊ธฐ์„œ ๋‚ด ์š”์ ์€ React๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DOM์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ์ด๊ฒƒ์ด ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ? class / className ์™€ ๊ฐ™์€ ์†์„ฑ์— ์–ด๋–ป๊ฒŒ๋“  ๋ฐ˜์˜๋˜๋Š” ์†์„ฑ๋งŒ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ํ•œ.

class / className ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ํ˜ผ๋ž€์€ React๊ฐ€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Angular ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  React๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. Angular์—์„œ ์†์„ฑ, ์†์„ฑ ๋ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์‚ฌ์ด์˜ ๋ถ„๋ฆฌ๋Š” ๊ตฌ๋ฌธ์—์„œ ์ง์ ‘ ๋ช…ํ™•ํ•˜๊ณ  DOM ์š”์†Œ์˜ props๊ฐ€ React์— ์˜ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ์†์„ฑ ๋˜๋Š” ์†์„ฑ.

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” event.currentTarget๊ณผ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ์š”? ๋„ค์ดํ‹ฐ๋ธŒ์˜ ๊ฒฝ์šฐ ํ•ญ์ƒ ๋ฌธ์„œ๋ฅผ ์˜๋ฏธํ•˜๊ฑฐ๋‚˜ React๊ฐ€ ํ•ด๋‹น ์š”์†Œ๋กœ ์ „ํ™˜๋˜๋ฉด React ๋ฃจํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

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

DOM์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ์ด๊ฒƒ์ด ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด class/className๊ณผ ๊ฐ™์€ ์†์„ฑ์— ์–ด๋–ป๊ฒŒ๋“  ๋ฐ˜์˜๋˜๋Š” ์†์„ฑ๋งŒ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ํ•œ.

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

๋‚˜๋Š” Angular ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ React๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. Angular์—์„œ ์†์„ฑ, ์†์„ฑ ๋ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ฐ„์˜ ๋ถ„๋ฆฌ๋Š” ๊ตฌ๋ฌธ์—์„œ ์ง์ ‘ ๋ช…ํ™•ํ•˜๊ณ  DOM ์š”์†Œ์˜ props๊ฐ€ React์— ์˜ํ•ด ์†์„ฑ์œผ๋กœ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์†์„ฑ.

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

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

@๋‹ค๋‹ˆ์—˜15
์–ธ๊ธ‰๋œ ์ •์ฑ…(๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)์ด ์—†์œผ๋ฉด ์ถ”๊ฐ€ ๊ฐœ์ฒด ๋ž˜ํผ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ dangerouslySetInnerHTML ๋ฅผ ํ†ตํ•ด ์œ„ํ—˜ํ•œ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๊ฒฝ๊ณ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‚ฌ์šฉ์ž si๊ฐ€ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์˜๋ฏธ๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผ ํ–ˆ๋˜ ์‹œ์ ์ž…๋‹ˆ๋‹ค.
(์•„๋งˆ๋„ ์ •์ œ๋˜์ง€ ์•Š์€) ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด/ํ•จ์ˆ˜๋กœ ๋ž˜ํ•‘ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ž˜ํ•‘๋œ ๊ฐ’์„ ์žฌ๊ณ ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋ฉด ์•„๋งˆ๋„ { __html } ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•˜์ง€ ์•Š๊ณ  [{ _html: { __html }] ๊ฐ€ ํ›จ์”ฌ ๋” ์•ˆ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ˆ์ „์„ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๊ฐ€ ์œ„ํ—˜ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ช‡ ๋ฒˆ์ด๋‚˜ ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ?

๋‹น์‹ ์ด ์ œ๊ณตํ•œ ํ†ต์ฐฐ๋ ฅ์œผ๋กœ ๋‚˜๋Š” ๊ทธ ์ถ”๋ก ์„ ์ดํ•ดํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” " { __html } ๊ฐ€ ์ •ํ™”๋œ html์„ ๋‚˜ํƒ€๋ƒ„" ๊ทœ์น™์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ํŽ˜์ด์Šค๋ถ ์™ธ๋ถ€์˜ ๋ˆ„๊ตฌ์—๊ฒŒ๋„ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ํ•ญ์ƒ ๊ทธ๊ฒƒ์ด API์˜ ๋˜ ๋‹ค๋ฅธ ์žฅ์• ๋ฌผ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ํ• ์• ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ข€ ๋” ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์šฐ๋ฐœ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ง€ ๋ฐ˜์‘์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ทธ๋ ‡๊ฒŒ ๋…๋‹จ์ ์ธ ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋“ฃ๊ณ  ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์— ์˜ค๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์—์„œ React์— ์ ์šฉ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด '์ค‘๋‹จ'์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ๋žŒ๋“ค์€ ๋ถ„๋ช…ํžˆ Angular 2 > 3 > 4๋ฒˆ์„ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

์ด ํ† ๋ก ์„ ๊ณ„์† ์ฃผ์ œ๋กœ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์œ„ํ—˜ํ•œ HTML์„ ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํฅ๋ฏธ๋กญ์ง€๋งŒ ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ๋ž‘ํ•œ๋‹ค

์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ํ™˜์˜๋ฐ›๋Š”๋‹ค๊ณ  ๋Š๋ผ๋„๋ก ๋„์šธ ์ˆ˜ ์žˆ๋Š” ์™„๋ฒฝํ•œ ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์„œ ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

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

@gaearon 2c๋ฅผ ๋˜์ง€์ง€๋งŒ ์ด ๋‘ ๊ฐ€์ง€ ๋ถ€์ •์€ ํ˜„์žฌ ๋ถ€์ •๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ปค ๋ณด์ž…๋‹ˆ๋‹ค(์ผํšŒ์„ฑ ํ•™์Šต ํด๋ž˜์Šค์˜ ์ž‘์€ ๋น„์šฉ => className ๋Œ€ ํ•ญ์ƒ ๊ตฌ์กฐํ™” ๋ฐฉ์ง€ + ์ƒํƒœ๊ณ„ ์ˆ˜์ค€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ).

๋ฐ˜์‘:์‹ฌ์žฅ:

์œ„์˜ @natew ๋ฅผ ๋ฐ˜ํ–ฅ:

@gaearon 2c๋ฅผ ๋˜์ง€์ง€๋งŒ ์ด ๋‘ ๊ฐ€์ง€ ๋ถ€์ •์€ ํ˜„์žฌ ๋ถ€์ •๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ปค ๋ณด์ž…๋‹ˆ๋‹ค(์ผํšŒ์„ฑ ํ•™์Šต ํด๋ž˜์Šค์˜ ์ž‘์€ ๋น„์šฉ => className ๋Œ€ ํ•ญ์ƒ ๊ตฌ์กฐํ™” ๋ฐฉ์ง€ + ์ƒํƒœ๊ณ„ ์ˆ˜์ค€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ).

์–ด์จŒ๋“  className ์—์„œ class ๋กœ ๋ณ€๊ฒฝํ•œ ๋™๊ธฐ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋‚ด๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ๋‘ ๊ฐ€์ง€ ์ฃผ์žฅ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐœ๋…์ ์œผ๋กœ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Name ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ์ž‘์€ ์žฅ์• ๋ฌผ์ž…๋‹ˆ๋‹ค. className ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€ React๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ ์ด ์—†๋Š” ์ž‘์€ ๋‹จ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” 4๊ฐœ์˜ ์บ๋ฆญํ„ฐ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๊ณต๋˜๋Š” ์–ด๋–ค ๋ถ„ํ•ด ๋Œ€์•ˆ๋ณด๋‹ค ์ธ์ง€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ฒซ ๋ฒˆ์งธ React ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”.

function Button({ color, ...rest }) {
  const buttonClass = rest.class +  ' Button-' + color;
  return <button {...rest} class={buttonClass} />
}

๋‚ด ๋ฉ์ฒญํ•œ ๋จธ๋ฆฌ๊ฐ€ ํญ๋ฐœํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
API์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ์‚ฌ๋žŒ๋“ค์€ API๊ฐ€ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ClassName์€ ๊ธฐ๋ณธ ์ œ๊ณต ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ ์€ ํƒ€์ดํ•‘

ํ— 4๊ธ€์ž 8^) . ๊ฒŒ๋‹ค๊ฐ€, ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ className ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์ž์ฃผ class ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋”๋ผ๋„ ์šฐ๋ฆฌ๊ฐ€ ํ•  ๋•Œ ํ›จ์”ฌ ๋” ๋งŽ์€ ํƒ€์ดํ•‘์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” 4๊ฐœ์˜ ๋ฌธ์ž๋ฅผ 12๋ฒˆ ๋” ์ž…๋ ฅํ–ˆ์ง€๋งŒ class ์„ ๋ถ„ํ•ดํ•  ๋•Œ๋งˆ๋‹ค 50๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๋” ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ง€ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋†“์นœ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
๋™๊ธฐ๊ฐ€ DOM ์†์„ฑ/์†์„ฑ ์ค€์ˆ˜์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์šฐ๋ ค์ž…๋‹ˆ๊นŒ?
๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ํ•™๋ฌธ์ ์ธ ์ฃผ์žฅ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ž˜ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์ถœ์‹œ๋˜๋ฉด React๋Š” className์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹  class ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
React๋Š” ํ˜„์žฌ ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ์—ˆ์œผ๋ฉฐ 1๋…„ ํ›„์— ์˜คํ”ˆ ์†Œ์Šค๋กœ ์ œ๊ณต๋œ๋‹ค๋ฉด ๊ทธ ๋‹น์‹œ ๋‹ค๋ฅธ ๊ฒฐ์ •์ด ๋‚ด๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋•Œ๋กœ๋Š” ๋ชจ๋“  ์ฃผ๋ฆ„์„ ๋‹ค๋ฆผ์งˆํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

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

๋งˆ์Œ์ด ๋ฐ”๋€Œ๊ธฐ๋ฅผ dan.church ์— ๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค.

react๋ฅผ ์ง€์†์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. react๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ์„œ vue์— ์ถ”์›”๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ className-> class์˜ ๊ณผ์ •์€ ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์œ„ํ•ด className -> class ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๋ช…ํ™•ํ•œ ๋™๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. className ๋Š” DOM์— ์กด์žฌํ•˜์ง€๋งŒ htmlFor ์™€ ๊ฐ™์ด ์•„๋ฌด๋ฐ๋„ ๋‚˜์˜ค์ง€ ์•Š๋Š” ์˜ˆ์•ฝ๋œ prop ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ๋•Œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋œ ํผ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@sonhanguyen htmlFor๋Š” ๊ณต์‹ ์›น API ์ด๋ฆ„์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/htmlFor

@allan2coder ๋ฐฐ์—ด๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๋Œ€์‹  <React.Fragment> ๋˜๋Š” <> ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

@allan2coder ๋˜ํ•œ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฃผ์ œ๋กœ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์—ฌ ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜์กด์„ฑ์„ ํŒจ์น˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ํŒจํ‚ค์ง€์ธ patch-package ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ง€์›๋˜์ง€ ์•Š๋Š” React API ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๊ธฐ ์œ„ํ•ด). ํ™•์‹คํžˆ ์ด๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ณด๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ๋” ์œ ์šฉํ•˜์ง€๋งŒ @philipwhiuk ์˜ ์šฐ๋ ค ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์–ด์š”.

  • onChange์—์„œ onInput์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ  ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ํด๋ฆฌํ•„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์œ„ ๋‹จ์–ด์˜ ๊ฒฝ์šฐ onChange ์ด๋ฒคํŠธ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฒคํŠธ์— ๊ฐ€๊น๊ฒŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์•ž์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@๋ฌด์œค์œค

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

ํ˜„์žฌ onChange๋Š” ์ž…๋ ฅ + ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฏธ DOM์— ์กด์žฌํ•˜๊ณ  ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ „ํ˜€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค: https://developer.mozilla.org/en-US/docs/Web/Events/change

@jxub

์•ฝ๊ฐ„ ์˜คํ”„ํƒ‘์ด์ง€๋งŒ (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ) ์•„๋ฌด๋„ HTML ์†์„ฑ์„ ๋งคํ•‘ํ•˜๋Š” ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์œผ๋กœ React๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด html/css/svg -> jsx ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋งŒ๋“ค ์ƒ๊ฐ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ์†Œํ’ˆ. ๋Œ€๋ถ€๋ถ„ ์ฐพ๊ธฐ ๋ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.:(

๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋ฅด์ง€๋งŒ IntelliJ IDEA(๋ฐ WebStorm, PhpStorm ๋“ฑ)๋Š” HTML ์ฝ”๋“œ๋ฅผ JS์— ๋ถ™์—ฌ๋„ฃ์„ ๋•Œ ์ด ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„ ์˜คํ”„ํƒ‘์ด์ง€๋งŒ (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ) ์•„๋ฌด๋„ HTML ์†์„ฑ์„ ๋งคํ•‘ํ•˜๋Š” ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์œผ๋กœ React๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด html/css/svg -> jsx ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋งŒ๋“ค ์ƒ๊ฐ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ์†Œํ’ˆ. ๋Œ€๋ถ€๋ถ„ ์ฐพ๊ธฐ ๋ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.:(

์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€๋งŒ ๊ฝค ์˜ค๋ž˜๋˜์—ˆ๊ณ  ์™„์ „ํžˆ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. https://magic.reactjs.net/htmltojsx.htm

์šฐ๋ฆฌ๋Š” ๊ทธ ๋…ธ๋ ฅ์„ ๋˜์‚ด๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•˜๋ฉด https://github.com/reactjs/reactjs.org/issues/484๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ง€๊ธˆ๊นŒ์ง€ ์•„๋ฌด๋„ ๋„์™€์ฃผ๊ฒ ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€๋งŒ ๊ฝค ์˜ค๋ž˜๋˜์—ˆ๊ณ  ์™„์ „ํžˆ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. https://magic.reactjs.net/htmltojsx.htm

์ €๋Š” ์ด๊ฒƒ์„ ์ „์—๋„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. HTML/CSS๋Š” ์•Œ์ง€๋งŒ JavaScript๋Š” ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์•„์›ƒ์†Œ์‹ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

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

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋Š” ๋‹จ๋ฐฉํ–ฅ(๋ฐ˜์‘์œผ๋กœ๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜)์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ฌธ์ œ๋Š” React์—๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ผ์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค...

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋Š” ๋‹จ๋ฐฉํ–ฅ(๋ฐ˜์‘ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋งŒ)์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ฌธ์ œ๋Š” React์—๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์™œ์š”? ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ReactDOMServer.renderToString ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค๋ฅผ ์ฐธ์„์„ฑ ์žˆ๊ฒŒ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@gaearon

์™œ์š”? ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ReactDOMServer.renderToString์„ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋„ค, ๋ฌธ๋งฅ์ƒ ๋…ผ์˜๋œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. html/css๋ฅผ ์ž‘์„ฑํ•˜๊ณ  JavaScript๋ฅผ ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋งˆํฌ์—…/์Šคํƒ€์ผ/๋ ˆ์ด์•„์›ƒ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก JS ์ฝ”๋“œ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‹น์žฅ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ html/css๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  htmltojsx๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด์ œ React์—์„œ ๋ชจ๋“  ๋งˆํฌ์—…/์Šคํƒ€์ผ/๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์„ ์ง์ ‘ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

react-sketchapp๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ผ๋ฐ˜ html/css๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด - ์ผ๋ถ€ ํ˜•ํƒœ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์š”์†Œ์— ๋ฐ˜์‘ ID๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ReactDOM ์ฝ”์–ด์˜ ๋ฒ”์œ„์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋งŒ ํ™•์‹คํžˆ ๊ทธ ์˜์—ญ์— ์žˆ๊ณ  ํฅ๋ฏธ๋กœ์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋†’์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ์ฃผ๋กœ htmltojsx๊ฐ€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ปจํ…์ŠคํŠธ ์™ธ๋ถ€์—์„œ๋„ ์šฐ๋ฆฌ ์ค‘ ์ผ๋ถ€์—๊ฒŒ ์œ ์šฉํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. :)

html/css๋ฅผ ์ž‘์„ฑํ•˜๊ณ  JavaScript๋ฅผ ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์ด JS ์ฝ”๋“œ์—์„œ ์ž‘์—…ํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋งˆํฌ์—…/์Šคํƒ€์ผ/๋ ˆ์ด์•„์›ƒ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์–ผ๋งˆ๋‚˜ ํฐ ๋ฌธ์ œ์ด๋ฉฐ, ๊ทธ๋“ค์—๊ฒŒ ์•ฝ๊ฐ„์˜ JSX๋ฅผ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ๊นŒ์š”? ์–ด์จŒ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ React์— ์ •ํ†ตํ•œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ฃ„์†กํ•˜์ง€๋งŒ ์š”์ฆ˜์—๋Š” HTML/CSS๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

( @gaearon ์œ„์˜ ์ด๋ฏธ ์•ฝ๊ฐ„์˜ OT ๋Œ“๊ธ€์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด๋ฏ€๋กœ ์‹œ๋„๋Ÿฝ๋‹ค๋ฉด ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์€ ์–ผ๋งˆ๋‚˜ ํฐ ๋ฌธ์ œ์ด๋ฉฐ, ๊ทธ๋“ค์—๊ฒŒ ์•ฝ๊ฐ„์˜ JSX๋ฅผ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ๊นŒ์š”? ์–ด์จŒ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ React์— ์ •ํ†ตํ•œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ํ˜„์žฌ React ์Šคํƒ์— ์ต์ˆ™ํ•œ ๊ณ„์•ฝ์ž์™€๋งŒ ์ž‘์—…ํ•˜์‹ญ์‹œ์˜ค. styled-components๋ฅผ ๋ฐฐ์šธ ์‚ฌ๋žŒ๋“ค์„ ์ฐพ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • Node(npm), ์Šคํƒ(React, webpack ๋“ฑ) ๋ฐ ์ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ UI ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ ๊ฐ๊ฐ์— ์„ค์น˜ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋“ค์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ JavaScript๋ฅผ ๊ฐ€๋ฅด์น˜๊ณ  devtools, ์ฝ˜์†” ์˜ค๋ฅ˜ ๋“ฑ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค.
  • React, ๊ตฌ๋ฌธ์ด ๋ฌด์—‡์ธ์ง€, className , key ์˜๋ฏธ ๋“ฑ์„ ๊ฐ€๋ฅด์ณ์ฃผ์„ธ์š”.
  • HTML/CSS๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๊ทธ๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณ„์•ฝ์ž ๋ฐ ํ”„๋ฆฌ๋žœ์„œ์™€๋งŒ ์ž‘์—…ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌผ๊ฑด์„ ๋” ๋น„์‹ธ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด์ œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ react-skeptchapp๊ณผ ๊ฐ™์€ ๊ฒƒ์€ UI ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ๋ฌป๋Š” ์ด์œ ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค (๋‚˜๋Š” ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค). ์–ด์จŒ๋“  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ReactDOM์˜ ํ•ต์‹ฌ์˜ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๋ฒ”์œ„๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค :-) ํŠธ์œ„ํ„ฐ๋‚˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ด ํ† ๋ก ์„ ๊ณ„์†ํ•ฉ์‹œ๋‹ค.

"๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ํ–‰๋™์€ ๋„๊ตฌ๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ํ–‰๋™์ž…๋‹ˆ๋‹ค"
~ ๊ฒŒ๋ฆฌ ๋ฒˆํ•˜ํŠธ

React๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์€ ๋Œ€๋ถ€๋ถ„์ด React API์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๊ณ  ์ขŒ์ ˆํ•˜๋Š” ์ด์™€ ๊ฐ™์€ ํ† ๋ก ์„ ์ดˆ๋ž˜ํ•˜๋Š” ๋งŽ์€ ํ•จ์ •์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. class ์™€ ๊ฐ™์€ ์˜ˆ์•ฝ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด javascript, html ๋˜๋Š” react ์ž์ฒด ๋•Œ๋ฌธ์— ๋‚˜์œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

<div {...this.props} />

๊ทธ๋ž˜์„œ ๋‚˜๋Š” Dan์ด ์šฐ๋ฆฌ๊ฐ€ ์ด ๋”์ฐํ•œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋“  ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๊ณ„์† ํผ๋œจ๋ฆด ๊ฒƒ์„ ์ œ์•ˆํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ƒ๋‹นํžˆ ์‹ค๋งํ–ˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

<Child {...props} />

const Child = (props) => <div {...props} />

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

์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜์‘์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด ์ž˜๋ชป๋œ ๊ฒฐ์ •์„ ๋‘ ๋ฐฐ๋กœ ์ค„์ด๋Š” ๋Œ€์‹  ์ด๋Ÿฌํ•œ ๋‚˜์œ ํŒจํ„ด์ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋ฏธ์น˜๋Š” ํ”ผํ•ด๋ฅผ ๊ทธ ๋’ค์— ์žˆ๋Š” ๋””์ž์ด๋„ˆ๊ฐ€ ๊นจ๋‹ฌ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

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

@gaearon ์˜ค๋žœ๋งŒ ! :) (ps. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค tl;dr ์•ž์œผ๋กœ)

์–ด์จŒ๋“ , ์ €๋Š” ์ œ ์ž์‹ ์˜ ๋ชจํ—˜์—์„œ ๋ฐฐ์šด ๊ฒƒ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ/๊ธฐ๋Šฅ์— ์ค‘์š”ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉํ•˜๋Š” ๋‚˜๋งŒ์˜ "์ตœ์†Œํ•œ์˜" React ํŒŒ์ƒ๋ฌผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ทธ์ € ์žฌ๋ฏธ์žˆ๋Š” ์‹คํ—˜์ด์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋งŽ์€ ์ด์ ์„ ํฌํ•จํ•˜์—ฌ ์ดˆ๊ธฐ ๋ Œ๋”๋ง/์—…๋ฐ์ดํŠธ/์‚ญ์ œ์— ๋Œ€ํ•œ ์‹ค์ œ ์‚ฌ๋ก€์—์„œ +300% ์ด์ƒ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ’€๋ง๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IIRC์˜ ๋งŽ์€ ๋ถ€๋ถ„์€ ๋ชจ๋“  React-props ๋กœ์ง์„ ์šฐํšŒํ•˜๊ณ  ๋‹จ์ˆœํžˆ ์†์„ฑ์„ setAttribute์— ์ง์ ‘, ์Šคํƒ€์ผ์„ style.setProperty์— ์ง์ ‘, ๋ฆฌ์Šค๋„ˆ๋ฅผ addEventListener์— ์ง์ ‘ ๊ณต๊ธ‰ํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ์‹์œผ๋กœ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ DOM ์š”์†Œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” `{attributes: {}, style: {}, listeners: {}, className: "", ...}์™€ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋” ์žฅํ™ฉํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด์ œ ์ž‘๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹น์‹ ์—๊ฒŒ ๋„ˆ๋ฌด ๊ทน๋‹จ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ €์—๊ฒŒ ์•„์ฃผ ์ž˜ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

๋Œ€๋ถ€๋ถ„ ๋‹น์‹ ์„ ์œ„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํฐ ํŠน์ง•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒ”์šฉ์œผ๋กœ ์ตœ์†Œํ•œ์˜ "๊ธฐ๋ณธ DOM ์š”์†Œ"๋งŒ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ/์ƒํ™ฉ์ด ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งค์šฐ ์ €๋ ดํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  "ํ•ดํ‚น"์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ž์‹ ์˜ ์ €์ˆ˜์ค€ ํŠน์ • ๋™์ž‘์„ ์‚ฌ์†Œํ•˜๊ฒŒ ํ™•์žฅ/๊ต์ฒดํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. -์ง€ํ–ฅ์„ฑ, ํŠน๋ณ„ํ•œ ์Šคํƒ€์ผ ์ฒ˜๋ฆฌ ๋“ฑ ). ์ด๊ฒƒ์€ ๋˜ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํฌ๊ด„ํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ํ•„์š” ์—†์ด DOM ์š”์†Œ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ƒ๋‹นํžˆ ๋…๋‹จ์ ์ผ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์—ฌํ•˜ํŠผ, ์•„๋งˆ๋„ ๋Œ€๋ถ€๋ถ„์€ ๊ทธ์ € ๋– ๋Œ์•„๋‹ค๋‹ˆ๋Š” ๊ฒƒ์ด๊ณ  ๋‚˜๋Š” ์•„๋งˆ๋„ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋…์„ ์ž˜ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ”๋˜ ๋ˆ„๊ตฐ๊ฐ€๋กœ๋ถ€ํ„ฐ ๋‹น์‹ ์„ ์œ„ํ•œ ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด "๋‹จ์ˆœํ•จ"์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์€ ์•„๋งˆ๋„ ๋‹น์‹ ๊ณผ ๊ด€๋ จ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ? :)

๋˜ํ•œ ๋‚ด๊ฐ€ ์žŠ๊ธฐ ์ „์— ๋‚ด objectKeyValueReconcile ํ•จ์ˆ˜์— ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ React์™€ ์œ ์‚ฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ prev/next props๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ ๋งค์šฐ ๋น ๋ฅด๋„๋ก ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ €์—๊ฒŒ ์ƒ๋‹นํ•œ ์‹ค์ œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/syranide/surgical/blob/master/packages/surgical/private/objectKeyValueReconcile.js

imho ๋‚˜๋Š” "ํด๋ž˜์Šค"์•„์ด๋””์–ด๋ฅผ ๋–จ์–ด ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. JSX๋Š” ๊ฒฐ๊ตญ ์ฃฝ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์†Œ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ DOM/์ฐฝ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ง€์›์„ React DOM์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ƒ๊ฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ•ฉ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„ ์ด๋ฒคํŠธ ์ˆ˜์ง‘/์—…๋ฐ์ดํŠธ/์ผ๊ด„ ์ฒ˜๋ฆฌ์˜ ์ผ๋ถ€ ํ˜•ํƒœ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ๋ˆ„๋ฅด๊ธฐ, ํฌ๊ธฐ ์กฐ์ • ๋ฐ ์ฐฝ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐ๋‚˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์ด์ง€๋งŒ https://developer.mozilla.org/en-US/docs/Web/Events ์— ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜/๋ชจ๋“  ๋ชฉ๋ก์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋™์ผํ•œ ์ถ”์ƒํ™” ๋’ค์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ณต๊ฐœ ๋ฌธ์ œ #285 ๐Ÿ˜„์—์„œ๋„ ๋…ผ์˜๋ฉ๋‹ˆ๋‹ค.

@gaearon

className -> class ์˜ ์‹ค์ œ ํšจ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

({ className }) => <div className={className} />

๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

({ ...rest }) => <div class={rest.class} />

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

@kans

์•„๋‹ˆ๋ฉด ์ด๊ฑฐ:

props => <div class={props.class} />

์›๋ž˜ ๊ธฐ๋Šฅ๊ณผ ๋น„์Šทํ•œ ๋ณต์žก์„ฑ์ž…๋‹ˆ๋‹ค.

class๋Š” js์˜ ํ‚ค์›Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— className์ด ๋งˆ์Œ์— ๋“ค์—ˆ์ง€๋งŒ ์–ด๋Š ์ชฝ์ด๋“  ๊ทธ๋ ‡๊ฒŒ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธ€๋ž˜๋จธ๋Ÿฌ์Šคํ•œ ์Šคํƒ€์ผ๋ง์„ ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์€ ์•„๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋งˆ๋„ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ className์„ ์ˆ˜์‹ญ ๋ฒˆ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค?? ๊ฑฐ์˜ ์—†๋‹ค.

class ์— ์ฐฌ์„ฑํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ƒ๊ฐ์€ ์‹ค์ œ๋กœ className์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด css๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ class ์˜ html/css ๋ชจ๋ธ์„ ๊ธฐ๋Œ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด prop์˜ ์••๋„์ ์ธ ์ฃผ์š” ๋ชฉ์ ์€ ์‹ค์ œ๋กœ css ์ฝ”๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด html/css ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํด๋ž˜์Šค๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋””์ž์ธ ์‹œ์Šคํ…œ ์ฝ”๋“œ ์™ธ๋ถ€์˜ IMO, ์ •๋ง ๊ด€์šฉ์ ์ธ React ๊ฐœ๋ฐœ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด์จŒ๋“  className ๋˜๋Š” class๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CSS์šฉ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ ๋ช‡ ๊ฐ€์ง€ ์ž‘์€ UI ๊ตฌ์„ฑ ์š”์†Œ์— ๊ฒฉ๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ๋” ๋†’์€ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค(์˜ˆ: <Columns verticalAlign="center"> ๋˜๋Š” <BodyText /> ).

๊ทธ๋ž˜์„œ className ์—์„œ class ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ฉด ์–ด์จŒ๋“  prop์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋” ์‰ฝ๊ฒŒ (React ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜๊ณ  ์ปจํ…์ŠคํŠธ๋ฅผ ์ „ํ™˜ํ•˜๊ณ  ํ™”๋ฅผ ๋‚ด์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ), ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฌถ์Œ ํฌ๊ธฐ๋ฅผ ์ค„์ด์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ํฌ๊ณ  ์ค‘์š”ํ•œ ์—…๋ฐ์ดํŠธ์ด๋ฏ€๋กœ React ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ด๋ฆ„๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์˜ˆ๋ฅผ ๋“ค์–ด shouldComponentUpdate => shouldUpdate ๋“ฑ. ์ด ์ด๋ฆ„์€ ์–ด๋ฆฌ์„์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@AlexGalays

์ด๊ฒƒ์€ ํฌ๊ณ  ์ค‘์š”ํ•œ ์—…๋ฐ์ดํŠธ์ด๋ฏ€๋กœ React ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ด๋ฆ„๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ฆ‰ shouldComponentUpdate => shouldUpdate ๋“ฑ. ์ด ๋ช…๋ช…์€ ์–ด๋ฆฌ์„์€ ์ผ์„ ๋„˜์–ด์„  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” React ์ฝ”์–ด์˜ ์ผ๋ถ€์ด๋ฉฐ ์ด ๋ฌธ์ œ๋Š” ์ „์ ์œผ๋กœ react-dom์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ljharb
์ •๋ง์ด์ง€!

@sompylasar
์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ข‹์€ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(๋ง์žฅ๋‚œ ์˜๋„, reasonReact๊ฐ€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค :)). ์šฐ๋ฆฌ๋Š” ํŒจํ‚ค์ง€ ์ด๋ฆ„์œผ๋กœ ๋ชจ๋“  ๋ชจ๋“ˆ์— ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ด์ง€ ์•Š๊ณ  ์ž˜ ์ฐพ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , react-core๋Š” ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋Š” ๊ทธ๋งŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

ํ† ๋ก ์˜ ์ผ๋ถ€๋ฅผ ํฌ๋Ÿผ(https://discuss.reactjs.org)์—์„œ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ์˜ฎ๊ธธ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. GitHub ๋ฌธ์ œ๋Š” ํฌ๋Ÿผ ๊ฒŒ์‹œ๋ฌผ์ฒ˜๋Ÿผ ์Šค๋ ˆ๋“œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋ฌธ์ œ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ๋…ผ์˜ํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค.

className -> class ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฅ๋ฏธ๋กญ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค ๐Ÿ˜บ

2019๋…„ React ํ”„๋กœ์ ํŠธ ๋ณด๊ธฐ

const {
  class: className, // YouKnowIamRight PepeHands
  someFancyProp,
  ...restProps
} = props

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ™•์‹คํžˆ ์˜ค๋Š” ๊ฒƒ์„ ๋ณธ๋‹ค.

HTML์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ  className ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ์ •๋ง ์ข‹์•„ํ•˜์ง€๋งŒ ๋™์‹œ์— class ์˜ˆ์•ฝ ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ €๋Š” className์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ํ•œ className ๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค(๊ฐœ์ธ ์ทจํ–ฅ์ด ์•„๋‹˜).

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‚˜์˜ ์‹ค์šฉ์ ์ธ ์ƒ๊ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

className ๋ฅผ React ๊ตฌ์„ฑ ์š”์†Œ(๋‹จ์ˆœํ•œ DOM ์š”์†Œ๊ฐ€ ์•„๋‹˜)์— ์ „๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ƒˆ๋กœ์šด ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์•„์ฃผ ์ž‘์€ ๋นŒ๋”ฉ ๋ธ”๋ก์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์˜ ์ผ๋ถ€๋ฅผ ๋…ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ(์˜ˆ: <Button /> ๊ตฌ์„ฑ์š”์†Œ) ์—์„œ๋Š” @gaearon ์˜ ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ฅด๊ณ  props์˜ "๋‚˜๋จธ์ง€"๋„ DOM ์š”์†Œ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€ ๋งˆ์ฐฐ๋กœ ์ธํ•ด ์ž‘์—…์„ ํ”ผํ•˜๊ณ  ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ์ฐพ๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฒธ์†ํ•œ ๊ฒฝํ—˜์—์„œ, ๋‚˜๋Š” className ๋ฐ›๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“  ๊ฒƒ์„ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์ด JSX์— ๋ถ™์—ฌ๋„ฃ๊ธฐ HTML์„ ๋ณต์‚ฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค( class ๋ฅผ className ๋กœ ๋Œ€์ฒด).

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

@philipwhiuk ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์†Œํ’ˆ๋งŒ ํผ๋œจ๋ฆฌ๋ฉด ํ–‰๋™ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@j-f1

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์†Œํ’ˆ๋งŒ ํผ๋œจ๋ฆฌ๋ฉด ํ–‰๋™ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

Btw, class ์˜ ๊ฐ’์„ ๋ถ„ํ•ดํ•˜์ง€๋งŒ ๊ทธ ์„ธ๋ถ€ ์‚ฌํ•ญ์—์„œ ์ž˜๋ฆฌ์ง€ ์•Š๋Š” ์ž„์˜์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ๋ถ„๋“ค์ด (๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค) ์ถ”๊ฐ€ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ํ”ผํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ์ด์œ  ์—†์ด ์  ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  props ๋ฐ state ์—์„œ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ’์„ ๋ถ„ํ•ดํ•ฉ๋‹ˆ๋‹ค.

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

์ข€ ๋” ์‹ค์šฉ์ ์ด๋ผ๋ฉด ๊ฐœ์ธ์ ์ธ ์„ ํ˜ธ๋„ ๋Œ€์‹  ๊ธฐ์ˆ ์  ์˜๋ฏธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์ง€๋งŒ className ์˜ ๊ธฐ์ˆ ์  ์˜๋ฏธ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ์€ ํ•ต์‹ฌ ๊ธฐ์—ฌ์ž๊ฐ€ ๊ฐœ์ธ ์ทจํ–ฅ์˜ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถ”๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์˜ ์‹œ๊ฐ„, ๋…ธ๋ ฅ ๋ฐ ๋ˆ(ํšŒ์‚ฌ์—์„œ)์€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์šฐ๋ฆฌ์˜ ๊ด€์‹ฌ์„ ์ง‘์ค‘ํ•  ๋” ๋‚˜์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  Core ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์— ํ•œ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. React์˜ ๋‹ค์Œ์œผ๋กœ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ, ๋‚˜์˜ ์‹ค์šฉ์ ์ธ ์˜๊ฒฌ.

ํด๋ฆฌํ•„์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด, ๋ฐ˜์‘์ด ์‚ฌ์šฉ์ž๊ฐ€ "์ข‹์€" ํด๋ฆฌํ•„์„ ์ง€์ •ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฐ์ง€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
(์˜ˆ: ์ฝ”๋“œ์—์„œ hasBadMapPolyfill )
React๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ”„๋กœ์ ํŠธ์—์„œ ์ €์ง€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฌด์ž‘์œ„ ์‹ค์ˆ˜์— ๋Œ€ํ•ด ์ฑ…์ž„์„ ์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@AlexGalays React๋Š” ์˜ฌ๋ฐ”๋ฅธ ์˜๋ฏธ ์ฒด๊ณ„๋กœ Map ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋น„์ค€์ˆ˜ ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์•ฑ์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐฉ์‹์œผ๋กœ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐœ๋ฐœ ๋นŒ๋“œ์—์„œ๋งŒ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ํ”„๋กœ๋•์…˜์—์„œ ์ด์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ด React Fire๋ฅผ ์ข‹์•„ํ•˜๊ณ  ReactDOM์„ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ๋” ํฅ๋ฏธ๋กœ์šด ๋‹จ๊ณ„์ธ ๊ฒƒ ๊ฐ™์•„์„œ ๊ณ„์† ์ž‘์—…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ ๋ฐœ์‚ฌ๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฆฌ๋ฐ”์ธ๋“œํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

class Compo exntends Compoent {
 onClick() {
   ...
 }
  render() {
   <button onClick={this.onClick} >click me </button>
  }
}

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

@cullophid

๋ฐ˜์‘ ๋ฐœ์‚ฌ๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฆฌ๋ฐ”์ธ๋“œํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

class Compo extends Compoent {
 onClick = () => {
   ...
 }
 render() {
   <button onClick={this.onClick}>click me</button>
 }
}

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์ (๋ชจ๋“  ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ํ’€๋ง ์—†์ด ์›์‹œ DOM ์ด๋ฒคํŠธ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :))์€ ์ •์ ์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์€ ๊ณ„ํš์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! IE 11 ์ง€์›์ด ์žˆ์œผ๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์™„์ „ํžˆ ๊ดœ์ฐฎ์€ ์ž์ฒด ํด๋ฆฌํ•„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋”๋ผ๋„). ์ •๋ถ€ ๊ณ ๊ฐ๊ณผ ํ•จ๊ป˜ ์ผํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ IE 11 ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•  ์‹œ๊ธฐ๋Š” ์™„์ „ํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@MatthewHerbst ๊ฐ™์€ ๋ณดํŠธ, ์šฐ๋ฆฌ ๊ณ ๊ฐ์€ IE 11์„ ์‚ฌ์šฉํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ข

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ํฅ๋ฏธ๋กญ๋‹ค๋Š” ๋ง์„ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ์€ ํ•œ ๊ฐ€์ง€ ๊ฑฑ์ •์Šค๋Ÿฌ์šด ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๋ธŒ๋ผ์šฐ์ €์˜ ์ฐจ์ด์  ์ค‘ ์ผ๋ถ€๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์–ด์จŒ๋“  ์ข‹์€ ๋„์„œ๊ด€์— ํ•ญ์ƒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@kentcdodds ๋Š” ๋‚ด๊ฐ€ ์ „๋žต ์„ ์ฝ๊ณ  ์žˆ๋˜ ๊ฐ€๋Šฅํ•œ ์•„์ด๋””์–ด๋กœ JSX 2.0 ํ†ตํ•ฉ์„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์ด์™€ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‹จ์ง€ ๊ณต์ค‘์— ๋–  ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ๋ณด๋ฅ˜๋  ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

IE๊ฐ€ ์ฃฝ๊ฒŒํ•˜์‹ญ์‹œ์˜ค! ์™„์ „ํžˆ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ œํ•œ์ ์ธ ํšŒ์‚ฌ๋ผ๋„ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์™€ ์›น์ด ์ง€์›์„ ์ค‘๋‹จํ•  ๋•Œ๊นŒ์ง€ ํ†ต๊ณ„์— IE11์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@hbroer ๋ ˆ๊ฑฐ์‹œ ์†Œํ”„ํŠธ์›จ์–ด?

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

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

๋‚˜๋Š” ๊ณผ๊ฑฐ๋ฅผ ์œ„ํ•ด ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์˜ ์ด์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋”์˜ 90%๊ฐ€ ์—ฌ์ „ํžˆ ์ง€๋‚œ ์„ธ๊ธฐ์— ์‚ด๊ณ  ์žˆ๋Š” ํ•˜์œ„ 15% ์†Œ๋น„์ž์˜ ํ˜•ํŽธ์—†๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ^^ ์•ž์œผ๋กœ 10๋…„ ๋™์•ˆ "์•„ ์ด ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ 6 ๋ฉ์ฒญ์ด๊ฐ€ ๋ญ์•ผ, ์šฐ๋ฆฌ๋Š” ๊ทธ 15%๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค"๋ผ๋Š” ๋ง์„ ๋‹ค์‹œ ๋“ฃ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

btw M$ ์†”๊ธฐ๋Š” Windows 7 ๋ฐ 8์šฉ Edge๋ฅผ ์›นํ‚ท์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

@hbroer ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๊ณต๊ฐ์„ ๊ฐ€์ง€์„ธ์š”.

(๋”ฐ๋กœ, M$ ๋Š” ์•„์ฃผ ์–ด๋ฆฌ๊ณ  ๋งค์šฐ ์˜ค๋ž˜๋œ 90๋…„๋Œ€ ํ›„๋ฐ˜ ์ฐธ์กฐ์ด๋ฏ€๋กœ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•  ๊ฒฝ์šฐ ์ œ์ณ๋‘๊ณ  ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

์—ฌ๊ธฐ ๋งŽ์€ M$ ํŒฌ ๋ณด์ด์ฆˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :DI๋Š” ์ •๋ง๋กœ ์ธ๊ฐ„์— ๊ด€์‹ฌ์ด ์žˆ์ง€๋งŒ ๊ธฐ์ˆ  ๋ฐœ์ „์„ ๋ฐฉํ•ดํ•˜๋Š” ์กฐ์ง์ด๋‚˜ ์˜ค๋žœ ์„ธ์›”์— ๊ฑธ์ณ ๊ทธ ์˜ค๋ž˜๋œ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋”์—๋Š” ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ "์˜ค๋ž˜๋œ ์“ฐ๋ ˆ๊ธฐ์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅ"ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ถ”๊ฐ€ ํŒจํ‚ค์ง€์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 2019๋…„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” <=2013 ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ >=2019 ๊ธฐ์ˆ ์„ ์—ผ๋‘์— ๋‘๊ณ  ์ฝ”๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌํŒŒ๋ฆฌ์™€ (์˜ค๋ž˜๋œ) ์—์ง€ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค.

๋งˆ์ดํฌ

@hbroer ์‚ฌ์‹ค ๊ณ ๋Œ€ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ธŒ๋ผ์šฐ์ €์™€ ๊ณ ๋Œ€ ์‚ฌํŒŒ๋ฆฌ๋Š” ์–ด๋–ค ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ๋ธŒ๋ผ์šฐ์ €๋ณด๋‹ค ๋” ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ "fanboi"๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ „๋ฌธ์ ์ด ๋˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ "M$"๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋‹ˆ์š”. ์˜ค๋ž˜๋œ ๊ธฐ์ˆ ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค ์‹์œผ๋กœ๋“  "๋‚˜์œ" ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋„๋•์ ์ด๊ณ  ์œค๋ฆฌ์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค. ๋‚˜์œ ์ ์€ Netscape Navigator, IE 6, ์ตœ์‹  Chrome ๋“ฑ "X์—์„œ ๊ฐ€์žฅ ์ž˜ ์ž‘๋™ํ•˜๋Š”" ์›น์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋งŽ์€ M$ ํŒฌ ๋ณด์ด์ฆˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@hbroer ์—ฌ๊ธฐ์—์„œ ์ „๋ฉด ๊ด‘๊ณ  ์ธ์‹ ๊ณต๊ฒฉ์„ ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ด…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ 2019๋…„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” <=2013 ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ >=2019 ๊ธฐ์ˆ ์„ ์—ผ๋‘์— ๋‘๊ณ  ์ฝ”๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ, ๊ทธ๋Ÿฌ๋ฉด ์•ˆ ๋œ๋‹ค.

1์ดˆ ์ •๋„ ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋ธŒ๋ผ์šฐ์ € ๋ชฉ๋ก ๊ธฐ๋ณธ๊ฐ’์„ ์‚ดํŽด๋ณธ๋‹ค๋ฉด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹ ์—, ๋‹น์‹ ์€ ์ธ์‹ ๊ณต๊ฒฉ๊ณผ ํ•™๊ต ์‹๋‹น ์ˆ˜์ค€์˜ ๋ชจ์š•์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

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

browsers

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

ps. ๋น„๊ผฌ๋Š”๊ฑฐ ๋ชป์ฝ๊ณ  ์›ƒ๋Š”๊ฑฐ ์‹ ๊ฒฝ์•ˆ์“ฐ๋Š” ์‚ฌ๋žŒ์ด ๋ณด์ด๋„ค์š”^^

@hbroer ๋‹น์‹ ์€ IE11์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ฝ”๋”ฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๋‹ค์‹œ ํ•œ ๋ฒˆ. https://browserl.ist ์—์„œ ๊ธฐ๋ณธ๊ฐ’ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ps. ๋น„๊ผฌ๋Š”๊ฑฐ ๋ชป์ฝ๊ณ  ์›ƒ๋Š”๊ฑฐ ์‹ ๊ฒฝ์•ˆ์“ฐ๋Š” ์‚ฌ๋žŒ์ด ๋ณด์ด๋„ค์š”^^

์˜ˆ, ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠธ๋กค๊ณผ ๋†€์ดํ„ฐ์—์„œ ๊ดด๋กญํžˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ „์ˆ ์ž…๋‹ˆ๋‹ค. "๋ญ๋ผ๊ณ ?! ์š•ํ•œ๊ฒŒ ์•„๋‹ˆ์•ผ! ๋†๋‹ด์ด์—ˆ์–ด!"

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

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

์ด์ œ 2019๋…„์— ์ƒˆ ํ”„๋กœ์ ํŠธ์— CSS ๊ทธ๋ฆฌ๋“œ(IE11์—์„œ๋งŒ ์‹คํ—˜์  ์ง€์›์ด ์žˆ์Œ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ES6์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IE11 ์‚ฌ์šฉ์ž๋Š” ๋‹จ์ˆœํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

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

๋‚˜๋Š” ๊ตฌ์‹์ด ์•„๋‹Œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ฃผ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Windows 7(2020๋…„ 1์›” ๋ง ์ง€์›) ๋•Œ๋ฌธ์— IE11 ์“ฐ๋ ˆ๊ธฐ๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ์ ์€ edge๋ฅผ ์ง€์›ํ•˜๊ณ  ํ˜„๋Œ€์ธ์€ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ^^

ํด๋ฆฌํ•„์ด๋‚˜ ํ˜ธํ™˜์„ฑ ํŒจํ‚ค์ง€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์‚ฌ๋žŒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ต์‹ฌ์€ ์ตœ์‹  ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฉฐ ์˜ค๋ž˜๋œ M$ ๊ธฐ์ˆ  ๋ธŒ๋ผ์šฐ์ €์˜ ํ•œ ๋ถ€๋ถ„ ๋•Œ๋ฌธ์— ๋’ค์ณ์ ธ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ LTS์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ตœ์‹  ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค๋ฉด ์ตœ์‹  ๊ธฐ์ˆ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€์˜ ์•ˆ์ •์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์ด ํ•„์š”ํ•œ b2b์šฉ ์›น์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ LTS ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋…น์•„์›ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์€ Windows XP์™€ IE6์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์†Œ์ˆ˜์˜ 100t๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค^^

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

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

React Fire ์ž์ฒด์˜ ์ง„ํ–‰ ์ƒํ™ฉ์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์ด ํ† ๋ก ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณ„์† ์ง„ํ–‰ํ•˜๊ณ  ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„๊ฐ€์ž.

#6410์„ ํ•ด๊ฒฐํ•  ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์•„๋‹๊นŒ์š”? onChange / onInput ์— ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์˜ํ–ฅ์ด ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

2019๋…„ 6์›” 5์ผ ์—…๋ฐ์ดํŠธ

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

์šฐ๋ฆฌ๋Š” 12์›”์— Fire ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/facebook/react/pull/14382 ๋ฐ ๊ธฐํƒ€ ์Šค๋ ˆ๋“œ์—์„œ ์ผ๋ถ€ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ตฌ์‹์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋งŽ์€ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๋ ˆ๊ฑฐ์‹œ ํŒฝ์ฐฝ์„ ์ค„์ด๊ณ  ์‹ถ์ง€๋งŒ ์›์‹œ DOM ์ด๋ฒคํŠธ์— ๋” ๊ฐ€๊นŒ์ด ๊ฐ€๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉํ–ฅ์ธ์ง€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ค„์ด๋Š” ๊ฒƒ์€ ์ตœ์„ ์˜ ์ ˆ์ถฉ์•ˆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ฑ ์ˆ˜์ค€์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ Fire ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•œ ํ”„๋กœํ† ํƒ€์ž… ํ›„, ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์ด ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ํฐ ์ˆ˜๋‹จ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

์ด ์กฐ์‚ฌ์˜ ๊ฒฐ๊ณผ, React Fire์˜ ์ผ๋ถ€์ธ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จํ•˜๊ณ  ๋จผ์ € ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์—๋งŒ ์ง‘์ค‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ”„๋กœ์ ํŠธ๋Š” React Flare(https://github.com/facebook/react/issues/15257)๋กœ ์•Œ๋ ค์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ ์ถฉ๋ถ„ํžˆ ๋„์ „์ ์ด๋ฉฐ ์ด ๋ชฉ๋ก์˜ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ๋จผ์ € ๋‹จ๋…์œผ๋กœ ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

React Flare์˜ ๋ชฉํ‘œ๋Š” ๋ฐ์Šคํฌํ†ฑ๊ณผ ๋ชจ๋ฐ”์ผ์—์„œ ๋งˆ์šฐ์Šค์™€ ํ„ฐ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ UI๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Press, Hover ๋ฐ Focus์™€ ๊ฐ™์€ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์„ ์–ธ์  API๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ React ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ๊ณผ ๋‹ฌ๋ฆฌ Flare ๋””์ž์ธ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋ฒˆ๋“ค์„ ํŒฝ์ฐฝ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉฐ ๋งˆ์šฐ์Šค ๋ฐ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

React Flare๋Š” ์•„์ง ์‹คํ—˜ ๋‹จ๊ณ„์ด์ง€๋งŒ ์ „๋ฐ˜์ ์ธ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ํ™•์‹ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฒฐ๊ตญ ๊ณต์‹์ ์œผ๋กœ ์˜คํ”ˆ ์†Œ์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. (์ง€๊ธˆ์€ ๋งˆ์Šคํ„ฐ์—์„œ ์ˆ˜๋™์œผ๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•˜๋ฉฐ, ํ˜„์žฌ ์ž‘์—… ์ค‘์ด๋ฏ€๋กœ semver ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค.) Fire์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ "Flare"๋Š” ์ฝ”๋“œ๋ช…์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๋ช…๋ช…, ๋ฌธ์„œ ๋“ฑ. ์•„๋งˆ๋„ react/events ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ React Native์—์„œ๋„ ๋™๋“ฑํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

React Flare์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„์„ ๋งˆ์นœ ํ›„์—๋Š” React Fire ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌํ•ญ์„ ์žฌํ‰๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Flare๊ฐ€ "ํ’๋ถ€ํ•œ" ์ด๋ฒคํŠธ ์ง‘ํ•ฉ์„ ์ธ์ˆ˜ํ•˜๋ฉด React DOM์—์„œ "๊ธฐ๋ณธ" ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋งŽ์€ ํด๋ฆฌํ•„์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ํ† ๋ก ์— ์ฐธ์—ฌํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ ์ด ์ •๋ณด๊ฐ€ ์œ ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ์ผ! ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์€ ๋งˆ์šฐ์Šค์™€ ํ„ฐ์น˜ ์ด๋ฒคํŠธ์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜์ง€๋งŒ ๊ฐ€๋ณ๊ณ  React์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

"React Flare"๊ฐ€ ๊ธฐ๋ณธ React ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€๋กœ ์ œ๊ณต๋˜๊ฑฐ๋‚˜ ํ•จ๊ป˜ ์ œ๊ณต๋  API์˜ ์–‘์„ ๊ณ ๋ คํ•˜์—ฌ ์ถ”๊ฐ€ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

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

์ด ๋งˆ์šฐ์Šค ๋ฐ ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์ด PointerEvent ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ด์ „ ์—…๋ฐ์ดํŠธ์—์„œ ์ด ์›น ํ‘œ์ค€์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ ์ฃผ์˜๋ฅผ ํ™˜๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ์— ๋Œ€ํ•œ ์ง์ ‘ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@jonathantneal ์˜ˆ, ์ƒˆ ์‹œ์Šคํ…œ์€ ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ ๋งˆ์šฐ์Šค/ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

https://github.com/facebook/react/issues/11347 ์ด ์ด ๋ฌธ์ œ์—์„œ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. React๋Š” https://custom-elements-everywhere.com์„ ํญ๋กœํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์žฌ์„ค๊ณ„ํ•  ๋•Œ ์„€๋„์šฐ ๋ฃจํŠธ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. React ๋ฃจํŠธ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ณ  ์š”์†Œ์—๋งŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค(https://github.com/facebook/react/issues/9242, https:// github.com/facebook/react/issues/15759, https://github.com/facebook/react/issues/13713, https://github.com/facebook/react/issues/11827)

์ด ์—…๋ฐ์ดํŠธ์—์„œ: https://github.com/facebook/react/issues/13525#issuecomment -499196939 @gaearon ์–ธ๊ธ‰:

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

์ด๋Ÿฌํ•œ ์—ฃ์ง€ ์ผ€์ด์Šค์˜ ๋ชฉ๋ก์ด ์–ด๋””์—๋‚˜ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

@gaearon ์ด์ œ Flare๊ฐ€ ๋‚˜๊ฐ”๊ณ  (SCNR), ์—…๋ฐ์ดํŠธ๋œ ๊ณ„ํš( 2019๋…„ 6์›” 5์ผ ์—…๋ฐ์ดํŠธ ๊ด€๋ จ)์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋‚˜์š”?

๊ทธ๋ฆฌ๊ณ  @trusktr ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๊ธฐ์—์„œ๋„ #11347์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํด๋ฆฌํ•„์„ ๋‹ค๋ฅธ ๋ฒˆ๋“ค, ํŠนํžˆ ์ฃผ์š” ์—๋ฒ„๊ทธ๋ฆฐ ๋ธŒ๋ผ์šฐ์ €์™€ ๊ด€๋ จ์ด ์—†๋Š” ๋ฒˆ๋“ค๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์˜ค๋žœ ์‹œ๊ฐ„์ด ํ˜๋ €๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์ผœ๊ณ  ๋„๊ธฐ ์œ„ํ•ด ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์— ๋Œ€ํ•ด ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ์ด ๋ชฉ๋ก์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์†Œํ•œ์˜ ๊ฐ€๋Šฅํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ–๋„๋ก React 17์„ "์˜ˆ์•ฝ" ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ React 18๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ React ๋ฃจํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค(https://github.com/facebook/react/issues/2043). ๋ฌธ์„œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ React ์•ฑ์„ ๋” ํฐ ์‹œ์Šคํ…œ์— ํฌํ•จํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Atom ํŽธ์ง‘๊ธฐ๋Š” ์ด์™€ ์ถฉ๋Œํ•œ ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋Œ€ํ˜• ์›น์‚ฌ์ดํŠธ๋Š” ๊ฒฐ๊ตญ stopPropagation ๊ฐ€ ๋น„ React ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ฑฐ๋‚˜ React ๋ฃจํŠธ(https://github.com/facebook/react/issues/8693, https://github)์—์„œ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋งค์šฐ ๋ณต์žกํ•œ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. .com/facebook/react/pull/8117, https://github.com/facebook/react/issues/12518). ๋˜ํ•œ ์—…๋ฐ์ดํŠธ ์ค‘์— ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ๋œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“  ๋ฃจํŠธ์— ์—ด์‹ฌํžˆ ์ด๋ฒคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ React 17์—์„œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—„์ฒญ๋‚œ ์ž‘์—… ๋ฉ์–ด๋ฆฌ๋กœ ํŒ๋ช…๋˜์—ˆ์ง€๋งŒ ๊ณ ๋ง™๊ฒŒ๋„ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • onChange ์—์„œ onInput ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ  ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ํด๋ฆฌํ•„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(https://github.com/facebook/react/issues/9657). ์ž์„ธํ•œ ๊ณ„ํš์€ ๋งํฌ๋œ ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. React๊ฐ€ DOM์—์„œ input ์ด๋ฒคํŠธ๋ผ๊ณ  ํ•˜๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํฐ ์ด์  ์—†์ด ์ด์™€ ๊ฐ™์€ ํฐ ๋ณ€๊ฒฝ์„ ํ”ผํ•˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ์ œ์–ด ์ž…๋ ฅ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์—ฃ์ง€ ์ผ€์ด์Šค์—๋งŒ ํ•„์š”ํ•œ ์ผ๋ถ€ ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋™์ž‘ ์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋‘ ๊ฐ€์ง€ ๋ณ€๊ฒฝ์„ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด๋ฅผ ๊ธฐํšŒ๋กœ ์‚ฌ์šฉํ•˜์—ฌ onInput ๋ฐ onChange ๊ฐ€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด DOM ์ด๋ฒคํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ์ด๊ฒƒ์œผ๋กœ ๋Œ์•„์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ดํƒˆ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€๋Š” ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ์•„์ง ๋ฏธ์ •์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ๋Œ€ํญ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค(https://github.com/facebook/react/issues/4751). ํ˜„์žฌ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์€ 2013๋…„ ์ฒ˜์Œ ๊ตฌํ˜„๋œ ์ดํ›„ ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. React DOM ๋ฐ React Native์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ถ”์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜๋Š” ๋งŽ์€ ํด๋ฆฌํ•„์€ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์— ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ถ€๋Š” ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ React DOM ๋ฒˆ๋“ค ํฌ๊ธฐ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์•„์ฃผ ๊ตฌ์ฒด์ ์ธ ๊ณ„ํš์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ๋ถ„๊ธฐํ•œ ๋‹ค์Œ DOM์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์— ๋” ๊ฐ€๊นŒ์ด ๋‹ค๊ฐ€๊ฐ€๋ฉด ์–ผ๋งˆ๋‚˜ ์ตœ์†Œํ•œ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ฉ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. DOM์—์„œ ๋ฒ„๋ธ”๋ง๋˜์ง€ ์•Š๊ณ  ๋ฒ„๋ธ”๋งํ•  ํƒ€๋‹นํ•œ ์ด์œ ๊ฐ€ ์—†๋Š” ๋ฏธ๋””์–ด ์ด๋ฒคํŠธ์™€ ๊ฐ™์€ ๋ฒ„๋ธ”๋ง ์ด๋ฒคํŠธ๋ฅผ ์ค‘์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฌํ„ธ์„ ํ†ตํ•œ ๋ฒ„๋ธ”๋ง๊ณผ ๊ฐ™์€ ์ผ๋ถ€ React ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๋” ๊ฐ„๋‹จํ•œ ์ˆ˜๋‹จ(์˜ˆ: ์ด๋ฒคํŠธ ์žฌ์ „์†ก)์„ ํ†ตํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ์ด๊ฒƒ์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” 2019๋…„ ์ดˆ์— ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ์ง„์ •์œผ๋กœ ์ตœ์†Œํ•œ์˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์€ ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. React๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ์ •๊ทœํ™” ์ž‘์—…์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋‚˜ contentEditable ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์ž…๋ ฅ ํŽธ์ง‘๊ธฐ์™€ ๊ฐ™์€ ํ‹ˆ์ƒˆ ์˜์—ญ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋ฒคํŠธ๋ฅผ ๋ฃจํŠธ์— ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์˜ ์ผ๋ถ€๋กœ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์—์„œ ๋งŽ์€ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ํ–ฅํ›„ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React 17์˜ ์ผ๋ถ€๋กœ ๋งŽ์€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•œ "์ด๋ฒคํŠธ ํ’€๋ง"์„ ์ œ๊ฑฐํ•˜๊ณ  ๋” ์ด์ƒ onScroll ์ด๋ฒคํŠธ๋ฅผ ๋ฒ„๋ธ”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React 18์—์„œ ๋ฏธ๋””์–ด ์ด๋ฒคํŠธ์˜ ๋ฒ„๋ธ”๋ง์„ ์ค‘์ง€ํ•˜์—ฌ React ๋™์ž‘์„ ๋ธŒ๋ผ์šฐ์ €์— ๋” ๊ฐ€๊น๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์œผ๋กœ ์•ฝ๊ฐ„์˜ ๋ฐ”์ดํŠธ๋ฅผ ์ ˆ์•ฝํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—… ์ค‘์ธ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ์˜ํ•ด ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ „์ฒด์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ๋กœ ์ด์–ด์ง€์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • className โ†’ class (https://github.com/facebook/react/issues/4331, https://github.com/facebook/react/issues/13525#issuecomment- ์ฐธ์กฐ) 417818906 ์•„๋ž˜). ์ด๊ฒƒ์€ ์ˆ˜์—†์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ class ๋ฅผ React 16์—์„œ DOM ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ƒ์„ฑํ•˜๋Š” ํ˜ผ๋ž€์€ ๋ณดํ˜ธํ•˜๋ ค๋Š” ๊ตฌ๋ฌธ ์ œํ•œ์˜ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ณ€๊ฒฝ์„ ์ž์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ์œ„์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ๊ณ„๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๊ณ  ์—†์ด ๋‘˜ ๋‹ค ํ—ˆ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‘˜ ๋‹ค ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ์•ผ ํ•˜๋ฉฐ ์ถฉ๋Œํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ className ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ(์˜ˆ: ์ถ”๊ฐ€ํ•˜์—ฌ) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”, ์ข‹์€ ๊ธฐ์‚ฌ์ž…๋‹ˆ๋‹ค!
React-DOM ์ œํ’ˆ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ ๊ณ„ํš์ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ 100KB ์ด์ƒ์˜ React-DOM JS ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“ˆ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์˜ค๋ฒ„ํ—ค๋“œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ๋ณ„ JS.
์ฝ˜ํ…์ธ ๊ฐ€ ํ’๋ถ€ํ•œ ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ ๋” ํฐ ์ฐจ๋‹จ ๋ฐ ๋” ํฐ TTI๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์–ธ์ œ ๊ทธ๋Ÿฌํ•œ ๋ณ€ํ™”๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@morevolk-latei ์ธก์ • ์‹œ 100KB์˜ ReactDOM์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๊นŒ?

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