React

Na Jeongยท2022๋…„ 11์›” 21์ผ
0

react

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

๐Ÿ“”Framework์™€ Library

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

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

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

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

์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ Angular, Vue, React์ด๋‹ค.
์•ต๊ทค๋Ÿฌ์™€ ๋ทฐ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋ฉฐ, ๋ฆฌ์•กํŠธ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ ์ ์ธ ํŠน์ง•์„ ์ผ๋ถ€ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๐Ÿ“”React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

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

์ด๋Ÿฌํ•œ ์ด์œ ๋“ค๋กœ ๋ฆฌ์•กํŠธ๋Š” ํ˜„์žฌ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

๐Ÿ“”React๋ž€ ?

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

๐Ÿ“”React์˜ ํŠน์ง•

๐Ÿ–์„ ์–ธ์ 

๊ฐœ๋ฐœ๋ฐฉ์‹์—๋Š” ์ ˆ์ฐจ์  / ์„ ์–ต์  ๊ฐœ๋ฐœ์ด ์žˆ๋‹ค.
์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€ ์— ์ค‘์ ์„ ๋‘๋Š” ๋ฐฉ์‹์ด๊ณ , ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฌด์—‡์„ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€์— ์ค‘์ ์„ ๋‘๋Š” ๋ฐฉ์‹์ด๋‹ค.

์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด,

์ ˆ์ฐจ์  : ์ด ๋ฐฉํ–ฅ์œผ๋กœ ์ง์ง„ํ•ด์„œ ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์—์„œ ์šฐํšŒ์ „ํ•ด์ฃผ์‹œ๊ณ , ์ดํ›„ ์ฒซ ๋ฒˆ์งธ ์‹ ํ˜ธ๋“ฑ์—์„œ ์ขŒํšŒ์ „ํ•ด์ฃผ์„ธ์š”. ์ „๋ฐฉ์— ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ ๋•Œ๊นŒ์ง€ ์ง์ง„ํ•ด์ฃผ์‹œ๊ณ , ์†Œ๋ฐฉ์„œ๊ฐ€ ์žˆ๋Š” ๋ธ”๋ก์—์„œ ์šฐํšŒ์ „ ํ›„ 300m ์•ž์—์„œ ๋‚ด๋ ค์ฃผ์„ธ์š”.
์„ ์–ธ์  : OOO์œผ๋กœ ๊ฐ€์ฃผ์„ธ์š”.

์œ„๋ฅผ ๋ณด๋ฉด ์ ˆ์ฐจ์ ์€ ๋ชฉ์ ์ง€์— ์–ด๋–ป๊ฒŒ ๋„๋‹ฌํ•˜๋Š”์ง€์— ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ๊ณ , ์„ ์–ธ์ ์€ ๋ชฉ์ ์ง€์— ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ๋‹ค.
๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด๊ณ , ๋ฆฌ์•กํŠธ๊ฐ€ ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด๋‹ค.

์„ ์–ธ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ๋„ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์˜ ๋ชจ์Šต๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ธฐ์กด์— DOM์„ ์ ˆ์ฐจ์ ์œผ๋กœ ์กฐ์ž‘ํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์™„์ „ํžˆ ๋ฐ”๊พผ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ์˜ ์ „ํ™˜์ด๋‹ค.

๐Ÿ– Virtual DOM

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

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

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

๐Ÿ– Component

๐Ÿ” ์ปดํฌ๋„ŒํŠธ์˜ ์ •์˜

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

๐Ÿ” ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ง•

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

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

  3. ๋˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ปดํฌ๋„ŒํŠธ๋Š” <๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ /> ์•ˆ์— <์ž์‹ ์ปดํฌ๋„ŒํŠธ />๋“ค์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์ข‹๋‹ค.
    ํ•œ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.

๐Ÿ” ์ปดํฌ๋„ŒํŠธ์˜ ์ข…๋ฅ˜

  1. ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ
import React from 'react';

class App extends React.Component {
  render() {
    return <h1>This is Class Component!</h1>;
  }
}

export default App;

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” render() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ JSX๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. state ๋ฐ lifecycle API๋ฅผ ํ†ตํ•ด ๊ด€๋ จ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ
import React from 'react';

const App = () => {
  return <h1>This is Function Component!</h1>;
};

export default App;

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” render() ๋ฉ”์„œ๋“œ ์—†์ด JSX๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์— ๋น„ํ•ด์„œ ๊ฐ„๋‹จํ•˜์ง€๋งŒ state์™€ lifecycle์„ ๊ด€๋ฆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ Hook ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ๊ทธ ํ›„๋กœ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ๋งŽ์ด ์“ฐ์ด๊ณ  ์žˆ๋‹ค.

๐Ÿ” ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์šฉ

๋ฆฌ์•กํŠธ๋Š” ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ์š”์†Œ๋ฅผ HTML ํƒœ๊ทธ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ๋ช…์€ ํ•ญ์ƒ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ–JSX

๐Ÿ” JSX์˜ ์ •์˜

JSX(JavaScript Syntax eXtension)๋ž€ ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค.
JSX๋Š” HTML๊ณผ JS ๋กœ์ง์„ ํ•˜๋‚˜์˜ JSํŒŒ์ผ ์•ˆ์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.
JSX๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•˜๊ธฐ ์ „์— Babel์ด๋ผ๋Š” transcompiler๋ฅผ ํ†ตํ•ด ์ผ๋ฐ” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

๐Ÿ” JSX์˜ ํŠน์ง•

JSX๋Š” HTML ํƒœ๊ทธ์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—๋ณด๊ธฐ ์‰ฝ๊ณ  ์ต์ˆ™ํ•˜๋‹ค. ๋˜ํ•œ ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ HTML ๋งˆํฌ์—…๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋กœ์ง์„ ๋„์‹œ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค.

๐Ÿ” JSX ๋ฌธ๋ฒ•

  1. JSX element
    JSX ๋ฌธ๋ฒ•์„ ํ†ตํ•ด JS ํŒŒ์ผ ์–ด๋””์—์„œ๋‚˜ ํ•„์š”ํ•œ ๊ณณ์— HTML์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.
const hi = <p>Hi</p>;
  1. Javascript ํ‘œํ˜„์‹
    JSX ๋‚ด๋ถ€์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, {} ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
import React from 'react';

const Greetings = () => {
  const name = '๋ฐ•๋‚˜์ •';

  return <h1>{name}๋‹˜, Welcome to Wecode!</h1>;
};

export default Greetings;

3.JSX attribute
ํƒœ๊ทธ์˜ attribute name(์†์„ฑ๋ช…)์€ camelCase๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ณ , class๋ฅผ ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ๋Š” className์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

/* HTML
<h1 class="greetings">Welcome to Wecode!</h1>

/* JSX
<h1 className="greetings">Welcome to Wecode!</h1>
  1. event ์ฒ˜๋ฆฌ
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ํ•ด๋‹นํ•˜๋Š” DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•ด eventListener๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋‹ค.
    JSX์—์„œ๋Š”, ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ง์ ‘ ์ด๋ฒคํŠธ์™€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฒคํŠธ๋Š” ์•ž์— on์„ ๋ถ™ํ˜€ camelCase๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
// JS
const title = document.getElementsByClassName("title")[0];
title.addEventListener("click", handleClick);

// JSX
<h1 className="title" onClick={handleClick}>
  Welcome to Wecode!
</h1>
  1. inline Style
    style thrtjddms {{}} ์ค‘๊ด„ํ˜ธ๋ฅผ ๋‘ ๋ฒˆ ๊ฒน์ณ์„œ ์“ฐ๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
    ๋ฐ”๊นฅ์˜ {}๋Š” JSX ๋ฌธ๋ฒ•์„ ์˜๋ฏธํ•˜๊ณ , ์•ˆ์ชฝ์˜ {}๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
// HTML
<h1 style="color:red;background-image:yellow">Welcome to Wecode!</h1>

// JSX
<h1 style={{ color: "red", backgroundImage: "yellow" }}>
  Welcome to Wecode!
</h1>

inline ์Šคํƒ€์ผ์€ css๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋‚ฎ๊ณ  ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’ใ„น๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ์Šคํƒ€์ผ๋ง์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์™ธ์—๋Š” ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  1. Self-Closing Tag
    img ํƒœ๊ทธ์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ํƒœ๊ทธ๊ฐ€ ์š”์†Œ์ธ ๊ฒฝ์šฐ, img /> ์ฒ˜๋Ÿผ ํ•ญ์ƒ /๋กœ ๋๋‚ด์ค˜์•ผ ํ•œ๋‹ค.

  2. Nested JSX
    ๋ฐ˜๋“œ์‹œ ์ตœ์ƒ์œ„๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ํƒœ๊ทธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

const Greetings = () => {
  return (
    <div>
      <h1>๋‚˜์ •๋‹˜!</h1>
      <h2>์œ„์ฝ”๋“œ์— ์˜ค์‹  ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</h2>
    </div>
  );
}

JSX๋ฅผ ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์•ผ ํ•˜๋Š” ์ด์œ ๋Š”, Virtual DOM์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ณ€ํ™”๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ DOM ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  1. React.Fragment
    ์ตœ์ƒ์œ„์— ํƒœ๊ทธ๋ฅผ ๊ฐ์‹ธ์•ผํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด <React.Fragment>์ด๋‹ค.
    Fragment๋Š” ์ถ”๊ฐ€์ ์ธ DOM element๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
    ์ถ•์•ฝํ˜•์€ <> </> ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค.
profile
๋Š์ž„์—†์ด ๋…ธ๋ ฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž (โธโธโขโธโธ) เท†

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