๐Ÿš€ React๋ฅผ ์ฒ˜์Œ ์ ‘ํ•  ๋•Œ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด JSX & ์ƒํƒœ ๊ด€๋ฆฌ ํ•ต์‹ฌ ์ •๋ฆฌ

๊น€๋•์ง„ยท2025๋…„ 6์›” 7์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
1/13

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

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” React๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ๊ผญ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ๋ฌธ๋ฒ• ์š”์†Œ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


โœ… JSX ๋ฌธ๋ฒ•์—์„œ ์ฃผ์˜ํ•  ์ ๋“ค

1. class๊ฐ€ ์•„๋‹ˆ๋ผ className์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<div className="box">Hello</div>  // โœ…

HTML์—์„œ๋Š” class์ง€๋งŒ, JSX๋Š” JavaScript ๋ฌธ๋ฒ• ๊ธฐ๋ฐ˜์ด๋ผ ์˜ˆ์•ฝ์–ด์ธ class ๋Œ€์‹  className์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


2. ๋ณ€์ˆ˜๋Š” {}๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const name = "React";
<h1>{name}</h1> // โœ…

JSX ์•ˆ์—์„œ JavaScript ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ค‘๊ด„ํ˜ธ {}๋กœ ๊ฐ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


3. ์ธ๋ผ์ธ ์Šคํƒ€์ผ์€ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋„ฃ์Šต๋‹ˆ๋‹ค.

<div style={{ color: 'red', fontSize: '16px' }}></div> // โœ…

CSS ์†์„ฑ๋ช…์„ camelCase๋กœ ๋ฐ”๊พธ๊ณ , ์ „์ฒด๋ฅผ ๊ฐ์ฒด๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


4. return() ์•ˆ์—๋Š” ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ์š”์†Œ๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

return (
  <>
    <Header />
    <Main />
  </>
) // โœ… Fragment ์‚ฌ์šฉ

JSX๋Š” ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์“ฐ๋ ค๋ฉด <></> (Fragment)๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.


โš™๏ธ ์ƒํƒœ ๊ด€๋ฆฌ (useState)์—์„œ ์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜

5. useState๋Š” ์ƒํƒœ์™€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

const [count, setCount] = useState(0);

์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.


6. onClick์—๋Š” ๋ฌด์กฐ๊ฑด ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<button onClick={() => setCount(count + 1)}>Click</button> // โœ…

๊ด„ํ˜ธ๋ฅผ ๋ฐ”๋กœ ์“ฐ๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ฆ‰์‹œ ์‹คํ–‰๋˜๋ฏ€๋กœ, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์ด๋ฆ„๋งŒ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


7. like++ ์ฒ˜๋Ÿผ ํ›„์œ„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์˜๋„๋Œ€๋กœ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<span onClick={() => setLike(like + 1)}>๐Ÿ‘</span> // โœ…

like++๋Š” ๊ธฐ์กด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ ๋’ค ์ฆ๊ฐ€์‹œํ‚ค๋ฏ€๋กœ, React์˜ ๋น„๋™๊ธฐ์  ์ƒํƒœ ์ฒ˜๋ฆฌ์™€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ— like++๋Š” ํ˜„์žฌ ๊ฐ’์„ ๋จผ์ € ์ „๋‹ฌํ•˜๊ณ  ๋‚˜์ค‘์— ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, ์˜๋„ํ•œ ์ฆ๊ฐ€ ํšจ๊ณผ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: setLike(prev => prev + 1) ๋˜๋Š” setLike(like + 1) ์‚ฌ์šฉ


๐Ÿ”„ ์ƒํƒœ๋Š” ๋ถˆ๋ณ€์„ฑ(immutability)์„ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค

8. setState์— ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ’์„ ๋„˜๊ฒจ์•ผ React๊ฐ€ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

const newArr = [...oldArr];   // ๋ฐฐ์—ด ๋ณต์‚ฌ
setData(newArr);              // โœ… React๊ฐ€ ๊ฐ์ง€ํ•จ
  • React๋Š” ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์ฐธ์กฐ๊ฐ’(์ฃผ์†Œ) ๋งŒ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์ฐธ์กฐ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์•„์„œ React๋Š” "๋ณ€ํ™”๊ฐ€ ์—†๋„ค?"๋ผ๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ React vs Vue์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹ ๋น„๊ต

ํ•ญ๋ชฉReactVue
์ƒํƒœ ๋ณ€๊ฒฝ ์›์น™๋ถˆ๋ณ€์„ฑ (immutability)๋ฐ˜์‘์„ฑ ์‹œ์Šคํ…œ (reactivity)
์ƒํƒœ ๋ณ€๊ฒฝ ๋ฐฉ์‹๋ณต์‚ฌ ํ›„ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์ฒด์›๋ณธ ๊ฐ์ฒด/๋ฐฐ์—ด ์ง์ ‘ ์ˆ˜์ • ๊ฐ€๋Šฅ
๋ณ€๊ฒฝ ๊ฐ์ง€์ฐธ์กฐ๊ฐ’ ๋น„๊ต (์–•์€ ๋น„๊ต)Proxy ๊ธฐ๋ฐ˜ ์ถ”์ 
์ฝ”๋“œ ์œ ์—ฐ์„ฑ๋ฒˆ๊ฑฐ๋กญ์ง€๋งŒ ๋ช…ํ™•์ง๊ด€์ ์ด์ง€๋งŒ ๋‚ด๋ถ€ ์ถ”์  ๋กœ์ง ๋ณต์žก

๐Ÿงพ ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

ํ•ญ๋ชฉํ•ต์‹ฌ ๋‚ด์šฉ
JSX classclassName ์‚ฌ์šฉ
JSX ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ{}๋กœ ๊ฐ์‹ธ์•ผ ํ•จ
style ์ ์šฉ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ž‘์„ฑ
return ๋ฌธํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ํƒœ๊ทธ๋งŒ ํ—ˆ์šฉ
useState์ƒํƒœ ๋ณ€๊ฒฝ์‹œ ์ƒˆ๋กœ์šด ๊ฐ’ ํ•„์š”
์ƒํƒœ ๋ณ€๊ฒฝ์ง์ ‘ ์ˆ˜์ • โŒ, ๋ณต์‚ฌ ํ›„ setํ•จ์ˆ˜ ์‚ฌ์šฉ โœ…
ํ›„์œ„ ์—ฐ์‚ฐ++ ๋ณด๋‹ค๋Š” like + 1 ์‚ฌ์šฉ ๊ถŒ์žฅ

โœ๏ธ ์ฐธ๊ณ  ๋งํฌ

profile
FrontEnd Developer

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