[TIL] Unit 4. React ๊ธฐ์ดˆ

string_mainยท2022๋…„ 6์›” 2์ผ
0

React

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

๐ŸŒฑ React ๊ธฐ์ดˆ ๊ฐœ๋…


  • ์ •์˜ : ๋ฆฌ์•กํŠธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ JavaScript ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

๐ŸŒฟ ํŠน์ง•

  1. ์„ ์–ธํ˜•(Declarative)์ด๋‹ค.

    • HTML, CSS, JS๋กœ ๋‚˜๋ˆ ์„œ ์ ๊ธฐ ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ JSX๋ฅผ ํ™œ์šฉํ•œ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•œ๋‹ค.
    • ์–ด๋–ป๊ฒŒ(How)์— ์ง‘์ค‘ํ•˜๋Š” ๋ช…๋ นํ˜•๊ณผ ๋‹ค๋ฅด๊ฒŒ ์„ ์–ธํ˜•์€ ๋ฌด์—‡(What)์„ ๊ตฌํ˜„ํ• ์ง€์— ์ง‘์ค‘ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

      ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋“ค์„ ํ•œ ๊ณณ์— ๋ชจ์•„ ์ง๊ด€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ์–ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋งŒ ๋ณด๊ณ ๋„ ์‹ค์ œ ์›น์•ฑ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค!

    const Weather = () => (
      <WeatherContainer>
        <SearchInput />
        <CityInfo />
        <CurrentTemperature />
      </WeatherContainer>
  2. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜(Component-Based)์ด๋‹ค.

    • ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๋ฅผ ๋ฌถ์–ด๋‘” ์ปดํฌ๋„ŒํŠธ(๊ตฌ์กฐ + ๋™์ž‘์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ฝ”๋“œ์…‹)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋Šฅ ์ž์ฒด์— ์ง‘์ค‘ํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ์ง€๋ณด์ˆ˜, ์œ ๋‹› ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•˜๋‹ค.
    • UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•„์ˆ˜ ์š”์†Œ!!
    • ๋ ˆ์ด์•„์›ƒ์— ๋”ฐ๋ผ ์œ ๋™์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ–ฅ์‹ ๊ฐœ๋ฐœ(Bottom-up) ๋ฐฉ์‹์— ์ ํ•ฉํ•˜๋‹ค.
    • ๊ณ„์ธต์  ํŠธ๋ฆฌ ๊ตฌ์กฐ(hierarchy tree structure) : ๋ชจ๋“  ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ทผ์›(root)์ด ๋˜๋Š” ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

      ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฏธ ๊ตฌํ˜„๋œ ์‚ฌ์ดํŠธ์˜ ์ƒ๋‹จ ํ—ค๋”๋ฅผ ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ, HTML๋กœ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พผ ํ›„ CSS๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ ๊ตฌ์กฐ์™€ ๋””์ž์ธ์— ๋งž์ถฐ DOM ๋กœ์ง์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์œ„์น˜๋งŒ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค!

  3. ๋ฒ”์šฉ์„ฑ(Learn Once, Write Anywhere)์ด ์ข‹๋‹ค.

    • ๋ฆฌ์•กํŠธ๋Š” JS ํ”„๋กœ์ ํŠธ ์–ด๋””์—๋“  ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. Facebook์—์„œ ๊ด€๋ฆฌ๋˜์–ด ์•ˆ์ •์ ์ด๊ณ , ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๋ฉฐ, ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Angular๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์ƒํƒœ๊ณ„์— ์ข…์†๋œ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—ฌ์„œ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐ŸŒฑ JSX (JavaScript XML)


  • ์ •์˜ : ๋ฌธ์ž์—ด๋„ ์•„๋‹ˆ๊ณ  HTML๋„ ์•„๋‹Œ React์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ JavaScript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•. React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • Babel : JSX์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด์•ผ ํ•จ. Babel์€ JSX๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” JavaScript๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.

  • ์žฅ์  :
    • JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JavaScript ๋งŒ์œผ๋กœ ๋งˆํฌ์—…(markup) ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ DOM์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ํŒŒ์ผ์ด ์ค„์–ด๋“ค๊ณ , ํ•œ๋ˆˆ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (HTML๊ณผ JavaScript๋ฅผ ํ•œ ํŒŒ์ผ์— ์ž‘์„ฑ)
    • DOM๊ณผ ๋‹ค๋ฅด๊ฒŒ CSS, JSX ๋ฌธ๋ฒ•๋งŒ์„ ๊ฐ€์ง€๊ณ  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • JSX ์—†์ด๋„ React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ์–ด์„œ ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ ์ข‹์€ JSX๋ฅผ ์‚ฌ์šฉํžŒ๋‹ค.
// ์ผ๋ฐ˜ React ์ฝ”๋“œ
return React.createElement (
  "hi", null, `Hello, ${formatName(str)}!`
)

// JSX ํ™œ์šฉํ•œ React ์ฝ”๋“œ
return <h1>Hello, {formatName(user)}!</h1>;

๐ŸŒฟ JSX ๋ฌธ๋ฒ• ๊ทœ์น™

  • ํ•˜๋‚˜์˜ ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ํฌํ•จ๋œ๋‹ค. (์ตœ์ƒ์œ„์—์„œ opening tag์™€ closing tag๋กœ ๊ฐ์‹ธ์ค˜์•ผ ํ•จ โžก๏ธ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋ฆฌํ„ด ๊ฐ’์€ ํ•˜๋‚˜์˜ JSX ํ‘œํ˜„์‹์ด์–ด์•ผ ํ•œ๋‹ค.)
<div> //opening tag
  <div>
    <h1>Hello</h1>
  </div>
  <div>
    <h1>World</h1>
  </div>
</div> //closing tag
  • ์—˜๋ฆฌ๋จผํŠธ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ, className์œผ๋กœ ํ‘œ๊ธฐ
// class๋กœ ํ‘œ๊ธฐํ•  ์‹œ React์—์„œ๋Š” JavaScript ํด๋ž˜์Šค๋กœ ๋ฐ›์•„๋“ค์ž„
<div className="greeting">Hello!</div>
  • JavaScript ํ‘œํ˜„์‹ ์‚ฌ์šฉ ์‹œ, ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉ
function App() {
  const name = 'Hazel';
  
  return (
    <div>
      Hello, {name} // {} ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ธ์‹
    </div>
  );
}
  • ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ (PascalCase)
function Hello() { // PascalCase
  return <div>Hello!</div>
}

function HelloWorld() {
  return <Hello/>; // ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑ ์‹œ ์ผ๋ฐ˜ HTML ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ธ์‹
}
  • ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์€ if๋ฌธ์ด ์•„๋‹Œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋Š” ํ‘œํ˜„์‹์ด๋ฉฐ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ)
<div>
  {
    (1+1 === 2) ? (<p>์ •๋‹ต</p>) : (<p>ํƒˆ๋ฝ</p>)
  }
</div>
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ HTMl ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ, map() ํ•จ์ˆ˜๋ฅผ ์ด์šฉ
const posts = [
  {id: 1, title: 'Hi', content: 'Welcome!'},
  {id: 2, title: 'Hello', content: 'World!'}
];

function Blog() {
  const content = posts.map((post) =>
  	<div key={post.id}>
      <h3>{post.title}</h3>
      <p>{post.content}</p>
  	</div>
  );
                            
  return (
    <div>{content}</div>
  );
}
// ์ด๋ ‡๊ฒŒ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
function Blog() {
  const postToElement = (post) => (
    return (
      <div key={post.id}>
        <h3>{post.title}</h3>
        <p>{post.content}</p>
      </div>
    );
  );

  return (
    <div className="App">
      <h1>Hello JSX</h1>
      {posts.map(postToElement)}
    </div>
  );
}

๐ŸŒฑ Create React App


  • ์ •์˜ : SPA(Single Page Application)์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง„ ํˆด ์ฒด์ธ์ด๋‹ค.

  • React ์™ธ์—๋„ Babel(JS ์ปดํŒŒ์ผ๋Ÿฌ), Jest(ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ), PostCSS(css ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ), Webpack(๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ) ๋“ฑ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, React๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์…‹ํŒ…์„ ํˆด ์ฒด์ธ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค.

npx create-react-app [project_name]

๐ŸŒฑ ์•Œ๊ฒŒ๋œ ์  & ๋Š๋‚€ ์ 


  • React์˜ 3๊ฐ€์ง€ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๊ณ , ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • JSX๊ฐ€ ์™œ ๋ช…์‹œ์ ์ธ์ง€ ์ดํ•ดํ•˜๊ณ , ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • React ์ปดํฌ๋„ŒํŠธ(React Component)์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๊ณ , ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŒฑ ์ถ”๊ฐ€ ํ•™์Šต


  • ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ์—์„œ key ์ฐพ์•„๋ณด๊ธฐ
  • Warning : Each child in a list should have a unique "key" prop. ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
  • Component ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ

| ์ฐธ๊ณ ์ž๋ฃŒ |

  • CodeStates - UrClass
profile
FE developer

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