๐ŸŒ React Best Practice

2022๋…„ 11์›” 24์ผ
6๋ถ„

๋Œ€์„ธ ํ”„๋ก ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ๋ฆฌ์—‘ํŠธ๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ์— ์•ž์„œ ๊ฐ€๊ธ‰์ ์ด๋ฉด ๊ผญ ์ง€์ผœ์•ผํ•  ๋ถ€๋ถ„์„๋“ค ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์Šต๊ด€์ ์œผ๋กœ ์•„๋ž˜ ๋‚ด์šฉ๋“ค์€ ๋ฐ˜๋“œ์‹œ ์ˆ™์ง€ํ•ฉ์‹œ๋‹ค!

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์„ ์‚ฌ์šฉ

React ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์€ ํด๋ž˜์Šค์— ๋น„ํ•ด ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ์‚ฌ์šฉ ํ”ผํ•˜๊ธฐ

React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ๋•Œ ์ƒํƒœ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ• ์ˆ˜๋ก ์•ฑ ์ „์ฒด์—์„œ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒํƒœ๋ฅผ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์ƒํƒœ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํ•„์š”ํ•  ๋•Œ๋งŒ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด API์—์„œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ณ„ ์†์„ฑ์„ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  ์ „์ฒด ์‚ฌ์šฉ์ž ๊ฐœ์ฒด๋ฅผ ์ƒํƒœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

//๊ฐœ๋ณ„ ์†์„ฑ ์ƒํƒœ
const [username, setusername] = useState('');
const [password, setpassword] = useState('');
 
//์ „์ฒด ์‚ฌ์šฉ์ž ๊ฐœ์ฒด
const [user, setuser] = useState({});

๋™์ผํ•œ ๊ตฌ์„ฑ์š”์†Œ์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํด๋”์— ์ •๋ฆฌ

Navbar ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ Navbar ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด, ์Šคํƒ€์ผ ์‹œํŠธ, ๊ตฌ์„ฑ ์š”์†Œ์— ์‚ฌ์šฉ๋œ ๊ธฐํƒ€ JavaSript ๋ฐ ์ž์‚ฐ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” navbar๋ผ๋Š” ํด๋”๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ํ‚ค๋ฅผ Props Key๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ

์•„๋ž˜์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋•Œ๋•Œ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํŠนํžˆ ๋ชฉ๋ก์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//์ธ๋ฑ์Šค ํ‚ค๋ฅผ ์‚ฌ์šฉ (X)
const Items = () => {
  const arr = ['item1', 'item2', 'item3', 'item4', 'item5'];
  return (
    <>
      {arr.map((elem, index) => {
        <li key={index}>{elem}</li>;
      })}
    </>
  );
};

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ div ๋Œ€์‹  ์กฐ๊ฐ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

<div>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด DOM ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํƒœ๊ทธ ๋˜๋Š” DOM ๋…ธ๋“œ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์›น์‚ฌ์ดํŠธ์— ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์ „๋ ฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ถˆํ•„์š”ํ•œ <div> ํƒœ๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋‹จ์ผ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const Button = () => {
  return <button>Display</button>;
};

๋ช…๋ช… ๊ทœ์น™ ์ค€์ˆ˜

๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋•Œ ํ•ญ์ƒ PascalCase๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ JSX ํŒŒ์ผ๊ณผ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: TextField, NavMenu ๋ฐ SuccessButton)
handleInput() ๋˜๋Š” showElement()์™€ ๊ฐ™์€ React ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ํ•จ์ˆ˜์—๋Š” camelCase๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ ํ”ผํ•˜๊ธฐ

์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์‹ญ์‹œ์˜ค.

Props์— ๊ฐ์ฒด ๊ตฌ์กฐํ™” ์‚ฌ์šฉ

props ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ๊ฐ์ฒด ๊ตฌ์กฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ props ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค props ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

//props ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
const Button = (props) => {
 return <button>{props.text}</button>;
};
 
//๊ฐ์ฒด ๊ตฌ์กฐํ™” ์‚ฌ์šฉ
const Button = ({text}) => {
 return <button>{text}</button>;
};

๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋ฐฐ์—ด ๋ Œ๋”๋ง

map()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต๋˜๋Š” HTML ๋ธ”๋ก์„ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด map()์„ ์‚ฌ์šฉํ•˜์—ฌ <li> ํƒœ๊ทธ์˜ ํ•ญ๋ชฉ ๋ชฉ๋ก์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const Items = () => {
  const arr = ['item1', 'item2', 'item3', 'item4', 'item5'];
  return (
    <>
      {arr.map((elem, index) => {
        <li key={elem + index}>{elem}</li>;
      })}
    </>
  );
};

๊ฐ React ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

์ƒ์„ฑํ•œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. React์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋Š” Jest์ด๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

React Is a Powerful Tool, But You Must Follow Certain Practices

React๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์ธก๋ฉด์—์„œ ๋‹ค์†Œ ์œ ์—ฐํ•˜์ง€๋งŒ ํŠน์ • ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋ฉด ๊ฒฝํ—˜์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.