๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

[React] React ๋ณต์Šต (๊ฐœ๋… ~ context API๊นŒ์ง€) (2023.05.22) ๋ณธ๋ฌธ

full stack/React

[React] React ๋ณต์Šต (๊ฐœ๋… ~ context API๊นŒ์ง€) (2023.05.22)

Shinjio 2023. 5. 22. 19:48

์ง€๋‚œ์ฃผ๋ถ€ํ„ฐ ๋ฆฌ์•กํŠธ๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ๊ตฌ์กฐ์™€ ๋ฌธ๋ฒ•, ์“ฐ๋Š” ์ด์œ ์— ๋Œ€ํ•˜์—ฌ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์–ด ๋”ฐ๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ!

 

1. ๋ฆฌ์•กํŠธ(React)๋ž€?

๋ฆฌ์•กํŠธ๋ž€, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

meta(๊ตฌ facebook)์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ฃผ๋กœ SPA(Single Page Application)์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

React๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

 

1-1. ๊ธฐ์กด ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์˜ ๋‹จ์ 

1) HTML๊ณผ JS๊ฐ€ ๊ฐ€์ง„ ๋ถ„๋ฆฌ๊ฐ & ์ง๊ด€์ ์ด์ง€๋งŒ ๋„ˆ๋ฌด ๊ธด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ HTML ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” document.getElementById ๋“ฑ ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ธด ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ†ตํ•ด ์š”์†Œ๋ฅผ ๋ถˆ๋Ÿฌ ์˜ฌ ์ˆ˜ ์žˆ์Œ

๋ฆฌ์•กํŠธ๋Š” HTML๊ณผ JS ๋ฌธ์„œ๋ฅผ ํ•ฉ์นœ JSX ๋ฅผ ์ง€์›

 

2) ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ๋“ค์–ด๊ฐˆ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ๊ณ ์นจ > ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ”ผ๋กœ๊ฐ์„ ๋Š๋ผ๊ฒŒ ํ•จ

React๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋งํ•˜์—ฌ SPA ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

2. ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

2-1. Virtual DOM์˜ ์‚ฌ์šฉ

์‹ค์ œ๋กœ DOM์„ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ฐ„์— Virtual DOM ์ด๋ผ๋Š” ๊ฐ€์ƒ์˜ DOM์„ ๋‘์–ด Virtual DOM์ด ๋ณ€๊ฒฝ๋  ๋•Œ, ์‹ค์ œ DOM์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ์Œ. ์ด๋Ÿฌํ•œ ์ž‘์—…์„ Reconciliation์ด๋ผ๊ณ  ํ•จ. Virtual DOM์€ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๊ณผ์ •์˜ ๋น„ํšจ์œจ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒ. 

 

2-2. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ๊ฐœ๋ฐœ

์ปดํฌ๋„ŒํŠธ๋Š” ๋ ˆ๊ณ  ๋ธ”๋Ÿญ๊ณผ ๊ฐ™์ด ์ž‘์€ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ•œ๊ฒƒ์„ ์กฐ๋ฆฝํ•˜๋“ฏ์ด ํ•ฉ์น˜๋Š” ๊ฒƒ์œผ๋กœ ์บก์Šํ™”, ํ™•์žฅ์„ฑ, ๊ฒฐํ•ฉ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ™์€ ์ด์ ์ด ์žˆ์Œ

 

2-3. JSX์˜ ์ง€์›

JSX(JavaScript + XML)๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ํ™•์žฅ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฆฌ์•กํŠธ์—์„œ ์ƒ๊น€์ƒˆ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ JSX๋Š” ๋ฆฌ์•กํŠธ "์—˜๋ฆฌ๋จผํŠธ(Element)"๋ฅผ ์ƒ์„ฑํ•จ

HTML๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” JavaScript  

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์—์„œ XMLํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด babel์ด JSX๋ฅผ JavaScript๋กœ ๋ณ€ํ™˜

 

JSX ๋ฌธ๋ฒ•์ž‘์„ฑ ๊ทœ์น™

1. ๊ผญ ๋‹ซํ˜€์žˆ๋Š” ํƒœ๊ทธ
<input />, <br /> ์ด๋Ÿฐ์‹์œผ๋กœ HTML์—์„œ ๋ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํƒœ๊ทธ๋„ ๋‹ซ์•„์ฃผ์–ด์•ผ ํ•จ

2. ๊ผญ ๊ฐ์‹ธ์ ธ์•ผํ•˜๋Š” ํƒœ๊ทธ
๋‘๊ฐœ ์ด์ƒ์˜ ํƒœ๊ทธ๋Š” ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ์•ผ ํ•จ. 
๋ณดํ†ต์€ <div></div>ํƒœ๊ทธ๋กœ ๊ฐ์Œˆ


JSX ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ ์‚ฌ์šฉํ•˜๊ธฐ

JSX ๋‚ด๋ถ€์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋•Œ์—๋Š” { } ์œผ๋กœ ๊ฐ์‹ธ์„œ ๋ณด์—ฌ์คŒ
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์€ return๋ฌธ ์•„๋ž˜ { } ์•ˆ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•
1) ์กฐ๊ฑด์ด ํ•˜๋‚˜์ผ ๋•Œ - {} ์•ˆ์— && ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
2) ์กฐ๊ฑด์ด ๋‘๊ฐœ์ผ ๋•Œ - {} ์•ˆ์— ์‚ผํ•ญ์—ฐ์‚ฌ์ž (์กฐ๊ฑด ? ์‹คํ–‰๋ฌธ 1 : ์‹คํ–‰๋ฌธ 2)
3) ์กฐ๊ฑด์ด 3๊ฐœ ์ด์ƒ์ผ ๋•Œ - ์กฐ๊ฑด๋ฌธ์„ ํ‘œํ˜„์‹์ด ์•„๋‹Œ return๋ฌธ ์œ„์ชฝ์—์„œ ์‚ฌ์šฉ


style๊ณผ ClassName

์ธ๋ผ์ธ ์Šคํƒ€์ผ์€ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฉฐ background-color ์ฒ˜๋Ÿผ -๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š” ์ด๋ฆ„๋“ค์€ backgroundColor ์ฒ˜๋Ÿผ camelCase ํ˜•ํƒœ๋กœ ๋„ค์ด๋ฐํ•ด์ค˜์•ผ ํ•จ

๋˜ํ•œ, CSS Class๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” class= ์ด ์•„๋‹Œ className= ์œผ๋กœ ์„ค์ • 


์ฃผ์„ ์‚ฌ์šฉ : {/*     */}

function APP() {
	const name = 'react'
    const style = {
    	backgroundColor : 'black',
        color : 'aqua',
        fontSize : 24,
        padding : '1rem'
    }
	return (
    	{*/ ์ฃผ์„์€ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค */}
    	<div className='container'>
        	<div style={style}>{name}</div>
        </div>
    );
}โ€‹

 

์—˜๋ฆฌ๋จผํŠธ(Element)
์—˜๋ฆฌ๋จผํŠธ๋ž€ React ์•ฑ์˜ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„
์—˜๋ฆฌ๋จผํŠธ๋Š” ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋‚ด์šฉ์„ ๊ธฐ์ˆ 

์ปดํฌ๋„ŒํŠธ(Component)
ํ™”๋ฉด์—์„œ UI ์š”์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์œ„
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜์™€ ์œ ์‚ฌ
"props"๋ผ๊ณ  ํ•˜๋Š” ์ž„์˜์˜ ์ž…๋ ฅ์„ ๋ฐ›์€ ํ›„, ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜์˜
์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ผญ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘! (์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” HTML ํƒœ๊ทธ์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด)
import์™€ export default ์ž‘์—…์ด ํ•„์ˆ˜

 

3. ๋ฆฌ์•กํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ๋ณธ๊ตฌ์กฐ

๋ฆฌ์•กํŠธ์˜ html(index.html)์€ ํ•˜๋‚˜ >> SPA(Single Page Application)

App.js ์•ˆ์—์„œ ๋‚ด์šฉ (JSX) ๋ณ€๊ฒฝ

 


3-1. ๋ฆฌ์•กํŠธ ํด๋”๊ตฌ์„ฑ 

 

node_modules : ํ•„์š”ํ•œ ์žฅ์น˜๋“ค, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š” ํด๋”

 

public : index.html๊ณผ ๊ฐ™์€ ์ •์ ์ธ ํŒŒ์ผ (์ด๋ฏธ์ง€, html, json, text ๋“ฑ)

 

src : js, css ๋“ฑ ๋™์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค๋กœ ๋ฆฌ์•กํŠธ ๋‚ด๋ถ€์—์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ํŒŒ์ผ๋“ค. ์ด ํŒŒ์ผ๋“ค์€ ๋ช…๋ น์–ด์— ๋”ฐ๋ผ JS๋กœ ์ปดํŒŒ์ผ์ด ์ง„ํ–‰๋จ

 

.gitignore : ๊นƒ์— ํฌํ•จํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ํŒŒ์ผ์˜ ์ด๋ฆ„ ํ˜น์€ ํด๋” ๋“ฑ์„ ์ž…๋ ฅ

 

package.json : ํ”„๋กœ์ ํŠธ์— ๊ด€๋ จ๋œ ๊ธฐ๋ณธ ๋‚ด์šฉ(ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„, ๋ฒ„์ „ ๋“ฑ)๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก ํฌํ•จ. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋œ node_moduls ๋Œ€์‹  package. json์„ ๊นƒ์— ํฌํ•จํ•˜์—ฌ ์˜ฌ๋ฆฌ๊ฒŒ ๋˜๋ฉฐ ํ›„์— ๋ˆ„๊ตฐ๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก ํ•  ๋•Œ ์ด package.json์— ์ ํ˜€์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชฉ๋ก์„ ๊ธฐ์ค€์œผ๋กœ npm์—์„œ ์„ค์น˜

 

README.md : ๋ณดํ†ต ๊นƒ๊ณผ ๊ฐ™์€ ์ €์žฅ์†Œ์— ์˜ฌ๋ฆด ๋•Œ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ž‘์„ฑํ•˜๋Š”๊ณณ์œผ๋กœ ํ•ด๋‹น ์ €์žฅ์†Œ์— ์ง„์ž…ํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋„์–ด์ง

 

 

4. React ์ฃผ์š” ์†์„ฑ

4-1. Props (Property)

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์†์„ฑ

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ , ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ’์„ ์ฝ์–ด์˜ด

 

1) ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ Props๋ฅผ ์ง€์ •

<ComponentName propsName="value" />

 

2) ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›์€ Props ๊ฐ’์„ ๋ Œ๋”๋ง

function ComponentName(props){

    return(<div>{props.propsName}</div>)}

 

ํ˜น์€

 

function ComponentName({propsName}){

    return(<div>{propsName}</div>)}

 

4-2. State

์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ

๋ฆฌ์•กํŠธ์—์„œ ์ด๋ฒคํŠธ์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜๋Š” ๋™์ ์ธ ๊ฐ’

๊ฐ’์ด ๋ณ€ํ•˜๋ฉด ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์ด ํŠน์ง• >> ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅธ์ ! State๋ฅผ ์“ฐ๋Š” ์ด์œ 

 

1) useState ์„ ์–ธ

const [state, setState] = useState(์ดˆ๊ธฐ๊ฐ’)

state : ๋ณ€์ˆ˜๋ช…

setState : state๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜

useState import ํ•„์š”

 

2) setState(๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ) ์‚ฌ์šฉ

 

5. React ์ฃผ์š” ํ•จ์ˆ˜

5-1. map ํ•จ์ˆ˜

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€ ๋‚ด์žฅ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐฐ์—ด ๋‚ด์˜ ๋ชจ๋“  ์š”์†Œ ๊ฐ๊ฐ์— ๋Œ€ํ•˜์—ฌ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜. ์ฆ‰, ์ฃผ์–ด์ง„ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ฆ. 

๋‹จ, ๊ธฐ์กด ๋ฐฐ์—ด์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ

key ๊ฐ’์„ ๊ผญ ์ž…๋ ฅํ•ด์•ผ ํ•จ. ์ด๋•Œ key ๊ฐ’์€ ๊ณ ์œ ์˜ ๊ฐ’์ด์–ด์•ผ ํ•จ (์ค‘๋ณต๋˜๋ฉด ์•ˆ๋จ)

 

key๊ฐ’ ๋ฏธ์ž…๋ ฅ์‹œ ์˜ค๋ฅ˜

 

let ๊ธฐ์กดํ•จ์ˆ˜ = [

    {key1 : value1-1, key2 : value2-1},

    {key1 : value1-2 key2 : value2-1},

    {key1 : value1-3 key2 : value2-1}

]

 

๊ธฐ์กดํ•จ์ˆ˜๋ช….map((item)=>{

    <tag key="">{item.keyName}</tag>

})

 

5-2. filter ํ•จ์ˆ˜

 

let ํ•จ์ˆ˜๋ช… = ๊ธฐ์กดํ•จ์ˆ˜๋ช….filter((item)=>{item.keyName="์›ํ•˜๋Š”๊ฐ’"})