<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title> 개발 공부 공간</title>
    <link>https://d-yong.tistory.com/</link>
    <description>개발 공부 공간</description>
    <language>ko</language>
    <pubDate>Wed, 8 Apr 2026 20:23:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor> 개발새발</managingEditor>
    <image>
      <title> 개발 공부 공간</title>
      <url>https://tistory1.daumcdn.net/tistory/2854817/attach/2e8945318be54b1aa7d8de76c423ab36</url>
      <link>https://d-yong.tistory.com</link>
    </image>
    <item>
      <title>[React] component Life Cycle / useEffect를 통한 component Life Cycle 제어</title>
      <link>https://d-yong.tistory.com/143</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Component Life Cycle&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 컴포넌트의 라이프사이클은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mount -&amp;gt; Update -&amp;gt; Unmout로 진행된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mount : 컴포넌트가 최초에 렌더링 됨&lt;/li&gt;
&lt;li&gt;Update : 컴포넌트가 리렌더링 됨&lt;/li&gt;
&lt;li&gt;Unmount : 컴포넌트가 화면에서 제거 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;useEffect를&amp;nbsp;통한&amp;nbsp;component&amp;nbsp;Life&amp;nbsp;Cycle&amp;nbsp;제어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useEffect : &amp;nbsp; 두 번째 인수인 [] 배열의 값이 바뀌면, 첫 번째 매개변수의 함수를 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;pre id=&quot;code_1725177524221&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  useEffect(() =&amp;gt; {
    console.log(`count: ${count} / input ${input}`);
  }, [count, input]); // 의존성 배열, dependency array(deps)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) 클릭을 홀수 번 할 때 없어지는 컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1725177804027&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState, useEffect, useRef } from &quot;react&quot;;
import &quot;./App.css&quot;;
import Even from &quot;./components/Even&quot;;

function App() {
  const [count, setCount] = useState(0);
  const isMount = useRef(false);

  // 1. 마운트 : 탄생
  useEffect(() =&amp;gt; {
    console.log(&quot;App Mount&quot;);
  }, []);

  // 2. 업데이트 : 변화, 리렌더링
  useEffect(() =&amp;gt; {
    if (!isMount.current) {
      isMount.current = true;
      return;
    }
    console.log(&quot;App Update&quot;);
    console.log(&quot;Update&quot;);
  }); // deps 생략하면, 리렌더링 시 매번 실행 됨

  const onClickButton = () =&amp;gt; {
    setCount(count + 1); // setState는 비동기로 실행되기 때문에
    console.log(count); // count값이 바로 변하지 않음
  };

  return (
    &amp;lt;div className=&quot;App&quot;&amp;gt;
      &amp;lt;h1&amp;gt;Simple Counter {count}&amp;lt;/h1&amp;gt;
      &amp;lt;button onClick={onClickButton}&amp;gt;클릭&amp;lt;/button&amp;gt;
      &amp;lt;section&amp;gt;{count % 2 === 0 ? &amp;lt;Even /&amp;gt; : null}&amp;lt;/section&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Even.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1725177833088&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect } from &quot;react&quot;;

const Even = () =&amp;gt; {
  useEffect(() =&amp;gt; {
    console.log(&quot;Even Mount&quot;);
    return () =&amp;gt; {
      // 3. 언마운트 : 제거
      // 클린업, 정리함수
      console.log(&quot;Even Unmount&quot;);
    };
  }, []);
  return &amp;lt;div&amp;gt;짝수입니다.&amp;lt;/div&amp;gt;;
};

export default Even;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>component</category>
      <category>component lifecycle</category>
      <category>LifeCycle</category>
      <category>Mount</category>
      <category>react</category>
      <category>unmount</category>
      <category>Update</category>
      <category>useEffect</category>
      <category>리액트</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/143</guid>
      <comments>https://d-yong.tistory.com/143#entry143comment</comments>
      <pubDate>Sun, 1 Sep 2024 17:04:29 +0900</pubDate>
    </item>
    <item>
      <title>[React] component 기본 구조 / State Lifting</title>
      <link>https://d-yong.tistory.com/142</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리액트의 데이터(state등)는 부모 component에서 자식 component로 내려간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 형제 component끼리 상태를 공유하고 싶으면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 부모 component로 statef를 올린다. (= State Lifting)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 app을 만들어보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWJwBx/btsJmfGW9S9/N59CRfMgjtf4GKF5xRhVa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWJwBx/btsJmfGW9S9/N59CRfMgjtf4GKF5xRhVa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWJwBx/btsJmfGW9S9/N59CRfMgjtf4GKF5xRhVa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWJwBx%2FbtsJmfGW9S9%2FN59CRfMgjtf4GKF5xRhVa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;410&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개의 자식 컴포넌트가 count값을 알아야 하기 때문에 부모 컴포넌트인 App으로 state lifting을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBk6Px/btsJnibMoBt/25eRPjIQ03JxMVHnMMHdH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBk6Px/btsJnibMoBt/25eRPjIQ03JxMVHnMMHdH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBk6Px/btsJnibMoBt/25eRPjIQ03JxMVHnMMHdH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBk6Px%2FbtsJnibMoBt%2F25eRPjIQ03JxMVHnMMHdH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;332&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1725173615460&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState } from &quot;react&quot;;
import &quot;./App.css&quot;;
import Viewer from &quot;./components/Viewer&quot;;
import Controller from &quot;./components/Controller&quot;;

function App() {
  const [count, setCount] = useState(0); // State Lifting

  const onClickButton = (value) =&amp;gt; {
    setCount(count + value);
  };

  return (
    &amp;lt;div className=&quot;App&quot;&amp;gt;
      &amp;lt;h1&amp;gt;Simple Counter&amp;lt;/h1&amp;gt;
      &amp;lt;section&amp;gt;
        &amp;lt;Viewer count={count} /&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;section&amp;gt;
        &amp;lt;Controller onClickButton={onClickButton} /&amp;gt;
      &amp;lt;/section&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Viewer.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1725173635292&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Viewer = ({ count }) =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;div&amp;gt;현재 카운트 :&amp;lt;/div&amp;gt;
      &amp;lt;h1&amp;gt;{count}&amp;lt;/h1&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Viewer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1725173649583&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Controller = ({ onClickButton }) =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;button
        onClick={() =&amp;gt; {
          onClickButton(-1);
        }}
      &amp;gt;
        -1
      &amp;lt;/button&amp;gt;
      &amp;lt;button
        onClick={() =&amp;gt; {
          onClickButton(-10);
        }}
      &amp;gt;
        -10
      &amp;lt;/button&amp;gt;
      &amp;lt;button
        onClick={() =&amp;gt; {
          onClickButton(-100);
        }}
      &amp;gt;
        -100
      &amp;lt;/button&amp;gt;
      &amp;lt;button
        onClick={() =&amp;gt; {
          onClickButton(100);
        }}
      &amp;gt;
        +100
      &amp;lt;/button&amp;gt;
      &amp;lt;button
        onClick={() =&amp;gt; {
          onClickButton(10);
        }}
      &amp;gt;
        +10
      &amp;lt;/button&amp;gt;
      &amp;lt;button
        onClick={() =&amp;gt; {
          onClickButton(1);
        }}
      &amp;gt;
        +1
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Controller;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>javascript</category>
      <category>js</category>
      <category>lifting</category>
      <category>react</category>
      <category>state</category>
      <category>statelifting</category>
      <category>리액트</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/142</guid>
      <comments>https://d-yong.tistory.com/142#entry142comment</comments>
      <pubDate>Sun, 1 Sep 2024 15:54:33 +0900</pubDate>
    </item>
    <item>
      <title>[React] useRef로 component 내에 reference객체 생성</title>
      <link>https://d-yong.tistory.com/141</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;useRef vs useState&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 56px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;useRef&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;useState&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Reference 객체를 생성&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;State를 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;컴포넌트 내부의 변수로 활용 가능&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;컴포넌트 내부의 변수로 활용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;값이 바뀌어도 컵포넌트 리렌더링 발생하지 않음&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;값이 바뀌면 컵포넌트 리렌더링 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; input tag에 DOM 요소를 reference 객체에 저장하여 input값이 빈 경우 focus 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725153752503&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState, useRef } from &quot;react&quot;;

const Register = () =&amp;gt; {
  const [input, setInput] = useState({
    name: &quot;&quot;,
    birth: &quot;&quot;,
    country: &quot;&quot;,
    bio: &quot;&quot;,
  });
  const countRef = useRef(0);
  const inputRef = useRef();
  console.log(input);

  // 통합 이벤트 핸들러
  const onChange = (e) =&amp;gt; {
    countRef.current++;
    current++;
    console.log(&quot;countref current&quot;, countRef.current);
    console.log(&quot;current&quot;, current);
    setInput({
      ...input,
      [e.target.name]: e.target.value, // 대괄호를 쓰는 이유는 key로 사용 한다는 의미
    });
  };

  const onSubmit = () =&amp;gt; {
    if (input.name === &quot;&quot;) {
      console.log(inputRef.current); // &amp;lt;input name=&quot;name&quot; placeholder=&quot;이름&quot; value=&quot;&quot;&amp;gt;
      // 이름을 입력하면 DOM 요소 포커스
      inputRef.current.focus();
    }
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          ref={inputRef} // input tag DOM 요소가 inputRef 오브젝트에 저장 됨
          name=&quot;name&quot;
          value={input.name}
          onChange={onChange}
          placeholder={&quot;이름&quot;}
        /&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          name=&quot;birth&quot;
          value={input.birth}
          type=&quot;date&quot;
          onChange={onChange}
        /&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;select name=&quot;country&quot; value={input.country} onChange={onChange}&amp;gt;
          &amp;lt;option value=&quot;&quot;&amp;gt;&amp;lt;/option&amp;gt;
          &amp;lt;option value=&quot;KR&quot;&amp;gt;한국&amp;lt;/option&amp;gt;
          &amp;lt;option value=&quot;US&quot;&amp;gt;미국&amp;lt;/option&amp;gt;
          &amp;lt;option value=&quot;UK&quot;&amp;gt;영국&amp;lt;/option&amp;gt;
          &amp;lt;option value=&quot;CA&quot;&amp;gt;캐나다&amp;lt;/option&amp;gt;
        &amp;lt;/select&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;textarea name=&quot;bio&quot; value={input.bio} onChange={onChange} /&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;button onClick={onSubmit}&amp;gt;제출&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Register;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일내의(=컴포넌트의 외부에) let 변수와 userRef의 차이점은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; let의 경우 전역변수 처럼 하나의 컴포넌트가 여러개로 사용될 경우 let변수를 공유하게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; userRef의 경우 같은 컴포넌트라도 각각이 useRef를 가지고 있음&lt;/p&gt;</description>
      <category>React</category>
      <category>component</category>
      <category>focus</category>
      <category>react</category>
      <category>useRef</category>
      <category>리액트</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/141</guid>
      <comments>https://d-yong.tistory.com/141#entry141comment</comments>
      <pubDate>Sun, 1 Sep 2024 10:26:28 +0900</pubDate>
    </item>
    <item>
      <title>[React] Comonent 리랜더링 조건 / State로 Component 상태 관리</title>
      <link>https://d-yong.tistory.com/140</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 컴포넌트는 아래 조건이 충족되면 Re-Rendering 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;1. 내 state 값이 변경 될 때&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2. props 값이 변경 될 때&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;3. 부모 컴포넌트가 Re-Rendering 될 때&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) react의 useState hook을 이용하여 component의 상태를 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App Component에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 버튼 클릭 시 on / off 상태 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 버튼 클릭 시 count 수 증가 상태 관리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdYLNC/btsI6xnzOpn/akF6uEwRvQDeKQWASdKQVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdYLNC/btsI6xnzOpn/akF6uEwRvQDeKQWASdKQVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdYLNC/btsI6xnzOpn/akF6uEwRvQDeKQWASdKQVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdYLNC%2FbtsI6xnzOpn%2FakF6uEwRvQDeKQWASdKQVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;469&quot; height=&quot;308&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eh0xD/btsI7Xyooln/as6BU9nRLq8vVAguW97Uzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eh0xD/btsI7Xyooln/as6BU9nRLq8vVAguW97Uzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eh0xD/btsI7Xyooln/as6BU9nRLq8vVAguW97Uzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEh0xD%2FbtsI7Xyooln%2Fas6BU9nRLq8vVAguW97Uzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;275&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723963008960&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import &quot;./App.css&quot;;
import { useState } from &quot;react&quot;;

function App() {
  // 컴보턴트 리렌더링 =&amp;gt; 화면 바뀜
  const [count, setCount] = useState(0);
  const [light, setLight] = useState(&quot;OFF&quot;);
  return (
    &amp;lt;&amp;gt;
      &amp;lt;div&amp;gt;
        {light === &quot;ON&quot; ? (
          &amp;lt;h1 style={{ backgroundColor: &quot;orange&quot; }}&amp;gt;ON&amp;lt;/h1&amp;gt;
        ) : (
          &amp;lt;h1 style={{ backgroundColor: &quot;gray&quot; }}&amp;gt;OFF&amp;lt;/h1&amp;gt;
        )}
        &amp;lt;button
          onClick={() =&amp;gt; {
            setLight(light === &quot;ON&quot; ? &quot;OFF&quot; : &quot;ON&quot;);
          }}
        &amp;gt;
          {light === &quot;ON&quot; ? &quot;끄기&quot; : &quot;켜기&quot;}
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;h1&amp;gt;{count}&amp;lt;/h1&amp;gt;
        &amp;lt;button
          onClick={() =&amp;gt; {
            setCount(count + 1);
          }}
        &amp;gt;
          +
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 구현하면 내 state 값이 변경 될 때 component가 Re-Rendering특성을 가지고 있기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;count만 변경해도가 on/off가 Re-Rendering된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Developer Tools를 크롬에 설치하여 확인해보면 count버튼을 눌러도 on/off쪽이 다시 렌더링 된다. =&amp;gt; 매우 효율적&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2684&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wQ16F/btsI6SkAeW3/Ngjfl5D4UkANzvHsUsApk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wQ16F/btsI6SkAeW3/Ngjfl5D4UkANzvHsUsApk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wQ16F/btsI6SkAeW3/Ngjfl5D4UkANzvHsUsApk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwQ16F%2FbtsI6SkAeW3%2FNgjfl5D4UkANzvHsUsApk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2684&quot; height=&quot;518&quot; data-origin-width=&quot;2684&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 아래와 같이 component를 나눠서 구조를 재설계하면 비효율적인 랜더링을 피할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myyD2/btsI7dPpu0m/z7G7yXN3771iiztsU42W31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myyD2/btsI7dPpu0m/z7G7yXN3771iiztsU42W31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myyD2/btsI7dPpu0m/z7G7yXN3771iiztsU42W31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyyD2%2FbtsI7dPpu0m%2Fz7G7yXN3771iiztsU42W31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;344&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App Component&lt;/p&gt;
&lt;pre id=&quot;code_1723963656581&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import &quot;./App.css&quot;;

import Bulb from &quot;./components/Bulb&quot;;
import Counter from &quot;./components/Counter&quot;;

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Bulb /&amp;gt;
      &amp;lt;Counter /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bulb Component&lt;/p&gt;
&lt;pre id=&quot;code_1723963673518&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState } from &quot;react&quot;;

const Bulb = () =&amp;gt; {
  const [light, setLight] = useState(&quot;OFF&quot;);

  return (
    &amp;lt;div&amp;gt;
      {light === &quot;ON&quot; ? (
        &amp;lt;h1 style={{ backgroundColor: &quot;orange&quot; }}&amp;gt;ON&amp;lt;/h1&amp;gt;
      ) : (
        &amp;lt;h1 style={{ backgroundColor: &quot;gray&quot; }}&amp;gt;OFF&amp;lt;/h1&amp;gt;
      )}
      &amp;lt;button
        onClick={() =&amp;gt; {
          setLight(light === &quot;ON&quot; ? &quot;OFF&quot; : &quot;ON&quot;);
        }}
      &amp;gt;
        {light === &quot;ON&quot; ? &quot;끄기&quot; : &quot;켜기&quot;}
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Bulb;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Counter Component&lt;/p&gt;
&lt;pre id=&quot;code_1723963711145&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;import { useState } from &quot;react&quot;;

const Counter = () =&amp;gt; {
  const [count, setCount] = useState(0);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;{count}&amp;lt;/h1&amp;gt;
      &amp;lt;button
        onClick={() =&amp;gt; {
          setCount(count + 1);
        }}
      &amp;gt;
        +
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Counter;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 구현해 주면 각각 컴포넌트가 독립적으로 Re-Rendering 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2554&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0cnKr/btsI6Xe39Wf/Kq3uvvlhPqWMO7GrNsEO21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0cnKr/btsI6Xe39Wf/Kq3uvvlhPqWMO7GrNsEO21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0cnKr/btsI6Xe39Wf/Kq3uvvlhPqWMO7GrNsEO21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0cnKr%2FbtsI6Xe39Wf%2FKq3uvvlhPqWMO7GrNsEO21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2554&quot; height=&quot;608&quot; data-origin-width=&quot;2554&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2694&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNiOjO/btsI8hQUXYK/B9CzwF6tXR4jlEtgXhgQH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNiOjO/btsI8hQUXYK/B9CzwF6tXR4jlEtgXhgQH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNiOjO/btsI8hQUXYK/B9CzwF6tXR4jlEtgXhgQH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNiOjO%2FbtsI8hQUXYK%2FB9CzwF6tXR4jlEtgXhgQH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2694&quot; height=&quot;426&quot; data-origin-width=&quot;2694&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>React</category>
      <category>react</category>
      <category>리액트</category>
      <category>컴포넌트</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/140</guid>
      <comments>https://d-yong.tistory.com/140#entry140comment</comments>
      <pubDate>Sun, 18 Aug 2024 15:52:09 +0900</pubDate>
    </item>
    <item>
      <title>[React] Props를 통해 Component로 데이터 전달</title>
      <link>https://d-yong.tistory.com/139</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달 할 때 Props를 이용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서 데이터(Props)는 상위 컴포넌트에서 아래 컴포넌트로 흐른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xY2H3/btsITu44awF/5Eklya7AutknESlqleghok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xY2H3/btsITu44awF/5Eklya7AutknESlqleghok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xY2H3/btsITu44awF/5Eklya7AutknESlqleghok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxY2H3%2FbtsITu44awF%2F5Eklya7AutknESlqleghok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;344&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; Props를 전달하는 방법은 두 가지&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 객체 형태로 전달&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1722738446796&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import &quot;./App.css&quot;;
import Button from &quot;./components/Button&quot;;

function App() {
  const buttonProps = {
    text: &quot;메일&quot;,
    color: &quot;red&quot;,
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;Button {...buttonProps} /&amp;gt;
      &amp;lt;Button text={&quot;카페&quot;} color=&quot;blue&quot; /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1722738503344&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Button = (props) =&amp;gt; {
  console.log(props); // {text: '메일', color: 'red'}
  return (
    &amp;lt;button style={{ color: props.color }}&amp;gt;
      {props.text} - {props.color?.toUpperCase()}
    &amp;lt;/button&amp;gt;
  );
};

Button.defaultProps = {
  color: &quot;black&quot;,
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2.  구조분해 할당으로 전달&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1722738777887&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 구조분해 할당
const Button = ({ text, color, children }) =&amp;gt; {
  return (
    &amp;lt;button style={{ color: color }}&amp;gt;
      {text} - {color.toUpperCase()}
    &amp;lt;/button&amp;gt;
  );
};

Button.defaultProps = {
  color: &quot;black&quot;,
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt9eym/btsI0Kl5Kba/6nVZ1FNA81XQmFJEovot4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt9eym/btsI0Kl5Kba/6nVZ1FNA81XQmFJEovot4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt9eym/btsI0Kl5Kba/6nVZ1FNA81XQmFJEovot4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt9eym%2FbtsI0Kl5Kba%2F6nVZ1FNA81XQmFJEovot4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;239&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>React</category>
      <category>javascript</category>
      <category>JSX</category>
      <category>props</category>
      <category>react</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/139</guid>
      <comments>https://d-yong.tistory.com/139#entry139comment</comments>
      <pubDate>Sun, 4 Aug 2024 11:34:43 +0900</pubDate>
    </item>
    <item>
      <title>[React] Component &amp;amp; JSX</title>
      <link>https://d-yong.tistory.com/138</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Component&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript에서 html을 리턴하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 첫 글자는 대문자로 작성해야 컴포넌트로 인식한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vite를 통해 생성한 프로젝트 를 실행시켰을 때 원리를 간단히 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. index.html파일에서 main.jsx실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GcaXg/btsITSkhivG/2oO4xVEhcVkhRnHGs3yS6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GcaXg/btsITSkhivG/2oO4xVEhcVkhRnHGs3yS6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GcaXg/btsITSkhivG/2oO4xVEhcVkhRnHGs3yS6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGcaXg%2FbtsITSkhivG%2F2oO4xVEhcVkhRnHGs3yS6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1422&quot; height=&quot;740&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. main.jsx에서 App Component 렌더링&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBwSVj/btsIUDtr6re/wTMP20NypxXR3HeYurpyPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBwSVj/btsIUDtr6re/wTMP20NypxXR3HeYurpyPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBwSVj/btsIUDtr6re/wTMP20NypxXR3HeYurpyPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBwSVj%2FbtsIUDtr6re%2FwTMP20NypxXR3HeYurpyPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;364&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. App Component(함수)는 html을 리턴&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;1274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnZjT9/btsIUrT5TnN/pUUy3OgKSudvbR3jsrrgJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnZjT9/btsIUrT5TnN/pUUy3OgKSudvbR3jsrrgJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnZjT9/btsIUrT5TnN/pUUy3OgKSudvbR3jsrrgJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnZjT9%2FbtsIUrT5TnN%2FpUUy3OgKSudvbR3jsrrgJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;1274&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JSX&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX는 html과 JavaScript를 혼용해서 사용할 수 있도록 JavaScript를 eXtension한 것&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;JSX&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;주의&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;사항&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;중괄호&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;내부에는&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;자바스크립트&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;표현식만&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;넣을&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;수&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;있다&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;. {&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;짝수&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;홀수&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;숫자&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;문자열&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;배열&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;값만&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;렌더링&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;된다&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;. (&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;객체는&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;오류&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;발생&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3.&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;모든&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;태그는&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;닫혀있어야&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;한다&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4.&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;최상위&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;태그는&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;반드시&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;하나여야만&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;한다&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>React</category>
      <category>component</category>
      <category>html</category>
      <category>javascript</category>
      <category>js</category>
      <category>JSX</category>
      <category>react</category>
      <category>vite</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/138</guid>
      <comments>https://d-yong.tistory.com/138#entry138comment</comments>
      <pubDate>Sun, 4 Aug 2024 11:13:06 +0900</pubDate>
    </item>
    <item>
      <title>[React] React App 생성하기 (+ Vite)</title>
      <link>https://d-yong.tistory.com/137</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Vite(비트)를 이용하면 React의 기본적인 패키지를 갖춘 프로젝트를 쉽게 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. $:&amp;nbsp;npm&amp;nbsp;create&amp;nbsp;vite@latest&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 실행 후 React 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JnMzx/btsIO4lKGbJ/U39pLvAWm1dzxKaUmeKPj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JnMzx/btsIO4lKGbJ/U39pLvAWm1dzxKaUmeKPj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JnMzx/btsIO4lKGbJ/U39pLvAWm1dzxKaUmeKPj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJnMzx%2FbtsIO4lKGbJ%2FU39pLvAWm1dzxKaUmeKPj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;319&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 언어 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMV4Ve/btsIOVvGHGf/Crq8DpWeMTSJMAwxTXmgs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMV4Ve/btsIOVvGHGf/Crq8DpWeMTSJMAwxTXmgs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMV4Ve/btsIOVvGHGf/Crq8DpWeMTSJMAwxTXmgs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMV4Ve%2FbtsIOVvGHGf%2FCrq8DpWeMTSJMAwxTXmgs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;252&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트의 기본 틀이 만들어졌다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQxmyK/btsIPmmjZ2m/ZVqeCGchaVwkQQC7twacn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQxmyK/btsIPmmjZ2m/ZVqeCGchaVwkQQC7twacn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQxmyK/btsIPmmjZ2m/ZVqeCGchaVwkQQC7twacn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQxmyK%2FbtsIPmmjZ2m%2FZVqeCGchaVwkQQC7twacn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;592&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. $: npm i&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json에 명시되어 있는 dependencies를 설치하기 위해 install 명령어를 입력해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;1058&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zVOrD/btsIPjb1A47/X8sdnSK4nuimChOAKzqxYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zVOrD/btsIPjb1A47/X8sdnSK4nuimChOAKzqxYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zVOrD/btsIPjb1A47/X8sdnSK4nuimChOAKzqxYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzVOrD%2FbtsIPjb1A47%2FX8sdnSK4nuimChOAKzqxYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;504&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;1058&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm i를 통해 필요한 lib들이 패키지 내에 설치가 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;1286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ARpQp/btsIPAdzT3l/klWjuaePlPLrG5GdHTALt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ARpQp/btsIPAdzT3l/klWjuaePlPLrG5GdHTALt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ARpQp/btsIPAdzT3l/klWjuaePlPLrG5GdHTALt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FARpQp%2FbtsIPAdzT3l%2FklWjuaePlPLrG5GdHTALt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;210&quot; height=&quot;628&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;1286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. npm run dev를 입력하 여 React App 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 로컬에서 React App이 실행된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;1045&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0jEKP/btsIQdINWL1/y1LMO2ttAlGqvrWRcuOMY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0jEKP/btsIQdINWL1/y1LMO2ttAlGqvrWRcuOMY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0jEKP/btsIQdINWL1/y1LMO2ttAlGqvrWRcuOMY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0jEKP%2FbtsIQdINWL1%2Fy1LMO2ttAlGqvrWRcuOMY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1662&quot; height=&quot;1045&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;1045&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>React</category>
      <category>react</category>
      <category>vite</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/137</guid>
      <comments>https://d-yong.tistory.com/137#entry137comment</comments>
      <pubDate>Sun, 28 Jul 2024 13:14:37 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript][기초] Promise, async 비동기 처리</title>
      <link>https://d-yong.tistory.com/136</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 싱글 스레드로 작동하기 때문에 &lt;b&gt;Stack에서 코드를 순차적으로 실행시키고 Web APIs에 비동기 작업을 위임한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web APIs에서 완료 된 비동기 작업들은 Callback queue에 할당되고 Event loop를 통해 Stack에 등록되면 callback 함수가 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/74f1G/btsIPmzMx2D/YZ8R706HPrvHguCrxyBe7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/74f1G/btsIPmzMx2D/YZ8R706HPrvHguCrxyBe7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/74f1G/btsIPmzMx2D/YZ8R706HPrvHguCrxyBe7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F74f1G%2FbtsIPmzMx2D%2FYZ8R706HPrvHguCrxyBe7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;543&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.  Promise&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;add10 함수 호출 2초후에 executor가 실행 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1720926850830&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function add10(num) {
  // Promise는 비동기 작업을 감싸는 객체
  const promise = new Promise((resolve, reject) =&amp;gt; {
    // executor
    // 비동기 작업을 실행하는 함수
    setTimeout(() =&amp;gt; {
      if (typeof num === &quot;number&quot;) {
        console.log(&quot;executor&quot;);
        resolve(num + 10); // 성공 후 num + 10 값을 then으로 보냄
      } else {
        reject(&quot;Not Number type&quot;); // 실패 catch로 error message를 보냄
      }
    }, 2000);
  });

  return promise;
}

add10(1)
  .then((result) =&amp;gt; {
    console.log(&quot;first then&quot;, result);
    return add10(result);
  })
  .then((result) =&amp;gt; {
    console.log(&quot;second then&quot;, result);
    return add10(result);
  })
  .then((result) =&amp;gt; {
    console.log(&quot;third then&quot;, result);
    return add10(result);
  })
  .then((result) =&amp;gt; {
    console.log(&quot;final then&quot;, result);
  })
  .catch((error) =&amp;gt; {
    console.log(error);
  });


// 출력
// executor
// first then 11
// executor
// second then 21
// executor
// third then 31
// executor
// final then 41&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. async, await&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;printData()함수는 Promise객체를 리턴하고 getData()함수가 끝날 때 까지 기다린다.&lt;/p&gt;
&lt;pre id=&quot;code_1720926813683&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getData() {
  return new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      resolve({
        name: &quot;DY&quot;,
        id: &quot;async&quot;,
      });
    }, 1500);
  });
}

// async
// 어떤 함수가 Promise를 반환하도록 변환해주는 키워드

// await
// async 함수 내에서만 사용이 가능한 키워드
// 비동기 함수가 다 처리될 때 까지 기다리는 역할

async function printData() {
  console.log(&quot;start&quot;);
  const data = await getData();
  console.log(data); // {name: 'DY', id: 'async'}
  console.log(&quot;end&quot;);
}

console.log(printData()); // Promise&amp;nbsp;{&amp;lt;pending&amp;gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>async</category>
      <category>await</category>
      <category>javascript</category>
      <category>Promise</category>
      <category>비동기</category>
      <category>비동기프로그래밍</category>
      <category>자바스크립트</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/136</guid>
      <comments>https://d-yong.tistory.com/136#entry136comment</comments>
      <pubDate>Sun, 28 Jul 2024 11:42:26 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript][기초] 배열 변형 메소드 (filter, map, sort, toSorted)</title>
      <link>https://d-yong.tistory.com/135</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. filter&lt;br /&gt;기존 배열에서 조건을 만족하는 요소들만 필터링하여 &quot;새로운 배열&quot;로 반환&lt;/p&gt;
&lt;pre id=&quot;code_1725779889737&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;let arr1 = [
  { name: &quot;dy lee&quot;, address: &quot;KR&quot; },
  { name: &quot;sy im&quot;, address: &quot;KR&quot; },
  { name: &quot;yj kim&quot;, address: &quot;US&quot; },
];

const bundangPeople = arr1.filter((item) =&amp;gt; item.address === &quot;KR&quot;);

console.log(bundangPeople);
// [
//     {
//         &quot;name&quot;: &quot;dy lee&quot;,
//         &quot;address&quot;: &quot;KR&quot;
//     },
//     {
//         &quot;name&quot;: &quot;sy im&quot;,
//         &quot;address&quot;: &quot;KR&quot;
//     }
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. map&lt;br /&gt;배열의 모든 요소를 순회하면서, 각각 콜백함수를 실행하고 그 결과값들을 모아서 &quot;새로운 배열&quot;로 반환&lt;/p&gt;
&lt;pre id=&quot;code_1725779893826&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;let arr2 = [1, 2, 3];

const mapResult1 = arr2.map((item, idx, arr) =&amp;gt; {
  console.log(idx, item);
  return item * 2;
});
console.log(mapResult1); // [2, 4, 6]

let names = arr1.map((item) =&amp;gt; item.name);
console.log(names); // ['dy lee', 'sy im', 'yj kim']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. sort&lt;br /&gt;배열을 &lt;b&gt;사전순으로&lt;/b&gt; 정렬하는 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1720926929358&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr3 = [&quot;z&quot;, &quot;f&quot;, &quot;a&quot;];
arr3.sort();
console.log(arr3); // ['a', 'f', 'z']

let arrNumber = [10, 3, 21, 5, 4];

// 숫자도 사전순으로 정렬되는 문제가 있음
console.log(arrNumber.sort()); // [10, 21, 3, 4, 5]

// 오름차순 정렬
arrNumber.sort((a, b) =&amp;gt; {
  if (a &amp;gt; b) {
    return 1;
  } else if (a &amp;lt; b) {
    return -1;
  } else {
    return 0;
  }
});
console.log(arrNumber); // [3, 4, 5, 10, 21]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. toSorted&lt;br /&gt;원본 배열은 그대로 두고, 정렬 된 새로운 배열을 반환&lt;/p&gt;
&lt;pre id=&quot;code_1720926961063&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr5 = [&quot;e&quot;, &quot;a&quot;, &quot;g&quot;, &quot;z&quot;];
const sortedArr = arr5.toSorted();
console.log(arr5); // ['e', 'a', 'g', 'z']
console.log(sortedArr); // ['a', 'e', 'g', 'z']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. join&lt;br /&gt;배열의 모든 요소를 하나의 문자열로합쳐서 반환하는 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1720926983605&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr6 = [&quot;hi&quot;, &quot;i am&quot;, &quot;DY lee&quot;];
const joined = arr6.join();
console.log(joined); // hi,i am,DY lee

const joinedDash = arr6.join(&quot;-&quot;);
console.log(joinedDash); // hi-i am-DY lee&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JavaScript</category>
      <category>Filter</category>
      <category>javascript</category>
      <category>join</category>
      <category>map</category>
      <category>sort</category>
      <category>tosorted</category>
      <category>배열</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/135</guid>
      <comments>https://d-yong.tistory.com/135#entry135comment</comments>
      <pubDate>Sun, 14 Jul 2024 12:16:41 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript][기초] 배열 순회탐색 메소드 (forEach, includes, indexOf, findIndex, find)</title>
      <link>https://d-yong.tistory.com/134</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. forEach&lt;br /&gt;배열의 모든 요소를 순회하면서, 각각의 요소에 특정 동작을 수행시키는 메서드&lt;/p&gt;
&lt;pre id=&quot;code_1720926357963&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr1 = [1, 2, 3];
arr1.forEach(function (item, idx, arr) {
  console.log(item * 2);
  // 2
  // 4
  // 6
});

// 아래와 같이 응용가능
let doubledArr = [];
arr1.forEach((item) =&amp;gt; {
  doubledArr.push(item * 2);
});
console.log(doubledArr); // [2, 4, 6]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;includes&lt;br /&gt;배열에 특정 요소가 있는지 확인하는 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1720926421252&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr2 = [1, 2, 3];
console.log(arr2.includes(3)); // true
console.log(arr2.includes(11)); // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. indexOf&lt;br /&gt;특정 요소의 인덱스(요소)를 찾아서 반환하는 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1720926454959&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr3 = [1, 2, 3];
const index = arr3.indexOf(2);
console.log(index, arr3[index]); // 1 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. findIndex&lt;br /&gt;모든 요소를 순회하면서, &lt;b&gt;콜백함수의 조건을 가장 먼저 만족하는 경우&lt;/b&gt;&lt;br /&gt;특정 요소의 인덱스(위치)를 반환하는 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1720926547648&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr4 = [1, 2, 3];
const findedIndex = arr4.findIndex((item) =&amp;gt; {
  if (item === 2) return true;
});
console.log(findedIndex); // 1

const oddNumberIndex = arr4.findIndex((item) =&amp;gt; item % 2 !== 0);
console.log(oddNumberIndex); // 0

// 객체 배열인 경우
let objectArray = [{ name: &quot;dy lee&quot; }, { name: &quot;sy im&quot; }];
console.log(objectArray.indexOf(1)); // -1
console.log(objectArray.findIndex((item) =&amp;gt; item.name === &quot;sy im&quot;)); // 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. find&lt;br /&gt;모든 요소를 순회하면서 콜백 함수를 만족하는 경우, 해당 요소(객체)를 그대로 반환&lt;/p&gt;
&lt;pre id=&quot;code_1720926604592&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let objectArray2 = [{ name: &quot;dy lee&quot; }, { name: &quot;sy im&quot; }];

let findedObject = objectArray2.find((item) =&amp;gt; item.name === &quot;dy lee&quot;);
console.log(findedObject); // {name: 'dy lee'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>find</category>
      <category>findIndex</category>
      <category>foreach</category>
      <category>includes</category>
      <category>indexOf</category>
      <category>javascript</category>
      <category>배열순회</category>
      <category>배열탐색</category>
      <category>자바스크립트</category>
      <author> 개발새발</author>
      <guid isPermaLink="true">https://d-yong.tistory.com/134</guid>
      <comments>https://d-yong.tistory.com/134#entry134comment</comments>
      <pubDate>Sun, 14 Jul 2024 12:10:52 +0900</pubDate>
    </item>
  </channel>
</rss>