<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>SH's Devlog</title>
    <link>https://seosh817.tistory.com/</link>
    <description>공부한 내용을 정리하는 개발 기록 블로그</description>
    <language>ko</language>
    <pubDate>Sun, 16 Aug 2026 19:14:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>seunghwaan</managingEditor>
    <item>
      <title>[React] 이벤트 처리하기 - 이벤트 핸들링과 SyntheticEvent</title>
      <link>https://seosh817.tistory.com/719</link>
      <description>&lt;h1&gt;React 이벤트 처리하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; -&amp;gt; 이벤트 핸들링과 SyntheticEvent&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 React에서 사용자의 행동에 반응하는 방법인 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;이벤트(Event)&lt;/b&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;이벤트 핸들링(Event Handling)&lt;/b&gt;&lt;/span&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 React 컴포넌트를 만들고 Props를 통해 데이터를 전달했다면, 이번에는 사용자가 버튼을 클릭하거나 마우스를 움직이는 등의 행동에 따라 특정 기능을 실행하는 방법을 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 이벤트(Event)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트란 웹 페이지 내부에서 발생하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;사용자의 행동이나 특정 상황&lt;/b&gt;&lt;/span&gt;을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 이벤트는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버튼 클릭&lt;/li&gt;
&lt;li&gt;마우스 이동&lt;/li&gt;
&lt;li&gt;마우스 진입&lt;/li&gt;
&lt;li&gt;키보드 입력&lt;/li&gt;
&lt;li&gt;메시지 입력&lt;/li&gt;
&lt;li&gt;스크롤&lt;/li&gt;
&lt;li&gt;폼 제출&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 사용자가 버튼을 클릭하면 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;클릭 이벤트&lt;/b&gt;&lt;/span&gt;가 발생합니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;사용자 버튼 클릭
       &amp;darr;
클릭 이벤트 발생
       &amp;darr;
React에서 이벤트 처리
       &amp;darr;
특정 동작 실행&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 이벤트 핸들링(Event Handling)이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;이벤트 핸들링&lt;/b&gt;&lt;/span&gt;이란 이벤트가 발생했을 때 그 이벤트에 대한 동작을 처리하는 것을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 동작들이 이벤트 핸들링입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버튼 클릭 시 콘솔에 메시지 출력&lt;/li&gt;
&lt;li&gt;버튼 클릭 시 경고창 표시&lt;/li&gt;
&lt;li&gt;입력창에 값을 입력하면 데이터 변경&lt;/li&gt;
&lt;li&gt;마우스를 올리면 특정 UI 표시&lt;/li&gt;
&lt;li&gt;스크롤하면 추가 데이터 불러오기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 예를 들면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;버튼 클릭
   &amp;darr;
클릭 이벤트 발생
   &amp;darr;
&quot;버튼이 클릭되었습니다.&quot; 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 JSX 태그에 이벤트 속성을 추가하여 이벤트를 처리할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. onClick 이벤트 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 클릭했을 때 특정 코드를 실행하려면 onClick을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Button 컴포넌트를 다음과 같이 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;const Button = ({ children, text, color = 'black' }) =&amp;gt; {
  return (
    &amp;lt;button
      onClick={() =&amp;gt; {
        console.log(`${text} 버튼이 클릭되었습니다.`);
      }}
      style={{ color: color }}
    &amp;gt;
      {text} - {color.toUpperCase()}
      {children}
    &amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 부분은 다음 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;onClick={() =&amp;gt; {
  console.log(`${text} 버튼이 클릭되었습니다.`);
}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 버튼을 클릭하면 onClick에 전달된 함수가 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음 버튼이 있다고 가정해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;메일&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 클릭하면 콘솔에 다음과 같이 출력됩니다.&lt;/p&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;메일 버튼이 클릭되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 이벤트 핸들러를 별도의 함수로 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트가 발생했을 때 실행할 코드가 많아지면 JSX 내부에 모든 코드를 작성하기보다는 별도의 함수로 분리하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Button = ({ children, text, color = 'black' }) =&amp;gt; {
  const onClickButton = () =&amp;gt; {
    console.log(text);
  };

  return (
    &amp;lt;button
      onClick={onClickButton}
      style={{ color: color }}
    &amp;gt;
      {text} - {color.toUpperCase()}
      {children}
    &amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onClickButton처럼 이벤트가 발생했을 때 실행되는 함수를 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;이벤트 핸들러(Event Handler)&lt;/b&gt;&lt;/span&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;사용자 버튼 클릭
       &amp;darr;
onClick 이벤트 발생
       &amp;darr;
onClickButton 함수 실행
       &amp;darr;
console.log(text)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 함수는 실행하지 않고 전달해야 한다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서 이벤트 핸들러를 등록할 때 중요한 점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 함수 이름만 전달해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;onClick={onClickButton}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 작성하면 안 됩니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;onClick={onClickButton()}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 코드의 차이는 다음과 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;올바른 방법&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;onClick={onClickButton}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 자체를 onClick에 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 버튼을 클릭했을 때 함수가 실행됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;잘못된 방법&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;onClick={onClickButton()}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트가 렌더링되는 과정에서 onClickButton() 함수를 바로 실행한 결과를 onClick에 전달하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이벤트가 발생했을 때 실행할 함수를 전달하는 목적과 맞지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트 핸들러를 전달할 때는 함수 이름만 작성한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;onClick={함수이름}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 화살표 함수를 이용하여 이벤트 처리하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 핸들러에 직접 화살표 함수를 작성하는 방법도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;&amp;lt;button
  onClick={() =&amp;gt; {
    console.log('버튼이 클릭되었습니다.');
  }}
&amp;gt;
  버튼
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 Props와 함께 사용할 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;&amp;lt;button
  onClick={() =&amp;gt; {
    console.log(`${text} 버튼이 클릭되었습니다.`);
  }}
&amp;gt;
  {text}
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 간단한 이벤트 처리에 편리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이벤트 처리 로직이 길어지면 별도의 함수로 분리하는 것이 코드의 가독성 측면에서 좋습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 다른 이벤트도 사용할 수 있다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 onClick 외에도 다양한 이벤트를 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 마우스가 요소 위로 들어왔을 때는 onMouseEnter를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Button = ({ text }) =&amp;gt; {
  const onMouseEnterButton = () =&amp;gt; {
    console.log(`${text} 버튼에 마우스가 올라갔습니다.`);
  };

  return (
    &amp;lt;button onMouseEnter={onMouseEnterButton}&amp;gt;
      {text}
    &amp;lt;/button&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 속성의 이름은 React에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;camelCase&lt;/b&gt;&lt;/span&gt; 형태로 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트React 이벤트 속성&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;클릭&lt;/td&gt;
&lt;td&gt;onClick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;마우스 진입&lt;/td&gt;
&lt;td&gt;onMouseEnter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;마우스 이동&lt;/td&gt;
&lt;td&gt;onMouseMove&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;키 입력&lt;/td&gt;
&lt;td&gt;onKeyDown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;값 변경&lt;/td&gt;
&lt;td&gt;onChange&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;폼 제출&lt;/td&gt;
&lt;td&gt;onSubmit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. SyntheticEvent란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서 이벤트를 처리할 때 이벤트 핸들러의 매개변수를 통해 이벤트 객체를 전달받을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const onClickButton = (e) =&amp;gt; {
  console.log(e);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이벤트 핸들러를 연결합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;button onClick={onClickButton}&amp;gt;
  버튼
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 클릭하면 e에 이벤트 관련 정보가 전달됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 이러한 이벤트 객체를 일반적으로 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;SyntheticEvent(합성 이벤트)&lt;/b&gt;&lt;/span&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Button = ({ children, text, color = 'black' }) =&amp;gt; {
  const onClickButton = (e) =&amp;gt; {
    console.log(e);
    console.log(text);
  };

  return (
    &amp;lt;button
      onClick={onClickButton}
      style={{ color: color }}
    &amp;gt;
      {text} - {color.toUpperCase()}
      {children}
    &amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 e는 클릭 이벤트가 발생했을 때 React가 전달해 주는 이벤트 객체입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. SyntheticEvent를 사용하는 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저에는 다양한 종류가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 다음과 같은 브라우저가 존재합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Safari&lt;/li&gt;
&lt;li&gt;Edge&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;Whale&lt;/li&gt;
&lt;li&gt;Opera&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 브라우저마다 JavaScript 이벤트를 처리하는 방식이나 이벤트 객체의 동작에 차이가 있어 같은 코드를 작성해도 브라우저에 따라 다르게 동작하는 문제가 발생할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;크로스 브라우징(Cross Browsing) 이슈&lt;/b&gt;&lt;/span&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 브라우저의 기본 이벤트를 그대로 사용하는 대신, 브라우저 간 차이를 일관된 방식으로 다룰 수 있도록 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;SyntheticEvent라는 React의 이벤트 시스템&lt;/b&gt;&lt;/span&gt;을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 일반적으로 React가 제공하는 동일한 이벤트 API를 사용하여 이벤트를 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조를 간단하게 표현하면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Chrome   Safari   Edge   Firefox
    │        │       │       │
    └────────┴───────┴───────┘
                 │
          브라우저 이벤트 차이
                 &amp;darr;
       React SyntheticEvent 시스템
                 │
                 &amp;darr;
         일관된 방식으로 처리&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 여러 브라우저의 차이를 개발자가 각각 직접 고려하는 부담을 줄일 수 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 브라우저별 이벤트 객체의 속성 이름이 단순히 target, ETarget처럼 서로 다르다는 식으로 이해하기보다는, 브라우저별 이벤트 API의 구현과 동작 차이를 React가 정규화해 일관된 인터페이스를 제공한다고 이해하는 것이 더 정확합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. 이벤트 객체에서 확인할 수 있는 값&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 객체에는 이벤트가 발생한 요소와 이벤트 종류 등 다양한 정보가 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const onClickButton = (e) =&amp;gt; {
  console.log(e);
  console.log(e.target);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e.target을 통해 이벤트가 발생한 대상 요소를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;사용자가 Button 클릭
         &amp;darr;
이벤트 발생
         &amp;darr;
onClickButton(e)
         &amp;darr;
e.target 확인
         &amp;darr;
이벤트가 발생한 요소 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 객체를 활용하면 클릭한 요소의 정보나 입력값 등 다양한 이벤트 정보를 처리할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;11. 전체 코드 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 작성한 Button 컴포넌트를 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Button = ({ children, text, color = 'black' }) =&amp;gt; {
  const onClickButton = (e) =&amp;gt; {
    console.log(e);
    console.log(`${text} 버튼이 클릭되었습니다.`);
  };

  return (
    &amp;lt;button
      onClick={onClickButton}
      style={{ color: color }}
    &amp;gt;
      {text} - {color.toUpperCase()}
      {children}
    &amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 클릭하면 다음 과정으로 동작합니다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;Button 클릭
    &amp;darr;
onClick 이벤트 발생
    &amp;darr;
onClickButton 실행
    &amp;darr;
이벤트 객체 e 전달
    &amp;darr;
이벤트 관련 정보 및 text 출력&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;1208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqsxGU/dJMcafgFbWW/yaQQDBqHKmHrR9l5HtRGY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqsxGU/dJMcafgFbWW/yaQQDBqHKmHrR9l5HtRGY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqsxGU/dJMcafgFbWW/yaQQDBqHKmHrR9l5HtRGY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqsxGU%2FdJMcafgFbWW%2FyaQQDBqHKmHrR9l5HtRGY0%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;600&quot; height=&quot;612&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;1208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 React에서 사용자의 행동을 처리하는 이벤트 핸들링에 대해 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;이벤트는 웹 페이지에서 발생하는 사용자의 행동이나 특정 상황을 의미한다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;버튼 클릭, 입력, 스크롤, 마우스 이동 등이 이벤트에 해당한다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;이벤트 핸들링은 이벤트가 발생했을 때 특정 동작을 처리하는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;React에서는 onClick, onChange, onMouseEnter 등의 이벤트 속성을 사용한다.&lt;/li&gt;
&lt;li&gt;이벤트 핸들러는 onClick={onClickButton}처럼 함수 자체를 전달해야 한다.&lt;/li&gt;
&lt;li&gt;onClick={onClickButton()}처럼 함수를 즉시 실행하면 안 된다.&lt;/li&gt;
&lt;li&gt;간단한 로직은 화살표 함수로 직접 작성할 수 있다.&lt;/li&gt;
&lt;li&gt;이벤트 처리 로직이 길어지면 별도의 함수로 분리하는 것이 좋다.&lt;/li&gt;
&lt;li&gt;React는 브라우저 이벤트를 일관된 방식으로 다룰 수 있도록 SyntheticEvent 시스템을 제공한다.&lt;/li&gt;
&lt;li&gt;이벤트 핸들러의 매개변수 e를 통해 이벤트 관련 정보를 확인할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 핸들링을 배우면 이제 React 화면에 사용자의 행동을 반영할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 단계에서는 이벤트와 함께 React의 핵심 개념인 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;State(상태)&lt;/b&gt;&lt;/span&gt;를 사용하여, 버튼 클릭과 같은 사용자 행동에 따라 화면의 데이터를 변경하고 다시 렌더링하는 방법을 알아볼 수 있습니다.&lt;/p&gt;</description>
      <category>Web Frontend/React</category>
      <category>React</category>
      <category>Web Fronted</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/719</guid>
      <comments>https://seosh817.tistory.com/719#entry719comment</comments>
      <pubDate>Thu, 9 Apr 2026 12:17:20 +0900</pubDate>
    </item>
    <item>
      <title>[React] React Props로 데이터 전달하기</title>
      <link>https://seosh817.tistory.com/717</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;React Props로 데이터 전달하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 React에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트에 데이터를 전달하는 방법인 Props&lt;/b&gt;&lt;/span&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 하나의 페이지를 여러 개의 컴포넌트로 나누고, 이를 조합하여 화면을 만드는 방식으로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치 레고 블록을 여러 개 조립해서 하나의 완성된 결과물을 만드는 것과 비슷합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 같은 형태의 컴포넌트라도 전달하는 데이터에 따라 서로 다른 화면을 보여줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 여러 개의 Button 컴포넌트가 있다고 가정해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[메일]

[카페]

[블로그]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 버튼의 구조는 같지만 버튼마다 표시되는 텍스트나 색상은 다를 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 &lt;b&gt;부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할 때 사용하는 값&lt;/b&gt;을 React에서는 &lt;b&gt;Props(Properties)&lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Props란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Props는 부모 컴포넌트가 자식 컴포넌트에게 전달하는 데이터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 App 컴포넌트에서 Button 컴포넌트를 사용한다고 가정해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;메일&quot; color=&quot;red&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Button 컴포넌트에 전달한 값은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;text: 메일&lt;/li&gt;
&lt;li&gt;color: red&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값들은 Button 컴포넌트에서 Props로 전달받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 관계를 그림으로 표현하면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;         부모 컴포넌트
             App
              │
              │ Props 전달
              ▼
         자식 컴포넌트
           Button&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Props를 이용하면 다음과 같이 데이터를 전달할 수 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모 컴포넌트 &amp;rarr; 자식 컴포넌트&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Props는 React에서 컴포넌트를 재사용할 수 있도록 해주는 핵심 기능 중 하나입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Props는 객체 형태로 전달된다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트에 여러 개의 Props를 전달하면 자식 컴포넌트에서는 이를 하나의 객체 형태로 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 부모 컴포넌트에서 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;메일&quot; color=&quot;red&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 컴포넌트에서는 props라는 매개변수로 전달받을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;const Button = (props) =&amp;gt; {
  console.log(props);

  return (
    &amp;lt;button style={{ color: props.color }}&amp;gt;
      {props.text} - {props.color}
    &amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console.log(props)를 출력하면 대략 다음과 같은 객체 형태를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;{
  text: '메일',
  color: 'red'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 각각의 값은 객체의 프로퍼티를 통해 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;props.text&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;props.color&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 구조 분해 할당으로 Props 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 props.text, props.color처럼 작성할 수도 있지만, JavaScript의 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;구조 분해 할당&lt;/b&gt;&lt;/span&gt;을 사용하면 조금 더 간결하게 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;const Button = ({ text, color }) =&amp;gt; {
  return (
    &amp;lt;button style={{ color: color }}&amp;gt;
      {text} - {color}
    &amp;lt;/button&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드는,&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;const Button = (props) =&amp;gt; {
  const text = props.text;
  const color = props.color;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 비슷한 의미입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조 분해 할당을 사용하면 필요한 Props를 바로 꺼내서 사용할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Props의 기본값 설정하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button 컴포넌트에 color를 전달하지 않았다고 가정해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;카페&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 color는 undefined가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 기본 색상을 지정해 두면 color를 전달하지 않았을 때 자동으로 기본값을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조 분해 할당에서 다음과 같이 기본값을 설정합니다.&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;const Button = ({ text, color = 'black' }) =&amp;gt; {
  return (
    &amp;lt;button style={{ color: color }}&amp;gt;
      {text} - {color.toUpperCase()}
    &amp;lt;/button&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다음과 같이 color를 전달하면 전달한 값을 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;메일&quot; color=&quot;red&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;메일 - RED&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 color를 전달하지 않으면 기본값인 black이 사용됩니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;카페&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;카페 - BLACK&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고: 기존의 defaultProps 방식&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 함수 컴포넌트의 기본 Props를 다음과 같이 설정하기도 했습니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;Button.defaultProps = {
  color: 'black',
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 현재 함수 컴포넌트에서는 JavaScript의 기본 매개변수와 구조 분해 할당을 사용하는 방식이 일반적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 작성하는 것이 간단합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Button = ({ color = 'black' }) =&amp;gt; {
  // ...
};&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 여러 개의 Props를 전달하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 컴포넌트에서 여러 개의 Button을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.jsx를 다음과 같이 작성해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import Button from './components/Button';

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Button text=&quot;메일&quot; color=&quot;red&quot; /&amp;gt;
      &amp;lt;Button text=&quot;카페&quot; /&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;모든 컴포넌트는 동일한 Button 컴포넌트를 사용하지만 전달되는 Props에 따라 서로 다르게 표시됩니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;메일 - RED
카페 - BLACK
블로그 - BLUE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 하나의 컴포넌트를 만들어 두고 Props만 다르게 전달하면 여러 상황에서 재사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 React 컴포넌트를 사용하는 큰 장점 중 하나입니다.&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;2552&quot; data-origin-height=&quot;1582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgZ9Vk/dJMb99N9KEK/NMIiyGXiRn8dryYARwCCMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgZ9Vk/dJMb99N9KEK/NMIiyGXiRn8dryYARwCCMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgZ9Vk/dJMb99N9KEK/NMIiyGXiRn8dryYARwCCMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgZ9Vk%2FdJMb99N9KEK%2FNMIiyGXiRn8dryYARwCCMK%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;600&quot; height=&quot;372&quot; data-origin-width=&quot;2552&quot; data-origin-height=&quot;1582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. Spread 연산자로 Props 전달하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Props가 많아지면 하나씩 전달하는 것이 번거로울 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 객체가 있다고 가정해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;const buttonProps = {
  text: '메일',
  color: 'red',
  a: 1,
  b: 2,
  c: 3,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 객체의 값을 하나씩 전달하면 다음과 같이 작성해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;&amp;lt;Button
  text={buttonProps.text}
  color={buttonProps.color}
  a={buttonProps.a}
  b={buttonProps.b}
  c={buttonProps.c}
/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 **Spread 연산자(...)**를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;&amp;lt;Button {...buttonProps} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 프로퍼티가 각각 Props로 전달됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 위 코드는 다음과 같은 의미입니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;Button
  text=&quot;메일&quot;
  color=&quot;red&quot;
  a={1}
  b={2}
  c={3}
/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Spread 연산자 사용 예제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.jsx를 다음과 같이 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import Button from './components/Button';

function App() {
  const buttonProps = {
    text: '메일',
    color: 'red',
    a: 1,
    b: 2,
    c: 3,
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;Button {...buttonProps} /&amp;gt;
      &amp;lt;Button text=&quot;카페&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;buttonProps 객체에 있는 값들이 Button 컴포넌트의 Props로 전달됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 실제로 컴포넌트에서 사용하지 않는 Props까지 무조건 전달하는 방식은 피하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 데이터가 명확할 때 사용하는 것이 코드의 가독성과 유지보수에 도움이 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 컴포넌트 사이에 작성한 요소도 전달할 수 있다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Props는 태그의 속성으로 전달하는 값만 있는 것이 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트의 시작 태그와 종료 태그 사이에 작성한 요소도 전달할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;블로그&quot;&amp;gt;
  &amp;lt;Header /&amp;gt;
  &amp;lt;div&amp;gt;자식 요소&amp;lt;/div&amp;gt;
&amp;lt;/Button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button 태그 사이에 작성된 요소는 특별한 Props인 **children**으로 전달됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;children 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button 컴포넌트에서 children을 전달받습니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;const Button = ({ children, text, color = 'black' }) =&amp;gt; {
  return (
    &amp;lt;button style={{ color: color }}&amp;gt;
      {text} - {color.toUpperCase()}
      {children}
    &amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Button 컴포넌트 내부의 {children} 위치에 부모에서 전달한 내용이 렌더링됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;블로그&quot;&amp;gt;
  &amp;lt;Header /&amp;gt;
  &amp;lt;div&amp;gt;자식 요소&amp;lt;/div&amp;gt;
&amp;lt;/Button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 부분이,&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;Header /&amp;gt;
&amp;lt;div&amp;gt;자식 요소&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;children으로 전달됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Button 내부에서 다음 코드가 이를 화면에 표시합니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;{children}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. Props와 children의 관계&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Props와 children을 함께 사용하면 다음과 같은 구조가 됩니다.&lt;/p&gt;
&lt;pre class=&quot;openscad&quot;&gt;&lt;code&gt;App
 │
 ├── text, color ──────────────┐
 │                              ▼
 │                          Button
 │                              │
 │
 └── &amp;lt;Header /&amp;gt;, &amp;lt;div&amp;gt; ──── children
                                │
                                ▼
                             화면 렌더링&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;블로그&quot; color=&quot;blue&quot;&amp;gt;
  &amp;lt;Header /&amp;gt;
  &amp;lt;div&amp;gt;자식 요소&amp;lt;/div&amp;gt;
&amp;lt;/Button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달되는 Props를 객체 형태로 생각하면 대략 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;{
  text: '블로그',
  color: 'blue',
  children: [
    &amp;lt;Header /&amp;gt;,
    &amp;lt;div&amp;gt;자식 요소&amp;lt;/div&amp;gt;,
  ],
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 React 내부 구조를 그대로 표현한 것은 아니지만, &lt;b&gt;text, color와 마찬가지로 children도 컴포넌트가 전달받는 Props라는 개념&lt;/b&gt;으로 이해하면 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 전체 코드 정리&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;App.jsx&lt;/h2&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;import Button from './components/Button';
import Header from './components/Header';

function App() {
  const buttonProps = {
    text: '메일',
    color: 'red',
    a: 1,
    b: 2,
    c: 3,
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;Button {...buttonProps} /&amp;gt;

      &amp;lt;Button text=&quot;카페&quot; /&amp;gt;

      &amp;lt;Button text=&quot;블로그&quot;&amp;gt;
        &amp;lt;Header /&amp;gt;
        &amp;lt;div&amp;gt;자식 요소&amp;lt;/div&amp;gt;
      &amp;lt;/Button&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Button.jsx&lt;/h2&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;const Button = ({ children, text, color = 'black' }) =&amp;gt; {
  return (
    &amp;lt;button style={{ color: color }}&amp;gt;
      {text} - {color.toUpperCase()}
      {children}
    &amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 React에서 부모 컴포넌트가 자식 컴포넌트에게 데이터를 전달하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Props&lt;/b&gt;&lt;/span&gt;에 대해 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Props는 부모 컴포넌트에서 자식 컴포넌트로 전달하는 데이터이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;자식 컴포넌트에서는 Props를 객체 형태로 전달받을 수 있다.&lt;/li&gt;
&lt;li&gt;props.text와 같이 객체의 프로퍼티를 이용할 수 있다.&lt;/li&gt;
&lt;li&gt;구조 분해 할당을 사용하면 Props를 간결하게 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;구조 분해 할당에서 기본값을 지정할 수 있다.&lt;/li&gt;
&lt;li&gt;Spread 연산자(...)를 이용하면 객체의 값을 한 번에 Props로 전달할 수 있다.&lt;/li&gt;
&lt;li&gt;컴포넌트 태그 사이에 작성한 요소는 children Props로 전달된다.&lt;/li&gt;
&lt;li&gt;자식 컴포넌트에서는 {children}을 통해 전달받은 요소를 렌더링할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 하나의 컴포넌트를 만들어 두고 Props를 다르게 전달함으로써 다양한 형태의 UI를 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 하나의 Button 컴포넌트를 만들어도 Props에 따라 서로 다른 버튼을 만들 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;&amp;lt;Button text=&quot;메일&quot; color=&quot;red&quot; /&amp;gt;
&amp;lt;Button text=&quot;카페&quot; color=&quot;green&quot; /&amp;gt;
&amp;lt;Button text=&quot;블로그&quot; color=&quot;blue&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트를 재사용하고, 필요한 데이터를 Props로 전달하는 것&lt;/b&gt;&lt;/span&gt;은 React의 매우 중요한 개발 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 단계에서는 Props와 함께 자주 사용되는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;State(상태)&lt;/b&gt;&lt;/span&gt;를 이용해 사용자 동작에 따라 화면을 변경하는 방법을 알아보겠습니다.&lt;/p&gt;</description>
      <category>Web Frontend/React</category>
      <category>React</category>
      <category>Web Frontend</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/717</guid>
      <comments>https://seosh817.tistory.com/717#entry717comment</comments>
      <pubDate>Tue, 7 Apr 2026 12:52:43 +0900</pubDate>
    </item>
    <item>
      <title>[React] React JSX로 UI 표현하기</title>
      <link>https://seosh817.tistory.com/716</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;React JSX로 UI 표현하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; JSX 문법과 주의사항, 스타일 적용 방법&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;이번에는 React에서 화면을 표현할 때 사용하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;JSX&lt;/b&gt;&lt;/span&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 컴포넌트에서는 JavaScript 함수 안에서 HTML과 비슷한 형태의 코드를 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문법을 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;JSX&lt;/b&gt;&lt;/span&gt;라고 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. JSX란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;JavaScript Syntax Extension&lt;/b&gt;&lt;/span&gt;의 약자로, JavaScript를 확장한 문법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 JSX를 사용하여 JavaScript 코드 안에서 HTML과 비슷한 문법으로 UI를 표현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 일반적인 JavaScript 코드에서는 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const Main = () =&amp;gt; {
  return '&amp;lt;h1&amp;gt;main&amp;lt;/h1&amp;gt;'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 JSX를 사용하면 다음과 같이 HTML 태그와 비슷한 형태로 UI를 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Main = () =&amp;gt; {
  return (
    &amp;lt;main&amp;gt;
      &amp;lt;h1&amp;gt;main&amp;lt;/h1&amp;gt;
    &amp;lt;/main&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX는 HTML과 매우 비슷하게 보이지만 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;JavaScript 안에서 사용되는 문법&lt;/b&gt;&lt;/span&gt;이라는 점이 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 HTML과 완전히 동일하지 않고 몇 가지 작성 규칙이 존재합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. JSX에서 JavaScript 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX 안에서는 중괄호 {}를 사용하여 JavaScript 값을 화면에 표현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 변수를 만들어 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Main = () =&amp;gt; {
  const number = 10

  return (
    &amp;lt;main&amp;gt;
      &amp;lt;h1&amp;gt;main&amp;lt;/h1&amp;gt;
      &amp;lt;h2&amp;gt;{number}&amp;lt;/h2&amp;gt;
    &amp;lt;/main&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;number 변수의 값은 10이므로 화면에 다음과 같이 표시됩니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;main
10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중괄호 안에서는 JavaScript 표현식을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 삼항 연산자를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Main = () =&amp;gt; {
  const number = 10

  return (
    &amp;lt;main&amp;gt;
      &amp;lt;h1&amp;gt;main&amp;lt;/h1&amp;gt;
      &amp;lt;h2&amp;gt;{number % 2 === 0 ? '짝수' : '홀수'}&amp;lt;/h2&amp;gt;
    &amp;lt;/main&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;number가 10이므로 화면에는 다음과 같이 표시됩니다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;main
짝수&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. JSX 작성 시 주의사항&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX를 사용할 때는 몇 가지 중요한 규칙이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 중괄호 안에는 JavaScript 표현식만 사용할 수 있다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX에서 {} 안에는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;값을 만들어낼 수 있는 JavaScript 표현식(Expression)&lt;/b&gt;&lt;/span&gt;을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 코드는 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;{number}

{number + 10}

{number % 2 === 0 ? '짝수' : '홀수'}

{obj.name}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 if, for, while과 같은 문장은 JSX 중괄호 안에서 직접 사용할 수 없습니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;{
  if (number &amp;gt; 10) {
    ...
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if, for, while은 값을 반환하는 표현식이 아니라 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;제어문(Statement)&lt;/b&gt;&lt;/span&gt;이기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건에 따라 다른 내용을 표현하고 싶다면 삼항 연산자를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;{number &amp;gt; 10 ? '10보다 큼' : '10 이하'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 JSX를 반환하기 전에 별도로 조건문을 작성할 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Main = () =&amp;gt; {
  const number = 10

  let result

  if (number % 2 === 0) {
    result = '짝수'
  } else {
    result = '홀수'
  }

  return (
    &amp;lt;main&amp;gt;
      &amp;lt;h1&amp;gt;{result}&amp;lt;/h1&amp;gt;
    &amp;lt;/main&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. 모든 JavaScript 값이 화면에 렌더링되는 것은 아니다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX에서 {}를 이용해 값을 화면에 표현할 수 있지만 모든 값이 그대로 렌더링되는 것은 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 문자열과 숫자는 렌더링할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;const name = 'React'
const number = 10

return (
  &amp;lt;main&amp;gt;
    &amp;lt;p&amp;gt;{name}&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;{number}&amp;lt;/p&amp;gt;
  &amp;lt;/main&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에는 다음과 같이 표시됩니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;React
10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열도 렌더링할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const fruits = ['사과', '바나나', '딸기']

return (
  &amp;lt;main&amp;gt;
    {fruits}
  &amp;lt;/main&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 각 값이 화면에 표시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 객체 자체를 JSX에서 바로 렌더링할 수는 없습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;const obj = {
  a: 1,
  b: 2,
}

return (
  &amp;lt;main&amp;gt;
    {obj}
  &amp;lt;/main&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 자체를 렌더링하려고 하면 오류가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 객체의 특정 프로퍼티 값은 렌더링할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;const obj = {
  a: 1,
  b: 2,
}

return (
  &amp;lt;main&amp;gt;
    {obj.a}
  &amp;lt;/main&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에는 다음과 같이 표시됩니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 다음 값들은 일반적인 텍스트처럼 화면에 렌더링되지 않습니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;{true}
{false}
{undefined}
{null}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특징은 조건부 렌더링을 할 때 많이 활용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 false일 경우 화면에 아무것도 표시하지 않는 특징을 이용할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-3. 모든 태그는 닫아야 한다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML에서는 일부 태그를 닫지 않고 작성할 수 있는 경우가 있지만 JSX에서는 모든 태그를 닫아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 코드는 올바르지 않습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;img src=&quot;image.png&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX에서는 반드시 태그를 닫아야 합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;img src=&quot;image.png&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input, br, hr과 같이 자식 요소가 없는 태그도 동일합니다.&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;&amp;lt;input /&amp;gt;

&amp;lt;br /&amp;gt;

&amp;lt;hr /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 태그 역시 반드시 닫아야 합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;div&amp;gt;
  &amp;lt;h1&amp;gt;안녕 리액트&amp;lt;/h1&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-4. 최상위 요소는 하나여야 한다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트가 반환하는 JSX는 하나의 최상위 요소로 감싸져 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음 코드는 오류가 발생합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;return (
  &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
  &amp;lt;p&amp;gt;안녕하세요.&amp;lt;/p&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개의 태그가 같은 레벨에 존재하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 하나의 부모 태그로 감싸야 합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;return (
  &amp;lt;div&amp;gt;
    &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;안녕하세요.&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 단순히 묶기 위해 불필요한 div를 추가하고 싶지 않을 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Fragment&lt;/b&gt;&lt;/span&gt;를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;return (
  &amp;lt;&amp;gt;
    &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;안녕하세요.&amp;lt;/p&amp;gt;
  &amp;lt;/&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;gt; &amp;lt;/&amp;gt;는 React의 Fragment 축약 문법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 요소를 하나로 묶어 JSX 규칙을 만족시키면서도 실제 DOM에 불필요한 태그를 추가하지 않을 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. JSX 예제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지의 내용을 하나의 코드로 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Main = () =&amp;gt; {
  const number = 10
  const obj = { a: 1 }

  return (
    &amp;lt;main&amp;gt;
      &amp;lt;h1&amp;gt;main&amp;lt;/h1&amp;gt;

      &amp;lt;h2&amp;gt;{number % 2 === 0 ? '짝수' : '홀수'}&amp;lt;/h2&amp;gt;

      {true}
      {undefined}
      {null}

      {obj.a}
    &amp;lt;/main&amp;gt;
  )
}

export default Main&lt;/code&gt;&lt;/pre&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;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;코드결과&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{number % 2 === 0 ? '짝수' : '홀수'}&lt;/td&gt;
&lt;td&gt;짝수 렌더링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{true}&lt;/td&gt;
&lt;td&gt;렌더링되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{undefined}&lt;/td&gt;
&lt;td&gt;렌더링되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{null}&lt;/td&gt;
&lt;td&gt;렌더링되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{obj.a}&lt;/td&gt;
&lt;td&gt;1 렌더링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{obj}&lt;/td&gt;
&lt;td&gt;객체 자체는 렌더링할 수 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. JSX에서 스타일 적용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서 JSX로 UI를 작성할 때 스타일을 적용하는 방법은 크게 두 가지가 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;태그에 직접 style 속성을 작성하는 방법&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;별도의 CSS 파일을 만들어 적용하는 방법&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-1. 태그에 직접 스타일 적용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 방법은 style 속성을 사용하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 CSS에서는 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;background-color: red;
font-size: 20px;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 JSX에서는 JavaScript 객체 형태로 스타일을 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;h1
  style={{
    backgroundColor: 'red',
    fontSize: '20px',
  }}
&amp;gt;
  안녕 리액트
&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은 CSS 속성 이름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 CSS에서는 background-color처럼 하이픈(-)을 사용하지만 JSX의 style 객체에서는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;camelCase(카멜 케이스)&lt;/b&gt;&lt;/span&gt;를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSSJSX style&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;background-color&lt;/td&gt;
&lt;td&gt;backgroundColor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;font-size&lt;/td&gt;
&lt;td&gt;fontSize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;margin-top&lt;/td&gt;
&lt;td&gt;marginTop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;border-radius&lt;/td&gt;
&lt;td&gt;borderRadius&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, JSX에서는 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;style={{
  backgroundColor: 'red',
  fontSize: '20px',
  marginTop: '10px',
}}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 별도의 CSS 파일 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 방법은 별도의 CSS 파일을 만들어 스타일을 적용하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 App.css에 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.title {
  background-color: red;
  font-size: 20px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 React 컴포넌트에서 CSS 파일을 import 합니다.&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;import './App.css'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 JSX에서 해당 클래스를 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 HTML에서는 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;logout&quot;&amp;gt;로그아웃&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 JSX에서는 class 대신 **className**을 사용해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;div className=&quot;logout&quot;&amp;gt;로그아웃&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 JSX가 JavaScript와 함께 사용되는 문법이기 때문에 HTML의 class 속성 대신 className을 사용하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 React에서 CSS 클래스를 적용할 때는 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;h1 className=&quot;title&quot;&amp;gt;안녕 리액트&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS 파일에서는 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.title {
  background-color: red;
  font-size: 20px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. JSX 스타일링 방법 비교&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 가지 방법을 비교하면 다음과 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Inline Style&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;h1 style={{ color: 'red' }}&amp;gt;안녕 리액트&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 스타일을 빠르게 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 스타일이 많아지면 JSX 코드가 길어지고 복잡해질 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. CSS 파일 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;h1 className=&quot;title&quot;&amp;gt;안녕 리액트&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.title {
  color: red;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX와 스타일을 분리할 수 있기 때문에 여러 스타일을 관리하기 편합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 React에서 UI를 표현하는 JSX에 대해 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX는 HTML과 비슷한 문법을 사용하지만 JavaScript 안에서 동작하기 때문에 몇 가지 중요한 규칙이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;JSX는 JavaScript 안에서 UI를 작성하기 위한 문법이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;{} 안에는 JavaScript 표현식을 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;if, for, while 같은 제어문은 JSX 중괄호 안에서 직접 사용할 수 없다.&lt;/li&gt;
&lt;li&gt;문자열과 숫자는 화면에 렌더링할 수 있다.&lt;/li&gt;
&lt;li&gt;객체 자체는 렌더링할 수 없지만 객체의 프로퍼티 값은 렌더링할 수 있다.&lt;/li&gt;
&lt;li&gt;true, false, undefined, null은 일반적인 화면 텍스트로 렌더링되지 않는다.&lt;/li&gt;
&lt;li&gt;모든 JSX 태그는 반드시 닫아야 한다.&lt;/li&gt;
&lt;li&gt;컴포넌트가 반환하는 JSX는 하나의 최상위 요소로 묶어야 한다.&lt;/li&gt;
&lt;li&gt;불필요한 태그를 만들고 싶지 않을 때는 &amp;lt;&amp;gt; &amp;lt;/&amp;gt; Fragment를 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;JSX에서 inline style은 JavaScript 객체 형태로 작성하며 CSS 속성은 camelCase를 사용한다.&lt;/li&gt;
&lt;li&gt;CSS 클래스를 적용할 때는 HTML의 class 대신 **className**을 사용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서 컴포넌트를 만들고 JSX로 UI를 표현하는 방법을 이해했다면, 다음 단계에서는 JSX를 이용해 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;조건에 따라 다른 화면을 표시하거나 여러 데이터를 반복해서 렌더링하는 방법&lt;/b&gt;&lt;/span&gt;도 학습할 수 있습니다.&lt;/p&gt;</description>
      <category>Web Frontend/React</category>
      <category>React</category>
      <category>Web Frontend</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/716</guid>
      <comments>https://seosh817.tistory.com/716#entry716comment</comments>
      <pubDate>Tue, 7 Apr 2026 12:52:36 +0900</pubDate>
    </item>
    <item>
      <title>[React] React 컴포넌트란?</title>
      <link>https://seosh817.tistory.com/715</link>
      <description>&lt;h1&gt;React 컴포넌트란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; 함수 컴포넌트 만들기와 부모&amp;middot;자식 컴포넌트 구조&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;이번에는 React의 가장 기본적인 개념인 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트(Component)&lt;/b&gt;&lt;/span&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 화면을 하나의 거대한 코드로 만드는 것이 아니라, 화면을 여러 개의 작은 단위로 나누어 개발합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 화면을 구성하는 각각의 단위를 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트&lt;/b&gt;&lt;/span&gt;라고 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. React 컴포넌트란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 작성한 App.jsx 파일을 보면 다음과 같은 코드가 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;안녕 리액트.&amp;lt;/h1&amp;gt;
    &amp;lt;/&amp;gt;
  )
}

export default App&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 JavaScript 함수와 비슷하지만, React에서는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;JSX를 반환하는 함수&lt;/b&gt;&lt;/span&gt;를 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 함수를 React에서는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트(Component)&lt;/b&gt;&lt;/span&gt;라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 경우 함수 이름이 App이므로 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;App 컴포넌트&lt;/b&gt;&lt;/span&gt;라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 다음과 같이 이해할 수 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX를 반환하는 JavaScript 함수 &amp;rarr; React 컴포넌트&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 함수로 작성한 컴포넌트를 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;함수 컴포넌트(Function Component)&lt;/b&gt;&lt;/span&gt;라고 부릅니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Header 컴포넌트 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App 컴포넌트와 마찬가지로 Header 컴포넌트도 만들 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function Header() {
  return (
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 작성하면 Header라는 React 컴포넌트가 만들어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트는 일반 함수처럼 이름을 이용해 호출하는 것이 아니라 JSX 문법을 사용하여 화면에 배치합니다.&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;&amp;lt;Header /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 화살표 함수로 컴포넌트 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 컴포넌트는 일반적인 함수 선언식뿐만 아니라 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;화살표 함수&lt;/b&gt;&lt;/span&gt;로도 만들 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Header = () =&amp;gt; {
  return (
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 두 방식 모두 많이 사용됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;함수 선언식&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function Header() {
  return (
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;화살표 함수&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Header = () =&amp;gt; {
  return (
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서 사용하는 코드 스타일에 맞춰 일관되게 작성하면 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. React 컴포넌트 이름은 반드시 대문자로 시작해야 한다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 컴포넌트를 만들 때 중요한 규칙이 하나 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트의 이름은 반드시 대문자로 시작해야 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음은 올바른 컴포넌트 이름입니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Header = () =&amp;gt; {
  return &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다음과 같이 소문자로 시작하면 React는 일반 HTML 태그로 인식할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const header = () =&amp;gt; {
  return &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 React 컴포넌트를 만들 때는 다음과 같이 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;App
Header
Footer
Main
Profile
UserInfo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 이름의 첫 글자는 항상 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;대문자&lt;/b&gt;&lt;/span&gt;로 작성하는 것이 중요합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 클래스 컴포넌트와 함수 컴포넌트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 과거부터 클래스를 이용해 컴포넌트를 만들 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 클래스 컴포넌트는 작성해야 하는 코드가 많고 구조가 복잡해질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 React에서는 일반적으로 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;함수 컴포넌트와 Hooks를 사용하는 방식이 주로 사용됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 앞으로는 다음과 같은 함수 형태의 컴포넌트를 중심으로 작성하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Header = () =&amp;gt; {
  return (
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 컴포넌트를 만들기만 해서는 화면에 표시되지 않는다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.jsx에 Header 컴포넌트를 추가했다고 해서 자동으로 화면에 표시되는 것은 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 Header 컴포넌트를 작성했다고 가정해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function Header() {
  return (
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 브라우저에는 header가 표시되지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 React가 처음 렌더링하는 컴포넌트를 main.jsx에서 확인할 수 있기 때문입니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;createRoot(document.getElementById('root')).render(
  &amp;lt;App /&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 React는 &amp;lt;App /&amp;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;Header 컴포넌트를 화면에 표시하려면 App 컴포넌트 안에서 사용해야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 컴포넌트 안에서 다른 컴포넌트 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App 컴포넌트 안에 Header를 추가해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Header /&amp;gt;
      &amp;lt;h1&amp;gt;안녕 리액트.&amp;lt;/h1&amp;gt;
    &amp;lt;/&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 React는 다음과 같은 구조로 컴포넌트를 렌더링합니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;App
 ├─ Header
 └─ h1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App이 렌더링되면서 내부에 작성된 Header 컴포넌트도 함께 렌더링됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 부모 컴포넌트와 자식 컴포넌트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 구조에서 App과 Header는 부모와 자식 관계를 가집니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;App
 └─ Header&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App &amp;rarr; 부모 컴포넌트&lt;/li&gt;
&lt;li&gt;Header &amp;rarr; 자식 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 부릅니다.&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;pre class=&quot;gauss&quot;&gt;&lt;code&gt;App
 ├─ Header
 ├─ Main
 └─ Footer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 App은 최상위에서 여러 컴포넌트를 관리하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Root 컴포넌트&lt;/b&gt;&lt;/span&gt; 역할을 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 모든 하위 컴포넌트의 상위에 있기 때문에 문맥에 따라 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;조상 컴포넌트&lt;/b&gt;&lt;/span&gt;라고 표현하기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 React 프로젝트에서는 App 컴포넌트를 애플리케이션의 주요 루트 컴포넌트로 사용하는 경우가 많습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. 컴포넌트는 파일별로 분리해서 관리하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트가 많아지면 하나의 파일에 모든 컴포넌트를 작성하는 것은 관리하기 어려워집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 일반적으로는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트별로 파일을 분리하여 관리&lt;/b&gt;&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 구조로 구성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;src
├─ components
│  ├─ Header.jsx
│  ├─ Main.jsx
│  └─ Footer.jsx
├─ App.jsx
├─ App.css
├─ index.css
└─ main.jsx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구성하면 각 컴포넌트의 역할을 쉽게 구분하고 관리할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. Header 컴포넌트 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 components/Header.jsx 파일을 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Header = () =&amp;gt; {
  return (
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;header&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}

export default Header&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막에 다음 코드를 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export default Header&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 Header 컴포넌트를 다른 파일에서 사용할 수 있도록 내보내는 역할을 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;11. Main 컴포넌트 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;components/Main.jsx 파일을 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Main = () =&amp;gt; {
  return (
    &amp;lt;main&amp;gt;
      &amp;lt;h1&amp;gt;main&amp;lt;/h1&amp;gt;
    &amp;lt;/main&amp;gt;
  )
}

export default Main&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;12. Footer 컴포넌트 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;components/Footer.jsx 파일을 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Footer = () =&amp;gt; {
  return (
    &amp;lt;footer&amp;gt;
      &amp;lt;h1&amp;gt;footer&amp;lt;/h1&amp;gt;
    &amp;lt;/footer&amp;gt;
  )
}

export default Footer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Header, Main, Footer 컴포넌트를 각각 파일로 분리했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;13. App.jsx에서 컴포넌트 불러오기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분리한 컴포넌트를 사용하려면 App.jsx에서 import 해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;import Header from './components/Header'
import Main from './components/Main'
import Footer from './components/Footer'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 JSX에서 컴포넌트를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import Header from './components/Header'
import Main from './components/Main'
import Footer from './components/Footer'

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Header /&amp;gt;
      &amp;lt;Main /&amp;gt;
      &amp;lt;Footer /&amp;gt;
    &amp;lt;/&amp;gt;
  )
}

export default App&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 화면에는 세 개의 컴포넌트가 순서대로 렌더링됩니다.&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;header

main

footer&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;14. import에서 .jsx 확장자 생략하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트를 import할 때 다음과 같이 확장자까지 작성할 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;import Header from './components/Header.jsx'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 일반적으로 .jsx 확장자는 생략할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;import Header from './components/Header'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vite를 이용한 React 프로젝트에서는 이러한 모듈 파일을 해석할 수 있도록 기본 설정이 되어 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 보통 다음과 같이 확장자를 생략해서 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;import Header from './components/Header'
import Main from './components/Main'
import Footer from './components/Footer'&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;15. 최종 컴포넌트 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 만든 컴포넌트 구조를 그림으로 표현하면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;                App
                 │
       ┌─────────┼─────────┐
       │         │         │
    Header      Main     Footer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 이렇게 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;컴포넌트를 트리 형태로 구성&lt;/b&gt;&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 상위에 있는 App 컴포넌트가 렌더링되고, App 내부에서 사용한 Header, Main, Footer 컴포넌트가 차례대로 렌더링됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 규모가 커질수록 이러한 컴포넌트 구조는 더욱 복잡해질 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;App
├─ Header
│  ├─ Logo
│  └─ Navigation
├─ Main
│  ├─ Content
│  └─ Sidebar
└─ Footer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 React에서는 화면을 적절한 단위로 나누고 각각을 컴포넌트로 만들어 관리하는 것이 중요합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 React의 핵심 개념인 컴포넌트에 대해 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;React에서는 JSX를 반환하는 함수를 컴포넌트로 만들 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;함수로 만든 컴포넌트를 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;함수 컴포넌트&lt;/b&gt;&lt;/span&gt;라고 한다.&lt;/li&gt;
&lt;li&gt;컴포넌트 이름은 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;반드시 대문자로 시작해야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;컴포넌트는 일반 함수 선언식 또는 화살표 함수로 만들 수 있다.&lt;/li&gt;
&lt;li&gt;컴포넌트를 만들기만 해서는 화면에 표시되지 않으며, 렌더링되는 컴포넌트 내부에서 사용해야 한다.&lt;/li&gt;
&lt;li&gt;다른 컴포넌트 내부에서 사용되는 컴포넌트는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;자식 컴포넌트&lt;/b&gt;&lt;/span&gt;가 된다.&lt;/li&gt;
&lt;li&gt;자식 컴포넌트를 포함하는 컴포넌트는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;부모 컴포넌트&lt;/b&gt;&lt;/span&gt;가 된다.&lt;/li&gt;
&lt;li&gt;일반적으로 컴포넌트는 역할별로 파일을 분리하여 관리한다.&lt;/li&gt;
&lt;li&gt;export를 통해 컴포넌트를 내보내고, 다른 파일에서 import하여 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;여러 컴포넌트를 조합하여 하나의 화면을 구성할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 개발은 결국 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;작은 컴포넌트를 만들고, 이를 조합하여 화면을 구성하는 방식&lt;/b&gt;&lt;/span&gt;이라고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음부터는 이렇게 만든 컴포넌트에 데이터를 전달하거나 상태를 관리하는 방법을 학습하면 React의 동작 방식을 더욱 잘 이해할 수 있습니다.&lt;/p&gt;</description>
      <category>Web Frontend/React</category>
      <category>React</category>
      <category>Web Frontend</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/715</guid>
      <comments>https://seosh817.tistory.com/715#entry715comment</comments>
      <pubDate>Tue, 7 Apr 2026 12:52:30 +0900</pubDate>
    </item>
    <item>
      <title>[React] React App 만들기 + Vite 설정 및 ESLint 적용하기</title>
      <link>https://seosh817.tistory.com/714</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Vite를 이용해서 간단한 React App을 생성하고, 기본으로 제공되는 코드를 정리한 뒤 ESLint까지 설정해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 React 프로젝트를 만들 때는 직접 Webpack 등의 개발 환경을 구성하는 것보다 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Vite를 사용하는 것이 훨씬 간편합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. React App 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;React 프로젝트&lt;/span&gt;&lt;/b&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;그래서 아래와 같은 과정으로 진행하게 됩니다.&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: #ef5369;&quot;&gt;&lt;b&gt;1. Node.js 패키지 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. React 라이브러리 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. 기타 도구 설치 및 설정(입문자에게는 까다로우므로 Vite 설치)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Vite란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Vite&lt;/b&gt;&lt;/span&gt;는 차세대 프론트엔드 개발 도구로, React 등의 프로젝트를 빠르게 생성하고 개발 서버를 실행할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 프로젝트 설정이 이미 되어 있기 때문에 React를 처음 공부할 때 사용하기 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 다음 명령어를 입력합니다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;npm create vite@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 실행하면 프로젝트 이름과 사용할 프레임워크, 언어 등을 선택하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React를 선택해서 프로젝트를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 생성이 완료되면 해당 프로젝트 폴더로 이동합니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;cd 프로젝트명
&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;그다음 package.json에 정의되어 있는 패키지들을 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;npm install
&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;설치가 완료되었다면 개발 서버를 실행합니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run dev
&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;터미널에 표시되는 주소로 접속하면 생성된 React App을 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 기본으로 생성된 React 코드 정리하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vite로 React 프로젝트를 생성하면 처음에는 예제 코드가 상당히 많이 들어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 React를 공부할 때는 이 코드들이 오히려 복잡하게 느껴질 수 있기 때문에 필요한 부분만 남겨두도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트의 src/App.jsx를 확인해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 코드에는 React와 Vite 로고, 카운터 등의 예제 코드가 포함되어 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 필요하지 않은 import 삭제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 다음과 같은 코드가 있을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;import reactLogo from './assets/react.svg'
import viteLogo from './assets/vite.svg'
import heroImg from './assets/hero.png'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 사용하지 않을 예정이므로 삭제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 useState도 사용하지 않을 것이므로 다음 코드 역시 삭제합니다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;import { useState } from 'react'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다음 코드도 삭제합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;const [count, setCount] = useState(0)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 기본 예제 화면 삭제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vite가 생성해준 기본 화면에는 React 로고, Vite 로고, 카운터, Documentation 등의 예제 코드가 들어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;section id=&quot;center&quot;&amp;gt;
  ...
&amp;lt;/section&amp;gt;

&amp;lt;div className=&quot;ticks&quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;section id=&quot;next-steps&quot;&amp;gt;
  ...
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 필요하지 않으므로 해당 부분을 모두 삭제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 App.jsx를 최대한 간단하게 만들어줍니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import './App.css'

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;안녕 리액트.&amp;lt;/h1&amp;gt;
    &amp;lt;/&amp;gt;
  )
}

export default App
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 화면에는 다음과 같이 간단한 문구만 출력됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕 리액트.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. CSS 파일 초기화하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 Vite에서 생성되는 CSS에는 기본 예제 화면을 위한 스타일이 많이 들어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이번 실습에서는 App.css와 index.css의 내용을 모두 삭제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 스타일은 앞으로 직접 작성하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 프로젝트 구조는 대략 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;프로젝트
├─ node_modules
├─ public
├─ src
│  ├─ App.css
│  ├─ App.jsx
│  ├─ index.css
│  └─ main.jsx
├─ eslint.config.js
├─ index.html
├─ package.json
└─ vite.config.js
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. main.jsx 확인하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 main.jsx를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vite에서 React 프로젝트를 생성하면 기본적으로 다음과 같이 React.StrictMode가 적용되어 있을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;&amp;lt;React.StrictMode&amp;gt;
  &amp;lt;App /&amp;gt;
&amp;lt;/React.StrictMode&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 StrictMode를 사용하지 않을 것이므로 삭제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 다음과 같이 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'

createRoot(document.getElementById('root')).render(
  &amp;lt;App /&amp;gt;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;React.StrictMode란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;StrictMode&lt;/b&gt;&lt;/span&gt;는 개발 환경에서 React 코드를 작성할 때 발생할 수 있는 잠재적인 문제를 검사하고 경고해주는 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 서비스에서 반드시 제거해야 하는 기능이라는 의미는 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 현재 실습에서는 React의 기본 동작을 단순하게 이해하는 것이 목적이므로 일단 제외하고 진행하겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. ESLint 설치 및 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 코드 작성 시 실수를 줄이고 일정한 코딩 스타일을 유지하기 위해 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;ESLint&lt;/b&gt;&lt;/span&gt;를 설정해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VS Code를 사용한다면 Extensions에서 ESLint 확장 프로그램을 설치할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESLint는 JavaScript 코드에서 문법적인 문제나 잠재적인 오류 등을 찾아주는 도구입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. .eslintrc.cjs 파일이 없는데?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 한 가지 헷갈릴 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전 React 강의나 자료를 보면 다음과 같은 파일을 사용하는 경우가 있습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.eslintrc.cjs
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 최근 ESLint에서는 설정 방식이 변경되면서 다음과 같은 파일이 사용될 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;eslint.config.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.eslintrc.cjs 파일이 없다고 해서 잘못된 것이 아닙니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 생성된 프로젝트에 eslint.config.js가 있다면 해당 파일을 사용하면 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. eslint.config.js 설정하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 ESLint에서는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Flat Config&lt;/b&gt;&lt;/span&gt; 방식이 기본 설정 방식으로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 설정할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import js from '@eslint/js'
import globals from 'globals'

export default [
  js.configs.recommended,
  {
    languageOptions: {
      ecmaVersion: 2020,
      sourceType: 'module',
      globals: globals.browser,
    },
    rules: {
      'semi': ['error', 'always'],
      'quotes': ['error', 'single'],
      'no-unused-vars': 'warn',
      'prefer-const': 'error',
    },
  },
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 설정은 다음과 같은 의미를 가집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;semi&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세미콜론 사용 여부를 검사합니다.&lt;/p&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;'semi': ['error', 'always']
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세미콜론을 반드시 사용하도록 설정합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;quotes&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열에 사용할 따옴표를 설정합니다.&lt;/p&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;'quotes': ['error', 'single']
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은따옴표(')를 사용하도록 설정합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;no-unused-vars&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하지 않는 변수가 있는지 검사합니다.&lt;/p&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;'no-unused-vars': 'warn'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하지 않는 변수가 있으면 경고를 표시합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;prefer-const&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경되지 않는 변수는 let 대신 const를 사용하도록 검사합니다.&lt;/p&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;'prefer-const': 'error'
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. React 프로젝트에서 ESLint 설정하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 프로젝트에서는 React 전용 ESLint 설정을 추가할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 eslint-plugin-react를 사용하는 방법이 있습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;npm install -D eslint-plugin-react
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 eslint.config.js에서 React 관련 설정을 추가할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import js from '@eslint/js'
import globals from 'globals'
import pluginReact from 'eslint-plugin-react'
import { defineConfig } from 'eslint/config'

export default defineConfig([
  {
    files: ['**/*.{js,mjs,cjs,jsx}'],
    plugins: {
      js,
    },
    extends: ['js/recommended'],
    languageOptions: {
      globals: globals.browser,
    },
    rules: {
      'no-unused-vars': 'off',
    },
  },
  {
    ...pluginReact.configs.flat.recommended,
    rules: {
      'react/prop-types': 'off',
    },
  },
])
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은 &lt;b&gt;ESLint 버전이나 프로젝트 생성 방식에 따라 설정 파일의 형태가 달라질 수 있다는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 포스트에서는 eslint.config.js를 다루고 있는데 내 프로젝트에는 .eslintrc.cjs가 있다면, 무조건 똑같은 파일을 만들 필요는 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 프로젝트의 ESLint 버전에 맞는 설정 방식을 사용하는 것이 중요합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;11. npm init @eslint/config 명령어&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESLint 설정을 직접 만드는 것이 어렵다면 다음 명령어를 사용할 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;npm init @eslint/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 실행하면 질문에 답하면서 ESLint 설정을 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 ESLint의 버전에 따라 생성되는 파일이나 설정 형태가 달라질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에는 .eslintrc 계열 파일이 생성되는 경우가 많았지만, 최근 버전에서는 eslint.config.js가 생성될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 파일 이름이 자료와 다르더라도 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;현재 사용하고 있는 ESLint 버전의 설정 방식을 확인하는 것이 좋습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 과정에서는 Vite를 이용해 React 프로젝트를 생성하고, 기본으로 제공되는 예제 코드를 정리했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 과정은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;Vite를 이용해 React 프로젝트 생성&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;npm install로 패키지 설치&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;npm run dev로 개발 서버 실행&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;Vite 기본 예제 코드 삭제&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;App.jsx를 간단하게 정리&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;App.css, index.css 초기화&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;main.jsx에서 React.StrictMode 제거&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;VS Code에서 ESLint 확장 프로그램 설치&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;eslint.config.js를 이용해 ESLint 설정&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;필요하다면 eslint-plugin-react 추가&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 ESLint 부분에서 기억해둘 점은 최근에는&lt;b&gt;&amp;nbsp;설정 파일이 다를 수 있다는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전 자료에서는 .eslintrc.cjs를 많이 사용했지만, 최근 ESLint에서는 eslint.config.js를 사용하는 방식이 일반적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 기본적인 React 프로젝트 설정이 끝났으니, 다음 단계부터 본격적으로 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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web Frontend/React</category>
      <category>React</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/714</guid>
      <comments>https://seosh817.tistory.com/714#entry714comment</comments>
      <pubDate>Tue, 7 Apr 2026 12:52:23 +0900</pubDate>
    </item>
    <item>
      <title>[React] React 사용을 위한 Node.js 설정 및 사용법</title>
      <link>https://seosh817.tistory.com/712</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Node.js 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 공식 사이트에서 LTS 버전으로 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nodejs.org/ko/download&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772544780219&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Node.js &amp;mdash; Node.js&amp;reg; 다운로드&quot; data-og-description=&quot;Node.js&amp;reg; is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/ko/download&quot; data-og-url=&quot;https://nodejs.org/ko/download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbkO03/dJMb9efbv2T/4zdSqWvgh82ktdShL6qK40/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/gm8nQ/dJMb9aKCGc2/Q30Y9sVT3wGQn9nM5CqQqK/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/ko/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbkO03/dJMb9efbv2T/4zdSqWvgh82ktdShL6qK40/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/gm8nQ/dJMb9aKCGc2/Q30Y9sVT3wGQn9nM5CqQqK/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Node.js &amp;mdash; Node.js&amp;reg; 다운로드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;node -v&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;npm -v&lt;/span&gt;&lt;/b&gt; 명령어로 설치 여부 확인.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8RmO3/dJMcaiCqk0x/9dedGXQnkvI3Ray3NwP6vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8RmO3/dJMcaiCqk0x/9dedGXQnkvI3Ray3NwP6vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8RmO3/dJMcaiCqk0x/9dedGXQnkvI3Ray3NwP6vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8RmO3%2FdJMcaiCqk0x%2F9dedGXQnkvI3Ray3NwP6vK%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;500&quot; height=&quot;88&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;56&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;패키지 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;패키지&lt;/span&gt;&lt;/b&gt; -&amp;gt; Node.js에서 사용하는 프로그램의 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;npm init&lt;/span&gt;&lt;/b&gt; 명령어를 이용해 패키지를 생성할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l9wpk/dJMcaioVt8S/V5ngk5eNr6WHLUGcDPg4DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l9wpk/dJMcaioVt8S/V5ngk5eNr6WHLUGcDPg4DK/img.png&quot; data-alt=&quot;npm init&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l9wpk/dJMcaioVt8S/V5ngk5eNr6WHLUGcDPg4DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl9wpk%2FdJMcaioVt8S%2FV5ngk5eNr6WHLUGcDPg4DK%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;634&quot; height=&quot;621&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;npm init&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 생성이 완료되면 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;package.json&lt;/span&gt;&lt;/b&gt; 이라는 설정 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pacakage.json을 열어보면 아래와 같이 패키지를 생성할 때 설정한 기본적인 내용들이 들어있다.&lt;/p&gt;
&lt;pre id=&quot;code_1772546058914&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;section03&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;author&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;amp;&amp;amp; exit 1&quot;,
   },
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 새로운 자바스크립트 파일을 만들고 실행시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 폴더 내에 index.js 파일을 생성하고 아래와 같은 내용을 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1772546152962&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;안녕 Node.js&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 node 명령어로 index.js를 실행시킬 수 있다.&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;node src/index.js&lt;/span&gt;&lt;/b&gt; 명령어로 노드를 실행할 수 있으나, package.json의 scripts에 명령어를 입력해주면 start에 node src/index.js로 값을 입력해주면 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;npm run start&lt;/span&gt;&lt;/b&gt; 명령어를 입력하여 실행 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1772544506272&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;section03&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;author&quot;: &quot;&quot;,
  &quot;type&quot;: &quot;module&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;amp;&amp;amp; exit 1&quot;,
    &quot;start&quot;: &quot;node src/index.js&quot;
  },
}&lt;/code&gt;&lt;/pre&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;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPMzeE/dJMcaioVugg/6gZwTmL53FYEf87Twt6RWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPMzeE/dJMcaioVugg/6gZwTmL53FYEf87Twt6RWk/img.png&quot; data-alt=&quot;node index.js, npm run start&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPMzeE/dJMcaioVugg/6gZwTmL53FYEf87Twt6RWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPMzeE%2FdJMcaioVugg%2F6gZwTmL53FYEf87Twt6RWk%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;430&quot; height=&quot;114&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;node index.js, npm run start&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;모듈 시스템 이해하기&lt;/b&gt;&lt;/h2&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;JavaScript의 모듈 시스템에는 아래와 같은 것들이 존재하지만, 가장 많이 사용하는 CJS와 EMS에 대해서만 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Common JS(CJS)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;ES Module(ESM)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AMD&lt;br /&gt;UMD&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Common JS(CJS)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;module.exports&lt;/span&gt;&lt;/b&gt;에 메소드를 등록해서 외부에서 불러올 수 있게 하고, 가져올 때는 &lt;b&gt;&lt;/b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;require&lt;/b&gt;&lt;/span&gt; 메소드를 이용해서 모듈의 메소드를 불러올 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;math.js&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1772548004200&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// math 모듈
function add(a, b) {
  return a + b;
}

function sub(a, b) {
  return a - b;
}

// CJS (Common JS 모듈 시스템)

module.exports = {
  add, // 이렇게 key값과 value 값이 같을 경우에는 생략 가능.
  // add : add,
  sub: sub,
};&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;index.js&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1772548067108&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// CJS (Common JS 모듈 시스템)

// const moduleData = require(&quot;./math&quot;);
// console.log(moduleData.add(1, 2));
// console.log(moduleData.sub(1, 2));

const { add, sub } = require(&quot;./math&quot;);

console.log(add(1, 2));
console.log(sub(1, 2));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;EMS(ES Module 시스템)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;export 키워드&lt;/span&gt;&lt;/b&gt;를 붙여 외부에서 불러올 수 있게 하였고, 가져오는 곳에서 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;import 키워드&lt;/span&gt;&lt;/b&gt;를 이용하여 불러올 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1772548178504&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// math 모듈
export function add(a, b) {
  return a + b;
}

export function sub(a, b) {
  return a - b;
}

// default 불러올 때 이름을 마음대로 정해서 불러올 수 있다.
export default function multiply(a, b) {

  return a * b;
}

// ESM (ES Module 시스템)
// 이렇게 안하고 function 앞에 export 키워드를 붙여줘도 된다!
// export { add, sub }; // export 키워드를 이용해서 객체를 리터럴로 생성해서 넘겨주기만 하면 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;index.js&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1772548298459&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ESM (ES Module 시스템)
import mul, { add, sub } from &quot;./math.js&quot;;
// import mul from &quot;./math.js&quot;;
// import { add, sub } from &quot;./math.js&quot;;

console.log(add(1, 2));
console.log(sub(1, 2));&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;외부 패키지 설치하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;npmjs 사이트&lt;/b&gt;&lt;/span&gt; -&amp;gt;&amp;nbsp; node.js 패키지 모음 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.npmjs.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;npm i [패키지명]&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;npm i 명령어를 입력하여 패키지를 설치하면 node_modules 폴더와 package-lock.json 파일이 생성된다.&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: #ef5369;&quot;&gt;&lt;b&gt;node_modules&lt;/b&gt;&lt;/span&gt; -&amp;gt; 설치한 라이브러리가 저장되는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(node_modules가 지워졌다면 npm i 명령어를 입력하면 다시 설치됨.)&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;package-lock.json&lt;/span&gt;&lt;/b&gt; -&amp;gt; 패키지가 사용하고 있는 라이브러리의 정확한 버전이나 정보를 저장하는 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(package.json에는 대략적인 버전 정보만 저장됨.)&lt;/p&gt;</description>
      <category>Web Frontend/React</category>
      <category>Node.js</category>
      <category>React</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/712</guid>
      <comments>https://seosh817.tistory.com/712#entry712comment</comments>
      <pubDate>Tue, 3 Mar 2026 22:23:11 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] JS의 비동기 처리 (콜백 함수, Promise, Async &amp;amp; Await)</title>
      <link>https://seosh817.tistory.com/710</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동기와 비동기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;동기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 여러개의 작업을 순서대로, 하나씩 표현하는 방식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 개의 작업이 있을 때 각 작업을 순서대로 처리하는 것을 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;동기적으로 처리한다&lt;/span&gt;&lt;/b&gt;라고 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Task A, Task B, Task C가 있다고 가정한다면, Task A가 종료되면 Task B가 실행되고, Task B가 종료되면 Task C가 실행되고 최종적으로는 순서대로 완료하는 흐름으로 표현할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1803&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXp0Vc/dJMcahXONw2/Ku9saD5oXs8S2o9UA3znB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXp0Vc/dJMcahXONw2/Ku9saD5oXs8S2o9UA3znB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXp0Vc/dJMcahXONw2/Ku9saD5oXs8S2o9UA3znB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXp0Vc%2FdJMcahXONw2%2FKu9saD5oXs8S2o9UA3znB1%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;600&quot; height=&quot;97&quot; data-origin-width=&quot;1803&quot; data-origin-height=&quot;290&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;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;쓰레드&lt;/span&gt;&lt;/b&gt;라고 부른다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동기적인 방식의 단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;but, 동기적인 방식에는 치명적인 단점이 존재한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Task가 오래 걸리는 작업이라면 작업을 처리하기 전 까지는 다음 Task를 실행할 수 없게되어 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;전체 프로그램의 성능이 악화&lt;/span&gt;&lt;/b&gt;되어 버리는 치명적인 단점이 존재한다.&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;1887&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baJ98j/dJMcaih7bOr/Rp5N3DGatWQ6AgErwkmMfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baJ98j/dJMcaih7bOr/Rp5N3DGatWQ6AgErwkmMfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baJ98j/dJMcaih7bOr/Rp5N3DGatWQ6AgErwkmMfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaJ98j%2FdJMcaih7bOr%2FRp5N3DGatWQ6AgErwkmMfk%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;600&quot; height=&quot;92&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;290&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;이러한 단점을 해결하기 위해, Java나 C# 같은 경우에는 여러개의 쓰레드를 동시에 사용하는 멀티 쓰레드 방법을 활용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diow6C/dJMcaioT5ii/iGH7T7rPCMJZToIfgKN8k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diow6C/dJMcaioT5ii/iGH7T7rPCMJZToIfgKN8k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diow6C/dJMcaioT5ii/iGH7T7rPCMJZToIfgKN8k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdiow6C%2FdJMcaioT5ii%2FiGH7T7rPCMJZToIfgKN8k0%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;600&quot; height=&quot;264&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;803&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;but, 아쉽게도 JavaScript 엔진에는 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;쓰레드가 1개 밖에 없기 때문&lt;/span&gt;&lt;/b&gt;에 멀티 쓰레드 방식으로는 해결할 수 없으므로, 비동기 방식으로 해결해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;비동기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 작업을 순서대로 처리하지 않는 방식&lt;/span&gt;&lt;/b&gt;&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;1037&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KSiVJ/dJMcaf6Lj1B/2ckDIamFN4wqt9PtO66yCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KSiVJ/dJMcaf6Lj1B/2ckDIamFN4wqt9PtO66yCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KSiVJ/dJMcaf6Lj1B/2ckDIamFN4wqt9PtO66yCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKSiVJ%2FdJMcaf6Lj1B%2F2ckDIamFN4wqt9PtO66yCk%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;600&quot; height=&quot;475&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;821&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;1844&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7K69h/dJMcagq4htH/U6j3KJknD5o19LfBku3tIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7K69h/dJMcagq4htH/U6j3KJknD5o19LfBku3tIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7K69h/dJMcagq4htH/U6j3KJknD5o19LfBku3tIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7K69h%2FdJMcagq4htH%2FU6j3KJknD5o19LfBku3tIk%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;600&quot; height=&quot;168&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;517&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;그래서 앞선 작업의 결과 값을 받아서 사용하고 싶다면 각각의 작업에 Callback을 붙여서 사용할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript는 비동기 작업들을 어떻게 동시에 처리할 수 있는가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 작업들은 쓰레드에서 실행되는 것이 아닌, 자바스크립트 엔진이 아닌 Web APIs 에서 실행된다.&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;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1. JavaScript Engine은 비동기 함수를 만나게 되면, 이 비동기 함수를 Web Browser의 Web APIs에게 실행해달라고 부탁한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;2. 이때, 해당 비동기 함수가 끝나면 실행할 콜백 함수까지 넘겨준다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3. 비동기 함수가 끝나면 콜백 함수를 JavaScript Engine에게 돌려준다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLiJmY/dJMcajnJjLm/kLUSFxltuygW2JG8trvKak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLiJmY/dJMcajnJjLm/kLUSFxltuygW2JG8trvKak/img.png&quot; data-alt=&quot;JavaScript의 비동기 작업 처리 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLiJmY/dJMcajnJjLm/kLUSFxltuygW2JG8trvKak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLiJmY%2FdJMcajnJjLm%2FkLUSFxltuygW2JG8trvKak%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;600&quot; height=&quot;404&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JavaScript의 비동기 작업 처리 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;비동기&amp;nbsp; 처리 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 콜백 함수&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 비동기 처리 작업의 결과로 콜백 함수를 달아줄 수는 있지만 아래의 orderFood() 함수처럼 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;콜백 지옥&lt;/span&gt;&lt;/b&gt;이 생길 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1772375847964&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 콜백 함수

function add(a, b) {
  setTimeout(() =&amp;gt; {
    const sum = a + b; // 3
    callback(sum);
  }, 3000);
}

add(1, 2, (value) =&amp;gt; {
  console.log(value); // 3 출력
});

// 음식을 주문하는 상황
function orderFood(callback) {
  setTimeout(() =&amp;gt; {
    const food = &quot;떡볶이&quot;;
    callback(food);
  }, 3000);
}

function cooldownFood(food, callback) {
  setTimeout(() =&amp;gt; {
    const cooldowndedFood = `식은 ${food}`;
    callback(cooldownFood);
  }, 2000);
}

function freezFood(food) {
  setTimeout(() =&amp;gt; {
    const freezedFood = `냉동된 ${food}`;
    callback(freezedFood);
  }, 1500);
}

orderFood((food) =&amp;gt; {
  console.log(food);

  cooldowndedFood(food, (cooldownFood) =&amp;gt; {
    console.log(cooldownFood);

    freezFood(cooldownFood, (freezedFood) =&amp;gt; {
      console.log(freezedFood);
    });
  });
});

// 3초 뒤 떡볶이 출력
// 2초 뒤 식은 떡볶이 출력
// 1.5초 뒤 냉동된 식은 떡볶이 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Promise&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 비동기 작업을 효율적으로 처리할 수 있도록 도와주는 자바스크립트 내장 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Promise는 setTimeout 함수와 같은 비동기 작업들을 래핑하는 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 감싸고 있는 비동기 작업을 실행, 관리, 결과 저장, 병렬 실행, 다시 실행 등의 비동기 작업들을 처리하는데에 필요한 모든 기능을 제공해주는 객체&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Promise의 3가지 상태&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbmz1w/dJMcajnJEDk/qDxuiPKJmSKEAUsPKMBgsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbmz1w/dJMcajnJEDk/qDxuiPKJmSKEAUsPKMBgsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbmz1w/dJMcajnJEDk/qDxuiPKJmSKEAUsPKMBgsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbmz1w%2FdJMcajnJEDk%2FqDxuiPKJmSKEAUsPKMBgsk%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;600&quot; height=&quot;218&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;616&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. &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;대기(Pending)&lt;/b&gt;&lt;/span&gt; -&amp;gt; 비동기 작업이 진행중인, 아직 작업이 완료되지 않은 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;성공(Fulfilled)&lt;/b&gt;&lt;/span&gt; -&amp;gt; 비동기 작업이 성공적으로 마무리 된 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;실패(Rejected)&lt;/span&gt;&lt;/b&gt; -&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;1649&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGYsRl/dJMcaaqR4ic/9IjClbdirDmtxNFp4KvYCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGYsRl/dJMcaaqR4ic/9IjClbdirDmtxNFp4KvYCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGYsRl/dJMcaaqR4ic/9IjClbdirDmtxNFp4KvYCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGYsRl%2FdJMcaaqR4ic%2F9IjClbdirDmtxNFp4KvYCk%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;600&quot; height=&quot;223&quot; data-origin-width=&quot;1649&quot; data-origin-height=&quot;613&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;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;해결(resolve)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;/span&gt; -&amp;gt;&amp;nbsp;비동기 작업이 성공해서 대기 -&amp;gt; 성공으로 바뀜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;거부(reject) &lt;/span&gt;&lt;/b&gt;-&amp;gt;&amp;nbsp;비동기 작업이 어떠한 이유로 대기 -&amp;gt; 실패로 바뀜&lt;/p&gt;
&lt;pre id=&quot;code_1772420648108&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 비동기 작업 처리하기 Promise

// resolve -&amp;gt; Promise가 관리하는 비동기 작업을 성공 상태로 바꾸는 함수가 들어있음.
// reject -&amp;gt; Promise가 관리하는 비동기 작업을 실패 상태로 바꾸는 함수가 들어있음.
const promise = new Promise((resolve, reject) =&amp;gt; {
  // 비동기 작업
  // executor

  setTimeout(() =&amp;gt; {
    console.log(&quot;안녕&quot;);
  }, 2000);
});

console.log(promise);&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;promise의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;PromiseState가&lt;/span&gt;&amp;nbsp;pending 상태&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AQlnG/dJMcajuxHmS/k8RL9vKGBxhKcktQYWfc6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AQlnG/dJMcajuxHmS/k8RL9vKGBxhKcktQYWfc6k/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AQlnG/dJMcajuxHmS/k8RL9vKGBxhKcktQYWfc6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAQlnG%2FdJMcajuxHmS%2Fk8RL9vKGBxhKcktQYWfc6k%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;500&quot; height=&quot;197&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1772420667068&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 비동기 작업 처리하기 Promise

// resolve -&amp;gt; Promise가 관리하는 비동기 작업을 성공 상태로 바꾸는 함수가 들어있음.
// reject -&amp;gt; Promise가 관리하는 비동기 작업을 실패 상태로 바꾸는 함수가 들어있음.
const promise = new Promise((resolve, reject) =&amp;gt; {
  // 비동기 작업
  // executor

  setTimeout(() =&amp;gt; {
    console.log(&quot;안녕&quot;);
    resolve();
  }, 2000);
});

console.log(promise);&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;resolve() 추가 후, 2초 뒤 promise의 PromiseState가 pending -&amp;gt; resolved 상태&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btvkCI/dJMcahwL0aY/kJtOyFM1AoL3rEPkM59dyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btvkCI/dJMcahwL0aY/kJtOyFM1AoL3rEPkM59dyk/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btvkCI/dJMcahwL0aY/kJtOyFM1AoL3rEPkM59dyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtvkCI%2FdJMcahwL0aY%2FkJtOyFM1AoL3rEPkM59dyk%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;500&quot; height=&quot;220&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1772420675909&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 비동기 작업 처리하기 Promise

// resolve -&amp;gt; Promise가 관리하는 비동기 작업을 성공 상태로 바꾸는 함수가 들어있음.
// reject -&amp;gt; Promise가 관리하는 비동기 작업을 실패 상태로 바꾸는 함수가 들어있음.
const promise = new Promise((resolve, reject) =&amp;gt; {
  // 비동기 작업
  // executor

  setTimeout(() =&amp;gt; {
    console.log(&quot;안녕&quot;);
    resolve(&quot;안녕&quot;);
  }, 2000);
});

console.log(promise);&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;이때, PromiseResult가 undefined로 결과값이 저장되어있지 않은 것을 확인할 수 있는데, resolve() 함수 안에 값을 넣어주면 된다.&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;336&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhcu9/dJMcafsagz7/rafuanOuy8Jrfes7s9RnxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhcu9/dJMcafsagz7/rafuanOuy8Jrfes7s9RnxK/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhcu9/dJMcafsagz7/rafuanOuy8Jrfes7s9RnxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flhcu9%2FdJMcafsagz7%2FrafuanOuy8Jrfes7s9RnxK%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;500&quot; height=&quot;305&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1772420878348&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 비동기 작업 처리하기 Promise

// resolve -&amp;gt; Promise가 관리하는 비동기 작업을 성공 상태로 바꾸는 함수가 들어있음.
// reject -&amp;gt; Promise가 관리하는 비동기 작업을 실패 상태로 바꾸는 함수가 들어있음.
const promise = new Promise((resolve, reject) =&amp;gt; {
  // 비동기 작업
  // executor

  setTimeout(() =&amp;gt; {
    console.log(&quot;안녕&quot;);
    // resolve(&quot;안녕&quot;);
    reject(&quot;왜 실패했는지 이유....&quot;);
  }, 2000);
});

console.log(promise);&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;반면, reject()를 사용하면 콘솔에 아래와 같이 PromiseState와 PromiseReulst가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBcwSS/dJMcajnJNAS/wph7873DKfnApmAYvj6K20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBcwSS/dJMcajnJNAS/wph7873DKfnApmAYvj6K20/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBcwSS/dJMcajnJNAS/wph7873DKfnApmAYvj6K20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBcwSS%2FdJMcajnJNAS%2Fwph7873DKfnApmAYvj6K20%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;500&quot; height=&quot;321&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;then 메소드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; promise가 성공하면, then 메소드에 전달한 callback 함수를 실행시킴.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772424450517&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// then 메소드
// -&amp;gt; promise가 성공하면, then 메소드에 전달한 callback 함수를 실행시킴.
promise.then((value) =&amp;gt; {
  console.log(value);
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;catch 메소드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; promise가 실패하면, catch 메소드에 전달한 callback 함수를 실행시킴.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772424494869&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// catch 메소드
// -&amp;gt; promise가 실패하면, catch 메소드에 전달한 callback 함수를 실행시킴.
promise.catch((error) =&amp;gt; {
  console.log(value);
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Promise Chaining&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; promise의 then과 catch는 promise 자기 자신을 반환하므로 연결해서 사용하는 것도 가능하다.&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772424521702&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// promise의 then과 catch는 promise 자기 자신을 반환하므로 연결해서 사용하는 것도 가능함. (promise chaining)
promise
  .then((value) =&amp;gt; {
    console.log(value);
  })
  .catch((error) =&amp;gt; {
    console.log(&quot;error&quot;);
  });&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Async &amp;amp; Await&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Async&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;gt; 어떤 함수를 비동기 함수로 만들어지는 키워드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;gt; 즉, 함수가 Promise를 반환하도록 변환해주는 키워드&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772427213772&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// async
// 어떤 함수를 비동기 함수로 만들어주는 키워드
// 함수가 프로미스를 반환하도록 변환해주는 키워드

async function getData() {
  return {
    name: &quot;서승환&quot;,
    id: &quot;seosh817&quot;,
  };
}

console.log(getData());&lt;/code&gt;&lt;/pre&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;395&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8Gi18/dJMcadA3tFm/TDFuhfyUYC9O2t0ITfvHIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8Gi18/dJMcadA3tFm/TDFuhfyUYC9O2t0ITfvHIk/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8Gi18/dJMcadA3tFm/TDFuhfyUYC9O2t0ITfvHIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8Gi18%2FdJMcadA3tFm%2FTDFuhfyUYC9O2t0ITfvHIk%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;500&quot; height=&quot;261&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Await&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; async 함수 내부에서만 사용이 가능한 키워드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 비동기 함수가 다 처리되기를 기다리고 결과를 반환함.&lt;/p&gt;
&lt;pre id=&quot;code_1772427253544&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function getData() {
  return new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      resolve({
        name: &quot;서승환&quot;,
        id: &quot;seosh817&quot;,
      });
    });
  });
}

// await
// async 함수 내부에서만 사용이 가능한 키워드
// 비동기 함수가 다 처리되기를 기다리고 결과를 반환함.

async function printData() {
    const data = await getData();
    console.log(data);
    // getData().then((result) =&amp;gt; {
    //     console.log(result);
    // });
}

printData();&lt;/code&gt;&lt;/pre&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;397&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bawuPy/dJMcabpNPlq/qLwNrF5SNyKAISNcjliT0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bawuPy/dJMcabpNPlq/qLwNrF5SNyKAISNcjliT0k/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bawuPy/dJMcabpNPlq/qLwNrF5SNyKAISNcjliT0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbawuPy%2FdJMcabpNPlq%2FqLwNrF5SNyKAISNcjliT0k%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;500&quot; height=&quot;199&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;References&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;b&gt;한 입 크기로 잘라 먹는 리액트(React.js)(이정환)&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web Frontend/JavaScript</category>
      <category>async</category>
      <category>Await</category>
      <category>PROMISE</category>
      <category>React</category>
      <category>비동기 처리</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/710</guid>
      <comments>https://seosh817.tistory.com/710#entry710comment</comments>
      <pubDate>Fri, 20 Feb 2026 23:41:23 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 함수 표현식과 화살표 함수 &amp;amp; 콜백 함수(Callback)</title>
      <link>https://seosh817.tistory.com/708</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수 표현식과 화살표 함수&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 함수 표현식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; &lt;b&gt;익명함수는&amp;nbsp;&lt;/b&gt;function () 형태로 만들 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771414679800&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 함수 표현식
function funcA() {
  console.log(&quot;funcA&quot;);
}

let varA = funcA; // 함수가 아니라 함수 자체를 넣어줌.
console.log(varA);

// f funcA() {
//    console.log(&quot;funcA&quot;);
//}
// 출력

varA(); // 함수를 실행

let varB = function funcB() {
  console.log(&quot;funcB&quot;);
};

varB();
// funcB(); -&amp;gt; 이건 오류, funcB는 사용할 수 없음.

let varC = function () {
  // 익명함수
  console.log(&quot;funcB&quot;);
};

console.log(varC()); // funcB 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 화살표 함수&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; 화살표 함수를 이용해서 익명함수를 function()이 아닌 () =&amp;gt; 형태로도 만들 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771414708935&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. 화살표 함수
let varD = () =&amp;gt; {
  return 1;
};

console.log(varD()); // 1 출력

let varE = () =&amp;gt; 1;

console.log(varE()); // 1 출력

let varF = (value) =&amp;gt; value + 1;

console.log(varF(10)); // 11 출력

let varG = (value) =&amp;gt; {
  console.log(value);
  return value + 1;
};

console.log(varG(10)); // 10 11 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;콜백 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; 자신이 아닌 다른 함수에, 인수로써 전달된 함수를 의미 함.&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; 매개 변수에 변수가 아닌 함수를 넘겨서 사용.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771422941273&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 콜백 함수

// 1. 콜백함수
// 자신이 아닌 다른 함수에, 인수로써 전달된 함수를 의미 함

function main(value) {
  value();
}

function sub() {
  console.log(&quot;i am sub&quot;);
}

main(sub); // &quot;i am sub 출력&quot;

main(function sub() {
  // 이렇게도 가능.
  console.log(&quot;i am sub&quot;);
});

main(() =&amp;gt; {
  // 이렇게도 가능.
  console.log(&quot;i am sub&quot;);
});

// 2. 콜백함수의 활용.
function repeat(count) {
  for (let idx = 1; idx &amp;lt;= count; idx++) {
    console.log(idx);
  }
}

function repeatDouble(count) {
  for (let idx = 1; idx &amp;lt;= count; idx++) {
    console.log(idx * 2);
  }
}

// repeat(5);
// repeatDouble(5);

// 위 처럼 구조가 흡사한 함수를 만들 일이 있음.
// 이럴 경우 아래와 같이 콜백함수로 만들 수 있음.

function repeatCallback(count, callback) {
  for (let idx = 1; idx &amp;lt;= count; idx++) {
    callback(idx);
  }
}

repeatCallback(5, function (idx) {
  console.log(idx);
});

repeatCallback(5, (idx) =&amp;gt; {
  // function 제거하고 =&amp;gt; 붙여도 동일하게 사용 가능.
  console.log(idx * 2);
});

repeatCallback(5, (idx) =&amp;gt; {
  console.log(idx * 3);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web Frontend/JavaScript</category>
      <category>JavaScript</category>
      <category>함수 표현식</category>
      <category>화살표 함수</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/708</guid>
      <comments>https://seosh817.tistory.com/708#entry708comment</comments>
      <pubDate>Wed, 18 Feb 2026 20:37:33 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 연산자</title>
      <link>https://seosh817.tistory.com/707</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;연산자&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 대입 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; = 연산자&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411624276&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 대입 연산자 (=)
let var1 = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 산술 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; +, -, *, /, % 연산자&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411672600&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. 산술 연산자
let num1 = 3 + 2;
let num2 = 3 - 2;
let num3 = 3 * 2;
let num4 = 3 / 2;
let num5 = 3 % 2;

let num6 = 1 + 2 * 10;
console.log(num6); // *가 우선순위가 높으므로 21 출력.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 복합 대입 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 산술 + 대입 연산자&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411710443&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 3. 복합 대입 연산자 (산술 + 대입)
let num7 = 10;
num7 += 20; // num7 = num7 + 20;
num7 -= 20;
num7 *= 20;
num7 /= 20;
num7 %= 10;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 증감 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 후위 연산, 전위 연산&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411742567&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 4. 증감 연산자
let num8 = 10;
num8++; // 후위 연산. 이 줄이 끝나고 나서야 +1이 증가된다.
console.log(num8);
console.log(++num8); // 전위 연산. +1이 증가된 이후에 줄이 실행된다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 논리 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; ||(or), &amp;amp;&amp;amp;(and), !(not)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411813532&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 5. 논리 연산자
let or = true || false;
let and = true &amp;amp;&amp;amp; false;
let not = !true;
console.log(or, and, not); // true false false 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 비교 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; ===는 자료형까지 같은지 비교한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; ==는 자료형이 같은지는 비교하지 않는다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411888223&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 6. 비교 연산자 (==을 사용하게 되면 자료형이 같은지 까지는 비교하지 않는다!)
let comp1 = 1 === 2; // 같은 값이 아니기 때문에 false
let comp2 = 1 !== 2; // 같은 값이 아니기 때문에 true
console.log(comp1, comp2);

let comp3 = 2 &amp;gt; 1; // true
let comp4 = 2 &amp;lt; 1; // false
console.log(comp3, comp4);

let comp5 = 2 &amp;gt;= 2; // true
let comp6 = 2 &amp;lt;= 2; // true
console.log(comp5, comp6);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. null 병합 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; null, undefined가 아닌 값을 찾아내는 연산자&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 존재하는 값을 추려내는 기능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411971223&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 7. null 병합 연산자
// -&amp;gt; null, undefined가 아닌 값을 찾아내는 연산자
// -&amp;gt; 존재하는 값을 추려내는 기능
let var1; // undefined
let var2 = 10;
let var3 = 20;

let var4 = var1 ?? var2; // 10 var4에 undefined가 아닌 var2의 값을 저장한다.
let var5 = var1 ?? var3; // 20 var4에 undefined가 아닌 var3의 값을 저장한다.
let var6 = var3 ?? var2;

let userName;
let userNickName = &quot;seosh817&quot;;

let displayName = userName ?? userNickName; // userName이 undefined라면 userNickName으로 저장한다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. typeof 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 값의 타입을 문자열로 반환하는 기능을 하는 연산자.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771412143528&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 8. typeof 연산자
// -&amp;gt; 값의 타입을 문자열로 반환하는 기능을 하는 연산자.
let var7 = &quot;hello&quot;;

let t1 = typeof var7;
console.log(t1); // string&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9. 삼항 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 항을 3개 사용하는 연산자.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;-&amp;gt; 조건식을 이용해서 참, 거짓일 때의 값을 다르게 반환&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771412191183&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 9. 삼항 연산자
// -&amp;gt; 항을 3개 사용하는 연산자.
// -&amp;gt; 조건식을 이용해서 참, 거짓일 때의 값을 다르게 반환
let var8 = 10;

// 요구사항 : 변수 res에 var8의 값이 짝수 -&amp;gt; &quot;짝&quot;, 홀수 -&amp;gt; &quot;&quot;
let res = var8 % 2 === 0 ? &quot;짝수&quot; : &quot;홀수&quot;;
console.log(res); // 짝수 출력.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web Frontend/JavaScript</category>
      <category>JavaScript</category>
      <category>연산자</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/707</guid>
      <comments>https://seosh817.tistory.com/707#entry707comment</comments>
      <pubDate>Wed, 18 Feb 2026 19:48:50 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 형 변환</title>
      <link>https://seosh817.tistory.com/706</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;형 변환&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 묵시적 형 변환&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt;&amp;nbsp;자바스크립트&amp;nbsp;엔진이&amp;nbsp;오류를&amp;nbsp;발생시키지&amp;nbsp;않기&amp;nbsp;위해서&amp;nbsp;알아서&amp;nbsp;형&amp;nbsp;변환&amp;nbsp;하는&amp;nbsp;것.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411177340&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 묵시적 형 변환
// -&amp;gt; 자바스크립트 엔진이 오류를 발생시키지 않기 위해서 알아서 형 변환 하는 것.

let num = 10;
let str = &quot;20&quot;;

const result = num + str; // 묵시적으로 String으로 형 변환. &quot;10&quot; + &quot;20&quot; = &quot;1020&quot;
console.log(result); // &quot;1020&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 명시적 형 변환&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;-&amp;gt; 프로그래머 내장함수 등을 이용해서 직접 형 변환을 명시&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771411115968&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. 명시적 형 변환
// -&amp;gt; 프로그래머 내장함수 등을 이용해서 직접 형 변환을 명시
// -&amp;gt; 문자열 -&amp;gt; 숫자

let str1 = &quot;10&quot;;
let strToNum1 = Number(str1);
console.log(10 + strToNum1); // 20 출력. 10 + 10 = 20

let str2 = &quot;10개&quot;;
let strToNum2 = parseInt(str2); // 숫자가 앞쪽에 있으면 뒤에 문자가 있더라도 형 변환 해준다.

console.log(strToNum2); // 10 출력.

// -&amp;gt; 숫자 -&amp;gt; 문자열
let num1 = 20;
let numToStr1 = String(num1);

console.log(numToStr1 + &quot;입니다&quot;); // 20입니다 출력.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web Frontend/JavaScript</category>
      <category>JavaScript</category>
      <category>형 변환</category>
      <author>seunghwaan</author>
      <guid isPermaLink="true">https://seosh817.tistory.com/706</guid>
      <comments>https://seosh817.tistory.com/706#entry706comment</comments>
      <pubDate>Wed, 18 Feb 2026 19:38:23 +0900</pubDate>
    </item>
  </channel>
</rss>