๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
React์˜ ํƒ€์ž… ๋น„๊ต์™€ key์˜ ์—ญํ•  ์š”์ฆ˜ ๋‹ค์‹œ Advanced React๋ฅผ ์ฝ์œผ๋ฉฐ, React์—์„œ key๊ฐ€ DOM ์žฌ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •์ง“๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. ํƒ€์ž… ๋น„๊ต๋Š” "DOM ์žฌ์‚ฌ์šฉ" ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.const App = () => { const [isMarketMember, setIsMarketMember] = useState(false); .... return ( {isMarketMember ? ( ) : ( )} );}; ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด isMarketMember ๊ฐ’์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋™์ž‘์„ ๋‹น์—ฐํžˆ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์—์„œ๋Š” ์ž…๋ ฅ๊ฐ’์ด ์œ ์ง€๋œ๋‹ค. ์ฆ‰, Market ID๋ฅผ ์ž…๋ ฅํ•œ ๋’ค ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํ•ด์ œํ•˜๋ฉด Name ์ž…๋ ฅ.. 2025. 6. 22.
debugger ์—†์ด ํ˜ธ์ถœ ์Šคํƒ ํ™•์ธํ•˜๋Š” ๋ฒ• ๋””๋ฒ„๊น…์„ ํ•˜๋‹ค ๋ณด๋ฉด, ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.๋ณดํ†ต์€ debugger๋ฅผ ์ฐ๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ด ๋ณด๋Š” ์‹์œผ๋กœ ์ถ”์ ํ•ด ์™”๋Š”๋ฐ, ์กฐ๊ธˆ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ๋ฆ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.console.trace ๋ž€?ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฝ๋กœ(Call Stack)๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค.ํˆฌ๋‘๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธํ•ด ๋ณด์•˜๋‹ค. const handleChange = (e) => { setInputValue(e.target.value); }; const handleAddTodo = (e) => { e.preventDefault(); if (!inputValue.trim()) return; setTodos((prev) => [...pre.. 2025. 6. 15.
Stagewise - ๋ธŒ๋ผ์šฐ์ €์—์„œ AI ์ฝ”๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋„๊ตฌ ์ตœ๊ทผ์— Stagewise๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. AI ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์—๋””ํ„ฐ๋ฅผ ์œ„ํ•œ ์‹œ๊ฐ์  ๋„์šฐ๋ฏธ๋ผ๋Š” ์ปจ์…‰์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , ์Šฌ๋กœ๊ฑด์€ "Eyesight for your AI-powered Code Editor" ๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, AI ์ฝ”๋“œ ์ƒ์„ฑ์ด๋‚˜ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ € ์ชฝ UI ์ปจํ…์ŠคํŠธ๋ฅผ AI์—๊ฒŒ ๋” ์ž˜ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋„๊ตฌ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Stagewise๊ฐ€ ์–ด๋–ค ๋„๊ตฌ์ธ์ง€, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ๋ณด๋ฉฐ ๋А๋‚€ ์ ์„ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.์„ค์น˜ + ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ค์น˜์™€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ ๊ณต์‹ Quickstart ๊ธฐ์ค€์œผ๋กœ VS Code ์ต์Šคํ…์…˜ ์„ค์น˜์™€ Toolbar ์ฃผ์ž… ๋‘ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋œ๋‹ค. Plugins ๊ธฐ๋Šฅ์œผ๋กœ ํˆด๋ฐ” UI์™€ AI ์ปจํ…์ŠคํŠธ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์ด ๊ฐ„๋‹จ.. 2025. 6. 6.
๋ชจ๋…ธ๋ ˆํฌ์—์„œ ์„ค์ • ๊ณตํ†ตํ™”ํ•˜๊ธฐ ์ด์ „ ํŒ€์€ ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ์ด๋ผ ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ์„ค์ •์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์„ค์ •์„ ์ค‘์•™ํ™”ํ•˜๋ ค๋Š” ๋ฐฉํ–ฅ์ด ์žกํžˆ๋˜ ์‹œ์ ์—, lingui ์„ค์ • ๊ณตํ†ตํ™” ์ž‘์—…์„ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค.BEFORE๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์œผ๋กœ lingui ์„ค์ •์„ ๋“ค๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์„ค์ • ๋‚ด์šฉ์„ ๋ณด๋ฉด ๊ฑฐ์˜ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์—ˆ๋‹ค.apps/โ”œโ”€โ”€ a-web/ # a ๋„๋ฉ”์ธ ์›น์•ฑ (lingui ์‚ฌ์šฉ)โ”œโ”€โ”€ b-web/ # b ์‚ฌ์ดํŠธ (lingui ์‚ฌ์šฉ)โ”œโ”€โ”€ c-web/ # c ์‚ฌ์ดํŠธ (lingui ์‚ฌ์šฉ)โ””โ”€โ”€ d-web/ # ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์‚ฌ์ดํŠธ (lingui ์‚ฌ์šฉ) ๋ฌธ์ œ๋Š” ์ด ์„ค์ •๋“ค์ด ๊ฐ๊ฐ ๋”ฐ๋กœ ๊ด€๋ฆฌ๋˜๋‹ค ๋ณด๋‹ˆ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ๊ณ ์ƒˆ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ์„ค์ •์„ ๋ณต๋ถ™ ํ•˜๋Š”.. 2025. 5. 30.
React ๋ฒˆ๋“ค ์ตœ์ ํ™” ์š”์•ฝ ์ตœ๊ทผ์— โœจ How I Reduced My React Bundle Size by 30% ๋ผ๋Š” ๊ธ€์„ ์ฝ์—ˆ๋‹ค.ํ•ด๋‹น ๊ธ€์€ ์‹ค์ œ ๋ฐ๋ชจ ์•ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์ค„์—ฌ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๋‚ด์šฉ์„ ๋ณด๋ฉฐ ์˜ˆ์ „ ํšŒ์‚ฌ์—์„œ์˜ ๊ธฐ์–ต์ด ๋– ์˜ฌ๋ž๋‹ค. ๊ทธ๋•Œ ์•ฝ 2์ฃผ๊ฐ„ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๊ฐ„์ด ์ฃผ์–ด์กŒ๊ณ , ํŒ€์›๋ณ„๋กœ ๋นŒ๋“œ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜, lodash ์ „์ฒด import๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์—์„œ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋งŒ ๊ฐœ๋ณ„ import ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—… ๋“ฑ์„ ์ง„ํ–‰ํ–ˆ์—ˆ๋‹ค. ๊ทธ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ ์™ธ์—๋Š” ์ž˜ ๋ชฐ๋ž๊ธฐ ๋•Œ๋ฌธ์—, ๋ญ”๊ฐ€ ์ง์ ‘ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜ ์˜๊ฒฌ์„ ๋‚ด์ง€ ๋ชปํ–ˆ๋˜ ๊ฒŒ ๋Š˜ ์•„์‰ฌ์› ๋‹ค. ์ด๋ฒˆ ๊ธ€์„ ์ฝ์œผ๋ฉฐ, ๋‹ค์Œ์— ๋น„์Šทํ•œ ๊ธฐํšŒ๊ฐ€ ์˜ค๋ฉด ์ข€ ๋” ์ฃผ๋„์ ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ๊ธ€์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ๊ฐ„๋‹จ.. 2025. 5. 25.
cloneElement๋ฅผ ์“ฐ์ง€ ๋ชปํ•œ ์ด์œ  ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์ž์ฃผ ๊ฒช๊ฒŒ ๋˜๋Š” ํ๋ฆ„์ด ์žˆ๋‹ค.์ฒ˜์Œ์—๋Š” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ธฐํš ์š”๊ตฌ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋ฉด์„œ props๋Š” ์ ์  ๋Š˜์–ด๋‚˜๊ณ  ๋‚ด๋ถ€ ๋กœ์ง๋„ ํ•จ๊ป˜ ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๊ทธ๋ž˜์„œ ํ–ฅํ›„ ์–ด๋–ค ์กฐ๊ฑด์ด ๋”ํ•ด์งˆ์ง€๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์ตœ์†Œํ•œ ์ดˆ๊ธฐ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ๋Š” ๋‚ด๋ถ€์—์„œ ๋ชจ๋“  ์ •์ฑ…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ๋งˆ์Œ์ด ๋Š˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ๊ณตํ†ตํ™”๊ฐ€ ์–ธ์ œ๋‚˜ ์ •๋‹ต์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ธ‰ํ•œ ์ผ์ • ์†์—์„œ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ๊ธฐํš์ด 1์ฐจ, 2์ฐจ๋กœ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ์—๋Š” ์„ฃ๋ถ€๋ฅธ ๊ณตํ†ตํ™”๋ณด๋‹ค๋Š” ์ตœ๋Œ€ํ•œ ์ž˜ ์ฝํžˆ๋Š” ์ฝ”๋“œ๋ฅผ ์šฐ์„ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ๋’ค, ๋‚˜์ค‘์— ํ˜ผ์ž ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค. ์ด๋ฒˆ์— ๊ฐœ๋ฐœํ•œ ๊ธฐ๋Šฅ์€ ์ž…๋ ฅ์ฐฝ ์˜†์— ๋ฒ„ํŠผ์„ ๋ถ™์ด๊ณ , ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ…์ŠคํŠธ .. 2025. 5. 4.
ํšจ์œจ์ ์ธ DOM ์กฐ์ž‘์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•˜๊ธฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ์ž‘์—…์€ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ์ตœ๊ทผ์— ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ DOM ์กฐ์ž‘์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŒจํ„ด์„ ์†Œ๊ฐœํ•˜๋Š” ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.1. ์š”์†Œ ์ˆจ๊ธฐ๊ธฐ/๋ณด์ด๊ธฐ ๋Œ€์‹  ์ƒ์„ฑ/์‚ญ์ œ ํ”ผํ•˜๊ธฐ DOM์—์„œ ๋™์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์€ ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, ๋งค๋ฒˆ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋„ ๋‹ค์‹œ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๋ฐ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ , ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์š”์†Œ๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค. const el = document.querySelector('#element');el.classList.add('show.. 2025. 4. 27.
requestAnimationFrame ์œผ๋กœ ํ”„๋ ˆ์ž„ ํƒ€์ด๋ฐ ๋งž์ถ”๊ธฐ ๐ŸŽจ ๊ธ€์— ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™”๋ฉด์„ ๊ทธ๋ฆด ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰DOM ๋ณ€๊ฒฝ ๊ฐ์ง€์Šคํƒ€์ผ ๊ณ„์‚ฐLayout (Reflow) – ์š”์†Œ์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐPaint – ๊ณ„์‚ฐ๋œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ”ฝ์…€์„ ๊ทธ๋ฆฌ๊ธฐComposite – ๋ ˆ์ด์–ด๋ฅผ ์กฐํ•ฉํ•ด ์ตœ์ข…์ ์œผ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ์œ„ ์‚ฌ์ดํด์€ ๋ณดํ†ต 1์ดˆ์— 60๋ฒˆ, ์•ฝ 16.6ms๋งˆ๋‹ค ๋ฐ˜๋ณต๋˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์ฃผ๊ธฐ์— ๋งž์ถฐ ์ตœ๋Œ€ํ•œ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ™”๋ฉด์„ ๋ Œ๋”๋ง์„ ํ•˜๋Š”๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ DOM์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด ํƒ€์ด๋ฐ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด, ํ”„๋ ˆ์ž„ ๋“œ๋กญ, ๋Š๊น€, ๋А๋ ค์ง„ ์ธํ„ฐ๋ž™์…˜ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.โœจ requestAnimationFrame ์ด๋ž€?window.requestAnimationFrame() ๋ฉ”์„œ๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ˆ˜.. 2025. 3. 30.