React.js ๊ฐœ๋ก 

ANNยท2025๋…„ 11์›” 19์ผ

OneBiteReact

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

ํ•œ ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ(React.js) : ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค์ „๊นŒ์ง€ by ์ด์ •ํ™˜

๐Ÿ“Œ React.js๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค

๋ฆฌ์•กํŠธ์˜ ๊ธฐ์ˆ ์ ์ธ ํŠน์ง•

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ UI๋ฅผ ํ‘œํ˜„
  • ํ™”๋ฉด ์—…๋ฐ์ดํŠธ ๊ตฌํ˜„์ด ์‰ฌ์›€
  • ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ

๋ชจ๋“  ๋‚ด์šฉ์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ•  ํ•„์š” ์—†๊ณ , ์™„๊ฐ• ํ›„ ๋‹ค์‹œ ๋ณด๋Š” ๊ฑธ ์ถ”์ฒœํ•œ๋‹ค ํ•จ
๋‚˜๋Š” ๋ฆฌ์•กํŠธ ๊ณต๋ถ€ 2ํšŒ์ฐจ(?)์ด๋‹ˆ๊นŒ ์—ด์‹ฌํžˆ ๋ณด๋ ค๊ณ  ํ•จ

1๏ธโƒฃ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ UI ํ‘œํ˜„

์ปดํฌ๋„ŒํŠธ๋ž€?

ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ UI ์กฐ๊ฐ

์ปดํฌ๋„ŒํŠธ๋กœ ์ธํ•ด ํ™”๋ฉด์˜ ๊ตฌ์„ฑ ์š”์†Œ, ๊ฐ๊ฐ์˜ ์˜์—ญ์„ ๋ชจ๋“ˆํ™”ํ•ด์„œ ๋ณด๊ด€ ๊ฐ€๋Šฅ
โžก๏ธ ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ(์•„์ฃผ ํฐ ์žฅ์ )

์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ฐ๋Š” ์žฅ์ 

๋งŒ์•ฝ, ๋ฉ”์ธ ํŽ˜์ด์ง€, ์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€, ์ฃผ๋ฌธ ํŽ˜์ด์ง€ ๋“ฑ์—์„œ ๋ชจ๋‘ ๊ฐ™์€ ํ—ค๋” ๋ฉ”๋‰ด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ ํŽ˜์ด์ง€๊ฐ€ ๋ชจ๋‘ ํ—ค๋” ๋ฉ”๋‰ด ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๊ฒƒ์ž„

์ด๋•Œ, ํ—ค๋” ๋ฉ”๋‰ด์— ์ˆ˜์ •์ด ์ƒ๊ธธ ๊ฒฝ์šฐ ํ—ค๋” ๋ฉ”๋‰ด๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•จ

๊ทธ๋Ÿฌ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ฐ๋ฉด,
ํ—ค๋” ๋‚ด์— ์ˆ˜์ •์ด ์ƒ๊ฒจ๋„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋งŒ ์ˆ˜์ •ํ•˜๊ณ 
๊ฐ ํŽ˜์ด์ง€๋Š” ๊ทธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋จ
โžก๏ธ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ด

2๏ธโƒฃ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ ๊ตฌํ˜„์ด ์‰ฌ์›€

์—…๋ฐ์ดํŠธ๋ž€?

์‚ฌ์šฉ์ž์˜ ํ–‰๋™(ํด๋ฆญ, ๋“œ๋ž˜๊ทธ)์— ๋”ฐ๋ผ ์›น ํŽ˜์ด์ง€๊ฐ€ ์Šค์Šค๋กœ ๋ชจ์Šต์„ ๋ฐ”๊ฟ” ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ

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

์˜ˆ๋ฅผ ๋“ค๋ฉด,
์‹๋‹น์—์„œ ์Œ์‹์„ ์ฃผ๋ฌธํ•  ๋•Œ
"ํ† ๋งˆํ†  ํŒŒ์Šคํƒ€ ํ•˜๋‚˜ ์ฃผ์„ธ์š”."
๊ทธ๋Ÿฌ๋‚˜ ์ด๋•Œ, ํ† ๋งˆํ†  ํŒŒ์Šคํƒ€๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์€ ์•Œ ํ•„์š”๊ฐ€ ์—†์Œ

์ด์™€ ๋ฐ˜๋Œ€๋กœ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์žˆ์Œ
๋ชฉ์ ์„ ์ด๋ฃจ๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์ผ๋ จ์˜ ๊ณผ์ • ์„ค๋ช…

์ฃผ๋ฐฉ์œผ๋กœ ๊ฐ€์„œ ๋ฉด 100g์„ ๊บผ๋‚ด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ์— 9๋ถ„๊ฐ„ ์‚ถ์œผ์„ธ์š”. 
ํ›„๋ผ์ดํŒฌ์„ ๊บผ๋‚ด ๋ถˆ์„ ์˜ฌ๋ฆฌ๊ณ  ํ† ๋งˆํ†  ์†Œ์Šค์™€ ํ•จ๊ป˜ ๋ณถ์œผ์„ธ์š”. ๋งŒํ…Œ๊นŒ๋ ˆ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

(์ง„์ƒ ์†๋‹˜์ธ๊ฐ€?)

๊ทผ๋ฐ ์›๋ž˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ด๋Ÿฐ ์‹์ž„

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

๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋น ๋ฅธ๊ฐ€?

๋ฆฌ์•กํŠธ๋กœ ๋งŒ๋“  ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” state๋ผ๋Š”,
์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Œ

์ด state ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด,
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ”๋€ state ๊ฐ’์— ๋”ฐ๋ผ์„œ
๊ฐ๊ฐ ๋‹ค๋ฅธ UI๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•˜๋„๋ก ์„ค์ • ๊ฐ€๋Šฅ

C์ปดํฌ๋„ŒํŠธ๋Š” state ๋ณ€์ˆ˜์˜ ๊ฐ’์— ๋”ฐ๋ผ์„œ
๊ฐ’์ด 1์ผ ๋•Œ๋Š” 1๋ฒˆ UI๋ฅผ ๋ Œ๋”๋ง,
๊ฐ’์ด 2์ผ ๋•Œ๋Š” 2๋ฒˆ UI๋ฅผ ๋ Œ๋”๋งํ•˜๋„๋ก ํ•จ

์ฆ‰, ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ state ๋ณ€์ˆ˜๋งŒ ๋ฐ”๊พธ๋ฉด
UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ํŽธํ•จ

์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ๋ณต์žกํ•œ ๋™์ž‘์„ ์ง์ ‘ ์ •์˜ํ•  ํ•„์š” ์—†์ด
ํŠน์ • ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ

3๏ธโƒฃ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ

ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅ

์—…๋ฐ์ดํŠธ๋ž€, ๊ฒฐ๊ตญ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ํ–‰์œ„
๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ฒ„ํŠผ์˜ ์ƒ‰์ƒ์„ ํŒŒ๋ž€์ƒ‰์—์„œ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด,
๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฆฌ์•กํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ๋ ค๋ฉด,
๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋จผ์ € ์ดํ•ดํ•ด์•ผ ํ•จ

๋ธŒ๋ผ์šฐ์ €๋Š” ์–ด๋–ป๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š”๊ฐ€?

๋ธŒ๋ผ์šฐ์ €๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

Critical Rendering Path
: ๋ฐ˜๋“œ์‹œ ๊ผญ ๊ฑฐ์ณ์•ผ๋งŒ ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฒฝ๋กœ

HTML ์ฝ”๋“œ โžก๏ธ DOM ๋ณ€ํ™˜

HTML ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด ๋”์œผ๋กœ ๋ณ€ํ™˜

CSS ์ฝ”๋“œ โžก๏ธ CSSOM ๋ณ€ํ™˜

CSS์ฝ”๋“œ๋„ ํ•ด์„ํ•ด์„œ CSSOM(CSS Object Model, ์Šคํƒ€์ผ ๊ทœ์น™)์œผ๋กœ ๋ณ€ํ™˜

DOM, CSSOM โžก๏ธ Render Tree

ํŽ˜์ด์ง€์— ์–ด๋–ค ์š”์†Œ๊ฐ€ ์žˆ๊ณ , ์–ด๋””์— ์žˆ๋Š”์ง€๋ฅผ ์•„๋Š” DOM๊ณผ DOM ๊ฐ๊ฐ์˜ ์š”์†Œ์— ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ์Šคํƒ€์ผ ๊ทœ์น™์„ ํ•ฉ์ณ ๋ Œ๋” ํŠธ๋ฆฌ(Render Tree)๋ฅผ ๋งŒ๋“ฆ = ์›น ํŽ˜์ด์ง€์˜ ์ฒญ์‚ฌ์ง„/์„ค๊ณ„๋„
(๋” = ์š”์†Œ๋“ค์˜ ์œ„์น˜, ๋ฐฐ์น˜, ๋ชจ์–‘์— ๋Œ€ํ•œ ์ •๋ณด)

๋ ˆ์ด์•„์›ƒ ๋‹จ๊ณ„

๋ Œ๋” ํŠธ๋ฆฌ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ
= ์š”์†Œ์˜ ๋ฐฐ์น˜๋ฅผ ์žก๋Š” ์ž‘์—…
๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ์—ฐ์‚ฐ์„ ์š”๊ตฌ

ํŽ˜์ธํŒ… ๋‹จ๊ณ„

๋ ˆ์ด์•„์›ƒ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์š”์†Œ๋ฅผ ์‹ค์ œ๋กœ ํŽ˜์ด์ง€์— ๊ทธ๋ฆผ
ํŽ˜์ธํŒ… ์—ญ์‹œ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ์—ฐ์‚ฐ์„ ์š”๊ตฌ


์—…๋ฐ์ดํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์งˆ๊นŒ? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋”์„ ์ˆ˜์ •ํ•˜๋ฉด,

๋ธŒ๋ผ์šฐ์ €๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋‹ค์‹œ ๋ฐ˜๋ณต

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋”์„ 3,000๋ฒˆ ์ˆ˜์ •ํ•˜๋ฉด,
๋ Œ๋”๋ง ๊ณผ์ •์ด 3,000๋ฒˆ ์ผ์–ด๋‚จ

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ, ๋ ˆ์ด์•„์›ƒ(Reflow)๊ณผ ํŽ˜์ธํŒ…(Repaint) ๊ณผ์ •์€ ๋งŽ์€ ์—ฐ์‚ฐ์„ ๋™๋ฐ˜
โžก๏ธ ๋”์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋งŽ์•„์ง€๋ฉด ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ €ํ•˜

๋ธŒ๋ผ์šฐ์ €์˜ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋ฉด ์‘๋‹ต์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜, ์‘๋‹ต ๋ถˆ๋Šฅ ์ƒํƒœ์— ๋น ์ง

[๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, 3000๊ฐœ์˜ ๋ชฉ๋ก์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, onClick ํ•จ์ˆ˜ ์‹คํ–‰
$ul์— ul์•„์ด๋””๋ฅผ ๊ฐ€์ ธ์˜จ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์™€ ์ €์žฅ,
๊ทธ ํƒœ๊ทธ์˜ innerHTML ๊ฐ’์— ๋ณตํ•ฉ ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋กœ, liํƒœ๊ทธ๋ฅผ ํ•˜๋‚˜์”ฉ ๋” ์ถ”๊ฐ€

๊ทธ๋Ÿฐ๋ฐ innerHTML์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค๋Š” ๊ฑด,
๋”์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ
โžก๏ธ 3,000๋ฒˆ ๋” ์ˆ˜์ •

๋งํ–ˆ๋“ฏ์ด
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋”์„ ์ง์ ‘ ์ˆ˜์ •ํ•ด์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋” ์ˆ˜์ • ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒŒ ์ข‹์Œ

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ ๊ฐœ์„ 

ul ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์™€ $ul์— ์ €์žฅํ•˜๋Š” ๊ฑด ๋™์ผ
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋‹ค์Œ list ๋ณ€์ˆ˜์— li ํƒœ๊ทธ๋ฅผ 3000๊ฐœ ์ถ”๊ฐ€
โžก๏ธ ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ๋Š” innerHTML์„ ๋ฐ”๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ(DOM์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ)

๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋˜๊ณ  ๋งจ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ DOM ์ˆ˜์ •ํ•ด์„œ list ์ถ”๊ฐ€


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

๋ฆฌ์•กํŠธ๋Š” ์ด๋Ÿฌํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•ด์คŒ

์–ด๋–ป๊ฒŒ?
๋ฒ„์ถ”์–ผ ๋”(Virtual DOM)์„ ์ด์šฉ

๋ฒ„์ถ”์–ผ ๋”์„ ์ด์šฉํ•œ ํšจ์œจ์ ์ธ ์—…๋ฐ์ดํŠธ

๋ฒ„์ถ”์–ผ ๋”(Virtual DOM)์ด๋ž€?

๊ฐ€์ƒ์˜ ๋”, ์‹ค์ œ ๋”์˜ ์‚ฌ๋ณธ

๋ฆฌ์•กํŠธ์—์„œ๋Š” ํŽ˜์ด์ง€์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋จผ์ € ๋ฒ„์ถ”์–ผ ๋”์„ ์—…๋ฐ์ดํŠธ
โžก๏ธ ๋ฒ„์ถ”์–ผ ๋”์€, ์ผ์ข…์˜ ๋ฒ„ํผ์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ชจ์•˜๋‹ค๊ฐ€ ํ•œ ๋ฒˆ์— ์‹ค์ œ ๋” ์—…๋ฐ์ดํŠธ


๋งŒ์•ฝ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด,

๋™์‹œ์— 3๊ฐœ์˜ ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ

๋ฒ„์ถ”์–ผ ๋”์— 3๋ฒˆ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ
๊ทธ๋ฆฌ๊ณ  ์ด ๋™์•ˆ ์‹ค์ œ ๋”์€ ์•„๋ฌด๋Ÿฐ ๋ณ€ํ™”๊ฐ€ ์—†์Œ

๋ณ€๊ฒฝ ์ž‘์—…์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ์•˜๋‹ค๊ฐ€ ํ•œ ๋ฒˆ์— ์‹ค์ œ ๋” ์—…๋ฐ์ดํŠธ

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชจ์•„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žฆ์•„๋„, ๋ธŒ๋ผ์šฐ์ €์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜์ง€ ์•Š์Œ


๐Ÿ“Œ ์ฒซ React App ์ƒ์„ฑํ•˜๊ธฐ

npm create vite@latest

npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ create-vite ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์™€ ์‹คํ–‰
create-vite : Vite ํ”„๋กœ์ ํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ
@latest : ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ

React, JavaScript ์„ ํƒํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๊ธฐ๋ณธ ์„ค์ •์ด ์™„๋ฃŒ๋œ ๋ฆฌ์•กํŠธ ์•ฑ ์ƒ์„ฑ

package.json

Node.js ํŒจํ‚ค์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ํŒŒ์ผ

{
  "name": "section06",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^19.1.1",
    "react-dom": "^19.1.1"
  },
  "devDependencies": {
    "@eslint/js": "^9.36.0",
    "@types/react": "^19.1.16",
    "@types/react-dom": "^19.1.9",
    "@vitejs/plugin-react": "^5.0.4",
    "eslint": "^9.36.0",
    "eslint-plugin-react-hooks": "^5.2.0",
    "eslint-plugin-react-refresh": "^0.4.22",
    "globals": "^16.4.0",
    "vite": "^7.1.7"
  }
}

"type": "module"
: Node ํ™˜๊ฒฝ์—์„œ ES Modules ๋ฐฉ์‹์„ ์‚ฌ์šฉ
"scripts":~ : scripts ํ•ญ๋ชฉ๋„ ๋ฏธ๋ฆฌ ์„ค์ •
"dependencies":~
: ํ”„๋กœ๋•์…˜(์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ)์—์„œ๋„ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก
"devDependencies":~
: ๊ฐœ๋ฐœํ•  ๋•Œ๋‚˜ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๊ฐœ๋ฐœ ์‹œ ์‚ฌ์šฉํ•  ๋ฌธ๋ฒ• ์ฒดํฌ ๋„๊ตฌ๋‚˜ ํ™œ์šฉํ•  ํ…Œ์ŠคํŠธ ๋„๊ตฌ
๋ฆฌ์•กํŠธ ์•ฑ์„ ๋ฐฐํฌํ•  ๋•Œ ๊ฐœ๋ฐœ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฏธํฌํ•จ


ํ˜„์žฌ node_modules ํด๋”๋‚˜, package-lock.json ํŒŒ์ผ์€ ์•„์˜ˆ ์—†๋Š”๋ฐ
์ด๋•Œ ํ„ฐ๋ฏธ๋„ ์•ˆ์—

npm i

๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Œ

public ํด๋”

  • svg, png, jpg ๊ฐ™์€ ์ด๋ฏธ์ง€ ํŒŒ์ผ
  • ํฐํŠธ, ๋™์˜์ƒ ๋“ฑ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ •์ ์ธ ํŒŒ์ผ

โžก๏ธ ์ด๋ฏธ์ง€๋‚˜ ํฐํŠธ ๋“ฑ์€ ์ด ํด๋”์— ์ถ”๊ฐ€
๋‹จ, ๋ธŒ๋žœ๋“œ ๋กœ๊ณ ์ฒ˜๋Ÿผ ์ด๋ฆ„์ด ์ ˆ๋Œ€ ๋ฐ”๋€Œ๋ฉด ์•ˆ ๋˜๋Š” ํŒŒ์ผ
์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์ •์  ํŒŒ์ผ

src ํด๋”

  • ์†Œ์Šค ํŒŒ์ผ

โžก๏ธ ์‹ค์ œ ์ž‘์„ฑํ•œ ๋ฆฌ์•กํŠธ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ์ด ํด๋”์— ์ถ”๊ฐ€

asset ํด๋”

  • ์ด๋ฏธ์ง€, ํฐํŠธ ๊ฐ™์€ ์ •์ ์ธ ํŒŒ์ผ
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€
    • CSS์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ •์  ๋ฆฌ์†Œ์Šค

.eslintrc.cjs

eslint๋ผ๋Š” ๋„๊ตฌ์˜ ์„ค์ • ํŒŒ์ผ
์ฝ”๋“œ ์Šคํƒ€์ผ์„ ํ†ต์ผํ•˜๋Š” ๋ฐ์— ๋„์›€์„ ์ฃผ๋Š” ๋„๊ตฌ

.gitignore

๋ฆฌ์•กํŠธ ์•ฑ์„ ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ฆด ๋•Œ, ์ œ์™ธํ•  ํŒŒ์ผ ๋ช…์‹œ

index.html

  • ๋ฆฌ์•กํŠธ ์•ฑ์˜ ๊ธฐ๋ณธ ํ‹€ ์—ญํ• ์„ ํ•˜๋Š” html ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ธด ํŒŒ์ผ
  • ์›๋ž˜๋Š” UI์š”์†Œ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‹ค html๋กœ ๋งŒ๋“ค์—ˆ์ง€๋งŒ,
    ๋ฆฌ์•กํŠธ์—์„œ๋Š” UI๋ฅผ ์ง์ ‘ HTML์— ์“ฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ์•กํŠธ๊ฐ€ index.html์˜ root์— DOM์„ ์ˆ˜์ •ํ•ด์„œ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

vite.config.js

  • ๋ฆฌ์•กํŠธ ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ vite๋ผ๋Š” ๋„๊ตฌ์˜ ์˜ต์…˜ ์„ค์ •

๋ฆฌ์•กํŠธ ์•ฑ ์‹คํ–‰

package.json์˜ scripts ํ•ญ๋ชฉ ์•ˆ์— ๋ฆฌ์•กํŠธ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€์˜ ๋ช…๋ น์–ด๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์ •

๋ช…๋ น์–ดํ•˜๋Š” ์ผ์–ธ์ œ ์‚ฌ์šฉ?
npm run dev๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰๊ฐœ๋ฐœํ•  ๋•Œ
npm run build๋ฐฐํฌ์šฉ ํŒŒ์ผ ์ƒ์„ฑ์„œ๋น„์Šค ์ถœ์‹œ ์ค€๋น„ํ•  ๋•Œ
npm run preview๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฐฐํฌ ์ „์— ์ตœ์ข… ์ ๊ฒ€
npm run lint์ฝ”๋“œ ์Šคํƒ€์ผ ๋ฐ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ์ฝ”๋“œ ํ’ˆ์งˆ ์ฒดํฌํ•  ๋•Œ
npm run dev

๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๋ฆฌ์•กํŠธ ์•ฑ ์ž‘๋™


๐Ÿ“Œ ๋ฆฌ์•กํŠธ ์•ฑ ๊ตฌ๋™์›๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ

index.html ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๋ฉด
<body> ํƒœ๊ทธ๊ฐ€ ํ……ํ…… ๋น„์–ด์žˆ์Œ

๊ทธ๋Ÿผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‚˜ํƒ€๋‚œ ์ € ์ด๋ฏธ์ง€์™€ ํ…์Šคํ„ฐ์™€ ์นด์šดํ„ฐ๋Š” ๋ญ˜๊นŒ?

์š”์†Œ๋Š” ๋ชจ๋‘ <script> ํƒœ๊ทธ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ ,
src/main.jsx๋ผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ
์ข…์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ์š”์†Œ

๋”ฐ๋ผ์„œ index.html์— ์•„๋ฌด๊ฒƒ๋„ ์—†์–ด๋„
main.jsx๊ฐ€ ํ™”๋ฉด์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž„

๋ฆฌ์•กํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ

ReactDOM์˜ createRoot๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š”
์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ html์š”์†Œ๋ฅผ
๋ฆฌ์•กํŠธ์˜ ๋ฃจํŠธ, ์ฆ‰ ๋ฟŒ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์—ญํ• 

document.getElementById(root)
์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋Š” ์š”์†Œ
โžก๏ธ index.html ํŒŒ์ผ ์•ˆ์— ์žˆ๋Š” root๋ฅผ id๋กœ ๊ฐ–๋Š” ์š”์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘

๋”ฐ๋ผ์„œ ์œ„ ์š”์†Œ๊ฐ€ main.jsx์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ์ค‘
โžก๏ธ ๋ฆฌ์•กํŠธ๋Š” ์ด ์š”์†Œ๋ฅผ ๋ฆฌ์•กํŠธ์˜ ๋ฃจํŠธ๋กœ ๋ณ€ํ™˜์ค‘

๊ทธ ๋‹ค์Œ render๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋ฃจํŠธ ์•„๋ž˜์— ๋ฌด์–ธ๊ฐ€ ๋ Œ๋”๋งํ•  ๊ฒƒ

<React.StrictMode> ๋Š” ์ž ์‹œ ๋ฌด์‹œ

<App />
App ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง
โžก๏ธ ์ฆ‰, App ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง

์ด App ์ปดํฌ๋„ŒํŠธ๋Š” ์–ด๋””์„œ ๊ฐ€์ ธ์˜ค๋‚˜?
๋งจ ์ƒ์œ„์— import ์ค‘

App.jsx๋ฅผ ์‚ดํŽด๋ณด๋ฉด
html ํƒœ๊ทธ๋ฅผ ๋ฆฌํ„ด ์ค‘

๋ฆฌ์•กํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ html ํƒœ๊ทธ๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ์œผ๋ฉด, ์ด ํ•จ์ˆ˜๋ฅผ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ํ•จ

App.jsx๋ฅผ ๋ณด๋ฉด, App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋Š” html ์š”์†Œ๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ์ง€๋„ ๋ฆฌํ„ดํ•˜๊ณ , h1 ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ํ…์ŠคํŠธ๋„ ๋ Œ๋”๋งํ•˜๊ณ , ๋ฒ„ํŠผ๋„ ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ์Œ

๋”ฐ๋ผ์„œ App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋Š” ์ด html ํƒœ๊ทธ๊ฐ€ main.jsx๋กœ ๋ถˆ๋Ÿฌ์™€์ ธ์„œ render ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋ง๋˜๊ณ  ์žˆ์Œ

main.jsx ํŒŒ์ผ์€ index.html์—์„œ <script> ํƒœ๊ทธ๋กœ ๋ถˆ๋Ÿฌ์™€ ์‹คํ–‰

๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ๋ณด๋ฉด,

App.jsx์—์„œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ์˜ ์š”์†Œ๋“ค์ด ์ž˜ ๋ Œ๋”๋ง๋˜๊ณ  ์žˆ์Œ

๋‹ค์‹œ ๋งํ•ด, ํ•ด๋‹น ๋ฆฌํ„ด๋˜๋Š” ์š”์†Œ๋“ค์„ ์‚ญ์ œํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์„ ๊ฒƒ

์ •๋ฆฌ

๋ฆฌ์•กํŠธ ์•ฑ์€ index.html์—์„œ main.jsx๋ผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ,
์ด ํŒŒ์ผ์—์„œ๋Š” App.jsxํŒŒ์ผ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” App ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” html ์š”์†Œ๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋ง ์ค‘

0๊ฐœ์˜ ๋Œ“๊ธ€