<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>_민주</title>
    <link>https://kalswn.tistory.com/</link>
    <description> 여행을 좋아하는 개발자 </description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 17:24:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_민주</managingEditor>
    <image>
      <title>_민주</title>
      <url>https://tistory1.daumcdn.net/tistory/6585359/attach/15c04a2980e743d4ac8067f68a8fda19</url>
      <link>https://kalswn.tistory.com</link>
    </image>
    <item>
      <title>[Badminton Without Nets] 개인 정보 처리 방침</title>
      <link>https://kalswn.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[Badminton Without Nets] 개인 정보 처리 방침&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 개인정보 정책은 Badminton Without Nets 앱(이하 &quot;애플리케이션&quot;)에 적용되며, 무료 서비스로 제공됩니다. 이 서비스는 &quot;있는 그대로&quot; 사용하도록 의도되었습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;정보&amp;nbsp;수집&amp;nbsp;및&amp;nbsp;사용&lt;/b&gt;&lt;br /&gt;애플리케이션은&amp;nbsp;다운로드하여&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;정보를&amp;nbsp;수집합니다.&amp;nbsp;이&amp;nbsp;정보에는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;정보가&amp;nbsp;포함될&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;사용자&amp;nbsp;기기의&amp;nbsp;인터넷&amp;nbsp;프로토콜&amp;nbsp;주소(예:&amp;nbsp;IP&amp;nbsp;주소)&lt;br /&gt;방문한&amp;nbsp;애플리케이션의&amp;nbsp;페이지,&amp;nbsp;방문&amp;nbsp;시간과&amp;nbsp;날짜,&amp;nbsp;해당&amp;nbsp;페이지에서&amp;nbsp;보낸&amp;nbsp;시간&lt;br /&gt;애플리케이션에서&amp;nbsp;보낸&amp;nbsp;시간&lt;br /&gt;모바일&amp;nbsp;기기에서&amp;nbsp;사용하는&amp;nbsp;운영&amp;nbsp;체제&lt;br /&gt;애플리케이션은&amp;nbsp;사용자&amp;nbsp;모바일&amp;nbsp;기기의&amp;nbsp;정확한&amp;nbsp;위치&amp;nbsp;정보를&amp;nbsp;수집하지&amp;nbsp;않습니다.&lt;br /&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;중요한&amp;nbsp;정보,&amp;nbsp;필수&amp;nbsp;알림&amp;nbsp;및&amp;nbsp;마케팅&amp;nbsp;프로모션을&amp;nbsp;제공하기&amp;nbsp;위해&amp;nbsp;수시로&amp;nbsp;사용자가&amp;nbsp;제공한&amp;nbsp;정보를&amp;nbsp;사용하여&amp;nbsp;연락할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션&amp;nbsp;사용&amp;nbsp;경험을&amp;nbsp;개선하기&amp;nbsp;위해&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;이메일을&amp;nbsp;포함하되&amp;nbsp;이에&amp;nbsp;국한되지&amp;nbsp;않는&amp;nbsp;특정&amp;nbsp;개인&amp;nbsp;식별&amp;nbsp;정보를&amp;nbsp;요청할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;요청한&amp;nbsp;정보는&amp;nbsp;저장되며&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;설명된&amp;nbsp;대로&amp;nbsp;사용됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;제3자&amp;nbsp;접근&lt;/b&gt;&lt;br /&gt;집계되고&amp;nbsp;익명화된&amp;nbsp;데이터만&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;애플리케이션&amp;nbsp;및&amp;nbsp;서비스&amp;nbsp;개선을&amp;nbsp;돕기&amp;nbsp;위해&amp;nbsp;주기적으로&amp;nbsp;외부&amp;nbsp;서비스에&amp;nbsp;전송됩니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;설명된&amp;nbsp;방식으로&amp;nbsp;제3자와&amp;nbsp;귀하의&amp;nbsp;정보를&amp;nbsp;공유할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션은&amp;nbsp;자체&amp;nbsp;개인정보&amp;nbsp;처리방침을&amp;nbsp;가진&amp;nbsp;제3자&amp;nbsp;서비스를&amp;nbsp;사용한다는&amp;nbsp;점을&amp;nbsp;유의하십시오.&amp;nbsp;다음은&amp;nbsp;애플리케이션에서&amp;nbsp;사용하는&amp;nbsp;제3자&amp;nbsp;서비스&amp;nbsp;제공자의&amp;nbsp;개인정보&amp;nbsp;보호정책&amp;nbsp;링크입니다:&lt;br /&gt;&lt;br /&gt;Google&amp;nbsp;Play&amp;nbsp;Services&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;경우&amp;nbsp;사용자&amp;nbsp;제공&amp;nbsp;및&amp;nbsp;자동으로&amp;nbsp;수집된&amp;nbsp;정보를&amp;nbsp;공개할&amp;nbsp;수&amp;nbsp;있습니다:&lt;br /&gt;&lt;br /&gt;소환장&amp;nbsp;또는&amp;nbsp;유사한&amp;nbsp;법적&amp;nbsp;절차와&amp;nbsp;같이&amp;nbsp;법률에서&amp;nbsp;요구하는&amp;nbsp;경우&lt;br /&gt;서비스&amp;nbsp;제공자의&amp;nbsp;권리를&amp;nbsp;보호하거나,&amp;nbsp;사용자의&amp;nbsp;안전&amp;nbsp;또는&amp;nbsp;타인의&amp;nbsp;안전을&amp;nbsp;보호하거나,&amp;nbsp;사기를&amp;nbsp;조사하거나,&amp;nbsp;정부&amp;nbsp;요청에&amp;nbsp;응답하기&amp;nbsp;위해&amp;nbsp;공개가&amp;nbsp;필요하다고&amp;nbsp;선의로&amp;nbsp;판단하는&amp;nbsp;경우&lt;br /&gt;서비스&amp;nbsp;제공자를&amp;nbsp;대신하여&amp;nbsp;작업하며,&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;공개하는&amp;nbsp;정보를&amp;nbsp;독립적으로&amp;nbsp;사용하지&amp;nbsp;않고,&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;명시된&amp;nbsp;규칙을&amp;nbsp;준수하기로&amp;nbsp;동의한&amp;nbsp;신뢰할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;서비스&amp;nbsp;제공자와&amp;nbsp;함께&lt;br /&gt;옵트아웃&amp;nbsp;권리&lt;br /&gt;애플리케이션을&amp;nbsp;제거함으로써&amp;nbsp;모든&amp;nbsp;정보&amp;nbsp;수집을&amp;nbsp;쉽게&amp;nbsp;중단할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;모바일&amp;nbsp;기기의&amp;nbsp;일부로&amp;nbsp;제공되거나&amp;nbsp;모바일&amp;nbsp;애플리케이션&amp;nbsp;마켓플레이스&amp;nbsp;또는&amp;nbsp;네트워크를&amp;nbsp;통해&amp;nbsp;제공될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;표준&amp;nbsp;제거&amp;nbsp;프로세스를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;데이터&amp;nbsp;보존&amp;nbsp;정책&lt;br /&gt;서비스 제공자는 사용자가 애플리케이션을 사용하는 동안 및 그 후 합리적인 시간 동안 사용자가 제공한 데이터를 보관할 것입니다. 애플리케이션을 통해 제공한 사용자 제공 데이터를 삭제하고 싶다면 &lt;span style=&quot;background-color: #e9eef6; color: #000000; text-align: center;&quot;&gt;jasonjimin2009@gmail.com&lt;/span&gt;으로 연락하시면 합리적인 시간 내에 응답해 드리겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;아동&lt;/b&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;13세&amp;nbsp;미만&amp;nbsp;아동의&amp;nbsp;데이터를&amp;nbsp;수집하거나&amp;nbsp;이들을&amp;nbsp;대상으로&amp;nbsp;마케팅하기&amp;nbsp;위해&amp;nbsp;애플리케이션을&amp;nbsp;사용하지&amp;nbsp;않습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션은 13세 미만의 사용자를 대상으로 하지 않습니다. 서비스 제공자는 13세 미만 아동의 개인 식별 정보를 고의로 수집하지 않습니다. 서비스 제공자가 13세 미만 아동이 개인 정보를 제공한 것을 발견한 경우, 서비스 제공자는 즉시 서버에서 이를 삭제할 것입니다. 귀하가 부모 또는 보호자이고 자녀가 개인 정보를 제공했다는 사실을 알게 된 경우, 서비스 제공자(&lt;span style=&quot;background-color: #e9eef6; color: #000000; text-align: center;&quot;&gt;jasonjimin2009@gmail.com&lt;/span&gt;)에게 연락하여 필요한 조치를 취할 수 있도록 해주십시오.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;보안&lt;/b&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;귀하의&amp;nbsp;정보&amp;nbsp;기밀성을&amp;nbsp;보호하는&amp;nbsp;데&amp;nbsp;관심이&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;처리하고&amp;nbsp;유지하는&amp;nbsp;정보를&amp;nbsp;보호하기&amp;nbsp;위한&amp;nbsp;물리적,&amp;nbsp;전자적,&amp;nbsp;절차적&amp;nbsp;보호&amp;nbsp;장치를&amp;nbsp;제공합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;변경사항&lt;/b&gt;&lt;br /&gt;본&amp;nbsp;개인정보&amp;nbsp;정책은&amp;nbsp;어떤&amp;nbsp;이유로든&amp;nbsp;수시로&amp;nbsp;업데이트될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;새&amp;nbsp;개인정보&amp;nbsp;정책으로&amp;nbsp;이&amp;nbsp;페이지를&amp;nbsp;업데이트하여&amp;nbsp;개인정보&amp;nbsp;정책의&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;알려드릴&amp;nbsp;것입니다.&amp;nbsp;모든&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;지속적으로&amp;nbsp;사용하는&amp;nbsp;것은&amp;nbsp;모든&amp;nbsp;변경&amp;nbsp;사항에&amp;nbsp;대한&amp;nbsp;승인으로&amp;nbsp;간주되므로&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책을&amp;nbsp;정기적으로&amp;nbsp;확인하는&amp;nbsp;것이&amp;nbsp;좋습니다.&lt;br /&gt;&lt;br /&gt;이 개인정보 정책은 2025-11-13부터 유효합니다.&lt;br /&gt;&lt;br /&gt;귀하의&amp;nbsp;동의&lt;br /&gt;애플리케이션을&amp;nbsp;사용함으로써,&amp;nbsp;귀하는&amp;nbsp;현재&amp;nbsp;및&amp;nbsp;당사에&amp;nbsp;의해&amp;nbsp;개정된&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;명시된&amp;nbsp;대로&amp;nbsp;귀하의&amp;nbsp;정보&amp;nbsp;처리에&amp;nbsp;동의하는&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;연락처&lt;/b&gt;&lt;br /&gt;애플리케이션 사용 중 개인정보에 관한 질문이 있거나 관행에 대해 질문이 있으시면 이메일(jasonjimin2009@gmail.com)을 통해 서비스 제공자에게 문의하십시오.&lt;/p&gt;</description>
      <category>  개발 일지</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/64</guid>
      <comments>https://kalswn.tistory.com/64#entry64comment</comments>
      <pubDate>Fri, 14 Nov 2025 08:45:08 +0900</pubDate>
    </item>
    <item>
      <title>[Badminton without nets] 개인 정보 처리 방침</title>
      <link>https://kalswn.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[Badminton without nets] 개인 정보 처리 방침&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 개인정보 정책은 Badminton without nets 앱(이하 &quot;애플리케이션&quot;)에 적용되며, 무료 서비스로 제공됩니다. 이 서비스는 &quot;있는 그대로&quot; 사용하도록 의도되었습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;정보&amp;nbsp;수집&amp;nbsp;및&amp;nbsp;사용&lt;/b&gt;&lt;br /&gt;애플리케이션은&amp;nbsp;다운로드하여&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;정보를&amp;nbsp;수집합니다.&amp;nbsp;이&amp;nbsp;정보에는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;정보가&amp;nbsp;포함될&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;사용자&amp;nbsp;기기의&amp;nbsp;인터넷&amp;nbsp;프로토콜&amp;nbsp;주소(예:&amp;nbsp;IP&amp;nbsp;주소)&lt;br /&gt;방문한&amp;nbsp;애플리케이션의&amp;nbsp;페이지,&amp;nbsp;방문&amp;nbsp;시간과&amp;nbsp;날짜,&amp;nbsp;해당&amp;nbsp;페이지에서&amp;nbsp;보낸&amp;nbsp;시간&lt;br /&gt;애플리케이션에서&amp;nbsp;보낸&amp;nbsp;시간&lt;br /&gt;모바일&amp;nbsp;기기에서&amp;nbsp;사용하는&amp;nbsp;운영&amp;nbsp;체제&lt;br /&gt;애플리케이션은&amp;nbsp;사용자&amp;nbsp;모바일&amp;nbsp;기기의&amp;nbsp;정확한&amp;nbsp;위치&amp;nbsp;정보를&amp;nbsp;수집하지&amp;nbsp;않습니다.&lt;br /&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;중요한&amp;nbsp;정보,&amp;nbsp;필수&amp;nbsp;알림&amp;nbsp;및&amp;nbsp;마케팅&amp;nbsp;프로모션을&amp;nbsp;제공하기&amp;nbsp;위해&amp;nbsp;수시로&amp;nbsp;사용자가&amp;nbsp;제공한&amp;nbsp;정보를&amp;nbsp;사용하여&amp;nbsp;연락할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션&amp;nbsp;사용&amp;nbsp;경험을&amp;nbsp;개선하기&amp;nbsp;위해&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;이메일을&amp;nbsp;포함하되&amp;nbsp;이에&amp;nbsp;국한되지&amp;nbsp;않는&amp;nbsp;특정&amp;nbsp;개인&amp;nbsp;식별&amp;nbsp;정보를&amp;nbsp;요청할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;요청한&amp;nbsp;정보는&amp;nbsp;저장되며&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;설명된&amp;nbsp;대로&amp;nbsp;사용됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;제3자&amp;nbsp;접근&lt;/b&gt;&lt;br /&gt;집계되고&amp;nbsp;익명화된&amp;nbsp;데이터만&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;애플리케이션&amp;nbsp;및&amp;nbsp;서비스&amp;nbsp;개선을&amp;nbsp;돕기&amp;nbsp;위해&amp;nbsp;주기적으로&amp;nbsp;외부&amp;nbsp;서비스에&amp;nbsp;전송됩니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;설명된&amp;nbsp;방식으로&amp;nbsp;제3자와&amp;nbsp;귀하의&amp;nbsp;정보를&amp;nbsp;공유할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션은&amp;nbsp;자체&amp;nbsp;개인정보&amp;nbsp;처리방침을&amp;nbsp;가진&amp;nbsp;제3자&amp;nbsp;서비스를&amp;nbsp;사용한다는&amp;nbsp;점을&amp;nbsp;유의하십시오.&amp;nbsp;다음은&amp;nbsp;애플리케이션에서&amp;nbsp;사용하는&amp;nbsp;제3자&amp;nbsp;서비스&amp;nbsp;제공자의&amp;nbsp;개인정보&amp;nbsp;보호정책&amp;nbsp;링크입니다:&lt;br /&gt;&lt;br /&gt;Google&amp;nbsp;Play&amp;nbsp;Services&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;경우&amp;nbsp;사용자&amp;nbsp;제공&amp;nbsp;및&amp;nbsp;자동으로&amp;nbsp;수집된&amp;nbsp;정보를&amp;nbsp;공개할&amp;nbsp;수&amp;nbsp;있습니다:&lt;br /&gt;&lt;br /&gt;소환장&amp;nbsp;또는&amp;nbsp;유사한&amp;nbsp;법적&amp;nbsp;절차와&amp;nbsp;같이&amp;nbsp;법률에서&amp;nbsp;요구하는&amp;nbsp;경우&lt;br /&gt;서비스&amp;nbsp;제공자의&amp;nbsp;권리를&amp;nbsp;보호하거나,&amp;nbsp;사용자의&amp;nbsp;안전&amp;nbsp;또는&amp;nbsp;타인의&amp;nbsp;안전을&amp;nbsp;보호하거나,&amp;nbsp;사기를&amp;nbsp;조사하거나,&amp;nbsp;정부&amp;nbsp;요청에&amp;nbsp;응답하기&amp;nbsp;위해&amp;nbsp;공개가&amp;nbsp;필요하다고&amp;nbsp;선의로&amp;nbsp;판단하는&amp;nbsp;경우&lt;br /&gt;서비스&amp;nbsp;제공자를&amp;nbsp;대신하여&amp;nbsp;작업하며,&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;공개하는&amp;nbsp;정보를&amp;nbsp;독립적으로&amp;nbsp;사용하지&amp;nbsp;않고,&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;명시된&amp;nbsp;규칙을&amp;nbsp;준수하기로&amp;nbsp;동의한&amp;nbsp;신뢰할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;서비스&amp;nbsp;제공자와&amp;nbsp;함께&lt;br /&gt;옵트아웃&amp;nbsp;권리&lt;br /&gt;애플리케이션을&amp;nbsp;제거함으로써&amp;nbsp;모든&amp;nbsp;정보&amp;nbsp;수집을&amp;nbsp;쉽게&amp;nbsp;중단할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;모바일&amp;nbsp;기기의&amp;nbsp;일부로&amp;nbsp;제공되거나&amp;nbsp;모바일&amp;nbsp;애플리케이션&amp;nbsp;마켓플레이스&amp;nbsp;또는&amp;nbsp;네트워크를&amp;nbsp;통해&amp;nbsp;제공될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;표준&amp;nbsp;제거&amp;nbsp;프로세스를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;데이터&amp;nbsp;보존&amp;nbsp;정책&lt;br /&gt;서비스 제공자는 사용자가 애플리케이션을 사용하는 동안 및 그 후 합리적인 시간 동안 사용자가 제공한 데이터를 보관할 것입니다. 애플리케이션을 통해 제공한 사용자 제공 데이터를 삭제하고 싶다면 &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;jasonjimin2009@gmail.com&lt;/span&gt;으로 연락하시면 합리적인 시간 내에 응답해 드리겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;아동&lt;/b&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;13세&amp;nbsp;미만&amp;nbsp;아동의&amp;nbsp;데이터를&amp;nbsp;수집하거나&amp;nbsp;이들을&amp;nbsp;대상으로&amp;nbsp;마케팅하기&amp;nbsp;위해&amp;nbsp;애플리케이션을&amp;nbsp;사용하지&amp;nbsp;않습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션은 13세 미만의 사용자를 대상으로 하지 않습니다. 서비스 제공자는 13세 미만 아동의 개인 식별 정보를 고의로 수집하지 않습니다. 서비스 제공자가 13세 미만 아동이 개인 정보를 제공한 것을 발견한 경우, 서비스 제공자는 즉시 서버에서 이를 삭제할 것입니다. 귀하가 부모 또는 보호자이고 자녀가 개인 정보를 제공했다는 사실을 알게 된 경우, 서비스 제공자(&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;jasonjimin2009@gmail.com&lt;/span&gt;)에게 연락하여 필요한 조치를 취할 수 있도록 해주십시오.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;보안&lt;/b&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;귀하의&amp;nbsp;정보&amp;nbsp;기밀성을&amp;nbsp;보호하는&amp;nbsp;데&amp;nbsp;관심이&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;처리하고&amp;nbsp;유지하는&amp;nbsp;정보를&amp;nbsp;보호하기&amp;nbsp;위한&amp;nbsp;물리적,&amp;nbsp;전자적,&amp;nbsp;절차적&amp;nbsp;보호&amp;nbsp;장치를&amp;nbsp;제공합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;변경사항&lt;/b&gt;&lt;br /&gt;본&amp;nbsp;개인정보&amp;nbsp;정책은&amp;nbsp;어떤&amp;nbsp;이유로든&amp;nbsp;수시로&amp;nbsp;업데이트될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;새&amp;nbsp;개인정보&amp;nbsp;정책으로&amp;nbsp;이&amp;nbsp;페이지를&amp;nbsp;업데이트하여&amp;nbsp;개인정보&amp;nbsp;정책의&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;알려드릴&amp;nbsp;것입니다.&amp;nbsp;모든&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;지속적으로&amp;nbsp;사용하는&amp;nbsp;것은&amp;nbsp;모든&amp;nbsp;변경&amp;nbsp;사항에&amp;nbsp;대한&amp;nbsp;승인으로&amp;nbsp;간주되므로&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책을&amp;nbsp;정기적으로&amp;nbsp;확인하는&amp;nbsp;것이&amp;nbsp;좋습니다.&lt;br /&gt;&lt;br /&gt;이 개인정보 정책은 2025-08-12부터 유효합니다.&lt;br /&gt;&lt;br /&gt;귀하의&amp;nbsp;동의&lt;br /&gt;애플리케이션을&amp;nbsp;사용함으로써,&amp;nbsp;귀하는&amp;nbsp;현재&amp;nbsp;및&amp;nbsp;당사에&amp;nbsp;의해&amp;nbsp;개정된&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;명시된&amp;nbsp;대로&amp;nbsp;귀하의&amp;nbsp;정보&amp;nbsp;처리에&amp;nbsp;동의하는&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;연락처&lt;/b&gt;&lt;br /&gt;애플리케이션 사용 중 개인정보에 관한 질문이 있거나 관행에 대해 질문이 있으시면 이메일(jasonjimin2009@gmail.com)을 통해 서비스 제공자에게 문의하십시오.&lt;/p&gt;</description>
      <category>  개발 일지</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/63</guid>
      <comments>https://kalswn.tistory.com/63#entry63comment</comments>
      <pubDate>Sat, 27 Sep 2025 10:06:47 +0900</pubDate>
    </item>
    <item>
      <title>[Shoulders] 개인 정보 처리 방침</title>
      <link>https://kalswn.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[Shoulders]&amp;nbsp;개인&amp;nbsp;정보&amp;nbsp;처리&amp;nbsp;방침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;개인정보&amp;nbsp;정책은&amp;nbsp;Shoulders&amp;nbsp;앱(이하&amp;nbsp;&quot;애플리케이션&quot;)에&amp;nbsp;적용되며,&amp;nbsp;무료&amp;nbsp;서비스로&amp;nbsp;제공됩니다.&amp;nbsp;이&amp;nbsp;서비스는&amp;nbsp;&quot;있는&amp;nbsp;그대로&quot;&amp;nbsp;사용하도록&amp;nbsp;의도되었습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;정보&amp;nbsp;수집&amp;nbsp;및&amp;nbsp;사용&lt;/b&gt;&lt;br /&gt;애플리케이션은&amp;nbsp;다운로드하여&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;정보를&amp;nbsp;수집합니다.&amp;nbsp;이&amp;nbsp;정보에는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;정보가&amp;nbsp;포함될&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;사용자&amp;nbsp;기기의&amp;nbsp;인터넷&amp;nbsp;프로토콜&amp;nbsp;주소(예:&amp;nbsp;IP&amp;nbsp;주소)&lt;br /&gt;방문한&amp;nbsp;애플리케이션의&amp;nbsp;페이지,&amp;nbsp;방문&amp;nbsp;시간과&amp;nbsp;날짜,&amp;nbsp;해당&amp;nbsp;페이지에서&amp;nbsp;보낸&amp;nbsp;시간&lt;br /&gt;애플리케이션에서&amp;nbsp;보낸&amp;nbsp;시간&lt;br /&gt;모바일&amp;nbsp;기기에서&amp;nbsp;사용하는&amp;nbsp;운영&amp;nbsp;체제&lt;br /&gt;애플리케이션은&amp;nbsp;사용자&amp;nbsp;모바일&amp;nbsp;기기의&amp;nbsp;정확한&amp;nbsp;위치&amp;nbsp;정보를&amp;nbsp;수집하지&amp;nbsp;않습니다.&lt;br /&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;중요한&amp;nbsp;정보,&amp;nbsp;필수&amp;nbsp;알림&amp;nbsp;및&amp;nbsp;마케팅&amp;nbsp;프로모션을&amp;nbsp;제공하기&amp;nbsp;위해&amp;nbsp;수시로&amp;nbsp;사용자가&amp;nbsp;제공한&amp;nbsp;정보를&amp;nbsp;사용하여&amp;nbsp;연락할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션&amp;nbsp;사용&amp;nbsp;경험을&amp;nbsp;개선하기&amp;nbsp;위해&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;이메일을&amp;nbsp;포함하되&amp;nbsp;이에&amp;nbsp;국한되지&amp;nbsp;않는&amp;nbsp;특정&amp;nbsp;개인&amp;nbsp;식별&amp;nbsp;정보를&amp;nbsp;요청할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;요청한&amp;nbsp;정보는&amp;nbsp;저장되며&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;설명된&amp;nbsp;대로&amp;nbsp;사용됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;제3자&amp;nbsp;접근&lt;/b&gt;&lt;br /&gt;집계되고&amp;nbsp;익명화된&amp;nbsp;데이터만&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;애플리케이션&amp;nbsp;및&amp;nbsp;서비스&amp;nbsp;개선을&amp;nbsp;돕기&amp;nbsp;위해&amp;nbsp;주기적으로&amp;nbsp;외부&amp;nbsp;서비스에&amp;nbsp;전송됩니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;설명된&amp;nbsp;방식으로&amp;nbsp;제3자와&amp;nbsp;귀하의&amp;nbsp;정보를&amp;nbsp;공유할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션은&amp;nbsp;자체&amp;nbsp;개인정보&amp;nbsp;처리방침을&amp;nbsp;가진&amp;nbsp;제3자&amp;nbsp;서비스를&amp;nbsp;사용한다는&amp;nbsp;점을&amp;nbsp;유의하십시오.&amp;nbsp;다음은&amp;nbsp;애플리케이션에서&amp;nbsp;사용하는&amp;nbsp;제3자&amp;nbsp;서비스&amp;nbsp;제공자의&amp;nbsp;개인정보&amp;nbsp;보호정책&amp;nbsp;링크입니다:&lt;br /&gt;&lt;br /&gt;Google&amp;nbsp;Play&amp;nbsp;Services&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;경우&amp;nbsp;사용자&amp;nbsp;제공&amp;nbsp;및&amp;nbsp;자동으로&amp;nbsp;수집된&amp;nbsp;정보를&amp;nbsp;공개할&amp;nbsp;수&amp;nbsp;있습니다:&lt;br /&gt;&lt;br /&gt;소환장&amp;nbsp;또는&amp;nbsp;유사한&amp;nbsp;법적&amp;nbsp;절차와&amp;nbsp;같이&amp;nbsp;법률에서&amp;nbsp;요구하는&amp;nbsp;경우&lt;br /&gt;서비스&amp;nbsp;제공자의&amp;nbsp;권리를&amp;nbsp;보호하거나,&amp;nbsp;사용자의&amp;nbsp;안전&amp;nbsp;또는&amp;nbsp;타인의&amp;nbsp;안전을&amp;nbsp;보호하거나,&amp;nbsp;사기를&amp;nbsp;조사하거나,&amp;nbsp;정부&amp;nbsp;요청에&amp;nbsp;응답하기&amp;nbsp;위해&amp;nbsp;공개가&amp;nbsp;필요하다고&amp;nbsp;선의로&amp;nbsp;판단하는&amp;nbsp;경우&lt;br /&gt;서비스&amp;nbsp;제공자를&amp;nbsp;대신하여&amp;nbsp;작업하며,&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;공개하는&amp;nbsp;정보를&amp;nbsp;독립적으로&amp;nbsp;사용하지&amp;nbsp;않고,&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;명시된&amp;nbsp;규칙을&amp;nbsp;준수하기로&amp;nbsp;동의한&amp;nbsp;신뢰할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;서비스&amp;nbsp;제공자와&amp;nbsp;함께&lt;br /&gt;옵트아웃&amp;nbsp;권리&lt;br /&gt;애플리케이션을&amp;nbsp;제거함으로써&amp;nbsp;모든&amp;nbsp;정보&amp;nbsp;수집을&amp;nbsp;쉽게&amp;nbsp;중단할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;모바일&amp;nbsp;기기의&amp;nbsp;일부로&amp;nbsp;제공되거나&amp;nbsp;모바일&amp;nbsp;애플리케이션&amp;nbsp;마켓플레이스&amp;nbsp;또는&amp;nbsp;네트워크를&amp;nbsp;통해&amp;nbsp;제공될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;표준&amp;nbsp;제거&amp;nbsp;프로세스를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;데이터&amp;nbsp;보존&amp;nbsp;정책&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;사용자가&amp;nbsp;애플리케이션을&amp;nbsp;사용하는&amp;nbsp;동안&amp;nbsp;및&amp;nbsp;그&amp;nbsp;후&amp;nbsp;합리적인&amp;nbsp;시간&amp;nbsp;동안&amp;nbsp;사용자가&amp;nbsp;제공한&amp;nbsp;데이터를&amp;nbsp;보관할&amp;nbsp;것입니다.&amp;nbsp;애플리케이션을&amp;nbsp;통해&amp;nbsp;제공한&amp;nbsp;사용자&amp;nbsp;제공&amp;nbsp;데이터를&amp;nbsp;삭제하고&amp;nbsp;싶다면&amp;nbsp;jiminjasonkang@gmail.com으로&amp;nbsp;연락하시면&amp;nbsp;합리적인&amp;nbsp;시간&amp;nbsp;내에&amp;nbsp;응답해&amp;nbsp;드리겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;아동&lt;/b&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;13세&amp;nbsp;미만&amp;nbsp;아동의&amp;nbsp;데이터를&amp;nbsp;수집하거나&amp;nbsp;이들을&amp;nbsp;대상으로&amp;nbsp;마케팅하기&amp;nbsp;위해&amp;nbsp;애플리케이션을&amp;nbsp;사용하지&amp;nbsp;않습니다.&lt;br /&gt;&lt;br /&gt;애플리케이션은&amp;nbsp;13세&amp;nbsp;미만의&amp;nbsp;사용자를&amp;nbsp;대상으로&amp;nbsp;하지&amp;nbsp;않습니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;13세&amp;nbsp;미만&amp;nbsp;아동의&amp;nbsp;개인&amp;nbsp;식별&amp;nbsp;정보를&amp;nbsp;고의로&amp;nbsp;수집하지&amp;nbsp;않습니다.&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;13세&amp;nbsp;미만&amp;nbsp;아동이&amp;nbsp;개인&amp;nbsp;정보를&amp;nbsp;제공한&amp;nbsp;것을&amp;nbsp;발견한&amp;nbsp;경우,&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;즉시&amp;nbsp;서버에서&amp;nbsp;이를&amp;nbsp;삭제할&amp;nbsp;것입니다.&amp;nbsp;귀하가&amp;nbsp;부모&amp;nbsp;또는&amp;nbsp;보호자이고&amp;nbsp;자녀가&amp;nbsp;개인&amp;nbsp;정보를&amp;nbsp;제공했다는&amp;nbsp;사실을&amp;nbsp;알게&amp;nbsp;된&amp;nbsp;경우,&amp;nbsp;서비스&amp;nbsp;제공자(jiminjasonkang@gmail.com)에게&amp;nbsp;연락하여&amp;nbsp;필요한&amp;nbsp;조치를&amp;nbsp;취할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;해주십시오.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;보안&lt;/b&gt;&lt;br /&gt;서비스&amp;nbsp;제공자는&amp;nbsp;귀하의&amp;nbsp;정보&amp;nbsp;기밀성을&amp;nbsp;보호하는&amp;nbsp;데&amp;nbsp;관심이&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;서비스&amp;nbsp;제공자가&amp;nbsp;처리하고&amp;nbsp;유지하는&amp;nbsp;정보를&amp;nbsp;보호하기&amp;nbsp;위한&amp;nbsp;물리적,&amp;nbsp;전자적,&amp;nbsp;절차적&amp;nbsp;보호&amp;nbsp;장치를&amp;nbsp;제공합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;변경사항&lt;/b&gt;&lt;br /&gt;본&amp;nbsp;개인정보&amp;nbsp;정책은&amp;nbsp;어떤&amp;nbsp;이유로든&amp;nbsp;수시로&amp;nbsp;업데이트될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;서비스&amp;nbsp;제공자는&amp;nbsp;새&amp;nbsp;개인정보&amp;nbsp;정책으로&amp;nbsp;이&amp;nbsp;페이지를&amp;nbsp;업데이트하여&amp;nbsp;개인정보&amp;nbsp;정책의&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;알려드릴&amp;nbsp;것입니다.&amp;nbsp;모든&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;지속적으로&amp;nbsp;사용하는&amp;nbsp;것은&amp;nbsp;모든&amp;nbsp;변경&amp;nbsp;사항에&amp;nbsp;대한&amp;nbsp;승인으로&amp;nbsp;간주되므로&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책을&amp;nbsp;정기적으로&amp;nbsp;확인하는&amp;nbsp;것이&amp;nbsp;좋습니다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;개인정보&amp;nbsp;정책은&amp;nbsp;2025-06-12부터&amp;nbsp;유효합니다.&lt;br /&gt;&lt;br /&gt;귀하의&amp;nbsp;동의&lt;br /&gt;애플리케이션을&amp;nbsp;사용함으로써,&amp;nbsp;귀하는&amp;nbsp;현재&amp;nbsp;및&amp;nbsp;당사에&amp;nbsp;의해&amp;nbsp;개정된&amp;nbsp;본&amp;nbsp;개인정보&amp;nbsp;정책에&amp;nbsp;명시된&amp;nbsp;대로&amp;nbsp;귀하의&amp;nbsp;정보&amp;nbsp;처리에&amp;nbsp;동의하는&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;연락처&lt;/b&gt;&lt;br /&gt;애플리케이션&amp;nbsp;사용&amp;nbsp;중&amp;nbsp;개인정보에&amp;nbsp;관한&amp;nbsp;질문이&amp;nbsp;있거나&amp;nbsp;관행에&amp;nbsp;대해&amp;nbsp;질문이&amp;nbsp;있으시면&amp;nbsp;이메일(jiminjasonkang@gmail.com)을&amp;nbsp;통해&amp;nbsp;서비스&amp;nbsp;제공자에게&amp;nbsp;문의하십시오.&lt;/p&gt;</description>
      <category>  기억의 조각</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/62</guid>
      <comments>https://kalswn.tistory.com/62#entry62comment</comments>
      <pubDate>Thu, 28 Aug 2025 08:55:39 +0900</pubDate>
    </item>
    <item>
      <title>1년 미만 근로자의 중소기업청년전세대출 (순서 꿀팁)</title>
      <link>https://kalswn.tistory.com/61</link>
      <description>&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;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: &lt;/b&gt;&lt;b&gt;만 19세 이상 34세 이하 청년 /&amp;nbsp;&lt;/b&gt;&lt;b&gt;중소기업에 재직 중 (또는 일정 소득 이하의 개인사업자) / &lt;/b&gt;&lt;b&gt;연 소득 3천 5백만원 이하 / &lt;/b&gt;&lt;b&gt;무주택자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;순서&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 집 구하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;부동산이나 온라인사이트(네이버부동산, kb부동산 등)을 통해 모든대출, 버팀목 전세대출, 중소기업 청년전세대출이 가능한 집을 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;단, 2억이하이며 최대 대출 한도는 1억이므로 1억을 제외한 보증금은 보유하거나 다른 대출이 필요합니다.&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;원하는 집을 발견한 후 계약서 작성 시&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot; - 해당 계약 건은 중소기업취업청년전세대출 계약 건으로 임대임, 주택의 문제로 전세 대출이 불가할 경우 가계약금 포함 계약금은 모두 반환한다.(임차인 귀책사유로 대출이 거절 날 경우에는 반환의무 없음) &quot; 문구를 특약사항으로 반드시 기재해달라고 요청해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 기금e든든 사전심사&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;기금e든든 홈페이지( &lt;a href=&quot;https://menhuf.molit.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://menhuf.molit.go.kr&lt;/a&gt; )에 접속하여 대출 신청 (mac으로 신청불가 반드시 window로 진행)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #456771;&quot;&gt;&amp;nbsp; * 대출신청 시 다른 서류는 필요없습니다. 계약일이 명시되어 있어야 하므로 계약서 작성 후 신청해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #456771;&quot;&gt;&amp;nbsp; * 대출신청일로부터 최소 30일 이후로 신청해야해서 기간 넉넉히 잡으시는 거 추천드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-11-26-14-44-08.jpeg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHYWTg/btsKXH1GYBw/2GgzQ0mlO35nkNbR1rM4hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHYWTg/btsKXH1GYBw/2GgzQ0mlO35nkNbR1rM4hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHYWTg/btsKXH1GYBw/2GgzQ0mlO35nkNbR1rM4hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHYWTg%2FbtsKXH1GYBw%2F2GgzQ0mlO35nkNbR1rM4hk%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;540&quot; height=&quot;645&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-11-26-14-44-08.jpeg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #456771;&quot;&gt;* 신청 시 은행을 선택하게 되는 데 2번정도 방문해야하므로 가까운 은행을 추천합니다. (경험 공유)&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp;저는 주거래 은행인 우리은행을 회사 근처로 신청하였습니다.(다른 블로그에서 우리은행이 대출 잘해준다했음) 사전심사 적격 판정이 난 후 신청한 은행의 담당자 번호가 적힌 카톡이 와서 연락하였는데 급여통장 물어보길래 신한은행이라고 했더니 주거래은행임에도 불구하고 급여통장이 담당은행으로 되어있다면서 공문내려왔다고 안된다했습니다... 다음날 급여통장은행인 신한은행으로 가서 상담하고 진행가능하다고 하였고 원래 자격되면 해주는건데 귀찮아서 안해주는거라고 하셨습니다... (주거래은행 바꿈!)&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;* 아무튼 주거래라도 급여통장은행으로 가는거 추천!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 은행 방문&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사전심사 적격 판정이 뜨면 담당자 번호가 적힌 연락이 오고 전화한 후 서류들고 직접 방문하면 됩니다. ( 대출관련 서류 작성 약 40분정도 소요 )&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp;위에서 말했다시피 은행 지점이 변경되는 거는 상관없는데 은행이 바뀌는 경우에는 기존 사전 심사를 취소하고 재신청해야해서 시간이 더 소요됨&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;사전심사 하기 전 가까운 은행 방문해서 대출 가능여부 확인하고 기금e든든 신청하는것을 추천드립니다!&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-11-26-14-44-22.jpeg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;1187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HuNNF/btsKW4JOx1X/he8Set5Oikc8YV1uJESaKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HuNNF/btsKW4JOx1X/he8Set5Oikc8YV1uJESaKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HuNNF/btsKW4JOx1X/he8Set5Oikc8YV1uJESaKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHuNNF%2FbtsKW4JOx1X%2Fhe8Set5Oikc8YV1uJESaKK%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;540&quot; height=&quot;1187&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-11-26-14-44-22.jpeg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;1187&quot;/&gt;&lt;/span&gt;&lt;/figure&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;계약서 작성 -&amp;gt; 급여통장 은행 방문하여 신청여부 확인 -&amp;gt; 기금e든든 사전심사 신청 -&amp;gt; 아래 필요한 서류 발급 -&amp;gt; 서류 갖고 은행 방문&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주민등록등본(최근 5년 주소변경이력포함 / 마스킹 x ) &lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;대출 신청일 기준 1개월 이내에 발급&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&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;건강보험자격득실확인서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년 미만 재직자 급여통장 사본&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;/b&gt;&lt;br /&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;임대인 통장계좌번호(계약서에 작성되어있음)&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;/b&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;주업종코드 확인서 (직인필수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재직증명서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근로소득원천징수부(입사월~최근) : 1년 미만 (직인 필수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;저는 1년 미만 재직자라서 걱정했는데 HUG로 대출최대한도인 1억 대출받았습니다.&lt;br /&gt;대출이 처음이라 걱정과 고민되는 부분이 많았는데 검색하면 최신글이 없어서 다른분들께 도움이 되고자 글을 작성하게 되었습니다.&lt;br /&gt;보시고 도움이 되셨으면 좋겠습니다! 궁금한 점 있으시면 댓글 남겨주세요!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  기억의 조각/일상 그리고 운동</category>
      <category>대출</category>
      <category>전세대출</category>
      <category>중기청</category>
      <category>중소기업청년전세대출</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/61</guid>
      <comments>https://kalswn.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 26 Nov 2024 14:48:28 +0900</pubDate>
    </item>
    <item>
      <title>Next14 App Router react-quill 사용 (build 시 prerendered error 해결)</title>
      <link>https://kalswn.tistory.com/60</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;react-quill 이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- html editor를 활용할 . 수있는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 러닝커브가 낮아 많이 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- next13에서 사용한 코드를 next14 App Router로 작성 중 build 시 [&lt;span style=&quot;color: #ee2323;&quot;&gt;Error occurred prerendering page&lt;/span&gt;]/ [&lt;span style=&quot;color: #ee2323;&quot;&gt;ReferenceError: document is not defined&lt;/span&gt;] 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오전 10.59.55.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnFi3P/btsKRxzaTwL/1K4WwZPdllm9Ted0Mkkw90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnFi3P/btsKRxzaTwL/1K4WwZPdllm9Ted0Mkkw90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnFi3P/btsKRxzaTwL/1K4WwZPdllm9Ted0Mkkw90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnFi3P%2FbtsKRxzaTwL%2F1K4WwZPdllm9Ted0Mkkw90%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;1039&quot; height=&quot;455&quot; data-filename=&quot;스크린샷 2024-11-22 오전 10.59.55.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;455&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;react-quill 사용방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. react-quill 설치&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;yarn add react-quill&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 코드 작성&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;pre id=&quot;code_1732241575329&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Next13

import ReactQuill from &quot;react-quill&quot;;
import &quot;react-quill/dist/quill.snow.css&quot;;

const Editor = () =&amp;gt; {
    const Quill = ReactQuill.Quill;
    const Font = Quill.import(&quot;formats/font&quot;);
    Font.whitelist = [&quot;Gothic&quot;, &quot;Myeongjo&quot;, &quot;BlackHanSans&quot;, &quot;Brush&quot;, &quot;Dongle&quot;];
    Quill.register(Font, true);

    const quillRef = useRef(null);
    
    const modules = useMemo(
        () =&amp;gt; ({
            toolbar: {
                container: [
                    [{ header: &quot;1&quot; }, { header: &quot;2&quot; }],
                    [&quot;bold&quot;, &quot;italic&quot;, &quot;underline&quot;, &quot;strike&quot;],
                    [
                        { size: [&quot;small&quot;, false, &quot;large&quot;, &quot;huge&quot;] },
                        { color: [] },
                        { background: [] },
                        { font: [...Font.whitelist] }
                    ],
                    [{ list: &quot;ordered&quot; }, { list: &quot;bullet&quot; }, { indent: &quot;-1&quot; }, { indent: &quot;+1&quot; }, { align: [] }],
                    [&quot;blockquote&quot;, &quot;code-block&quot;, &quot;link&quot;]
                ]
            },
            clipboard: {
                matchVisual: false
            }
        }),
        []
    );
    return (
        &amp;lt;div
            style={{
                marginBottom: &quot;1rem&quot;,
                border: &quot;1px solid #ccc&quot;,
                borderBottom: &quot;none&quot;,
                borderRadius: &quot;0.5rem&quot;
            }}
        &amp;gt;
            &amp;lt;ReactQuill
                ref={quillRef}
                modules={modules}
                placeholder={&quot;내용을 입력하세요.&quot;}
                theme=&quot;snow&quot;
                formats={[
                    &quot;header&quot;,
                    &quot;bold&quot;,
                    &quot;italic&quot;,
                    &quot;underline&quot;,
                    &quot;strike&quot;,
                    &quot;size&quot;,
                    &quot;color&quot;,
                    &quot;background&quot;,
                    &quot;font&quot;,
                    &quot;list&quot;,
                    &quot;bullet&quot;,
                    &quot;indent&quot;,
                    &quot;align&quot;,
                    &quot;blockquote&quot;,
                    &quot;code-block&quot;,
                    &quot;link&quot;
                ]}
            /&amp;gt;
        &amp;lt;/div&amp;gt;
    );
};

export default Editor;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Next14 App Router 에러 해결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Error occurred prerendering page&lt;/span&gt;]/ [&lt;span style=&quot;color: #ee2323;&quot;&gt;ReferenceError: document is not defined&lt;/span&gt;] &lt;b&gt;발생 이유&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ReactQuill과 같은 브라우저 전용 라이브러리가 Next.js의 SSR (서버 사이드 렌더링) 환경에서 초기 로드 시 오류를 일으킬 수 있기 때문입니다. 특히 Next.js에서 서버에서 브라우저 전용 객체를 접근하려고 하면 prerender-error가 발생할 수 있습니다.&lt;/blockquote&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;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Next.js 서버 측에서는 DOM 객체와 관련된 작업을 피해야 합니다. ReactQuill은 브라우저에서만 사용할 수 있는 라이브러리이므로, dynamic 함수를 사용하여 클라이언트에서만 로드되도록 설정할 수 있습니다.&lt;br /&gt;Next.js의 next/dynamic을 사용하여 ReactQuill을 동적으로 import하고 SSR을 비활성화합니다.&lt;/blockquote&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;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732248864363&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Next14 App Router

'use client'
import { Dispatch, SetStateAction, useMemo, useRef } from &quot;react&quot;;
import dynamic from &quot;next/dynamic&quot;;
import &quot;react-quill/dist/quill.snow.css&quot;;

// 클라이언트에서만 ReactQuill 로드
const ReactQuill = dynamic(() =&amp;gt; import(&quot;react-quill&quot;), { ssr: false });

const Editor = () =&amp;gt; {
    const modules = useMemo(() =&amp;gt; {
        return {
            toolbar: {
                container: [
                    [{ header: &quot;1&quot; }, { header: &quot;2&quot; }],
                    [&quot;bold&quot;, &quot;italic&quot;, &quot;underline&quot;, &quot;strike&quot;],
                    [
                        { size: [&quot;small&quot;, false, &quot;large&quot;, &quot;huge&quot;] },
                        { color: [] },
                        { background: [] },
                        { font: [&quot;Gothic&quot;, &quot;Myeongjo&quot;, &quot;BlackHanSans&quot;, &quot;Brush&quot;, &quot;Dongle&quot;] }
                    ],
                    [{ list: &quot;ordered&quot; }, { list: &quot;bullet&quot; }, { indent: &quot;-1&quot; }, { indent: &quot;+1&quot; }, { align: [] }],
                    [&quot;blockquote&quot;, &quot;code-block&quot;, &quot;link&quot;]
                ]
            },
            clipboard: {
                matchVisual: false
            }
        };
    }, []);
    return (
        &amp;lt;div
        &amp;gt;
            &amp;lt;ReactQuill
                modules={modules}
                placeholder={&quot;내용을 입력하세요.&quot;}
                theme=&quot;snow&quot;
                formats={[
                    &quot;header&quot;,
                    &quot;bold&quot;,
                    &quot;italic&quot;,
                    &quot;underline&quot;,
                    &quot;strike&quot;,
                    &quot;size&quot;,
                    &quot;color&quot;,
                    &quot;background&quot;,
                    &quot;font&quot;,
                    &quot;list&quot;,
                    &quot;bullet&quot;,
                    &quot;indent&quot;,
                    &quot;align&quot;,
                    &quot;blockquote&quot;,
                    &quot;code-block&quot;,
                    &quot;link&quot;
                ]}
            /&amp;gt;
        &amp;lt;/div&amp;gt;
    );
};

export default Editor;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/React</category>
      <category>approuter</category>
      <category>next14</category>
      <category>React</category>
      <category>react-quill</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/60</guid>
      <comments>https://kalswn.tistory.com/60#entry60comment</comments>
      <pubDate>Fri, 22 Nov 2024 13:20:07 +0900</pubDate>
    </item>
    <item>
      <title>Next 로그인 (google provider 백엔드 구현 및 session에 사용자 정보 저장) (feat. next14 app-router)</title>
      <link>https://kalswn.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Project Explanation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kalswn.tistory.com/entry/Next-Auth-LoginGoogle-jwt-%EA%B5%AC%ED%98%84-feat-next-14-app-router&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;- 2024.07.02 - [next] - Next-Auth Login(Google/ jwt) 구현 (feat. next 14 app-router)&lt;/a&gt;에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현했던&amp;nbsp;NextAuth&amp;nbsp;Google&amp;nbsp;Provider를&amp;nbsp;백엔드로&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;backend 좀 더 공부하고 링크 첨부 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Project Folder&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; app&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┣  api&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┗  auth&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┃ ┗  [...nextauth]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┃ ┃ ┗  route.ts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┣  login&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┣  googleLogin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┃ ┗  page.tsx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┗  page.tsx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┣  layout.tsx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┗  page.tsx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; lib&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┗  axios.ts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; providers&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┗  SessionProvider.tsx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; src&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┣  server&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┣  services&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┃ ┗  userService.ts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┃ ┗  auth.ts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;┗  types&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;┗ &lt;span&gt; &lt;/span&gt;next-auth.d.ts&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- app &amp;gt; login &amp;gt; googleLogin &amp;gt; page.tsx 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app &amp;gt; login &amp;gt; googleLogin &amp;gt; page.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1719899764066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use client'
import { useRouter, useSearchParams } from 'next/navigation';
import { useEffect } from 'react';
import { signIn } from 'next-auth/react';

const GoogleLogin = () =&amp;gt; {
  const router = useRouter();
  const searchParams = useSearchParams();
  const token = searchParams.get('token');
    
  useEffect(() =&amp;gt; {
    if (token) {
      (async () =&amp;gt; {
        await signIn('custom-google', { token, redirect: false });
        router.push('/');
      })();
    }
  }, [token]);

  return &amp;lt;div&amp;gt;로그인 처리 중...&amp;lt;/div&amp;gt;;
};

export default GoogleLogin;&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;span style=&quot;color: #666666; text-align: start;&quot;&gt;src &amp;gt; server &amp;gt; auth.ts&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719899873381&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { User, NextAuthOptions, getServerSession } from &quot;next-auth&quot;;
import CredentialsProvider from &quot;next-auth/providers/credentials&quot;;
import * as process from &quot;process&quot;;
import { userService } from &quot;./services/userService&quot;;
import jwt from 'jsonwebtoken';

interface LocalUser {
    sub: string;
    email: string;
    name: string;
    image: string;
}

function decodeToken(token: string): LocalUser | null {
    try {
        // 디코드된 토큰의 페이로드 부분을 반환합니다.
        return jwt.decode(token) as LocalUser;
    } catch (e) {
        return null;
    }
}

export const authOptions: NextAuthOptions = {
    secret: process.env.NEXTAUTH_SECRET,
    providers: [
        CredentialsProvider({
            name: &quot;Credentials&quot;,
            credentials: { email: { label: &quot;아이디&quot; }, password: { label: &quot;비밀번호&quot; } },

            async authorize(credentials, req) {
                const { email, password } = credentials as {
                    email: string;
                    password: string;
                };
                const user = await userService.authenticate(email, password);
                return user as User | null;
            }
        }),
        CredentialsProvider({
          id: 'custom-google',
          name: 'Google',
          credentials: { token: { label: 'Token', type: 'text' },},

        async authorize(credentials): Promise&amp;lt;User | null&amp;gt; {
            try {
                const token = credentials?.token;                
                const user: LocalUser | null = decodeToken(token as string) as LocalUser;
                
                return user as User | null;
            } catch (error) {
                console.error('Authorize error:', error);
                return null;
            }
        }
        })
    ],
    callbacks: {
        async signIn({user, account, profile}) {
            if (account?.provider === &quot;credentials&quot;) {
                return true;
            }
            else if (account?.provider === &quot;custom-google&quot;) {
                return true;
            }
            return false;
        },
        async jwt({ token, user, trigger, session }) {
            if (trigger === &quot;update&quot;) {
                return { ...token, ...session.user };
            }
            return { ...token, ...user };
        },
        async session({ session, token, user }) {
            session.user = token as any;
            return session;
        }
    },
    pages: {
        signIn: &quot;/login&quot;
    }
};

export const getServerAuthSession = () =&amp;gt; getServerSession(authOptions);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- providers&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;┗ custom-google Google 토큰으로 인증 처리&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;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;app &amp;gt; login &amp;gt; page.tsx&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719901266202&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;use client&quot;
import React, { useState } from &quot;react&quot;;
import { FormControl,InputLabel, IconButton, Input, InputAdornment} from &quot;@mui/material&quot;;
import { FormEventHandler } from &quot;react&quot;;
import { signIn } from &quot;next-auth/react&quot;;
import Visibility from &quot;@mui/icons-material/Visibility&quot;;
import VisibilityOff from &quot;@mui/icons-material/VisibilityOff&quot;;
import CircularProgress from &quot;@mui/material/CircularProgress&quot;;
import Image from &quot;next/image&quot;;
import Link from &quot;next/link&quot;;

export default function page() {
  const [showPassword, setShowPassword] = useState&amp;lt;boolean&amp;gt;(false);
  const [userInfo, setUserInfo] = useState({ email: &quot;&quot;, password: &quot;&quot; });
  const [errorMessage, setErrorMessage] = useState&amp;lt;string&amp;gt;(&quot;&quot;);
  const [loading, setLoading] = useState&amp;lt;boolean&amp;gt;(false);
  
  const handleClickShowPassword = () =&amp;gt; setShowPassword(show =&amp;gt; !show);

  const handleMouseDownPassword = (event: React.MouseEvent&amp;lt;HTMLButtonElement&amp;gt;) =&amp;gt; {
      event.preventDefault();
  };

  const handleSubmit: FormEventHandler&amp;lt;HTMLFormElement&amp;gt; = e =&amp;gt; {
    e.preventDefault();
    setErrorMessage(&quot;&quot;);
    if (userInfo.email === &quot;&quot;) {
        setErrorMessage(&quot;아이디를 입력해주세요.&quot;);
        return;
    }
    if (userInfo.password === &quot;&quot;) {
        setErrorMessage(&quot;비밀번호를 입력해주세요.&quot;);
        return;
    }

    setLoading(true);
    signIn(&quot;credentials&quot;, {
        email: userInfo.email,
        password: userInfo.password,
        redirect: false,
        callbackUrl: &quot;/&quot;
    })
    .then(res =&amp;gt; {
        if (res?.status === 401) {
            setErrorMessage(&quot;아이디 또는 비밀번호가 일치하지 않습니다.&quot;);
            return;
        } else if (res?.ok === false) {
            setErrorMessage(&quot;서버에 오류가 발생했습니다. 잠시 후 다시 시도해주세요.&quot;);
            return;
        } else {
            window.location.href = &quot;/&quot;;
        }
    })
    .finally(() =&amp;gt; {
        setLoading(false);
    });
  };

  return (
    &amp;lt;div className='pt-28 flex flex-col items-center justify-center'&amp;gt;
      &amp;lt;p className=&quot;font-bold&quot;&amp;gt;로그인&amp;lt;/p&amp;gt;
      &amp;lt;form onSubmit={handleSubmit} className=&quot;flex flex-col gap-4&quot;&amp;gt;
          &amp;lt;FormControl sx={{ width: &quot;100%&quot; }} variant=&quot;standard&quot; className=''&amp;gt;
              &amp;lt;InputLabel className=&quot;px-2&quot;&amp;gt;아이디&amp;lt;/InputLabel&amp;gt;
              &amp;lt;Input
                  autoComplete={&quot;username&quot;}
                  value={userInfo.email}
                  type={&quot;text&quot;}
                  onChange={({ target }) =&amp;gt; {
                      setErrorMessage(&quot;&quot;);
                      setUserInfo({ ...userInfo, email: target.value });
                  }}
              /&amp;gt;
          &amp;lt;/FormControl&amp;gt;
          &amp;lt;FormControl sx={{ width: &quot;100%&quot; }} variant=&quot;standard&quot; className=''&amp;gt;
              &amp;lt;InputLabel className=&quot;px-2&quot;&amp;gt;비밀번호&amp;lt;/InputLabel&amp;gt;
              &amp;lt;Input
                  value={userInfo.password}
                  type={showPassword ? &quot;text&quot; : &quot;password&quot;}
                  autoComplete={&quot;current-password&quot;}
                  name={&quot;password&quot;}
                  onChange={({ target }) =&amp;gt; {
                      setErrorMessage(&quot;&quot;);
                      setUserInfo({ ...userInfo, password: target.value });
                  }}
                  endAdornment={
                      &amp;lt;InputAdornment position=&quot;end&quot;&amp;gt;
                          &amp;lt;IconButton
                              aria-label=&quot;toggle password visibility&quot;
                              onClick={handleClickShowPassword}
                              onMouseDown={handleMouseDownPassword}
                          &amp;gt;
                              {showPassword ? &amp;lt;VisibilityOff /&amp;gt; : &amp;lt;Visibility /&amp;gt;}
                          &amp;lt;/IconButton&amp;gt;
                      &amp;lt;/InputAdornment&amp;gt;
                  }
              /&amp;gt;
          &amp;lt;/FormControl&amp;gt;

          &amp;lt;p className='text-sm text-center'&amp;gt;{errorMessage}&amp;lt;/p&amp;gt;
          {loading ? (
              &amp;lt;button disabled&amp;gt;
                  &amp;lt;CircularProgress sx={{ height: &quot;20px !important&quot;, width: &quot;20px !important&quot; }} /&amp;gt;
              &amp;lt;/button&amp;gt;
          ) : (
              &amp;lt;button className='mx-auto text-white bg-[#599A7A] hover:bg-opacity-70 rounded-lg text-sm px-4 py-2 text-center' onClick={() =&amp;gt; handleSubmit}&amp;gt;
                  로그인
              &amp;lt;/button&amp;gt;
          )}
            &amp;lt;Link href='http://localhost:8080/oauth2/authorize/google?redirect_uri=http://localhost:3000/login/googleLogin' className='flex gap-2 items-center justify-center mx-auto text-white bg-[#FFFFFF] hover:bg-opacity-70 rounded-lg text-sm px-4 py-2 text-center'&amp;gt;
                &amp;lt;Image src={'/images/google.svg'} width={24} height={24} alt={'구글'}&amp;gt;&amp;lt;/Image&amp;gt;
                &amp;lt;div className='text-[#000000]'&amp;gt;Google로&amp;lt;/div&amp;gt;
                &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;/Link&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;lt;&lt;span&gt;Link&lt;/span&gt; href=&lt;span&gt;'http://localhost:8080/oauth2/authorize/google?redirect_uri=http://localhost:3000/login/googleLogin'&lt;/span&gt; className=&lt;span&gt;'flex gap-2 items-center justify-center mx-auto text-white bg-[#FFFFFF] hover:bg-opacity-70 rounded-lg text-sm px-4 py-2 text-center'&lt;/span&gt;&amp;gt; : google 인증을 마친 후 redirect_uri 에 리 다이렉션 되어 사용자 정보를 session에 저장&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Link로 API를 호출해서 응답을 받고 그 값을 세션에 저장하는 방법을 잘 모르겠어서,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;리디렉션된 페이지에서 next-auth의 signIn을 사용하여 처리를 했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;혹시 이 부분에 대해 아시는 분이 있다면 댓글로 남겨주시면 감사하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/Next</category>
      <category>app-router</category>
      <category>googleprovider</category>
      <category>next-auth</category>
      <category>next14</category>
      <category>session</category>
      <category>로그인</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/59</guid>
      <comments>https://kalswn.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 2 Jul 2024 16:00:25 +0900</pubDate>
    </item>
    <item>
      <title>Next-Auth Login(Google/ jwt) 구현 (feat. next 14 app-router)</title>
      <link>https://kalswn.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Project Setting&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #242424; text-align: start;&quot;&gt;Would you like to use &lt;b&gt;TypeScript&lt;/b&gt;?&amp;nbsp;&lt;/span&gt;&lt;b&gt;Yes&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #242424; text-align: start;&quot;&gt;Would you like to use &lt;b&gt;Tailwind CSS&lt;/b&gt;?&amp;nbsp;&lt;/span&gt;&lt;b&gt;Yes&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #242424; text-align: start;&quot;&gt;Would you like to use &lt;b&gt;App Router&lt;/b&gt;? (recommended)&amp;nbsp;&lt;/span&gt;&lt;b&gt;Yes&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Project Folder&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; app&lt;br /&gt;┣  api&lt;br /&gt;┃ ┗  auth&lt;br /&gt;┃ ┃ ┗  [...nextauth]&lt;br /&gt;┃ ┃ ┃ ┗  route.ts&lt;br /&gt;┣  login&lt;br /&gt;┃ ┗  page.tsx&lt;br /&gt;┣  layout.tsx&lt;br /&gt;┗  page.tsx&lt;br /&gt; lib&lt;br /&gt;┗  axios.ts&lt;br /&gt; providers&lt;br /&gt;┗  SessionProvider.tsx&lt;br /&gt; src&lt;br /&gt;┣  server&lt;br /&gt;┃ ┣  services&lt;br /&gt;┃ ┃ ┗  userService.ts&lt;br /&gt;┃ ┗  auth.ts&lt;br /&gt;┗  types&lt;br /&gt;┗  next-auth.d.ts&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;File Explanation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app&amp;gt;api&amp;gt;auth&amp;gt;[...nextauth]&amp;gt;route.ts&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import NextAuth from &quot;next-auth&quot;;
import { authOptions } from &quot;@/src/server/auth&quot;;

const handler = NextAuth(authOptions);
export { handler as GET, handler as POST };&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- NextAuth handler를 사용하여 GET / POST 요청 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- autoOptions를 가져와 인증설정과 기타설정을 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app&amp;gt;layout.ts&lt;/p&gt;
&lt;pre id=&quot;code_1719887481678&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import type { Metadata } from &quot;next&quot;;
import { Inter } from &quot;next/font/google&quot;;
import &quot;./globals.css&quot;;
import Header from &quot;@/components/common/Header&quot;;
import Footer from &quot;@/components/common/Footer&quot;;
import { SessionProvider } from &quot;@/providers/SessionProvider&quot;;
import { getServerSession } from &quot;next-auth&quot;;

export const metadata: Metadata = {
  title: &quot;login&quot;,
  description: &quot;login&quot;,
};

export default async function RootLayout({
  children
}: Readonly&amp;lt;{
  children: React.ReactNode;
}&amp;gt;) {

  const session = await getServerSession();

  return (
    &amp;lt;html lang=&quot;ko_KR&quot;&amp;gt;
      &amp;lt;body className='flex flex-col min-h-screen'&amp;gt;
        &amp;lt;SessionProvider session={session}&amp;gt;
        &amp;lt;Header /&amp;gt;
        &amp;lt;main className=&quot;pt-[70px] flex-grow w-full break-keep flex items-center flex-col&quot;&amp;gt;
          {children}
        &amp;lt;/main&amp;gt;
        &amp;lt;Footer /&amp;gt;
        &amp;lt;/SessionProvider&amp;gt;
      &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app &amp;gt; lib &amp;gt; axios.ts&lt;/p&gt;
&lt;pre id=&quot;code_1719887588801&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const BASE_URL = &quot;http://localhost:50101&quot;;
import axios from &quot;axios&quot;;

export default axios.create({
    baseURL: BASE_URL,
    headers: {
        // 'Content-Type': 'application/json',
    }
});

export const axiosAuth = axios.create({
    baseURL: BASE_URL,
    headers: {
        &quot;Content-Type&quot;: &quot;application/json&quot;
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app &amp;gt; providers &amp;gt; SessionProvider.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1719887535987&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;use client&quot;
import React from 'react'
import { Session } from 'next-auth'
import { SessionProvider as Provider} from 'next-auth/react'

type Props = {
  session: Session | null;
  children: React.ReactNode;
}

export const SessionProvider = ({session, children}: Props) =&amp;gt; {
  return (
    &amp;lt;Provider session={session}&amp;gt;
      {children}
    &amp;lt;/Provider&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src &amp;gt; server &amp;gt; auth.ts&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import NextAuth,{ User, NextAuthOptions, getServerSession } from &quot;next-auth&quot;;
import CredentialsProvider from &quot;next-auth/providers/credentials&quot;;
import axios from &quot;@/lib/axios&quot;;
import jwt from &quot;jwt-decode&quot;;
import * as process from &quot;process&quot;;
import { userService } from &quot;./services/userService&quot;;
import GoogleProvider from &quot;next-auth/providers/google&quot;;

const API_URL = `${process.env.NEXT_PUBLIC_API_URL}`;

export const authOptions: NextAuthOptions = {
    secret: process.env.NEXTAUTH_SECRET,
    events: {
        async signOut(message) {
            try {
                await axios.post(
                    API_URL + &quot;/api/users/logout&quot;,
                    {},
                    { headers: { AccessToken: `Bearer ${message.token.accesstoken}` } }
                );
            } catch (error: any) {
                if (error.response.status === 400) {
                    axios
                        .post(
                            API_URL + &quot;/api/lms/account/refreshAccessToken&quot;,
                            {},
                            { headers: { RefreshToken: `Bearer ${message.token.refreshtoken}` } }
                        )
                        .then(res =&amp;gt; {
                            axios
                                .post(
                                    API_URL + &quot;/api/users/logout&quot;,
                                    {},
                                    { headers: { AccessToken: `Bearer ${res.headers.accesstoken}` } }
                                )
                                .then(res =&amp;gt; {
                                    if (res.status === 200) {
                                        window.location.href = &quot;/&quot;;
                                    }
                                });
                        });
                }
            }
            return Promise.resolve();
        }
    },
    providers: [
        CredentialsProvider({
            name: &quot;Credentials&quot;,
            credentials: { userId: { label: &quot;아이디&quot; }, password: { label: &quot;비밀번호&quot; } },

            async authorize(credentials, req) {
                // credentials = {userId:, password:, redirect:, callbackUrl:, csrfToken:,json:}
                const { userId, password } = credentials as {
                    userId: string;
                    password: string;
                };
                return userService.authenticate(userId, password);
            }
        }),
        GoogleProvider({
            clientId: process.env.GOOGLE_CLIENT_ID as string,
            clientSecret: process.env.GOOGLE_CLIENT_SECRET as string
        })
    ],
    callbacks: {
        async jwt({ token, user, trigger, session }) {
            if (trigger === &quot;update&quot;) {
                return { ...token, ...session.user };
            }
            return { ...token, ...user };
        },
        async session({ session, token, user }) {
            session.user = token as any;
            return session;
        }
    },
    pages: {
        signIn: &quot;/login&quot;
    }
};

export const getServerAuthSession = () =&amp;gt; getServerSession(authOptions);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 인증에 필요한 옵션을 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- events : 이벤트에 대한 추가 작업을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; ┗ signOut : 로그아웃 시 서버에 로그아웃 요청과 엑세스 토큰 갱신&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- callbacks : 인증 흐름을 제어&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; ┗ jwt : JWT 토큰이 생성되거나 업데이트될 때 호출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; ┗ session : 세션이 생성되거나 접근될 때 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- pages : 인증 관련 페이지 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- getServerAuthSession : authOptions를 사용하여 세션 관리&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;src &amp;gt; server &amp;gt; services &amp;gt; userService.ts&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import axios from &quot;axios&quot;;
import NextAuth,{ User, NextAuthOptions } from &quot;next-auth&quot;;
import jwt from &quot;jwt-decode&quot;;

export const userService = {
    authenticate
};

const API_URL = `${process.env.NEXT_PUBLIC_API_URL}`;

async function authenticate(userId: string, password: string) {
    try {
        const res = await axios.post(
            API_URL + &quot;/api/users/login&quot;,
            {
                userId,
                password
            },
            {
                headers: {}
            }
        );
        if (res) {
            const token = res.headers.accesstoken;
            const user: User = jwt(token);

            user.refreshtoken = res.headers.refreshtoken;
            user.accesstoken = res.headers.accesstoken;

            return user;
        } else {
            return null;
        }
    } catch (e) {
        return null;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- authenticate : 사용자 인증을 처리하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;사용자 ID 와 password를 받아서 서버에 로그인 요청을 보내고 서버로부터 토큰과 리프레스 토큰을 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;받은 액세스 토큰을 디코딩하여 사용자 정보를 추출하고 토큰 정보를 사용자 객체에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login/page.tsx&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&quot;use client&quot;
import React, { useState } from &quot;react&quot;;
import { FormControl,InputLabel, IconButton, Input, InputAdornment} from &quot;@mui/material&quot;;
import { FormEventHandler } from &quot;react&quot;;
import { signIn } from &quot;next-auth/react&quot;;
import Visibility from &quot;@mui/icons-material/Visibility&quot;;
import VisibilityOff from &quot;@mui/icons-material/VisibilityOff&quot;;
import CircularProgress from &quot;@mui/material/CircularProgress&quot;;
import Image from &quot;next/image&quot;;
import Link from &quot;next/link&quot;;

export default function page() {
  const [showPassword, setShowPassword] = useState&amp;lt;boolean&amp;gt;(false);
  const [userInfo, setUserInfo] = useState({ email: &quot;&quot;, password: &quot;&quot; });
  const [errorMessage, setErrorMessage] = useState&amp;lt;string&amp;gt;(&quot;&quot;);
  const [loading, setLoading] = useState&amp;lt;boolean&amp;gt;(false);

  const handleClickShowPassword = () =&amp;gt; setShowPassword(show =&amp;gt; !show);

  const handleMouseDownPassword = (event: React.MouseEvent&amp;lt;HTMLButtonElement&amp;gt;) =&amp;gt; {
      event.preventDefault();
  };

  const handleSubmit: FormEventHandler&amp;lt;HTMLFormElement&amp;gt; = e =&amp;gt; {
    e.preventDefault();
    setErrorMessage(&quot;&quot;);
    if (userInfo.email === &quot;&quot;) {
        setErrorMessage(&quot;아이디를 입력해주세요.&quot;);
        return;
    }
    if (userInfo.password === &quot;&quot;) {
        setErrorMessage(&quot;비밀번호를 입력해주세요.&quot;);
        return;
    }

    setLoading(true);
    signIn(&quot;credentials&quot;, {
        email: userInfo.email,
        password: userInfo.password,
        redirect: false,
        callbackUrl: &quot;/&quot;
    })
        .then(res =&amp;gt; {
            if (res?.status === 401) {
                setErrorMessage(&quot;아이디 또는 비밀번호가 일치하지 않습니다.&quot;);
                return;
            } else if (res?.ok === false) {
                setErrorMessage(&quot;서버에 오류가 발생했습니다. 잠시 후 다시 시도해주세요.&quot;);
                return;
            } else {
              window.location.href = &quot;/&quot;;
            }
            // Todo : send ip address to sentry
        })
        .finally(() =&amp;gt; {
            setLoading(false);
        });
  };

  const handleGoogleLogin = async (provider: string) =&amp;gt; {
    if (provider === 'google') {
      await signIn(provider, { callbackUrl:'/' });
    }
  }
  
  return (
    &amp;lt;div className='pt-28 flex flex-col items-center justify-center'&amp;gt;
        &amp;lt;h1&amp;gt;로그인 페이지&amp;lt;/h1&amp;gt;
        &amp;lt;div className='px-3 py-2 gap-4 flex justify-between cursor-pointer rounded-md bg-[#FFFFFF]' onClick={() =&amp;gt; handleOauthLogin('google')}&amp;gt;
          &amp;lt;Image src={'/images/google.svg'} width={24} height={24} alt='google' /&amp;gt;
             구글로그인
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt; */}
      &amp;lt;p className=&quot;font-bold&quot;&amp;gt;로그인&amp;lt;/p&amp;gt;
      &amp;lt;form onSubmit={handleSubmit} className=&quot;flex flex-col gap-4&quot;&amp;gt;
          &amp;lt;FormControl sx={{ width: &quot;100%&quot; }} variant=&quot;standard&quot; className=''&amp;gt;
              &amp;lt;InputLabel className=&quot;px-2&quot;&amp;gt;아이디&amp;lt;/InputLabel&amp;gt;
              &amp;lt;Input
                  autoComplete={&quot;username&quot;}
                  value={userInfo.email}
                  type={&quot;text&quot;}
                  onChange={({ target }) =&amp;gt; {
                      setErrorMessage(&quot;&quot;);
                      setUserInfo({ ...userInfo, email: target.value });
                  }}
              /&amp;gt;
          &amp;lt;/FormControl&amp;gt;
          &amp;lt;FormControl sx={{ width: &quot;100%&quot; }} variant=&quot;standard&quot; className=''&amp;gt;
              &amp;lt;InputLabel className=&quot;px-2&quot;&amp;gt;비밀번호&amp;lt;/InputLabel&amp;gt;
              &amp;lt;Input
                  value={userInfo.password}
                  type={showPassword ? &quot;text&quot; : &quot;password&quot;}
                  autoComplete={&quot;current-password&quot;}
                  name={&quot;password&quot;}
                  onChange={({ target }) =&amp;gt; {
                      setErrorMessage(&quot;&quot;);
                      setUserInfo({ ...userInfo, password: target.value });
                  }}
                  endAdornment={
                      &amp;lt;InputAdornment position=&quot;end&quot;&amp;gt;
                          &amp;lt;IconButton
                              aria-label=&quot;toggle password visibility&quot;
                              onClick={handleClickShowPassword}
                              onMouseDown={handleMouseDownPassword}
                          &amp;gt;
                              {showPassword ? &amp;lt;VisibilityOff /&amp;gt; : &amp;lt;Visibility /&amp;gt;}
                          &amp;lt;/IconButton&amp;gt;
                      &amp;lt;/InputAdornment&amp;gt;
                  }
              /&amp;gt;
          &amp;lt;/FormControl&amp;gt;

          &amp;lt;p className='text-sm text-center'&amp;gt;{errorMessage}&amp;lt;/p&amp;gt;
          {loading ? (
              &amp;lt;button disabled&amp;gt;
                  &amp;lt;CircularProgress sx={{ height: &quot;20px !important&quot;, width: &quot;20px !important&quot; }} /&amp;gt;
              &amp;lt;/button&amp;gt;
          ) : (
              &amp;lt;button className='mx-auto text-white bg-[#599A7A] hover:bg-opacity-70 rounded-lg text-sm px-4 py-2 text-center' onClick={() =&amp;gt; handleSubmit}&amp;gt;
                  로그인
              &amp;lt;/button&amp;gt;
          )}
          &amp;lt;div className='flex gap-2 items-center justify-center mx-auto text-white bg-[#FFFFFF] hover:bg-opacity-70 rounded-lg text-sm px-4 py-2 text-center' onClick={() =&amp;gt; handleGoogleLogin('google')}&amp;gt;
                &amp;lt;Image src={'/images/google.svg'} width={24} height={24} alt={'구글'}&amp;gt;&amp;lt;/Image&amp;gt;
                &amp;lt;div className='text-[#000000]'&amp;gt;Google로&amp;lt;/div&amp;gt;
                &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
           &amp;lt;/div&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이전에는 Next.js 13의 Pages Router를 사용하여 프로젝트를 개발했지만,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 Next.js 14의 App Router를 사용하여 새로운 프로젝트를 개발했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 경험을 바탕으로 앞으로의 프로젝트에 참고할 수 있도록 이번 프로젝트의 개발 과정을 기록해두었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;</description>
      <category>  개발 일지/Next</category>
      <category>app-router</category>
      <category>Next</category>
      <category>next-auth</category>
      <category>next14</category>
      <category>로그인</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/58</guid>
      <comments>https://kalswn.tistory.com/58#entry58comment</comments>
      <pubDate>Tue, 2 Jul 2024 11:38:38 +0900</pubDate>
    </item>
    <item>
      <title>api 파일 분리 시 axios의 응답이 console에 안나오는 경우</title>
      <link>https://kalswn.tistory.com/55</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제상황&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1705451562722&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;분리된 API 파일(StorePostApi.js)에서는 response 로그를 남길 경우 나오지만

react파일(StorePage.js)에서 res 값을 찍을 경우 나오지 않음&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1705451957437&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// StorePage.js API호출 부분
StorePostApi(data)
.then(res =&amp;gt;{
  console.log(&quot;res&quot;,res)

  if(res){
    setUserCheck(true);

    setTimeout(() =&amp;gt; {
      navigate('/signup/stores/pos');
    }, 500);

  } else{
    throw new Error(&quot;토큰이 없습니다&quot;)
  }
})
.catch(err=&amp;gt;{
  console.error('API 호출 또는 토큰 발급 실패:',err)
})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eckGyz/btsDuTJWyrJ/jPOgBwb8RKIHjrgs7hwfC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eckGyz/btsDuTJWyrJ/jPOgBwb8RKIHjrgs7hwfC1/img.png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;627&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.2349%; margin-right: 10px;&quot; data-widthpercent=&quot;51.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eckGyz/btsDuTJWyrJ/jPOgBwb8RKIHjrgs7hwfC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeckGyz%2FbtsDuTJWyrJ%2FjPOgBwb8RKIHjrgs7hwfC1%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;837&quot; height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cisp1c/btsDBwzaHnE/UIskKatU9i2wic8pYsq84k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cisp1c/btsDBwzaHnE/UIskKatU9i2wic8pYsq84k/img.png&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;283&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;48.16&quot; data-filename=&quot;blob&quot; style=&quot;width: 47.6023%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cisp1c/btsDBwzaHnE/UIskKatU9i2wic8pYsq84k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcisp1c%2FbtsDBwzaHnE%2FUIskKatU9i2wic8pYsq84k%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;351&quot; height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;방법 (해결)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt; StorePostApi&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 함수에서 직접적으로 axios의 응답을 사용하도록 변경&lt;/span&gt; &lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wNQrn/btsDAbvNRUL/JVZWzVzCeX0D3haYIK34P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wNQrn/btsDAbvNRUL/JVZWzVzCeX0D3haYIK34P0/img.png&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;614&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.5256%; margin-right: 10px;&quot; data-widthpercent=&quot;56.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wNQrn/btsDAbvNRUL/JVZWzVzCeX0D3haYIK34P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwNQrn%2FbtsDAbvNRUL%2FJVZWzVzCeX0D3haYIK34P0%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;804&quot; height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZef7N/btsDBQK8sS1/itXmK8mpXKtaa56BjnETD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZef7N/btsDBQK8sS1/itXmK8mpXKtaa56BjnETD1/img.png&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;327&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;43.82&quot; data-filename=&quot;blob&quot; style=&quot;width: 43.3116%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZef7N/btsDBQK8sS1/itXmK8mpXKtaa56BjnETD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZef7N%2FbtsDBQK8sS1%2FitXmK8mpXKtaa56BjnETD1%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;334&quot; height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  개발 일지/JavaScript</category>
      <category>axios</category>
      <category>javascript</category>
      <category>React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/55</guid>
      <comments>https://kalswn.tistory.com/55#entry55comment</comments>
      <pubDate>Wed, 17 Jan 2024 09:42:34 +0900</pubDate>
    </item>
    <item>
      <title>React - Recoil 사용 중 놓쳤던 특징</title>
      <link>https://kalswn.tistory.com/54</link>
      <description>&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Recoil 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해당 상태를 구독하는 구성요소를 가진 함수가 리렌더링된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제상황&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1705398061483&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;회원가입 후 Recoil을 사용하여 회원의 유무를 판단하고 
PrivateRoute와 PublicRoute에서 useRecoilState를 사용했더니

다음 페이지로 넘어가야 되는 부분이 렌더링 되고 나서 
PrivateRoute와 PublicRoute가 또 실행되어 원하지 않는 페이지로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;과정 1.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PublicRoute 와 PrivateRoute 에서 UserStateCheck Recoil 변수를 사용 x&lt;br /&gt;=&amp;gt; token 값의 유무로 판단&lt;/p&gt;
&lt;pre id=&quot;code_1705367291244&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    // PublicRoute.js
    const userCheck = useRecoilValue(UserCheckState)
    return userCheck ? element : &amp;lt;Navigate replace to=&quot;/&quot;/&amp;gt;;
    
    // 수정
    
    const tokenCheck = localStorage.getItem('access_token')
    return tokenCheck !==null ? element : &amp;lt;Navigate replace to=&quot;/&quot;/&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;과정1 - 오류&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PrivateRoute가 2번 실행됨&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;523&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qysjj/btsDrmZAXiZ/1AFkX1W0zjL5yN7gOYYnrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qysjj/btsDrmZAXiZ/1AFkX1W0zjL5yN7gOYYnrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qysjj/btsDrmZAXiZ/1AFkX1W0zjL5yN7gOYYnrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQysjj%2FbtsDrmZAXiZ%2F1AFkX1W0zjL5yN7gOYYnrK%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;523&quot; height=&quot;540&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;과정 2.&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과정 1에서 발생한 오류 중 로그인 안되는 부분 수정&lt;/p&gt;
&lt;pre id=&quot;code_1705367687224&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const logout=()=&amp;gt;{
    localStorage.removeItem('access_token');
    localStorage.removeItem('csrf_token');
    tokenCheckfunc()
}
const tokenCheckfunc=()=&amp;gt;{
    const tokenCheck = localStorage.getItem('access_token')
    console.log(&quot;tokenCheckfunc&quot;,tokenCheck)

    if(tokenCheck !== null){
        setUserCheck(true)
    }else{
        setUserCheck(false)
    }
}

// useEffect(()=&amp;gt;{
//     tokenCheckfunc()
// },[userCheck])




수정

 const logout=()=&amp;gt;{
    localStorage.removeItem('access_token');
    localStorage.removeItem('csrf_token');
    setUserCheck(false)
    navigate('/')
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;과정 3&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;userCheck를 true로 변경 후 useEffect 가 실행되기때문에 privateRoute가 실행되어 home으로 라우팅 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;조건을 추가하여&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;카테고리 비어있을 경우 pospage 머물기&lt;/p&gt;
&lt;pre id=&quot;code_1705388895624&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  // Poscategory.js
  useEffect(()=&amp;gt;{
    if(categories.length == 0){
      setCategoryState(true)
      console.log(&quot;setCategoryState(true)&quot;,categories.length)
    }else{
      setCategoryState(false)
      console.log(&quot;setCategoryState(false)&quot;,categories.length)
    }
  },[categories])
  
// Header.js

//kiosk 상태
const [isKiosk , setIsKiosk] = useRecoilState(KioskState)
// 카테고리 데이터 상태 체크 [0인경우 true]
const [categoryState, setCategoryState] = useRecoilState(CategoryState)
useEffect(()=&amp;gt;{
    const checkCategory = async () =&amp;gt; {
        try{
            const category = await CategoryGetApi();
            if(category.categories.length !== 0){
                setCategoryState(false)
            }else{
                setCategoryState(true)
            }            
        } catch(err){
            console.log(err)
        }
    }
    checkCategory()
},[])
    
useEffect(() =&amp;gt; {

    // isKiosk 값이 변경될 때마다 실행되는 useEffect를 이용하여 라우팅을 수행합니다.
    if (isKiosk) {
        navigate('/kiosk');
    }
    else if(!isKiosk &amp;amp;&amp;amp; !categoryState){
        console.log(&quot;Header.js - useEffect[isKiosk] - !isKiosk&quot;)
        navigate('/home')
    }

}, [isKiosk]);

// CategoryState.js - recoil
import { atom } from &quot;recoil&quot;;

export const CategoryState = atom({
    key: &quot;CategoryState&quot;,
    default: false
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705399195307&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;로직을 바꾸는 방법도 있었지만 끝까지 해결하고 싶어 이틀정도 걸렸던 것 같다.
조건을 추가하는 방법말고도 다른 방법이 있을 것 같지만 시간을 더이상 투자하기에는 무리였다...

프로젝트 끝나고 다른방법을 찾아봐야겠다&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/React</category>
      <category>React</category>
      <category>Recoil</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/54</guid>
      <comments>https://kalswn.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 16 Jan 2024 19:00:31 +0900</pubDate>
    </item>
    <item>
      <title>git file 하나만 되돌리기</title>
      <link>https://kalswn.tistory.com/53</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제상황&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1705364601973&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;오류 수정 중 해결하지 못하고
최초 코드로 돌아가고 싶었다.

git pull 을 했지만 최초코드로 돌아가지 못했음&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;725&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di0iLh/btsDqOPq7yj/wM7EOo7AdLWgKI1IZvLejK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di0iLh/btsDqOPq7yj/wM7EOo7AdLWgKI1IZvLejK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di0iLh/btsDqOPq7yj/wM7EOo7AdLWgKI1IZvLejK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi0iLh%2FbtsDqOPq7yj%2FwM7EOo7AdLWgKI1IZvLejK%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;725&quot; height=&quot;208&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;843&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRELxl/btsDrC13a6X/TqQ6QZSCBdSdHy2vabHnHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRELxl/btsDrC13a6X/TqQ6QZSCBdSdHy2vabHnHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRELxl/btsDrC13a6X/TqQ6QZSCBdSdHy2vabHnHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRELxl%2FbtsDrC13a6X%2FTqQ6QZSCBdSdHy2vabHnHk%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;843&quot; height=&quot;470&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;470&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1705364696957&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout -- 파일 경로&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1rWFk/btsDuUHXYAq/oJW7e7YD9cmE7e7NduMnJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1rWFk/btsDuUHXYAq/oJW7e7YD9cmE7e7NduMnJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1rWFk/btsDuUHXYAq/oJW7e7YD9cmE7e7NduMnJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1rWFk%2FbtsDuUHXYAq%2FoJW7e7YD9cmE7e7NduMnJk%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;410&quot; height=&quot;27&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;27&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0cWB/btsDyDSMoNP/uJUTNtRUmRskv2oXkNAGXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0cWB/btsDyDSMoNP/uJUTNtRUmRskv2oXkNAGXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0cWB/btsDyDSMoNP/uJUTNtRUmRskv2oXkNAGXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0cWB%2FbtsDyDSMoNP%2FuJUTNtRUmRskv2oXkNAGXk%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;806&quot; height=&quot;376&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;파일 색상이 변경되고 origin에 있는 코드를 가져왔음&lt;/b&gt;&lt;/p&gt;</description>
      <category>  개발 일지/Git</category>
      <category>git</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/53</guid>
      <comments>https://kalswn.tistory.com/53#entry53comment</comments>
      <pubDate>Tue, 16 Jan 2024 09:29:07 +0900</pubDate>
    </item>
    <item>
      <title>Axios - http -&amp;gt; https 변경 시 오류</title>
      <link>https://kalswn.tistory.com/52</link>
      <description>&lt;h1&gt;문제상황&lt;/h1&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;SSL 인증서를 붙혀서 통신 URI가 `https://api.salesync.site`로 변경됨

해당하는 URI에 맞춰 JS 요청 엔드포인트 변경
&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;size14&quot;&gt;./src/api/BaseUrl.js&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;/ul&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;const URL = &quot;[http://api.salesync.site&quot;](http://api.salesync.site&quot;); export default URL;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;const URL = &quot;[https://api.salesync.site&quot;](https://api.salesync.site&quot;); export default URL;&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;오류&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;배포시 통신 오류가 뜨고 데이터를 조회할 수 없음

분명 `https`로 변경했으나 `http`로 통신이 감&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;# 해결시도1&amp;nbsp;&lt;/b&gt; &amp;nbsp; &amp;nbsp;  참조 : [&lt;a href=&quot;https://velog.io/@shin6949/HTTPS%EC%97%90%EC%84%9C-HTTP-%EC%9A%94%EC%B2%AD-%EB%B8%94%EB%9D%BD-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0%5D&quot;&gt;https://velog.io/@shin6949/HTTPS에서-HTTP-요청-블락-에러-해결하기]&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;요청을 `http://` `https://`로 시작하는 것이 아닌 **&quot;//&quot;** 으로 시작하면 됩니다.
그럼 자동으로 접속되었던 방식으로 선택되어 넘어갑니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다시 한 번 JS 요청 엔드포인트 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;br /&gt;./src/api/BaseUrl.js&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;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;const URL = &quot;//api.salesync.site&quot;;

export default URL;&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;size18&quot;&gt;&lt;b&gt;# 해결시도1 - 오류&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b95ILl/btsDqgQ2b5w/pcZIlE1SYvh2CsowMke6hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b95ILl/btsDqgQ2b5w/pcZIlE1SYvh2CsowMke6hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b95ILl/btsDqgQ2b5w/pcZIlE1SYvh2CsowMke6hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb95ILl%2FbtsDqgQ2b5w%2FpcZIlE1SYvh2CsowMke6hK%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;1207&quot; height=&quot;34&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nogax/btsDrhWSLyL/Ff8DZlhEfTFao8tkxQ58Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nogax/btsDrhWSLyL/Ff8DZlhEfTFao8tkxQ58Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nogax/btsDrhWSLyL/Ff8DZlhEfTFao8tkxQ58Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnogax%2FbtsDrhWSLyL%2FFf8DZlhEfTFao8tkxQ58Xk%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;1354&quot; height=&quot;660&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;# 해결시도2 - 해결&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705041964863&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CloudFront는 CDN이라 정적파일이 남아있음

캐시가 쌓여있어서 새롭게 배포한 React SPA가 반영이 안 됨 
(코드를 https로 수정해도 적용되지 않고 이미 기존의 http가 계속 유지됨)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;## JS 요청 엔드포인트 변경&lt;/b&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;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;./src/api/BaseUrl.js&lt;/p&gt;
&lt;pre id=&quot;code_1705041984303&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const URL = &quot;https://api.salesync.site&quot;;

export default URL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;## CloudFront 캐시 제거 스크립트 추가&lt;/b&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;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;./.github/workflows/deploy.yml&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;name: Deploy to Amazon S3 bucket

on:
  push:
    branches: [ &quot;main&quot; ]

env:
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: salesync.site

  CLOUDFRONT_NAME: secret

:
:

      - name: CloudFront delete cache
        uses: chetan/invalidate-cloudfront-action@v2
        env:
          DISTRIBUTION: ${{ env.CLOUDFRONT_NAME }}
          PATHS: &quot;/*&quot;
          AWS_REGION: ${{ env.AWS_REGION }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;code&gt;&lt;/code&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;code&gt;https&lt;/code&gt; 통신이 되고 정상 작동되는 것을 확인&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;950&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BleiI/btsDlpa9REy/bbOc9AzfKWDMMJ5TglY3gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BleiI/btsDlpa9REy/bbOc9AzfKWDMMJ5TglY3gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BleiI/btsDlpa9REy/bbOc9AzfKWDMMJ5TglY3gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBleiI%2FbtsDlpa9REy%2FbbOc9AzfKWDMMJ5TglY3gk%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;950&quot; height=&quot;786&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  개발 일지/React</category>
      <category>axios</category>
      <category>Error</category>
      <category>HTTP</category>
      <category>https</category>
      <category>React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/52</guid>
      <comments>https://kalswn.tistory.com/52#entry52comment</comments>
      <pubDate>Fri, 12 Jan 2024 15:41:38 +0900</pubDate>
    </item>
    <item>
      <title>2023 김나영 연말 콘서트 &amp;quot;Na&amp;quot; On The Voice [Songnando] 후기 - 2층 좌석</title>
      <link>https://kalswn.tistory.com/51</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;12월 2일 토요일 18시 첫콘 후기!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;광나루역 스타벅스에서 토피넛 라떼 구매하고 흡입하면서 갔는데 5분도 안걸렸다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3일전에 예매해서 2층 좌석을 예매하게 되었지만 yes24 라이브홀 크기가 작아서 괜찮았다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;우선 결론부터 말하자면 대만족!!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIpdpg/btsBiRNq6LY/LRUiBF4a1o8ZdvQ3lH44hK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIpdpg/btsBiRNq6LY/LRUiBF4a1o8ZdvQ3lH44hK/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIpdpg/btsBiRNq6LY/LRUiBF4a1o8ZdvQ3lH44hK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIpdpg%2FbtsBiRNq6LY%2FLRUiBF4a1o8ZdvQ3lH44hK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS9KfE/btsBh5SYha6/T1wfoxgWL0sr6k0v6Lwac1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS9KfE/btsBh5SYha6/T1wfoxgWL0sr6k0v6Lwac1/img.png&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS9KfE/btsBh5SYha6/T1wfoxgWL0sr6k0v6Lwac1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS9KfE%2FbtsBh5SYha6%2FT1wfoxgWL0sr6k0v6Lwac1%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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&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-filename=&quot;blob&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQpHj5/btsBgaHhIlT/kErsKppCMaXNWWWeuVLWDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQpHj5/btsBgaHhIlT/kErsKppCMaXNWWWeuVLWDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQpHj5/btsBgaHhIlT/kErsKppCMaXNWWWeuVLWDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQpHj5%2FbtsBgaHhIlT%2FkErsKppCMaXNWWWeuVLWDk%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;603&quot; height=&quot;452&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;452&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgltz/btsBjR0hutu/kEvAs94W083Q4R6l4wVTs0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgltz/btsBjR0hutu/kEvAs94W083Q4R6l4wVTs0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgltz/btsBjR0hutu/kEvAs94W083Q4R6l4wVTs0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flgltz%2FbtsBjR0hutu%2FkEvAs94W083Q4R6l4wVTs0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmFYzR/btsBiq3tvK7/YowixXr7TtyXGGnhZuWFFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmFYzR/btsBiq3tvK7/YowixXr7TtyXGGnhZuWFFk/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmFYzR/btsBiq3tvK7/YowixXr7TtyXGGnhZuWFFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmFYzR%2FbtsBiq3tvK7%2FYowixXr7TtyXGGnhZuWFFk%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&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;15분 정도 전에 입장했는데 무대가 연말 분위기에 맞게 꾸며져 있었고 각 좌석에 플랜카드가 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chi3H6/btsBjR0huEt/tyeR7fihKUv3ZAxIDvulu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chi3H6/btsBjR0huEt/tyeR7fihKUv3ZAxIDvulu1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chi3H6/btsBjR0huEt/tyeR7fihKUv3ZAxIDvulu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchi3H6%2FbtsBjR0huEt%2FtyeR7fihKUv3ZAxIDvulu1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&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;극 E라 발라드 콘서트 가면 힘들지 않을까 했는데 오히려 차분해지고 마음이 편안해졌다?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘서트 다녀와서 12월 플레이리스트는 김나영으로 가득 채워져버렸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋업리스트 기억나는 거는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홀로 / 솔직하게 말해서 나/ 너의 번호를 누르고 / 못해 / 어땠을까 / 신곡 외롭지 않아 / 너는 바다 / 어쩔 수가 없나봐 / The Youngest Day 등등&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;중간에 발라드만 들으면 지루할까봐 직접 만드는 Sing na young 코너라고 다른 가수 분의 노래 준비하셔서 불러주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사다리게임으로 나오는 장르에 맞는 노래를 불러주셨는데 밴드는 기억이 안나고 캐롤 - 징글벨 나왔고 추가로 박진영- 허니까지 발라드만 잘하시는게 아니라 신나는곡도 잘하신다.....S2 허니추시고 혼자 부끄럼 타시는거 너무 귀여웠어요..&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;앵콜 곡으로 홀로 불러주셧는데 실수하셨다고 다시불러주시고 진짜 완벽그자체&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2시간동안 노래부르시느라 목 걱정했는데 앵콜까지 무려 앵콜도 2곡&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;솔로 콘서트라 MC나 게스트 있을 줄 알았는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노래도 부르고 진행도 하면서 홀로 무대를 꽉 채우셨다. 2시간 30분동안 시간가는줄 몰랐던&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;고음내는 부분에서 소름이 몇번이나 돋았는지&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;아무튼 너무너무너무 좋았고 2시간동안 행복했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2층 좌석도 괜찮았습니다. 혹시 오늘 이 글을 읽고 계시고 시간이 되신다면 꼭 예매하고 다녀와보시길 추천해드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마음이 따뜻해지고 12월을 행복하게 보낼 수 있을 것 같아요...&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;</description>
      <category>  기억의 조각/일상 그리고 운동</category>
      <category>김나영콘서트</category>
      <category>발라드</category>
      <category>연말콘서트</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/51</guid>
      <comments>https://kalswn.tistory.com/51#entry51comment</comments>
      <pubDate>Sun, 3 Dec 2023 07:45:23 +0900</pubDate>
    </item>
    <item>
      <title>AWS - Terraform</title>
      <link>https://kalswn.tistory.com/50</link>
      <description>&lt;pre id=&quot;code_1701076207138&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;목표
이전에 aws로 배포했던 웹 어플리케이션을 테라폼을 사용하여
인프라를 효율적으로 프로비저닝

참고
https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask &amp;lt;= flask_codedeploy/github Action
https://kalswn.tistory.com/entry/AWS-Flask-MySQL-react-%EB%B0%B0%ED%8F%AC &amp;lt;= AWS로 웹 어플리케이션 배포&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#1 Terraform 사용자 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxsHiA/btsA0aS3zWQ/T3KmNty5sYKfuM1ckJPKUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxsHiA/btsA0aS3zWQ/T3KmNty5sYKfuM1ckJPKUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxsHiA/btsA0aS3zWQ/T3KmNty5sYKfuM1ckJPKUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxsHiA%2FbtsA0aS3zWQ%2FT3KmNty5sYKfuM1ckJPKUK%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;953&quot; height=&quot;620&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GDe0l/btsATNkkHwx/XiSqPs5U5tNRqbciAKMWNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GDe0l/btsATNkkHwx/XiSqPs5U5tNRqbciAKMWNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GDe0l/btsATNkkHwx/XiSqPs5U5tNRqbciAKMWNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGDe0l%2FbtsATNkkHwx%2FXiSqPs5U5tNRqbciAKMWNK%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;1014&quot; height=&quot;800&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwtIfK/btsAXhdSwwq/ojo76kxGrBLp4WlQ1fnoD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwtIfK/btsAXhdSwwq/ojo76kxGrBLp4WlQ1fnoD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwtIfK/btsAXhdSwwq/ojo76kxGrBLp4WlQ1fnoD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwtIfK%2FbtsAXhdSwwq%2Fojo76kxGrBLp4WlQ1fnoD1%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;1014&quot; height=&quot;800&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzTOBt/btsA1dWrUXx/Wk2yOIbKtNxLyCKvS24Nsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzTOBt/btsA1dWrUXx/Wk2yOIbKtNxLyCKvS24Nsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzTOBt/btsA1dWrUXx/Wk2yOIbKtNxLyCKvS24Nsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzTOBt%2FbtsA1dWrUXx%2FWk2yOIbKtNxLyCKvS24Nsk%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;805&quot; height=&quot;553&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3J7u/btsAXiw6qxd/ZOOJPVhPwZDwb7B0GbkRkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3J7u/btsAXiw6qxd/ZOOJPVhPwZDwb7B0GbkRkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3J7u/btsAXiw6qxd/ZOOJPVhPwZDwb7B0GbkRkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3J7u%2FbtsAXiw6qxd%2FZOOJPVhPwZDwb7B0GbkRkk%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;545&quot; height=&quot;94&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;94&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2 Terraform VPC 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;### vpc.tf ###&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701046051482&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
    region = &quot;ap-northeast-2&quot;
}

# vpc
resource &quot;aws_vpc&quot; &quot;vpc&quot; {
  cidr_block = &quot;10.0.0.0/16&quot;
  enable_dns_support = true
  enable_dns_hostnames = true

  tags = {
    Name = &quot;vpc&quot;
  }
}

# subnet (public)
resource &quot;aws_subnet&quot; &quot;public_subnet_2a&quot; {
  vpc_id =  aws_vpc.vpc.id
  cidr_block = &quot;10.0.10.0/24&quot;
  availability_zone = &quot;ap-northeast-2a&quot;
  tags = {
    Name = &quot;public_subnet_2a&quot;
  }
}

resource &quot;aws_subnet&quot; &quot;public_subnet_2c&quot; {
  vpc_id =  aws_vpc.vpc.id
  cidr_block = &quot;10.0.30.0/24&quot;
  availability_zone = &quot;ap-northeast-2c&quot;
  tags = {
    Name = &quot;public_subnet_2c&quot;
  }
}

# subnet (private)
resource &quot;aws_subnet&quot; &quot;private_subnet_2a&quot; {
  vpc_id =  aws_vpc.vpc.id
  cidr_block = &quot;10.0.20.0/24&quot;
  availability_zone = &quot;ap-northeast-2a&quot;
  tags = {
    Name = &quot;private_subnet_2a&quot;
  }
}
resource &quot;aws_subnet&quot; &quot;private_subnet_2c&quot; {
  vpc_id =  aws_vpc.vpc.id
  cidr_block = &quot;10.0.40.0/24&quot;
  availability_zone = &quot;ap-northeast-2c&quot;
  tags = {
    Name = &quot;private_subnet_2c&quot;
  }
}

# igw
resource &quot;aws_internet_gateway&quot; &quot;vpc_igw&quot; {
  vpc_id = aws_vpc.vpc.id

  tags = {
    Name = &quot;vpc_igw&quot;
  }
}

# route_table(public)
resource &quot;aws_route_table&quot; &quot;public_route_table&quot; {
  vpc_id = aws_vpc.vpc.id
  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    gateway_id = aws_internet_gateway.vpc_igw.id
  }
  tags = {
    Name = &quot;public_route_table&quot;
  }
}

resource &quot;aws_route_table_association&quot; &quot;public_rtb_a&quot; {
  subnet_id      = aws_subnet.public_subnet_2a.id
  route_table_id = aws_route_table.public_route_table.id
}


resource &quot;aws_route_table_association&quot; &quot;public_rtb_b&quot; {
  subnet_id      = aws_subnet.public_subnet_2c.id
  route_table_id = aws_route_table.public_route_table.id
}

# route_table(private)
resource &quot;aws_route_table&quot; &quot;private_route_table_1&quot; {
  vpc_id = aws_vpc.vpc.id
  tags = {
    Name = &quot;private_route_table_1&quot;
  }
}
resource &quot;aws_route_table_association&quot; &quot;private_rtb_1_a&quot; {
  subnet_id = aws_subnet.private_subnet_2a.id
  route_table_id = aws_route_table.private_route_table_1.id
}

resource &quot;aws_route_table&quot; &quot;private_route_table_2&quot; {
  vpc_id = aws_vpc.vpc.id
  tags = {
    Name = &quot;private_route_table_2&quot;
  }
}
resource &quot;aws_route_table_association&quot; &quot;private_rtb_2_a&quot; {
  subnet_id = aws_subnet.private_subnet_2c.id
  route_table_id = aws_route_table.private_route_table_2.id
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1701046084520&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt;terraform apply&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;# front bucket 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;### s3_front.tf ###&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701047860066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# bucket 생성
resource &quot;aws_s3_bucket&quot; &quot;fs-front-bucket&quot; {
  bucket = &quot;fs-front-bucket&quot;
  tags = {
    Name = &quot;fs-front-bucket&quot;
  }
}

# 정적 웹 사이트의 기본 index 페이지에 연결
resource &quot;aws_s3_bucket_website_configuration&quot; &quot;fs-front-bucket&quot; {
  bucket = aws_s3_bucket.fs-front-bucket.id

  index_document {
    suffix = &quot;index.html&quot;
  }

  error_document {
    key = &quot;index.html&quot;
  }
}

resource &quot;aws_s3_bucket_versioning&quot; &quot;fs-front-bucket&quot; {
  bucket = aws_s3_bucket.fs-front-bucket.id
  versioning_configuration {
    status = &quot;Enabled&quot;
  }
}

# Amazon S3 버킷 소유권 컨트롤을 정의
resource &quot;aws_s3_bucket_ownership_controls&quot; &quot;fs-front-bucket&quot; {
  bucket = aws_s3_bucket.fs-front-bucket.id
  rule {
    object_ownership = &quot;BucketOwnerPreferred&quot;
  }
}

#  Amazon S3 버킷에 대한 퍼블릭 액세스 허용
resource &quot;aws_s3_bucket_public_access_block&quot; &quot;fs-front-bucket&quot; {
  bucket = aws_s3_bucket.fs-front-bucket.id

  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

# ACL 공개 읽기 권한 설정 -정적 웹 호스팅을 위해
resource &quot;aws_s3_bucket_acl&quot; &quot;fs-front-bucket&quot; {
   depends_on = [  
    aws_s3_bucket_ownership_controls.fs-front-bucket,  
    aws_s3_bucket_public_access_block.fs-front-bucket
   ]
  
  bucket = aws_s3_bucket.fs-front-bucket.id
  acl = &quot;public-read&quot;
}

output &quot;fs-front-bucket-url&quot; {
  value = aws_s3_bucket.fs-front-bucket.website_endpoint
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1701047961562&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# aws_s3_bucket.FS_front_bucket will be created
  + resource &quot;aws_s3_bucket&quot; &quot;FS_front_bucket&quot; {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = &quot;FS_front_bucket&quot;
      + bucket_domain_name          = (known after apply)
      + bucket_prefix               = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + policy                      = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags                        = {
          + &quot;Name&quot; = &quot;FS_front_bucket&quot;
        }
      + tags_all                    = {
          + &quot;Name&quot; = &quot;FS_front_bucket&quot;
        }
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)
    }

  # aws_s3_bucket_acl.FS_front_bucket will be created
  + resource &quot;aws_s3_bucket_acl&quot; &quot;FS_front_bucket&quot; {
      + acl    = &quot;public-read-write&quot;
      + bucket = (known after apply)
      + id     = (known after apply)
    }&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;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error: validating S3 Bucket (fs_front_bucket) name: only lowercase alphanumeric characters and hyphens allowed in &quot;fs_front_bucket&quot;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; &lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;S3 버킷(fs_front_bucket) 이름 유효성 검사 중: &quot;fs_front_bucket&quot;에는 소문자 알파벳, 숫자, 및 하이픈만 허용됩니다.&amp;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;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;해결&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&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;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;**&lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;Error: creating S3 Bucket (fs-front-bucket) ACL: operation error S3: PutBucketAcl, https response error StatusCode: 403, RequestID: Q4PQR0K6M9SDRYHT, HostID: Sq7CAn32Jz3MrjxBVjabNIE2vKpPzxbDC+iJeV82/vdShgL3f6Xhxrc74BAWn61ecP6H/xRpc+SrROkwGIQMPg==, api error AccessDenied: Access Denied&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701049639073&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_s3_bucket_public_access_block&quot; &quot;fs-front-bucket&quot; {
  bucket = aws_s3_bucket.fs-front-bucket.id

  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

resource &quot;aws_s3_bucket_acl&quot; &quot;fs-front-bucket&quot; {
   depends_on = [  
    aws_s3_bucket_public_access_block.fs-front-bucket
   ]
  
  bucket = aws_s3_bucket.fs-front-bucket.id
  acl = &quot;public-read&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;835&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coBUMG/btsAUoR8SPO/r9lj5qb4Ezz9CodODfdjc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coBUMG/btsAUoR8SPO/r9lj5qb4Ezz9CodODfdjc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coBUMG/btsAUoR8SPO/r9lj5qb4Ezz9CodODfdjc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoBUMG%2FbtsAUoR8SPO%2Fr9lj5qb4Ezz9CodODfdjc0%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;835&quot; height=&quot;547&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;547&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;/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;953&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/75ZeV/btsAYGScn29/H4RiyRAGhgAmPHUL2786MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/75ZeV/btsAYGScn29/H4RiyRAGhgAmPHUL2786MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/75ZeV/btsAYGScn29/H4RiyRAGhgAmPHUL2786MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F75ZeV%2FbtsAYGScn29%2FH4RiyRAGhgAmPHUL2786MK%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;953&quot; height=&quot;629&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;629&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;# back bucket 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;### s3_back.tf ###&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701053039451&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# bucket 생성
resource &quot;aws_s3_bucket&quot; &quot;fs-back-bucket&quot; {
  bucket = &quot;fs-back-bucket&quot;

  tags = {
    Name = &quot;fs-back-bucket&quot;
  }
}

resource &quot;aws_s3_bucket_versioning&quot; &quot;fs-back-bucket&quot; {
  bucket = aws_s3_bucket.fs-back-bucket.id
  versioning_configuration {
    status = &quot;Enabled&quot;
  }
}

#  Amazon S3 버킷에 대한 퍼블릭 액세스 차단
resource &quot;aws_s3_bucket_public_access_block&quot; &quot;fs-back-bucket&quot; {
  bucket = aws_s3_bucket.fs-back-bucket.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}
# bucket 정책 설정
resource &quot;aws_s3_bucket_policy&quot; &quot;bucket-policy&quot; {
  bucket = aws_s3_bucket.fs-back-bucket.id

  depends_on = [
    aws_s3_bucket_public_access_block.fs-back-bucket
  ]

  policy = &amp;lt;&amp;lt;EOF
  {
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
      {
        &quot;Effect&quot;: &quot;Allow&quot;,
        &quot;Principal&quot;: {
          &quot;Service&quot;: &quot;codedeploy.amazonaws.com&quot;
        },
        &quot;Action&quot;: &quot;s3:Get*&quot;,
        &quot;Resource&quot;: [
          &quot;${aws_s3_bucket.fs-back-bucket.arn}&quot;,
          &quot;${aws_s3_bucket.fs-back-bucket.arn}/*&quot;
        ]
      },
      {
        &quot;Effect&quot;: &quot;Allow&quot;,
        &quot;Principal&quot;: {
          &quot;Service&quot;: &quot;codedeploy.amazonaws.com&quot;
        },
        &quot;Action&quot;: &quot;s3:List*&quot;,
        &quot;Resource&quot;: [
          &quot;${aws_s3_bucket.fs-back-bucket.arn}&quot;
        ],
        &quot;Condition&quot;: {
          &quot;StringEquals&quot;: {
            &quot;s3:prefix&quot;: [
              &quot;&quot;,
              &quot;folder/&quot;
            ],
            &quot;s3:delimiter&quot;: [
              &quot;/&quot;
            ]
          }
        }
      }
    ]
  }
  EOF
}

output &quot;fs-back-bucket-arn&quot; {
  value = aws_s3_bucket.fs-back-bucket.arn
}&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;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error: putting S3 Bucket (fs-back-bucket) Policy: operation error S3: PutBucketPolicy, https response error StatusCode: 400, RequestID: 7GG2M4SY0R7WJT29, HostID: iZTv28amEdl0ybcu5gX7rqTOVb1oVPhNUs9Yx5luVZ///6cbVRSjmGdwZ+jOlvkcT+LEv4HsRbc=, api error MalformedPolicy: Policy has invalid action&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;S3 버킷 정책이 올바른 형식이 아니거나 유효하지 않은 액션을 포함하고 있다는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt; S3 버킷 정책은 JSON 형식을 따라야 하며, 정책 내에 유효한 S3 액션을 지정&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701054900348&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;Action&quot;: &quot;s3:List&quot;,

&quot;Action&quot;: &quot;s3:List*&quot;, &amp;lt;= 수정&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;- back bucket 생성 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwKnhx/btsATYe3a0r/TPoHL0hkcz49Bgy24hKBg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwKnhx/btsATYe3a0r/TPoHL0hkcz49Bgy24hKBg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwKnhx/btsATYe3a0r/TPoHL0hkcz49Bgy24hKBg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwKnhx%2FbtsATYe3a0r%2FTPoHL0hkcz49Bgy24hKBg1%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;1011&quot; height=&quot;564&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;564&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;# flaskserver 인스턴스 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701063746680&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_instance&quot; &quot;flaskServer&quot; {
    ami = &quot;ami-086cae3329a3f7d75&quot;
    instance_type = &quot;t2.micro&quot;
    subnet_id = aws_subnet.public_subnet_2a.id
    key_name = aws_key_pair.my_key_pair.key_name
    vpc_security_group_ids = [aws_security_group.flask_sg.id]
    associate_public_ip_address = true

    # 인스턴스에 IAM 역할 할당
    iam_instance_profile = aws_iam_instance_profile.flask_profile.name
    user_data = &amp;lt;&amp;lt;EOF
    #!/bin/bash
    sudo apt-get update
    sudo spt-get install -y php
    sudo systemctl restart apache2
    sudo apt update
    sudo apt install -y ruby-full
    sudo apt install wget
    cd /home/ubuntu
    wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
    sudo ./install auto
    EOF
    tags = {
      Name = &quot;flaskServer&quot;
    }
}

# RSA private 키 생성
resource &quot;tls_private_key&quot; &quot;my_key&quot; {
  algorithm = &quot;RSA&quot;
  rsa_bits = 4096
}

resource &quot;aws_key_pair&quot; &quot;my_key_pair&quot; {
  key_name = &quot;myKeyPair&quot;
  public_key = tls_private_key.my_key.public_key_openssh
}

resource &quot;local_file&quot; &quot;my_downloads_key&quot; {
  filename = &quot;myKeyPair.pem&quot;
  content = tls_private_key.my_key.private_key_pem
}

# 보안그룹 생성
resource &quot;aws_security_group&quot; &quot;flask_sg&quot; {
  name_prefix = &quot;flask_sg&quot;
  vpc_id = aws_vpc.vpc.id
}

resource &quot;aws_security_group_rule&quot; &quot;flask_sg_ingress_ssh&quot; {
  type = &quot;ingress&quot;
  from_port = 22
  to_port = 22
  protocol = &quot;tcp&quot;
  cidr_blocks = [&quot;0.0.0.0/0&quot;]
  security_group_id = aws_security_group.flask_sg.id
}

resource &quot;aws_security_group_rule&quot; &quot;flask_sg_ingress_http&quot; {
  type = &quot;ingress&quot;
  from_port = 80
  to_port = 80
  protocol = &quot;tcp&quot;
  cidr_blocks = [&quot;0.0.0.0/0&quot;]
  security_group_id = aws_security_group.flask_sg.id
}
resource &quot;aws_security_group_rule&quot; &quot;flask_sg_ingress_flask&quot; {
  type = &quot;ingress&quot;
  from_port = 5000
  to_port = 5000
  protocol = &quot;tcp&quot;
  cidr_blocks = [&quot;0.0.0.0/0&quot;]
  security_group_id = aws_security_group.flask_sg.id
}
resource &quot;aws_security_group_rule&quot; &quot;flask_sg_egress_mysql&quot; {
   type = &quot;egress&quot;
  from_port = 3306
  to_port = 3306
  protocol = &quot;tcp&quot;
  cidr_blocks = [&quot;0.0.0.0/0&quot;]
  security_group_id = aws_security_group.flask_sg.id
}
resource &quot;aws_security_group_rule&quot; &quot;flask_sg_egress_all&quot; {
  type = &quot;egress&quot;
  from_port = 0
  to_port = 0
  protocol = &quot;-1&quot;
  cidr_blocks = [&quot;0.0.0.0/0&quot;]
  security_group_id = aws_security_group.flask_sg.id
}

# 역할생성
resource &quot;aws_iam_role&quot; &quot;flask_role&quot; {
  name = &quot;flask_role&quot;
  assume_role_policy = &amp;lt;&amp;lt;EOF
{
        &quot;Version&quot;: &quot;2012-10-17&quot;,
        &quot;Statement&quot;: [
            {
                &quot;Effect&quot;: &quot;Allow&quot;,
                &quot;Principal&quot;: {
                    &quot;Service&quot;: &quot;ec2.amazonaws.com&quot;
                },
                &quot;Action&quot;: &quot;sts:AssumeRole&quot;
            }
        ]
    }
    EOF
} 
  
# AmazonS3FullAccess 정책을 연결
resource &quot;aws_iam_role_policy_attachment&quot; &quot;s3_full_access&quot; {
  role       = aws_iam_role.flask_role.name
  policy_arn = &quot;arn:aws:iam::aws:policy/AmazonS3FullAccess&quot;
}

# EC2 인스턴스 프로필 생성 및 역할 연결
resource &quot;aws_iam_instance_profile&quot; &quot;flask_profile&quot; {
  name = &quot;flask-instance-profile&quot;
  role = aws_iam_role.flask_role.name
}

output &quot;flask_ip&quot; {
  value = aws_instance.flaskServer.public_ip
}
output &quot;access_key&quot; {
  value = tls_private_key.my_key.private_key_pem
  sensitive = true
}&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;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error:&amp;nbsp;Inconsistent&amp;nbsp;dependency&amp;nbsp;lock&amp;nbsp;file &lt;br /&gt;│ &lt;br /&gt;│&amp;nbsp;The&amp;nbsp;following&amp;nbsp;dependency&amp;nbsp;selections&amp;nbsp;recorded&amp;nbsp;in&amp;nbsp;the&amp;nbsp;lock&amp;nbsp;file&amp;nbsp;are&amp;nbsp;inconsistent&amp;nbsp;with&amp;nbsp;the&amp;nbsp;current&amp;nbsp;configuration: &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;provider&amp;nbsp;registry.terraform.io/hashicorp/local:&amp;nbsp;required&amp;nbsp;by&amp;nbsp;this&amp;nbsp;configuration&amp;nbsp;but&amp;nbsp;no&amp;nbsp;version&amp;nbsp;is&amp;nbsp;selected &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;provider&amp;nbsp;registry.terraform.io/hashicorp/tls:&amp;nbsp;required&amp;nbsp;by&amp;nbsp;this&amp;nbsp;configuration&amp;nbsp;but&amp;nbsp;no&amp;nbsp;version&amp;nbsp;is&amp;nbsp;selected &lt;br /&gt;│ &lt;br /&gt;│&amp;nbsp;To&amp;nbsp;update&amp;nbsp;the&amp;nbsp;locked&amp;nbsp;dependency&amp;nbsp;selections&amp;nbsp;to&amp;nbsp;match&amp;nbsp;a&amp;nbsp;changed&amp;nbsp;configuration,&amp;nbsp;run: &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;terraform&amp;nbsp;init&amp;nbsp;-upgrade&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: #0f0f0f; text-align: start;&quot;&gt;일반적으로 Terraform에서 모듈 또는 공급자(Provider)의 종속성을 관리하는 데 사용되는 &lt;/span&gt;terraform.tfstate&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt; 또는 &lt;/span&gt;terraform.tfstate.backup&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt; 파일이 예상과 다르다는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&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;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;해결&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;C:\aws&amp;gt;terraform&amp;nbsp;init&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;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;**&lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;&amp;nbsp;Error:&amp;nbsp;Output&amp;nbsp;refers&amp;nbsp;to&amp;nbsp;sensitive&amp;nbsp;values &lt;br /&gt;│ &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;on&amp;nbsp;flaskInastance.tf&amp;nbsp;line&amp;nbsp;115: &lt;br /&gt;│&amp;nbsp;&amp;nbsp;115:&amp;nbsp;output&amp;nbsp;&quot;access_key&quot;&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f;&quot;&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;해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법 x&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ssh client로 접속하기 위해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;key 내용을 확인하고 싶었던건데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더에 파일로 저장되어 파일을 import에 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**&lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023-11-27T07:09:28 ERROR [codedeploy-agent(10689)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;AWS CodeDeploy 에이전트가 실행 중인 인스턴스에서 AWS 자격 증명을 찾을 수 없을 때 발생&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;해결&lt;/p&gt;
&lt;pre id=&quot;code_1701077926103&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Principal&quot;: {
                &quot;Service&quot;: &quot;ec2.amazonaws.com&quot;    &amp;lt;=  ec2 가 아닌 lambda 로 설정되어 있었음
            },
            &quot;Action&quot;: &quot;sts:AssumeRole&quot;
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;#최종실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#1 terraform init&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701077979109&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws\FIRSTSTEP_Terraform&amp;gt;terraform init
Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Finding latest version of hashicorp/local...
- Finding latest version of hashicorp/tls...
- Installing hashicorp/aws v5.26.0...
- Installed hashicorp/aws v5.26.0 (signed by HashiCorp)
- Installing hashicorp/local v2.4.0...
- Installed hashicorp/local v2.4.0 (signed by HashiCorp)
- Installing hashicorp/tls v4.0.4...
- Installed hashicorp/tls v4.0.4 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run &quot;terraform init&quot; in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running &quot;terraform plan&quot; to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.&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;b&gt;#2 terraform apply&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701078155482&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws\FIRSTSTEP_Terraform&amp;gt;terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  + create

Terraform will perform the following actions:

  # aws_iam_instance_profile.flask_profile will be created
  + resource &quot;aws_iam_instance_profile&quot; &quot;flask_profile&quot; {
      + arn         = (known after apply)
      + create_date = (known after apply)
      + id          = (known after apply)
      + name        = &quot;flask-instance-profile&quot;
      + name_prefix = (known after apply)
      + path        = &quot;/&quot;
      + role        = &quot;flask_role&quot;
      + tags_all    = (known after apply)
      + unique_id   = (known after apply)
    }

  # aws_iam_role.flask_role will be created
  + resource &quot;aws_iam_role&quot; &quot;flask_role&quot; {
      + arn                   = (known after apply)
      + assume_role_policy    = jsonencode(
            {
              + Statement = [
                  + {
                      + Action    = &quot;sts:AssumeRole&quot;
                      + Effect    = &quot;Allow&quot;
                      + Principal = {
                          + Service = &quot;ec2.amazonaws.com&quot;
                        }
                    },
                ]
              + Version   = &quot;2012-10-17&quot;
            }
        )
        
        
        
        
...

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:                     &amp;lt;= &quot;yes&quot;

Apply complete! Resources: 36 added, 0 changed, 0 destroyed.

Outputs:

access_key = &amp;lt;sensitive&amp;gt;
flask_ip = &quot;52.78.4.158&quot;
fs-back-bucket-arn = &quot;arn:aws:s3:::fs-back-bucket&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#flaskserver 인스턴스로 접속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5U4rH/btsA24TdgBE/imCalY32uAt9Kducq22qHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5U4rH/btsA24TdgBE/imCalY32uAt9Kducq22qHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5U4rH/btsA24TdgBE/imCalY32uAt9Kducq22qHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5U4rH%2FbtsA24TdgBE%2FimCalY32uAt9Kducq22qHK%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;632&quot; height=&quot;643&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;# flaskserver 인스턴스 초기 설정 CodeDeploy agent 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701078305781&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo apt-get update

sudo apt-get install -y php

sudo systemctl restart apache2

sudo apt update

sudo apt install -y ruby-full

sudo apt install wget

cd /home/ubuntu

# wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install

# 서울 region의 경우

wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

chmod +x ./install

sudo ./install auto&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1701079057937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-10-0-10-149:~$ sudo service codedeploy-agent status
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
     Loaded: loaded (/etc/init.d/codedeploy-agent; generated)
     Active: active (running) since Mon 2023-11-27 09:57:12 UTC; 8s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 9813 ExecStart=/etc/init.d/codedeploy-agent start (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 1121)
     Memory: 58.8M
        CPU: 1.095s
     CGroup: /system.slice/codedeploy-agent.service
             ├─9843 &quot;codedeploy-agent: master 9843&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot;&amp;gt;
             └─9845 &quot;codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of m&amp;gt;

Nov 27 09:57:12 ip-10-0-10-149 systemd[1]: Starting LSB: AWS CodeDeploy Host Agent...
Nov 27 09:57:12 ip-10-0-10-149 codedeploy-agent[9813]: Starting codedeploy-agent:
Nov 27 09:57:12 ip-10-0-10-149 systemd[1]: Started LSB: AWS CodeDeploy Host Agent.
lines 1-15/15 (END)&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctWcDZ/btsA1bZssmu/YqEPY5QH0130ZiXBBwvt9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctWcDZ/btsA1bZssmu/YqEPY5QH0130ZiXBBwvt9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctWcDZ/btsA1bZssmu/YqEPY5QH0130ZiXBBwvt9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctWcDZ%2FbtsA1bZssmu%2FYqEPY5QH0130ZiXBBwvt9k%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;715&quot; height=&quot;120&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dctVEl/btsA255GgIJ/rx85KhCAy4BPi1uGzb4NCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dctVEl/btsA255GgIJ/rx85KhCAy4BPi1uGzb4NCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dctVEl/btsA255GgIJ/rx85KhCAy4BPi1uGzb4NCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdctVEl%2FbtsA255GgIJ%2Frx85KhCAy4BPi1uGzb4NCk%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;758&quot; height=&quot;171&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU2QBW/btsA26KhyEE/oqHX7RzuoDcQvqsfKwnjnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU2QBW/btsA26KhyEE/oqHX7RzuoDcQvqsfKwnjnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU2QBW/btsA26KhyEE/oqHX7RzuoDcQvqsfKwnjnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU2QBW%2FbtsA26KhyEE%2FoqHX7RzuoDcQvqsfKwnjnK%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;644&quot; height=&quot;271&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Terraform&lt;br /&gt;- VPC&lt;br /&gt;-&amp;nbsp; S3 bucket front / back&lt;br /&gt;- flaskServer 인스턴스&amp;nbsp;&lt;br /&gt;생성 됨을 확인&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;# 리소스 정리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701081319495&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>terraform</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/50</guid>
      <comments>https://kalswn.tistory.com/50#entry50comment</comments>
      <pubDate>Mon, 27 Nov 2023 19:32:52 +0900</pubDate>
    </item>
    <item>
      <title>AWS - Lambda 함수 사용 _ boardList / login</title>
      <link>https://kalswn.tistory.com/49</link>
      <description>&lt;pre id=&quot;code_1700793660934&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;목표
제작한 웹 어플리케이션의 게시판 목록조회를 lambda 함수로 구현

참고
https://github.com/Kwak-Minju/FIRSTSTEP_FE_AWS
https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#1 람다 계층 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;계층 (layer) : &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;모든 Lambda 함수에 있어 공통적으로 필요한 패키지 파일을 언제든 재활용해서 쓸 수 있도록 하는 기능&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700804913961&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\&amp;gt;cd FirstStep_project

C:\FirstStep_project&amp;gt;mkdir python

C:\FirstStep_project&amp;gt;cd python

C:\FirstStep_project\python&amp;gt;pip install pymysql -t .
Collecting pymysql
  Downloading PyMySQL-1.1.0-py3-none-any.whl.metadata (4.4 kB)
Downloading PyMySQL-1.1.0-py3-none-any.whl (44 kB)
   ---------------------------------------- 44.8/44.8 kB 734.6 kB/s eta 0:00:00
Installing collected packages: pymysql
Successfully installed pymysql-1.1.0

C:\FirstStep_project\python&amp;gt;pip install pyjwt -t .
Collecting pyjwt
  Using cached PyJWT-2.8.0-py3-none-any.whl.metadata (4.2 kB)
Using cached PyJWT-2.8.0-py3-none-any.whl (22 kB)
Installing collected packages: pyjwt
Successfully installed pyjwt-2.8.0

C:\FirstStep_project\python&amp;gt;cd ../

C:\FirstStep_project&amp;gt;tar -acf lambda_layer.zip .\python

C:\FirstStep_project&amp;gt;dir lambda_layer.zip
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: D0A5-3978

 C:\FirstStep_project 디렉터리

2023-11-22  오후 08:51           204,504 lambda_layer.zip
               1개 파일             204,504 바이트
               0개 디렉터리  54,888,493,056 바이트 남음&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;668&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxqc3C/btsAJz1tVWx/Nck8KLkc3bBmtC5jKL9jM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxqc3C/btsAJz1tVWx/Nck8KLkc3bBmtC5jKL9jM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxqc3C/btsAJz1tVWx/Nck8KLkc3bBmtC5jKL9jM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxqc3C%2FbtsAJz1tVWx%2FNck8KLkc3bBmtC5jKL9jM1%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;668&quot; height=&quot;165&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVY5Vb/btsAMTjRltH/I0hGlhUDNhjieazZI4AJpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVY5Vb/btsAMTjRltH/I0hGlhUDNhjieazZI4AJpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVY5Vb/btsAMTjRltH/I0hGlhUDNhjieazZI4AJpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVY5Vb%2FbtsAMTjRltH%2FI0hGlhUDNhjieazZI4AJpk%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;678&quot; height=&quot;826&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ypaD5/btsAJyPjznj/LE8dlqmS2fltPGbJLpjLv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ypaD5/btsAJyPjznj/LE8dlqmS2fltPGbJLpjLv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ypaD5/btsAJyPjznj/LE8dlqmS2fltPGbJLpjLv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FypaD5%2FbtsAJyPjznj%2FLE8dlqmS2fltPGbJLpjLv1%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;863&quot; height=&quot;417&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2 람다 함수 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardList&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjSqx/btsANwhErzb/06WCZVDSsTX52QVbWaVCsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjSqx/btsANwhErzb/06WCZVDSsTX52QVbWaVCsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjSqx/btsANwhErzb/06WCZVDSsTX52QVbWaVCsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjSqx%2FbtsANwhErzb%2F06WCZVDSsTX52QVbWaVCsk%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;663&quot; height=&quot;167&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRzNQQ/btsAJFOd8AQ/WLbht3Tkw99x7RsOs5H2lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRzNQQ/btsAJFOd8AQ/WLbht3Tkw99x7RsOs5H2lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRzNQQ/btsAJFOd8AQ/WLbht3Tkw99x7RsOs5H2lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRzNQQ%2FbtsAJFOd8AQ%2FWLbht3Tkw99x7RsOs5H2lk%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;834&quot; height=&quot;914&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2-1 생성한 람다 함수에 계층 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdgLcc/btsAKa1sCD8/ySIXkxWPnY5cUG7TD7MhdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdgLcc/btsAKa1sCD8/ySIXkxWPnY5cUG7TD7MhdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdgLcc/btsAKa1sCD8/ySIXkxWPnY5cUG7TD7MhdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdgLcc%2FbtsAKa1sCD8%2FySIXkxWPnY5cUG7TD7MhdK%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;830&quot; height=&quot;569&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq7cUP/btsAJAeYYXS/XztYCWnwI4F9l5ytticA60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq7cUP/btsAJAeYYXS/XztYCWnwI4F9l5ytticA60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq7cUP/btsAJAeYYXS/XztYCWnwI4F9l5ytticA60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq7cUP%2FbtsAJAeYYXS%2FXztYCWnwI4F9l5ytticA60%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;669&quot; height=&quot;589&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;#2-2 코드 작성 후 Deploy&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;847&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chF63o/btsASIoPGM6/mkXdo1Set3thxVaKg8QhcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chF63o/btsASIoPGM6/mkXdo1Set3thxVaKg8QhcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chF63o/btsASIoPGM6/mkXdo1Set3thxVaKg8QhcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchF63o%2FbtsASIoPGM6%2FmkXdo1Set3thxVaKg8QhcK%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;847&quot; height=&quot;612&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;612&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: #1b711d;&quot;&gt;#2-3 테스트 이벤트 생성&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;847&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eOxTjJ/btsASu5nhlE/xvCWN7d7UYPotDi1lJwv91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eOxTjJ/btsASu5nhlE/xvCWN7d7UYPotDi1lJwv91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eOxTjJ/btsASu5nhlE/xvCWN7d7UYPotDi1lJwv91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeOxTjJ%2FbtsASu5nhlE%2FxvCWN7d7UYPotDi1lJwv91%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;847&quot; height=&quot;612&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpTas1/btsALcdH1CD/pn6oNUBTCGHoZXVGFyVkD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpTas1/btsALcdH1CD/pn6oNUBTCGHoZXVGFyVkD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpTas1/btsALcdH1CD/pn6oNUBTCGHoZXVGFyVkD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpTas1%2FbtsALcdH1CD%2Fpn6oNUBTCGHoZXVGFyVkD1%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;606&quot; height=&quot;589&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;589&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: #1b711d;&quot;&gt;#2-4 환경변수 설정&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;858&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zPGjY/btsAJ99lxwy/wvZ7avXpHHXOX2NaKNcz90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zPGjY/btsAJ99lxwy/wvZ7avXpHHXOX2NaKNcz90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zPGjY/btsAJ99lxwy/wvZ7avXpHHXOX2NaKNcz90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzPGjY%2FbtsAJ99lxwy%2FwvZ7avXpHHXOX2NaKNcz90%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;858&quot; height=&quot;303&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhXqEn/btsALJoKeh1/KJqhEKR7U8gQs2LNsjKB6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhXqEn/btsALJoKeh1/KJqhEKR7U8gQs2LNsjKB6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhXqEn/btsALJoKeh1/KJqhEKR7U8gQs2LNsjKB6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhXqEn%2FbtsALJoKeh1%2FKJqhEKR7U8gQs2LNsjKB6K%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;856&quot; height=&quot;276&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NfuJ1/btsAL40woQK/2M0VFUoA4mrTV9lpnaBL4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NfuJ1/btsAL40woQK/2M0VFUoA4mrTV9lpnaBL4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NfuJ1/btsAL40woQK/2M0VFUoA4mrTV9lpnaBL4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNfuJ1%2FbtsAL40woQK%2F2M0VFUoA4mrTV9lpnaBL4k%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;857&quot; height=&quot;404&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;404&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: #1b711d;&quot;&gt;#2-5 lambda함수를 vpc 연결&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;854&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK3SZa/btsAMneqkOc/aay1odZDMMJMCFzFxIdskK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK3SZa/btsAMneqkOc/aay1odZDMMJMCFzFxIdskK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK3SZa/btsAMneqkOc/aay1odZDMMJMCFzFxIdskK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK3SZa%2FbtsAMneqkOc%2Faay1odZDMMJMCFzFxIdskK%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;854&quot; height=&quot;536&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Klb9B/btsALUcMcVl/OONmAJVU4IRUQFjE0WaX5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Klb9B/btsALUcMcVl/OONmAJVU4IRUQFjE0WaX5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Klb9B/btsALUcMcVl/OONmAJVU4IRUQFjE0WaX5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKlb9B%2FbtsALUcMcVl%2FOONmAJVU4IRUQFjE0WaX5k%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;642&quot; height=&quot;925&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;925&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;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2-6 RDS에 lambda 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://kalswn.tistory.com/entry/AWS-Flask-MySQL-react-%EB%B0%B0%ED%8F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kalswn.tistory.com/entry/AWS-Flask-MySQL-react-%EB%B0%B0%ED%8F%AC &lt;/a&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RDS 생성 참조&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700805801360&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;AWS - Flask / MySQL / react 배포&quot; data-og-description=&quot;목표 - 온프레미스 및 클라우드 환경에서 서비스 인프라를 (자동) 구성 - 어플리케이션 코드를 자동으로 배포, 실행하는 환경을 구성 참고 backend - flask : https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS.git fron&quot; data-og-host=&quot;kalswn.tistory.com&quot; data-og-source-url=&quot;https://kalswn.tistory.com/entry/AWS-Flask-MySQL-react-%EB%B0%B0%ED%8F%AC&quot; data-og-url=&quot;https://kalswn.tistory.com/entry/AWS-Flask-MySQL-react-%EB%B0%B0%ED%8F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bYuOpZ/hyUB5ZCKyp/J35t5GLLVD4c4NxZoIwsjK/img.png?width=735&amp;amp;height=659&amp;amp;face=0_0_735_659,https://scrap.kakaocdn.net/dn/bb4Hyu/hyUB82758o/LKievPYIhSR5OxZsaQpQwK/img.png?width=735&amp;amp;height=659&amp;amp;face=0_0_735_659,https://scrap.kakaocdn.net/dn/cMiBzo/hyUB7iQHf4/UbO0Q9eurdBjqGPVO4B600/img.png?width=667&amp;amp;height=915&amp;amp;face=0_0_667_915&quot;&gt;&lt;a href=&quot;https://kalswn.tistory.com/entry/AWS-Flask-MySQL-react-%EB%B0%B0%ED%8F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kalswn.tistory.com/entry/AWS-Flask-MySQL-react-%EB%B0%B0%ED%8F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bYuOpZ/hyUB5ZCKyp/J35t5GLLVD4c4NxZoIwsjK/img.png?width=735&amp;amp;height=659&amp;amp;face=0_0_735_659,https://scrap.kakaocdn.net/dn/bb4Hyu/hyUB82758o/LKievPYIhSR5OxZsaQpQwK/img.png?width=735&amp;amp;height=659&amp;amp;face=0_0_735_659,https://scrap.kakaocdn.net/dn/cMiBzo/hyUB7iQHf4/UbO0Q9eurdBjqGPVO4B600/img.png?width=667&amp;amp;height=915&amp;amp;face=0_0_667_915');&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;AWS - Flask / MySQL / react 배포&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목표 - 온프레미스 및 클라우드 환경에서 서비스 인프라를 (자동) 구성 - 어플리케이션 코드를 자동으로 배포, 실행하는 환경을 구성 참고 backend - flask : https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS.git fron&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kalswn.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czQmHe/btsAKS7iWCX/bGxbHo5WqnfuxVaYNgrVA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czQmHe/btsAKS7iWCX/bGxbHo5WqnfuxVaYNgrVA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czQmHe/btsAKS7iWCX/bGxbHo5WqnfuxVaYNgrVA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczQmHe%2FbtsAKS7iWCX%2FbGxbHo5WqnfuxVaYNgrVA0%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;684&quot; height=&quot;437&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;921&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bysFyh/btsANtkX4CF/61cVjGzegMzVJZ8Azk8mDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bysFyh/btsANtkX4CF/61cVjGzegMzVJZ8Azk8mDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bysFyh/btsANtkX4CF/61cVjGzegMzVJZ8Azk8mDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbysFyh%2FbtsANtkX4CF%2F61cVjGzegMzVJZ8Azk8mDk%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;632&quot; height=&quot;921&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;921&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;** CloudWatch 를 통해 로그 확인&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UhE4r/btsASUJx2QD/iP589UXFnNoJGbZW7yTYrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UhE4r/btsASUJx2QD/iP589UXFnNoJGbZW7yTYrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UhE4r/btsASUJx2QD/iP589UXFnNoJGbZW7yTYrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUhE4r%2FbtsASUJx2QD%2FiP589UXFnNoJGbZW7yTYrK%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;1154&quot; height=&quot;407&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvUKqx/btsAOPcefyV/zGrjrcCvs7k3zWMgFCrsQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvUKqx/btsAOPcefyV/zGrjrcCvs7k3zWMgFCrsQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvUKqx/btsAOPcefyV/zGrjrcCvs7k3zWMgFCrsQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvUKqx%2FbtsAOPcefyV%2FzGrjrcCvs7k3zWMgFCrsQK%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;1157&quot; height=&quot;264&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OBixg/btsASbdWY4T/8JNrSTcPaVAqMZV2VCUpU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OBixg/btsASbdWY4T/8JNrSTcPaVAqMZV2VCUpU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OBixg/btsASbdWY4T/8JNrSTcPaVAqMZV2VCUpU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOBixg%2FbtsASbdWY4T%2F8JNrSTcPaVAqMZV2VCUpU1%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;1174&quot; height=&quot;369&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;**&lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;Unable to import modul 'lambda_function' : No module named 'PIL'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; PIL 모듈이 존재하지 않아서 오류가 발생 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzkoTc/btsAQyHkGqO/x62uz6VJpKVQTPvcNJ8w41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzkoTc/btsAQyHkGqO/x62uz6VJpKVQTPvcNJ8w41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzkoTc/btsAQyHkGqO/x62uz6VJpKVQTPvcNJ8w41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzkoTc%2FbtsAQyHkGqO%2Fx62uz6VJpKVQTPvcNJ8w41%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;784&quot; height=&quot;329&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;해결&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 파이썬 기본 라이브러리와 AWS SDK를 제외한 외부 라이브러리는 직접 추가해 줘야 함&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;#&lt;span style=&quot;color: #1b711d;&quot;&gt;1 layer를 생성&lt;/span&gt;하고 &lt;span style=&quot;color: #1b711d;&quot;&gt;#2-1 계층을 추가&lt;/span&gt;하는 이유&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;#3 API Gateway&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;#3-1 API 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lx37G/btsANNp8DL0/gnWhe97uFHD7lNbz5YHoy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lx37G/btsANNp8DL0/gnWhe97uFHD7lNbz5YHoy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lx37G/btsANNp8DL0/gnWhe97uFHD7lNbz5YHoy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flx37G%2FbtsANNp8DL0%2FgnWhe97uFHD7lNbz5YHoy1%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;694&quot; height=&quot;687&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IAO9S/btsAMYyHk5C/1ANQJUiz62Ix0PPG9DPD3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IAO9S/btsAMYyHk5C/1ANQJUiz62Ix0PPG9DPD3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IAO9S/btsAMYyHk5C/1ANQJUiz62Ix0PPG9DPD3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIAO9S%2FbtsAMYyHk5C%2F1ANQJUiz62Ix0PPG9DPD3k%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;684&quot; height=&quot;558&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JNFr4/btsALUcMqHw/7yc8TH1nEKSK1ETilbC6nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JNFr4/btsALUcMqHw/7yc8TH1nEKSK1ETilbC6nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JNFr4/btsALUcMqHw/7yc8TH1nEKSK1ETilbC6nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJNFr4%2FbtsALUcMqHw%2F7yc8TH1nEKSK1ETilbC6nK%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;651&quot; height=&quot;362&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vd6Zm/btsAK8PT5Yh/qJbMMJNFk7GFOjJk6KpEik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vd6Zm/btsAK8PT5Yh/qJbMMJNFk7GFOjJk6KpEik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vd6Zm/btsAK8PT5Yh/qJbMMJNFk7GFOjJk6KpEik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVd6Zm%2FbtsAK8PT5Yh%2FqJbMMJNFk7GFOjJk6KpEik%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;678&quot; height=&quot;769&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;769&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b06S58/btsALJbclcS/PTsUfHrlJ5t9gNYW7StQuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b06S58/btsALJbclcS/PTsUfHrlJ5t9gNYW7StQuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b06S58/btsALJbclcS/PTsUfHrlJ5t9gNYW7StQuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb06S58%2FbtsALJbclcS%2FPTsUfHrlJ5t9gNYW7StQuk%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;729&quot; height=&quot;778&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;778&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;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;#3-2 API&lt;/span&gt;&amp;nbsp;배포&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brDj7C/btsAJxplwes/Ko4L6TaYNnUfMBiA3KkWl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brDj7C/btsAJxplwes/Ko4L6TaYNnUfMBiA3KkWl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brDj7C/btsAJxplwes/Ko4L6TaYNnUfMBiA3KkWl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrDj7C%2FbtsAJxplwes%2FKo4L6TaYNnUfMBiA3KkWl0%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;728&quot; height=&quot;645&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;645&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;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3-3 CORS 활성화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;** &lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;has been blocked by CORS policy :&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cors 오류 발생&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn6PFV/btsASVhoQYR/rUOdKmOKZ0hH00bnFyvxB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn6PFV/btsASVhoQYR/rUOdKmOKZ0hH00bnFyvxB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn6PFV/btsASVhoQYR/rUOdKmOKZ0hH00bnFyvxB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn6PFV%2FbtsASVhoQYR%2FrUOdKmOKZ0hH00bnFyvxB0%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;786&quot; height=&quot;129&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;699&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/denU5K/btsAJDbLcCU/EXn679oV9IgLCKZALiektk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/denU5K/btsAJDbLcCU/EXn679oV9IgLCKZALiektk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/denU5K/btsAJDbLcCU/EXn679oV9IgLCKZALiektk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdenU5K%2FbtsAJDbLcCU%2FEXn679oV9IgLCKZALiektk%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;699&quot; height=&quot;338&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmrn9y/btsAMXzLH1F/QHV41SvkoHxcT3r2fGCzP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmrn9y/btsAMXzLH1F/QHV41SvkoHxcT3r2fGCzP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmrn9y/btsAMXzLH1F/QHV41SvkoHxcT3r2fGCzP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmrn9y%2FbtsAMXzLH1F%2FQHV41SvkoHxcT3r2fGCzP1%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;658&quot; height=&quot;564&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;564&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;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3-4 API 재배포 후 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buE543/btsAORHNNR4/fzJIwWhEup3VHvo6KPw1kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buE543/btsAORHNNR4/fzJIwWhEup3VHvo6KPw1kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buE543/btsAORHNNR4/fzJIwWhEup3VHvo6KPw1kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuE543%2FbtsAORHNNR4%2FfzJIwWhEup3VHvo6KPw1kK%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;591&quot; height=&quot;164&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/86gFJ/btsAMrgRaxz/JPXKBuYbTPxeqYDxjOdFKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/86gFJ/btsAMrgRaxz/JPXKBuYbTPxeqYDxjOdFKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/86gFJ/btsAMrgRaxz/JPXKBuYbTPxeqYDxjOdFKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F86gFJ%2FbtsAMrgRaxz%2FJPXKBuYbTPxeqYDxjOdFKk%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;907&quot; height=&quot;279&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한글 깨짐 현상 발생&lt;/p&gt;
&lt;pre id=&quot;code_1700703186996&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import json
import pymysql
import os

# 데이터 베이스 연결
def getCon():
  return pymysql.connect(host=os.environ['RDS_HOST'],
                             user=os.environ['RDS_USER'],
                             password=os.environ['RDS_PASSWORD'],
                             database=os.environ['RDS_DATABASE']) 
                                                                  &amp;lt;== 삭제
                             
def json_default(value):
  if isinstance(value, datetime.date):
    return value.strftime('%Y-%m-%d')
  raise TypeError('not JSON serializable') 

def lambda_handler(event, context):
    
    con = getCon()
    cursor = con.cursor()
    cursor.execute(&quot;SELECT b.boardId, b.title, u.ID, b.location, date_format(b.createAt, '%Y-%m-%d') AS createAt FROM board as b LEFT OUTER JOIN user as u on u.userId = b.userId WHERE b.status = 'active' ORDER BY b.createAt DESC;&quot;)
    data = cursor.fetchall()

    return json.dumps(data, default=json_default, ensure_ascii=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;# login 람다 함수 (boardlist 함수와 동일)&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;864&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3aSwo/btsAJDv0cDs/Sw2TlXdu0rcCaAGP7wNOoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3aSwo/btsAJDv0cDs/Sw2TlXdu0rcCaAGP7wNOoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3aSwo/btsAJDv0cDs/Sw2TlXdu0rcCaAGP7wNOoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3aSwo%2FbtsAJDv0cDs%2FSw2TlXdu0rcCaAGP7wNOoK%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;864&quot; height=&quot;885&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;885&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;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;secret key 환경변수를 설정해주지 않아서 발생하는 오류&lt;/p&gt;
&lt;pre id=&quot;code_1700704550181&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Test Event Name
lambdaEvent

Response
{
  &quot;errorMessage&quot;: &quot;'ID'&quot;,
  &quot;errorType&quot;: &quot;KeyError&quot;,
  &quot;requestId&quot;: &quot;62474b5f-da46-4948-99f8-fb97128bc7dd&quot;,
  &quot;stackTrace&quot;: [
    &quot;  File \&quot;/var/task/lambda_function.py\&quot;, line 23, in lambda_handler\n    cursor.execute(sql, event['ID'])\n&quot;
  ]
}

Function Logs
START RequestId: 62474b5f-da46-4948-99f8-fb97128bc7dd Version: $LATEST
[ERROR] KeyError: 'ID'
Traceback (most recent call last):
&amp;nbsp;&amp;nbsp;File &quot;/var/task/lambda_function.py&quot;, line 23, in lambda_handler
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(sql, event['ID'])END RequestId: 62474b5f-da46-4948-99f8-fb97128bc7dd
REPORT RequestId: 62474b5f-da46-4948-99f8-fb97128bc7dd	Duration: 10.44 ms	Billed Duration: 11 ms	Memory Size: 128 MB	Max Memory Used: 48 MB

Request ID
62474b5f-da46-4948-99f8-fb97128bc7dd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VjSyO/btsASdQp8I2/JOdbgzgtea7sS74XfT0tj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VjSyO/btsASdQp8I2/JOdbgzgtea7sS74XfT0tj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VjSyO/btsASdQp8I2/JOdbgzgtea7sS74XfT0tj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVjSyO%2FbtsASdQp8I2%2FJOdbgzgtea7sS74XfT0tj1%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;848&quot; height=&quot;341&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;341&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;**error&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;1066&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ5ksl/btsAMZdl6un/rSJhbeIkjuHu9m2dkO8mwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ5ksl/btsAMZdl6un/rSJhbeIkjuHu9m2dkO8mwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ5ksl/btsAMZdl6un/rSJhbeIkjuHu9m2dkO8mwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ5ksl%2FbtsAMZdl6un%2FrSJhbeIkjuHu9m2dkO8mwk%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;1066&quot; height=&quot;833&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxgcdC/btsALU40nR7/pp3NUvaaUDyJe9KvHtOU11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxgcdC/btsALU40nR7/pp3NUvaaUDyJe9KvHtOU11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxgcdC/btsALU40nR7/pp3NUvaaUDyJe9KvHtOU11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxgcdC%2FbtsALU40nR7%2Fpp3NUvaaUDyJe9KvHtOU11%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;805&quot; height=&quot;104&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>lambda</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/49</guid>
      <comments>https://kalswn.tistory.com/49#entry49comment</comments>
      <pubDate>Fri, 24 Nov 2023 15:35:19 +0900</pubDate>
    </item>
    <item>
      <title>AWS - GitHub Actions_ react</title>
      <link>https://kalswn.tistory.com/47</link>
      <description>&lt;pre id=&quot;code_1700790167837&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;목표
 front GitHub Action을 사용해 workflow 자동화
 
 참고 
 https://github.com/Kwak-Minju/FIRSTSTEP_FE_AWS.git
 https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask &amp;lt;= S3 버킷 생성 참조&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#1 S3 버킷 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask &lt;/a&gt;참조&lt;/p&gt;
&lt;figure id=&quot;og_1700790182365&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;AWS - CodeDeploy _ Flask&quot; data-og-description=&quot;목표 back-flask server GitHub Action을 사용해 workflow 자동화 AWS CodeDeploy 사용하여 EC2에 자동 배포 참고 https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS.git * CodeDeploy 먼저 설명되어있지만 GithubAction부터 해보는 것이 &quot; data-og-host=&quot;kalswn.tistory.com&quot; data-og-source-url=&quot;https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask&quot; data-og-url=&quot;https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/duQwOD/hyUB6RFH1B/p88MzsgjZkOva1QlYqF0C0/img.png?width=192&amp;amp;height=257&amp;amp;face=0_0_192_257,https://scrap.kakaocdn.net/dn/cy3Tit/hyUChFHuQn/fxO2XwZcUVYi2L5GDB6uI1/img.png?width=192&amp;amp;height=257&amp;amp;face=0_0_192_257,https://scrap.kakaocdn.net/dn/bp80ms/hyUB4zzpZu/BByge42voayQoMu1u5H5g0/img.png?width=857&amp;amp;height=662&amp;amp;face=0_0_857_662&quot;&gt;&lt;a href=&quot;https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kalswn.tistory.com/entry/AWS-CodeDeploy-Flask&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/duQwOD/hyUB6RFH1B/p88MzsgjZkOva1QlYqF0C0/img.png?width=192&amp;amp;height=257&amp;amp;face=0_0_192_257,https://scrap.kakaocdn.net/dn/cy3Tit/hyUChFHuQn/fxO2XwZcUVYi2L5GDB6uI1/img.png?width=192&amp;amp;height=257&amp;amp;face=0_0_192_257,https://scrap.kakaocdn.net/dn/bp80ms/hyUB4zzpZu/BByge42voayQoMu1u5H5g0/img.png?width=857&amp;amp;height=662&amp;amp;face=0_0_857_662');&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;AWS - CodeDeploy _ Flask&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목표 back-flask server GitHub Action을 사용해 workflow 자동화 AWS CodeDeploy 사용하여 EC2에 자동 배포 참고 https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS.git * CodeDeploy 먼저 설명되어있지만 GithubAction부터 해보는 것이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kalswn.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;#2 GitHub Actions에서 사용할 사용자를 생성하고 권한을 부여&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;firststepGitActionUser&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EtV46/btsAPvCVXI2/5xM8sKy03EmYBDxiKKvEkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EtV46/btsAPvCVXI2/5xM8sKy03EmYBDxiKKvEkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EtV46/btsAPvCVXI2/5xM8sKy03EmYBDxiKKvEkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEtV46%2FbtsAPvCVXI2%2F5xM8sKy03EmYBDxiKKvEkK%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;866&quot; height=&quot;423&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckdcVi/btsAL4t2EBq/El4YWkQ5tcLlG0A0rJ6xmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckdcVi/btsAL4t2EBq/El4YWkQ5tcLlG0A0rJ6xmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckdcVi/btsAL4t2EBq/El4YWkQ5tcLlG0A0rJ6xmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckdcVi%2FbtsAL4t2EBq%2FEl4YWkQ5tcLlG0A0rJ6xmk%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;860&quot; height=&quot;519&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qJjWG/btsAPjCz1iX/vax4IR4hkavWhhsSNSgS60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qJjWG/btsAPjCz1iX/vax4IR4hkavWhhsSNSgS60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qJjWG/btsAPjCz1iX/vax4IR4hkavWhhsSNSgS60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqJjWG%2FbtsAPjCz1iX%2Fvax4IR4hkavWhhsSNSgS60%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;659&quot; height=&quot;570&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJGqU/btsAK8wkP56/NZhBt0M2jzxrQwV2JBYg01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJGqU/btsAK8wkP56/NZhBt0M2jzxrQwV2JBYg01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJGqU/btsAK8wkP56/NZhBt0M2jzxrQwV2JBYg01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJGqU%2FbtsAK8wkP56%2FNZhBt0M2jzxrQwV2JBYg01%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;725&quot; height=&quot;773&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7WJYJ/btsAMWBDvMx/ciBhz86CWqRFkx94IzN3k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7WJYJ/btsAMWBDvMx/ciBhz86CWqRFkx94IzN3k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7WJYJ/btsAMWBDvMx/ciBhz86CWqRFkx94IzN3k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7WJYJ%2FbtsAMWBDvMx%2FciBhz86CWqRFkx94IzN3k0%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;596&quot; height=&quot;319&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doCX1H/btsALW3u8CP/KpkxdDXvFWR0bakXXNkZMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doCX1H/btsALW3u8CP/KpkxdDXvFWR0bakXXNkZMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doCX1H/btsALW3u8CP/KpkxdDXvFWR0bakXXNkZMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoCX1H%2FbtsALW3u8CP%2FKpkxdDXvFWR0bakXXNkZMK%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;519&quot; height=&quot;545&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3 GitHub 레포지터리에 Secrets를 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;909&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqPoIl/btsAO7WCvZh/jFeVwJMNERr9mPATOyJdh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqPoIl/btsAO7WCvZh/jFeVwJMNERr9mPATOyJdh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqPoIl/btsAO7WCvZh/jFeVwJMNERr9mPATOyJdh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqPoIl%2FbtsAO7WCvZh%2FjFeVwJMNERr9mPATOyJdh0%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;940&quot; height=&quot;909&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;909&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;GitH&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;ub Actions 워크플로우를 작성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;775&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kMm7N/btsAMWBEbLF/AgM5y7K5COqL5FIE9yh9V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kMm7N/btsAMWBEbLF/AgM5y7K5COqL5FIE9yh9V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kMm7N/btsAMWBEbLF/AgM5y7K5COqL5FIE9yh9V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkMm7N%2FbtsAMWBEbLF%2FAgM5y7K5COqL5FIE9yh9V1%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;935&quot; height=&quot;775&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;775&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NEpFm/btsALbT8QkC/MnEkksknY3yRzVtnfBO0EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NEpFm/btsALbT8QkC/MnEkksknY3yRzVtnfBO0EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NEpFm/btsALbT8QkC/MnEkksknY3yRzVtnfBO0EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNEpFm%2FbtsALbT8QkC%2FMnEkksknY3yRzVtnfBO0EK%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;1197&quot; height=&quot;938&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700723320817&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: Deploy to Amazon EC2

on:
  push:
    branches: [ &quot;main&quot; ]

env:
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: firststepbucket
  CODE_DEPLOY_APPLICATION_NAME: ReactApplication
  CODE_DEPLOY_DEPLOY_GROUP_NAME: ReactDeployGroup

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production
    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    - name: Upload to AWS S3
      run: |
        aws deploy push \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
          --ignore-hidden-files \
          --source .

    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOY_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip&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;b&gt;**&lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;npm build 시 오류&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp; &lt;span style=&quot;text-align: start;&quot;&gt; Line 20:7: React Hook useEffect has a missing dependency: 'boardId'. Either include it or remove the dependency array react-hooks/exhaustive-deps&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;해결 // eslint-disable-next-line react-hooks/exhaustive-deps 추가&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700790790460&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; useEffect(() =&amp;gt; {
        axios.get(`${process.env.REACT_APP_SERVER_URL}/boardlist/${boardId}/commentlist`)
        .then(response =&amp;gt; {
            setComments(response.data)
            console.log(response.data)
        }).catch(error =&amp;gt; console.log(error));
        // eslint-disable-next-line react-hooks/exhaustive-deps &amp;lt;==  추가
    },[])&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;span style=&quot;color: #000000;&quot;&gt;2. &lt;span style=&quot;text-align: start;&quot;&gt;Line 10:13: img elements must have an alt prop, either with meaningful text, or an empty string for decorative images jsx-a11y/alt-text&lt;/span&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;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;해결 웹 표준에 따라 img 태그는 alt를 작성 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;lt;img src = {image} alt = &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&quot;face&quot;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700790871925&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;img src={backgroundImg} alt = &quot;face&quot;/&amp;gt; 	&amp;lt;= 수정&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;span style=&quot;color: #000000;&quot;&gt;3. &lt;span style=&quot;text-align: start;&quot;&gt;Line 41:31: Expected '!==' and instead saw '!=' eqeqeq&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;해결 !=를 !== 로 수정&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;4. &lt;span style=&quot;text-align: start;&quot;&gt; Line 1:10: 'useEffect' is defined but never used no-unused-vars&lt;/span&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;해결 사용하지 않는 모듈, 함수, 변수 등을 삭제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9szFe/btsAL05A4dg/YBTiMjp3mmLTnh2Wu79sCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9szFe/btsAL05A4dg/YBTiMjp3mmLTnh2Wu79sCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9szFe/btsAL05A4dg/YBTiMjp3mmLTnh2Wu79sCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9szFe%2FbtsAL05A4dg%2FYBTiMjp3mmLTnh2Wu79sCK%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;643&quot; height=&quot;893&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;893&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#5 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;GitHub Actions 확인&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDwPDK/btsAOJ21BR4/BcF6MfeEqxII8vr8eFvAt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDwPDK/btsAOJ21BR4/BcF6MfeEqxII8vr8eFvAt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDwPDK/btsAOJ21BR4/BcF6MfeEqxII8vr8eFvAt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDwPDK%2FbtsAOJ21BR4%2FBcF6MfeEqxII8vr8eFvAt1%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;932&quot; height=&quot;584&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>github actions</category>
      <category>React</category>
      <category>s3</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/47</guid>
      <comments>https://kalswn.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 24 Nov 2023 10:59:07 +0900</pubDate>
    </item>
    <item>
      <title>AWS - CodeDeploy / GitHub Actions _ Flask</title>
      <link>https://kalswn.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700752203777&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;목표
 back-flask server GitHub Action을 사용해 workflow 자동화
 AWS CodeDeploy 사용하여 EC2에 자동 배포
 
 참고 
 https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS.git
 
 * CodeDeploy 먼저 설명되어있지만 GithubAction부터 해보는 것이 더 편리할 것 같음.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;CodeDeploy&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#1 flask app 과 CodeDeploy 에서 사용할 코드 작성&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk0rFJ/btsAOMLqWko/PKt86MB6DkVrCdixlqLlj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk0rFJ/btsAOMLqWko/PKt86MB6DkVrCdixlqLlj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk0rFJ/btsAOMLqWko/PKt86MB6DkVrCdixlqLlj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk0rFJ%2FbtsAOMLqWko%2FPKt86MB6DkVrCdixlqLlj0%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;192&quot; height=&quot;257&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700710838146&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### appspec.yml ###

version: 0.0
os: linux
files:
  - souce: /
    destination: /home/ubuntu/FIRSTSTEP_BE_AWS
hooks:
  BeforeInstall:
    - location: scripts/before_install.sh
      runas: root
  AfterInstall:
    - location: scripts/after_install.sh
      runas: root&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700710867348&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### scripts/before_install.sh ###

#!/bin/bash
rm -rf /home/ubuntu/FIRSTSTEP_BE_AWS
mkdir /home/ubuntu/FIRSTSTEP_BE_AWS&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700710890113&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### scripts/after_install.sh ###

#!/bin/bash
cd /home/ubuntu/FIRSTSTEP_BE_AWS

echo &quot;&amp;gt;&amp;gt;&amp;gt; pip install =================&quot;
pip install -r requirements.txt

echo &quot;&amp;gt;&amp;gt;&amp;gt;remove template files ==============&quot;
rm -rf appspec.yml requirements.txt

echo &quot;&amp;gt;&amp;gt;&amp;gt; change owner to ubuntu ================&quot;
chown -R ubuntu /home/ubuntu/FIRSTSTEP_BE_AWS

echo &quot;&amp;gt;&amp;gt;&amp;gt; run app ======================&quot;
python3 app.py&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2 git repository 소스 등록&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700710950377&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;User@DESKTOP-UDC737O MINGW64 /c/FirstStep_project/FIRSTSTEP_BE_AWS (main)
$ git add .

User@DESKTOP-UDC737O MINGW64 /c/FirstStep_project/FIRSTSTEP_BE_AWS (main)
$ git commit -m &quot;codedeploy edit&quot;

User@DESKTOP-UDC737O MINGW64 /c/FirstStep_project/FIRSTSTEP_BE_AWS (main)
$ git push origin&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;#3 어플리케이션 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;FlaskApplication&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn9lOe/btsAKc6biyG/MmRbu3k173JaiaxWcmapuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn9lOe/btsAKc6biyG/MmRbu3k173JaiaxWcmapuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn9lOe/btsAKc6biyG/MmRbu3k173JaiaxWcmapuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn9lOe%2FbtsAKc6biyG%2FMmRbu3k173JaiaxWcmapuK%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;632&quot; height=&quot;392&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S1NkZ/btsALW9BHpI/NcoAkGnDNScuBFt9ovEqb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S1NkZ/btsALW9BHpI/NcoAkGnDNScuBFt9ovEqb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S1NkZ/btsALW9BHpI/NcoAkGnDNScuBFt9ovEqb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS1NkZ%2FbtsALW9BHpI%2FNcoAkGnDNScuBFt9ovEqb0%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;749&quot; height=&quot;526&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;526&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4 CodeDeploy에서 사용할 역할 생성 - firststepCodeDeployRole&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y9slm/btsAJggUgsW/4KlbBZYIGAZ6KLAnjkDZ0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y9slm/btsAJggUgsW/4KlbBZYIGAZ6KLAnjkDZ0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y9slm/btsAJggUgsW/4KlbBZYIGAZ6KLAnjkDZ0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy9slm%2FbtsAJggUgsW%2F4KlbBZYIGAZ6KLAnjkDZ0k%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;864&quot; height=&quot;826&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC0HV4/btsALJCrMbw/uXcZzf4iGjMXS0HFLhzvjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC0HV4/btsALJCrMbw/uXcZzf4iGjMXS0HFLhzvjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC0HV4/btsALJCrMbw/uXcZzf4iGjMXS0HFLhzvjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC0HV4%2FbtsALJCrMbw%2FuXcZzf4iGjMXS0HFLhzvjk%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;857&quot; height=&quot;662&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D6tbk/btsANK1nOBI/MHk8eR5gRxsCowm6dpkkn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D6tbk/btsANK1nOBI/MHk8eR5gRxsCowm6dpkkn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D6tbk/btsANK1nOBI/MHk8eR5gRxsCowm6dpkkn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD6tbk%2FbtsANK1nOBI%2FMHk8eR5gRxsCowm6dpkkn1%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;838&quot; height=&quot;369&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;#5 EC2 인스턴스에 적용할 정책과 역할을 생성&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;firststepCodeDeployEC2Policy&amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;nbsp; &amp;nbsp; firststepCodeDeployEC2Role&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tvg4N/btsAOOoVRDX/gyfJgXMumuQV4JnvwY1pwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tvg4N/btsAOOoVRDX/gyfJgXMumuQV4JnvwY1pwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tvg4N/btsAOOoVRDX/gyfJgXMumuQV4JnvwY1pwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftvg4N%2FbtsAOOoVRDX%2FgyfJgXMumuQV4JnvwY1pwk%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;670&quot; height=&quot;188&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQycTh/btsAJHk2Ro3/8sHC01Yl5PNNxpreMnkYVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQycTh/btsAJHk2Ro3/8sHC01Yl5PNNxpreMnkYVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQycTh/btsAJHk2Ro3/8sHC01Yl5PNNxpreMnkYVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQycTh%2FbtsAJHk2Ro3%2F8sHC01Yl5PNNxpreMnkYVk%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;647&quot; height=&quot;752&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HNtSG/btsAOReUf7y/gtewF5POB8p5ICwEQuZYkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HNtSG/btsAOReUf7y/gtewF5POB8p5ICwEQuZYkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HNtSG/btsAOReUf7y/gtewF5POB8p5ICwEQuZYkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHNtSG%2FbtsAOReUf7y%2FgtewF5POB8p5ICwEQuZYkK%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;653&quot; height=&quot;847&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rNJQv/btsAL0jAkC1/FJQZLc9fYB8oXlkgYw8uUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rNJQv/btsAL0jAkC1/FJQZLc9fYB8oXlkgYw8uUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rNJQv/btsAL0jAkC1/FJQZLc9fYB8oXlkgYw8uUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrNJQv%2FbtsAL0jAkC1%2FFJQZLc9fYB8oXlkgYw8uUK%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;645&quot; height=&quot;158&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bANpOH/btsALHkj1q3/3pCSW2rwrUWP29epB1yvqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bANpOH/btsALHkj1q3/3pCSW2rwrUWP29epB1yvqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bANpOH/btsALHkj1q3/3pCSW2rwrUWP29epB1yvqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbANpOH%2FbtsALHkj1q3%2F3pCSW2rwrUWP29epB1yvqk%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;853&quot; height=&quot;674&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRbowU/btsAM3toysA/s9eWd8jSdkX3etSxcNBKfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRbowU/btsAM3toysA/s9eWd8jSdkX3etSxcNBKfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRbowU/btsAM3toysA/s9eWd8jSdkX3etSxcNBKfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRbowU%2FbtsAM3toysA%2Fs9eWd8jSdkX3etSxcNBKfK%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;877&quot; height=&quot;449&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;449&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#6 flaskserver 인스턴스 접속 - &lt;/b&gt;&lt;b&gt;codedeploy agent 설치 후 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700716484097&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PHP 설치
ubuntu@ip-10-0-2-206:~$ sudo apt install -y php
ubuntu@ip-10-0-2-206:~$ sudo systemctl restart apache2
ubuntu@ip-10-0-2-206:~$ cd /var/www/html&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700717063835&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install ruby-full
sudo apt install wget

cd /home/ubuntu
# wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install
# 서울 region의 경우
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

chmod +x ./install

ubuntu@ip-10-0-10-203:~$ sudo service codedeploy-agent status
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
     Loaded: loaded (/etc/init.d/codedeploy-agent; generated)
     Active: active (running) since Thu 2023-11-23 05:23:24 UTC; 34s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 30031 ExecStart=/etc/init.d/codedeploy-agent start (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 1121)
     Memory: 57.3M
        CPU: 1.069s
     CGroup: /system.slice/codedeploy-agent.service
             ├─30037 &quot;codedeploy-agent: master 30037&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &amp;gt;
             └─30039 &quot;codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of &amp;gt;

Nov 23 05:23:24 ip-10-0-10-203 systemd[1]: Starting LSB: AWS CodeDeploy Host Agent...
Nov 23 05:23:24 ip-10-0-10-203 codedeploy-agent[30031]: Starting codedeploy-agent:
Nov 23 05:23:24 ip-10-0-10-203 systemd[1]: Started LSB: AWS CodeDeploy Host Agent.
lines 1-15/15 (END)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;lt;region별 버킷 참조&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/resource-kit.html#resource-kit-bucket-names&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#7 배포 그룹 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;FlaskApplicationDeployGroup&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qyImH/btsAMTqNV7r/Yt73LwY840h8NIbhx1ESd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qyImH/btsAMTqNV7r/Yt73LwY840h8NIbhx1ESd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qyImH/btsAMTqNV7r/Yt73LwY840h8NIbhx1ESd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqyImH%2FbtsAMTqNV7r%2FYt73LwY840h8NIbhx1ESd1%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;618&quot; height=&quot;410&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sscv9/btsALJQiuQc/NgdOJTS0F4JU6LHDPgxA41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sscv9/btsALJQiuQc/NgdOJTS0F4JU6LHDPgxA41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sscv9/btsALJQiuQc/NgdOJTS0F4JU6LHDPgxA41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsscv9%2FbtsALJQiuQc%2FNgdOJTS0F4JU6LHDPgxA41%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;611&quot; height=&quot;886&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baohjP/btsAM1o9xXP/RpstKPfY7PijpeqC0HWTsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baohjP/btsAM1o9xXP/RpstKPfY7PijpeqC0HWTsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baohjP/btsAM1o9xXP/RpstKPfY7PijpeqC0HWTsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaohjP%2FbtsAM1o9xXP%2FRpstKPfY7PijpeqC0HWTsk%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;594&quot; height=&quot;622&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DrS5s/btsAO7vn3KD/kDqCk0wx5XBFjFs5tak6Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DrS5s/btsAO7vn3KD/kDqCk0wx5XBFjFs5tak6Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DrS5s/btsAO7vn3KD/kDqCk0wx5XBFjFs5tak6Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDrS5s%2FbtsAO7vn3KD%2FkDqCk0wx5XBFjFs5tak6Rk%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;602&quot; height=&quot;464&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#8 배포 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5KpGp/btsAL3VnZAs/T59196WXKuwZj5lUHRaZsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5KpGp/btsAL3VnZAs/T59196WXKuwZj5lUHRaZsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5KpGp/btsAL3VnZAs/T59196WXKuwZj5lUHRaZsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5KpGp%2FbtsAL3VnZAs%2FT59196WXKuwZj5lUHRaZsk%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;652&quot; height=&quot;364&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhqBsz/btsAMn66iYn/dG2GYDpQyb8SpHuCDKkyD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhqBsz/btsAMn66iYn/dG2GYDpQyb8SpHuCDKkyD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhqBsz/btsAMn66iYn/dG2GYDpQyb8SpHuCDKkyD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhqBsz%2FbtsAMn66iYn%2FdG2GYDpQyb8SpHuCDKkyD0%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;659&quot; height=&quot;799&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- commit id 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Sd35/btsAKTloEJt/dcAn8IAHibQX6AB72cYcb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Sd35/btsAKTloEJt/dcAn8IAHibQX6AB72cYcb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Sd35/btsAKTloEJt/dcAn8IAHibQX6AB72cYcb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Sd35%2FbtsAKTloEJt%2FdcAn8IAHibQX6AB72cYcb1%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;720&quot; height=&quot;527&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;#9 flaskserver 인스턴스로 접속해서 로그확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700718218867&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-10-0-10-203:~$ sudo systemctl status codedeploy-agent
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
     Loaded: loaded (/etc/init.d/codedeploy-agent; generated)
     Active: active (running) since Thu 2023-11-23 05:23:24 UTC; 19min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 30031 ExecStart=/etc/init.d/codedeploy-agent start (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 1121)
     Memory: 57.8M
        CPU: 1.163s
     CGroup: /system.slice/codedeploy-agent.service
             ├─30037 &quot;codedeploy-agent: master 30037&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &amp;gt;
             └─30039 &quot;codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of &amp;gt;

Nov 23 05:23:24 ip-10-0-10-203 systemd[1]: Starting LSB: AWS CodeDeploy Host Agent...
Nov 23 05:23:24 ip-10-0-10-203 codedeploy-agent[30031]: Starting codedeploy-agent:
Nov 23 05:23:24 ip-10-0-10-203 systemd[1]: Started LSB: AWS CodeDeploy Host Agent.&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;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: #000000;&quot;&gt;**&lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beMK04/btsANKIdoWs/uHCb694ShfioK4DN2XZ63k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beMK04/btsANKIdoWs/uHCb694ShfioK4DN2XZ63k/img.png&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;863&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.8643%; margin-right: 10px;&quot; data-widthpercent=&quot;61.58&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beMK04/btsANKIdoWs/uHCb694ShfioK4DN2XZ63k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeMK04%2FbtsANKIdoWs%2FuHCb694ShfioK4DN2XZ63k%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;1619&quot; height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW8Uu8/btsARhdClAi/tX8Zt2dOH6Mm1NHDfwhUjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW8Uu8/btsARhdClAi/tX8Zt2dOH6Mm1NHDfwhUjk/img.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;663&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.973%;&quot; data-widthpercent=&quot;38.42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW8Uu8/btsARhdClAi/tX8Zt2dOH6Mm1NHDfwhUjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW8Uu8%2FbtsARhdClAi%2FtX8Zt2dOH6Mm1NHDfwhUjk%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;776&quot; height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtlGQS/btsAL23jNi8/8o0JK1BqwI38X6Y1hsBkj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtlGQS/btsAL23jNi8/8o0JK1BqwI38X6Y1hsBkj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtlGQS/btsAL23jNi8/8o0JK1BqwI38X6Y1hsBkj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtlGQS%2FbtsAL23jNi8%2F8o0JK1BqwI38X6Y1hsBkj0%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;912&quot; height=&quot;61&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ERROR [codedeploy-agent(3039) ]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller:Missing credentials - please check if this instance was started with am IAM instance profile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 에러가 발생하게 된 원인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp; IAM 역할을 지정하지 않고 인스턴스를 실행&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 이후 실행시킨 인스턴스에 CodeDeploy Agent를 설치&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 이때 설치된 CodeDeploy에는 해당 역할을 실행 할 수 있는 &lt;b&gt;자격증명이 없기&lt;/b&gt;에 위와 같은 에러가 발생 하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아무 권한이 없이 역할을 하나 생성해서 EC2에 부여&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;flaskDummyRole&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TcMiP/btsAMYTzXkD/n9ZYM3BBMF7GxB8EqDCH2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TcMiP/btsAMYTzXkD/n9ZYM3BBMF7GxB8EqDCH2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TcMiP/btsAMYTzXkD/n9ZYM3BBMF7GxB8EqDCH2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTcMiP%2FbtsAMYTzXkD%2Fn9ZYM3BBMF7GxB8EqDCH2K%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;658&quot; height=&quot;156&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sHsJo/btsAM2Ismd6/rd3u4qDF8DedbvHMlxOhyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sHsJo/btsAM2Ismd6/rd3u4qDF8DedbvHMlxOhyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sHsJo/btsAM2Ismd6/rd3u4qDF8DedbvHMlxOhyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsHsJo%2FbtsAM2Ismd6%2Frd3u4qDF8DedbvHMlxOhyK%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;837&quot; height=&quot;809&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;628&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVZ8M1/btsAPx1Ku2j/gwJ8J7AfIHMZTk3Gxs5JoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVZ8M1/btsAPx1Ku2j/gwJ8J7AfIHMZTk3Gxs5JoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVZ8M1/btsAPx1Ku2j/gwJ8J7AfIHMZTk3Gxs5JoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVZ8M1%2FbtsAPx1Ku2j%2FgwJ8J7AfIHMZTk3Gxs5JoK%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;628&quot; height=&quot;405&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AAdKZ/btsALat26ot/dHUh75J01yGhxH1QkNcHLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AAdKZ/btsALat26ot/dHUh75J01yGhxH1QkNcHLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AAdKZ/btsALat26ot/dHUh75J01yGhxH1QkNcHLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAAdKZ%2FbtsALat26ot%2FdHUh75J01yGhxH1QkNcHLk%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;761&quot; height=&quot;260&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVOhbJ/btsAMkJk5Xi/hZwalerH3Dp941zRFytvrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVOhbJ/btsAMkJk5Xi/hZwalerH3Dp941zRFytvrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVOhbJ/btsAMkJk5Xi/hZwalerH3Dp941zRFytvrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVOhbJ%2FbtsAMkJk5Xi%2FhZwalerH3Dp941zRFytvrk%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;682&quot; height=&quot;323&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- codedeploy agent 재시작&lt;/p&gt;
&lt;pre id=&quot;code_1700785058046&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;sudo service codedeploy-agent restart
ubuntu@ip-10-0-10-203:/opt/codedeploy-agent$ sudo service codedeploy-agent status
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
     Loaded: loaded (/etc/init.d/codedeploy-agent; generated)
     Active: active (running) since Thu 2023-11-23 06:01:21 UTC; 5s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 30234 ExecStart=/etc/init.d/codedeploy-agent start (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 1121)
     Memory: 56.4M
        CPU: 1.046s
     CGroup: /system.slice/codedeploy-agent.service
             ├─30241 &quot;codedeploy-agent: master 30241&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot;&amp;gt;
             └─30243 &quot;codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of master 30241&quot;

Nov 23 06:01:20 ip-10-0-10-203 systemd[1]: Stopped LSB: AWS CodeDeploy Host Agent.
Nov 23 06:01:20 ip-10-0-10-203 systemd[1]: codedeploy-agent.service: Consumed 1.686s CPU time.
Nov 23 06:01:20 ip-10-0-10-203 systemd[1]: Starting LSB: AWS CodeDeploy Host Agent...
Nov 23 06:01:21 ip-10-0-10-203 codedeploy-agent[30234]: Starting codedeploy-agent:
Nov 23 06:01:21 ip-10-0-10-203 systemd[1]: Started LSB: AWS CodeDeploy Host Agent.&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;**&lt;span style=&quot;background-color: #f89009; color: #000000; text-align: start;&quot;&gt;ERROR &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CodeDeploy agent was not able to receive the lifecycle event. Check the CodeDeploy agent logs on your host and make sure the agent is running and can commect to the CodeDeploy server.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmHt11/btsAL47V4h1/DPjKqPMVfJ0EKvLZDVfkzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmHt11/btsAL47V4h1/DPjKqPMVfJ0EKvLZDVfkzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmHt11/btsAL47V4h1/DPjKqPMVfJ0EKvLZDVfkzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmHt11%2FbtsAL47V4h1%2FDPjKqPMVfJ0EKvLZDVfkzk%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;638&quot; height=&quot;834&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700784725555&quot; class=&quot;shell&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;CodeDeploy에서 이벤트 주기가 가능하지 않으니, 배포하는 서버의 log를 보라는것&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700784731783&quot; class=&quot;sqf&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;경로 : var/log/aws/codedeploy-agent/codedeploy-agent.log &lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700720071293&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-10-0-10-203:/opt/codedeploy-agent$ cat /var/log/aws/codedeploy-agent/codedeploy-agent.log
2023-11-23T06:07:56 WARN  [codedeploy-agent(30243)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Calling PutHostCommandComplete: &quot;Code Error&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WARN&amp;nbsp;&amp;nbsp;[codedeploy-gent(30243)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Calling PutHostCommandComplete: &quot;Code Error&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;gt; code에서 발생하는 오류&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해결 : 코드 확인&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;gt; source 가 아닌 souce였다.....ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700721107008&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### appspec.yml ###

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/FIRSTSTEP_BE_AWS
hooks:
  BeforeInstall:
    - location: scripts/before_install.sh
      runas: root
  AfterInstall:
    - location: scripts/after_install.sh
      runas: root&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** &lt;span style=&quot;background-color: #f89009; text-align: start;&quot;&gt;ERROR&lt;/span&gt; &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;647&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1HfhQ/btsAL5MKZ5w/veK5n9o6KixM4xrgNohi10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1HfhQ/btsAL5MKZ5w/veK5n9o6KixM4xrgNohi10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1HfhQ/btsAL5MKZ5w/veK5n9o6KixM4xrgNohi10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1HfhQ%2FbtsAL5MKZ5w%2FveK5n9o6KixM4xrgNohi10%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;647&quot; height=&quot;671&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700729051560&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### run_flask.sh ###

echo &quot;&amp;gt;&amp;gt;&amp;gt; run app ===================&quot;
python3 -u app.py &amp;gt; /dev/null 2&amp;gt; /home/ubuntu/flask.log &amp;lt;/dev/null &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700729082236&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### after_install.sh ###

#!/bin/bash
cd /home/ubuntu/FIRSTSTEP_BE_AWS

echo &quot;&amp;gt;&amp;gt;&amp;gt; pip install requirements.txt =================&quot;
pip install -r requirements.txt

echo &quot;&amp;gt;&amp;gt;&amp;gt;remove template files ==============&quot;
rm -rf appspec.yml requirements.txt

echo &quot;&amp;gt;&amp;gt;&amp;gt; change owner to ubuntu ================&quot;
chown -R ubuntu /home/ubuntu/FIRSTSTEP_BE_AWS&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;* python3 -u app.py &amp;gt; /dev/null 2&amp;gt; /home/ubuntu/flask.log &amp;lt;/dev/null &amp;amp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; - -u:&amp;nbsp;Python의&amp;nbsp;출력&amp;nbsp;버퍼링을&amp;nbsp;사용하지&amp;nbsp;않도록&amp;nbsp;하는&amp;nbsp;옵션&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;gt; &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;/dev/&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; : 표준 출력(stout)을 /dev/null로 리다이렉션하여 모든 출력을 무시&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; 2&amp;gt; /dev/null: 표준 에러 출력을 /dev/null로 리다이렉션하여 모든 에러 메시지를 무시&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&amp;nbsp;/dev/null:&amp;nbsp;표준&amp;nbsp;입력을&amp;nbsp;/dev/null에서&amp;nbsp;읽도록&amp;nbsp;지정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; /dev/null은&amp;nbsp;아무것도&amp;nbsp;없음을&amp;nbsp;나타내는&amp;nbsp;파일로,&amp;nbsp;이&amp;nbsp;경우에는&amp;nbsp;표준&amp;nbsp;입력이&amp;nbsp;비어있는&amp;nbsp;것&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;amp; 백그라운드 작업으로 실행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;=&amp;gt; 출력 및 에러를 무시하면서 백그라운드에서 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Github Actions&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;#1 버킷 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;firststep-back&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5ltqd/btsALVwZ4mu/Qdc7fKTh75KbfH3eFCcoK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5ltqd/btsALVwZ4mu/Qdc7fKTh75KbfH3eFCcoK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5ltqd/btsALVwZ4mu/Qdc7fKTh75KbfH3eFCcoK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5ltqd%2FbtsALVwZ4mu%2FQdc7fKTh75KbfH3eFCcoK1%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;672&quot; height=&quot;411&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2dwPY/btsAMUxkBQa/2NKzEXf0ppC3OewlzSm6y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2dwPY/btsAMUxkBQa/2NKzEXf0ppC3OewlzSm6y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2dwPY/btsAMUxkBQa/2NKzEXf0ppC3OewlzSm6y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2dwPY%2FbtsAMUxkBQa%2F2NKzEXf0ppC3OewlzSm6y1%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;849&quot; height=&quot;525&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2 Github 레포지터리에 Secrets를 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2rvOb/btsAPwPD6tF/hCcoUdNMRxeHAvwkvKJsDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2rvOb/btsAPwPD6tF/hCcoUdNMRxeHAvwkvKJsDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2rvOb/btsAPwPD6tF/hCcoUdNMRxeHAvwkvKJsDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2rvOb%2FbtsAPwPD6tF%2FhCcoUdNMRxeHAvwkvKJsDK%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;978&quot; height=&quot;870&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;870&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3 Github Actions 워크플로우를 작성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HqtdZ/btsAL568lv2/KQqWdvzIWoeQ9mRDKkvksK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HqtdZ/btsAL568lv2/KQqWdvzIWoeQ9mRDKkvksK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HqtdZ/btsAL568lv2/KQqWdvzIWoeQ9mRDKkvksK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHqtdZ%2FbtsAL568lv2%2FKQqWdvzIWoeQ9mRDKkvksK%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;921&quot; height=&quot;785&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;785&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AxOHQ/btsAOMMl3IK/0Op7U7Rqqktfp0WCBUZRFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AxOHQ/btsAOMMl3IK/0Op7U7Rqqktfp0WCBUZRFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AxOHQ/btsAOMMl3IK/0Op7U7Rqqktfp0WCBUZRFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAxOHQ%2FbtsAOMMl3IK%2F0Op7U7Rqqktfp0WCBUZRFk%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;918&quot; height=&quot;923&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700731826118&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: Deploy to Amazon EC2

on:
  push:
    branches: [ &quot;main&quot; ]

env:
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: firststepbucket
  CODE_DEPLOY_APPLICATION_NAME: FlaskApplication
  CODE_DEPLOY_DEPLOY_GROUP_NAME: FlaskApplicationDeployGroup

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production
    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    - name: Upload to AWS S3
      run: |
        aws deploy push \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
          --ignore-hidden-files \
          --source . 

    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOY_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4 Action 실행 결과를 확인&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzaxAs/btsALZeI5iy/91GPvAxWfWkeKcVG5TfRlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzaxAs/btsALZeI5iy/91GPvAxWfWkeKcVG5TfRlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzaxAs/btsALZeI5iy/91GPvAxWfWkeKcVG5TfRlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzaxAs%2FbtsALZeI5iy%2F91GPvAxWfWkeKcVG5TfRlk%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;1228&quot; height=&quot;984&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#5 배포 로그 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;**&lt;span style=&quot;background-color: #f89009;&quot;&gt;ERROR&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Access Denied&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oPaOt/btsAPYE9bov/NXy0uSL4ABg72vNlQivfSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oPaOt/btsAPYE9bov/NXy0uSL4ABg72vNlQivfSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oPaOt/btsAPYE9bov/NXy0uSL4ABg72vNlQivfSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoPaOt%2FbtsAPYE9bov%2FNXy0uSL4ABg72vNlQivfSK%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;796&quot; height=&quot;238&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c65c0a/btsAONRTofk/dD7rfZfpqcdcsUuZZOz7Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c65c0a/btsAONRTofk/dD7rfZfpqcdcsUuZZOz7Rk/img.png&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;919&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.9404%; margin-right: 10px;&quot; data-widthpercent=&quot;44.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c65c0a/btsAONRTofk/dD7rfZfpqcdcsUuZZOz7Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc65c0a%2FbtsAONRTofk%2FdD7rfZfpqcdcsUuZZOz7Rk%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;805&quot; height=&quot;919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwSHwY/btsAMkCW8S7/XwpBnzizWmE0DWJMCIYAi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwSHwY/btsAMkCW8S7/XwpBnzizWmE0DWJMCIYAi0/img.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;710&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.8968%;&quot; data-widthpercent=&quot;55.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwSHwY/btsAMkCW8S7/XwpBnzizWmE0DWJMCIYAi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwSHwY%2FbtsAMkCW8S7%2FXwpBnzizWmE0DWJMCIYAi0%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;777&quot; height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/div&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;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#5-1 EC2 인스턴스에 묶여 있는 역할에 S3와 관련한 권한을 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;flaskDummyRole&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMnQOB/btsALWvWIv7/0ePKx0eGfAW92D6uswKZR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMnQOB/btsALWvWIv7/0ePKx0eGfAW92D6uswKZR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMnQOB/btsALWvWIv7/0ePKx0eGfAW92D6uswKZR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMnQOB%2FbtsALWvWIv7%2F0ePKx0eGfAW92D6uswKZR0%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;864&quot; height=&quot;527&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdgkxo/btsAPXztZ6C/v6NuIvUwQpDdbkLFTdq47K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdgkxo/btsAPXztZ6C/v6NuIvUwQpDdbkLFTdq47K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdgkxo/btsAPXztZ6C/v6NuIvUwQpDdbkLFTdq47K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdgkxo%2FbtsAPXztZ6C%2Fv6NuIvUwQpDdbkLFTdq47K%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;824&quot; height=&quot;592&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZf0F3/btsAO8ohmfk/1JWVH5v5X21Pr3MgBrptwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZf0F3/btsAO8ohmfk/1JWVH5v5X21Pr3MgBrptwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZf0F3/btsAO8ohmfk/1JWVH5v5X21Pr3MgBrptwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZf0F3%2FbtsAO8ohmfk%2F1JWVH5v5X21Pr3MgBrptwK%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;1000&quot; height=&quot;382&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#5-2 배포 재시도&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UOITX/btsAPiKLqw3/9PWDW3ilatYuLRf5RT6HN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UOITX/btsAPiKLqw3/9PWDW3ilatYuLRf5RT6HN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UOITX/btsAPiKLqw3/9PWDW3ilatYuLRf5RT6HN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUOITX%2FbtsAPiKLqw3%2F9PWDW3ilatYuLRf5RT6HN1%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;823&quot; height=&quot;329&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUBMU/btsAPku1siI/RTC0BwysCzIKwnQfnQrKOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUBMU/btsAPku1siI/RTC0BwysCzIKwnQfnQrKOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUBMU/btsAPku1siI/RTC0BwysCzIKwnQfnQrKOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUBMU%2FbtsAPku1siI%2FRTC0BwysCzIKwnQfnQrKOK%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;800&quot; height=&quot;880&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#6 브라우저로 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2usO3/btsAPh58wLZ/MzkRs5NknaoQZZrwdhW4AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2usO3/btsAPh58wLZ/MzkRs5NknaoQZZrwdhW4AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2usO3/btsAPh58wLZ/MzkRs5NknaoQZZrwdhW4AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2usO3%2FbtsAPh58wLZ%2FMzkRs5NknaoQZZrwdhW4AK%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;1099&quot; height=&quot;623&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** &lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;ERROR&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error: Credentials could not be loaded, please check your action inputs: Could not load credentials from any providers&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;819&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/psfX6/btsAM3udKiu/nvCexatxE0XWXJfRE387xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/psfX6/btsAM3udKiu/nvCexatxE0XWXJfRE387xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/psfX6/btsAM3udKiu/nvCexatxE0XWXJfRE387xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpsfX6%2FbtsAM3udKiu%2FnvCexatxE0XWXJfRE387xK%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;925&quot; height=&quot;819&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;819&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;#2 Github Action에서 사용할 사용자를 생성하고 권한부여&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: #1b711d;&quot;&gt;#3 Secrets 추가&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>CodeDeploy</category>
      <category>flask</category>
      <category>github actions</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/46</guid>
      <comments>https://kalswn.tistory.com/46#entry46comment</comments>
      <pubDate>Fri, 24 Nov 2023 10:41:01 +0900</pubDate>
    </item>
    <item>
      <title>AWS - Flask / MySQL / react 배포</title>
      <link>https://kalswn.tistory.com/45</link>
      <description>&lt;pre id=&quot;code_1700751309686&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;목표
- 온프레미스 및 클라우드 환경에서 서비스 인프라를 (자동) 구성
- 어플리케이션 코드를 자동으로 배포, 실행하는 환경을 구성

참고
backend - flask : https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS.git
front - react : https://github.com/Kwak-Minju/FIRSTSTEP_FE_AWS.git&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;1058&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDaL1P/btsA2tsgA7L/7i34PpZDtFlaV9t98oY5Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDaL1P/btsA2tsgA7L/7i34PpZDtFlaV9t98oY5Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDaL1P/btsA2tsgA7L/7i34PpZDtFlaV9t98oY5Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDaL1P%2FbtsA2tsgA7L%2F7i34PpZDtFlaV9t98oY5Q0%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;1058&quot; height=&quot;593&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#1 VPC 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC 구성 - Public Subnet 2개와 Private Subnet 2개를 생성&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;1124&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csLDbo/btsAKa74gAd/zIVckAnXmmDtvnBdLXy0KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csLDbo/btsAKa74gAd/zIVckAnXmmDtvnBdLXy0KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csLDbo/btsAKa74gAd/zIVckAnXmmDtvnBdLXy0KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsLDbo%2FbtsAKa74gAd%2FzIVckAnXmmDtvnBdLXy0KK%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;784&quot; height=&quot;512&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bygtWP/btsAJIcVjXN/3nR6PTxwWmrcXzAPwrtHck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bygtWP/btsAJIcVjXN/3nR6PTxwWmrcXzAPwrtHck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bygtWP/btsAJIcVjXN/3nR6PTxwWmrcXzAPwrtHck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbygtWP%2FbtsAJIcVjXN%2F3nR6PTxwWmrcXzAPwrtHck%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;784&quot; height=&quot;565&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWM3S/btsAL461WMK/whq9hAoWfz2OeThWHlCs9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWM3S/btsAL461WMK/whq9hAoWfz2OeThWHlCs9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWM3S/btsAL461WMK/whq9hAoWfz2OeThWHlCs9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWM3S%2FbtsAL461WMK%2Fwhq9hAoWfz2OeThWHlCs9k%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;784&quot; height=&quot;341&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2 RDS 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;myRds - MySQL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user : admin pw : Password&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diwhm2/btsAKby5Iig/w6r72XdFYUKpPhndRVtGk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diwhm2/btsAKby5Iig/w6r72XdFYUKpPhndRVtGk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diwhm2/btsAKby5Iig/w6r72XdFYUKpPhndRVtGk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdiwhm2%2FbtsAKby5Iig%2Fw6r72XdFYUKpPhndRVtGk1%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;657&quot; height=&quot;901&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyPavI/btsAL6DMRQi/RXafkmYy5VNHnZl5ZJ9Qjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyPavI/btsAL6DMRQi/RXafkmYy5VNHnZl5ZJ9Qjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyPavI/btsAL6DMRQi/RXafkmYy5VNHnZl5ZJ9Qjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyPavI%2FbtsAL6DMRQi%2FRXafkmYy5VNHnZl5ZJ9Qjk%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;662&quot; height=&quot;317&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXc13K/btsAJEVPcyK/n1eSnsaqGbAqn8U2jpiXHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXc13K/btsAJEVPcyK/n1eSnsaqGbAqn8U2jpiXHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXc13K/btsAJEVPcyK/n1eSnsaqGbAqn8U2jpiXHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXc13K%2FbtsAJEVPcyK%2Fn1eSnsaqGbAqn8U2jpiXHK%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;663&quot; height=&quot;745&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D89xZ/btsAM21VYPp/BBK5jaScNWGt6A9ZOsYko0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D89xZ/btsAM21VYPp/BBK5jaScNWGt6A9ZOsYko0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D89xZ/btsAM21VYPp/BBK5jaScNWGt6A9ZOsYko0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD89xZ%2FbtsAM21VYPp%2FBBK5jaScNWGt6A9ZOsYko0%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;667&quot; height=&quot;915&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qW0tq/btsAM2Vba6a/bQgXOgByUV22NSQLCvgqJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qW0tq/btsAM2Vba6a/bQgXOgByUV22NSQLCvgqJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qW0tq/btsAM2Vba6a/bQgXOgByUV22NSQLCvgqJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqW0tq%2FbtsAM2Vba6a%2FbQgXOgByUV22NSQLCvgqJk%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;661&quot; height=&quot;561&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;퍼블릭 액세스 - 아니요&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;vpc 내부에서만 접속할 수 있도록 하기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2-1 BastionHost 인스턴스 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- BastionHost&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;Bastion 요새 라는 뜻으로 보안을 위해 고안된 호스트&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;664&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nRDHJ/btsAJCDNNyZ/XvQvOQhHN9TDKEFb8PENOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nRDHJ/btsAJCDNNyZ/XvQvOQhHN9TDKEFb8PENOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nRDHJ/btsAJCDNNyZ/XvQvOQhHN9TDKEFb8PENOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnRDHJ%2FbtsAJCDNNyZ%2FXvQvOQhHN9TDKEFb8PENOk%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;664&quot; height=&quot;836&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB1THM/btsAL0jl5iS/HKU2ruvR6YvCxPupSJwzvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB1THM/btsAL0jl5iS/HKU2ruvR6YvCxPupSJwzvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB1THM/btsAL0jl5iS/HKU2ruvR6YvCxPupSJwzvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB1THM%2FbtsAL0jl5iS%2FHKU2ruvR6YvCxPupSJwzvk%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;660&quot; height=&quot;427&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UvPQi/btsAJAFZNsG/isoixgOJTrc4XlJdxf55Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UvPQi/btsAJAFZNsG/isoixgOJTrc4XlJdxf55Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UvPQi/btsAJAFZNsG/isoixgOJTrc4XlJdxf55Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUvPQi%2FbtsAJAFZNsG%2FisoixgOJTrc4XlJdxf55Yk%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;657&quot; height=&quot;886&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2-2 BastionHost 인스턴스와 RDS 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;개발자가 workbench로 접속하여 db를 설정하고 관리하기 위해&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4XmDu/btsAM1wvIHQ/vHJmtYMc79MNszG1kDTkJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4XmDu/btsAM1wvIHQ/vHJmtYMc79MNszG1kDTkJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4XmDu/btsAM1wvIHQ/vHJmtYMc79MNszG1kDTkJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4XmDu%2FbtsAM1wvIHQ%2FvHJmtYMc79MNszG1kDTkJK%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;716&quot; height=&quot;810&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWgHmv/btsANssJCR1/PLKNbP85Kir6ghhQjiw951/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWgHmv/btsANssJCR1/PLKNbP85Kir6ghhQjiw951/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWgHmv/btsANssJCR1/PLKNbP85Kir6ghhQjiw951/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWgHmv%2FbtsANssJCR1%2FPLKNbP85Kir6ghhQjiw951%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;835&quot; height=&quot;306&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUV03j/btsAMk9LUuX/GQ1YeRIuYkipQdapk9ven0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUV03j/btsAMk9LUuX/GQ1YeRIuYkipQdapk9ven0/img.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;835&quot; data-is-animation=&quot;false&quot; style=&quot;width: 36.449%; margin-right: 10px;&quot; data-widthpercent=&quot;36.88&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUV03j/btsAMk9LUuX/GQ1YeRIuYkipQdapk9ven0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUV03j%2FbtsAMk9LUuX%2FGQ1YeRIuYkipQdapk9ven0%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;685&quot; height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOU4nd/btsAJC4VoHb/Cv3XRwj4IwapnfPvJHP9tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOU4nd/btsAJC4VoHb/Cv3XRwj4IwapnfPvJHP9tK/img.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;527&quot; data-is-animation=&quot;false&quot; style=&quot;width: 62.3882%;&quot; data-widthpercent=&quot;63.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOU4nd/btsAJC4VoHb/Cv3XRwj4IwapnfPvJHP9tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOU4nd%2FbtsAJC4VoHb%2FCv3XRwj4IwapnfPvJHP9tK%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;740&quot; height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#2-3 workbench를 통해 생성한 RDS 연결 후 스키마 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNVQAk/btsAMpDf430/6V9bT5LomB4HTLt4pOQAQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNVQAk/btsAMpDf430/6V9bT5LomB4HTLt4pOQAQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNVQAk/btsAMpDf430/6V9bT5LomB4HTLt4pOQAQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNVQAk%2FbtsAMpDf430%2F6V9bT5LomB4HTLt4pOQAQ1%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;886&quot; height=&quot;593&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700750242960&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create database firststep;

use firststep;

CREATE TABLE `user` (
    `userId` int unsigned AUTO_INCREMENT NOT NULL ,
    `name` varchar(20)  NOT NULL ,
    `ID` varchar(16)  NOT NULL ,
    `password` varchar(300)  NOT NULL ,
    `phoneNumber` varchar(30)  NOT NULL ,
    `status` varchar(10) default 'active' NOT NULL ,
    `createAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    `updateAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    PRIMARY KEY (
        `userId`
    )
);

CREATE TABLE `board` (
    `boardId` int unsigned AUTO_INCREMENT NOT NULL ,
    `userId` int unsigned  NOT NULL ,
    `title` varchar(30)  NOT NULL ,
    `content` varchar(1000)  NOT NULL ,
    `location` varchar(20)  NOT NULL ,
    `status` varchar(10) default 'active' NOT NULL ,
    `createAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    `updateAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    PRIMARY KEY (
        `boardId`
    )
);

CREATE TABLE `comment` (
    `commentId` int unsigned AUTO_INCREMENT NOT NULL ,
    `userId` int unsigned  NOT NULL ,
    `boardId` int unsigned  NOT NULL ,
    `content` varchar(1000)  NOT NULL ,
    `status` varchar(10) default 'active' NOT NULL ,
    `createAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    `updateAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    PRIMARY KEY (
        `commentId`
    )
);

CREATE TABLE `rent` (
		`rentId` int unsigned AUTO_INCREMENT NOT NULL,
		`boardId` int unsigned  NOT NULL ,
		`userId` int unsigned,
		`rent` varchar(10) default 'active' NOT NULL ,
		`rentAt` datetime,
		`returnAt` datetime, 
		PRIMARY KEY (
				`rentId`
		)
);

ALTER TABLE `board` ADD CONSTRAINT `fk_board_userId` FOREIGN KEY(`userId`)
REFERENCES `user` (`userId`);

ALTER TABLE `comment` ADD CONSTRAINT `fk_comment_userId` FOREIGN KEY(`userId`)
REFERENCES `user` (`userId`);

ALTER TABLE `comment` ADD CONSTRAINT `fk_comment_board_id` FOREIGN KEY(`boardId`)
REFERENCES `board` (`boardId`);

ALTER TABLE `rent` ADD CONSTRAINT `fk_rent_boardId` FOREIGN KEY(`boardId`)
REFERENCES `board` (`boardId`);

ALTER TABLE `rent` ADD CONSTRAINT `fk_rent_userId` FOREIGN KEY(`userId`)
REFERENCES `user` (`userId`);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3 Flask 인스턴스 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbpRQA/btsAJ2WyNOM/Pkfl6ZJk9Ejf9INKXxMj0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbpRQA/btsAJ2WyNOM/Pkfl6ZJk9Ejf9INKXxMj0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbpRQA/btsAJ2WyNOM/Pkfl6ZJk9Ejf9INKXxMj0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbpRQA%2FbtsAJ2WyNOM%2FPkfl6ZJk9Ejf9INKXxMj0K%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;624&quot; height=&quot;794&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q93B3/btsAMnrRQrN/bZcKpmt8TE3guZVY2OUEPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q93B3/btsAMnrRQrN/bZcKpmt8TE3guZVY2OUEPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q93B3/btsAMnrRQrN/bZcKpmt8TE3guZVY2OUEPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq93B3%2FbtsAMnrRQrN%2FbZcKpmt8TE3guZVY2OUEPk%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;618&quot; height=&quot;398&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJF8LG/btsAJDQgPDf/jTCkqHLZf2llefK18mkgmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJF8LG/btsAJDQgPDf/jTCkqHLZf2llefK18mkgmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJF8LG/btsAJDQgPDf/jTCkqHLZf2llefK18mkgmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJF8LG%2FbtsAJDQgPDf%2FjTCkqHLZf2llefK18mkgmK%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;538&quot; height=&quot;922&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;포트범위 : EC2에서 5000 포트로 들어오는 요청을 받을 수 있게 설정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9zPh7/btsAJF8tOld/53Kkf74Bhdkxv9HBVPA9wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9zPh7/btsAJF8tOld/53Kkf74Bhdkxv9HBVPA9wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9zPh7/btsAJF8tOld/53Kkf74Bhdkxv9HBVPA9wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9zPh7%2FbtsAJF8tOld%2F53Kkf74Bhdkxv9HBVPA9wK%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;745&quot; height=&quot;526&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;526&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3-1 RDS와 FlaskServer 인스턴스 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rsCJZ/btsAMkhGGZd/iFEPKTnUhqUBSVQTwmXlGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rsCJZ/btsAMkhGGZd/iFEPKTnUhqUBSVQTwmXlGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rsCJZ/btsAMkhGGZd/iFEPKTnUhqUBSVQTwmXlGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrsCJZ%2FbtsAMkhGGZd%2FiFEPKTnUhqUBSVQTwmXlGk%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;743&quot; height=&quot;272&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;272&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;size14&quot;&gt;app.py 수정&lt;/p&gt;
&lt;pre id=&quot;code_1700698533984&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def getCon():
  return pymysql.connect(host=&quot;&amp;lt;RDS 엔드포인트&amp;gt;&quot;, 
                     user=&quot;admin&quot;, password=&quot;Password&quot;, 
                     db=&quot;firststep&quot;,
                     charset=&quot;utf8&quot;,
                     port=3306,
                     cursorclass=pymysql.cursors.DictCursor)
...

if __name__ == &quot;__main__&quot; :
    app.run(host=&quot;0.0.0.0&quot;, debug=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;user와 password 는 RDS 생성 시 설정한 정보로 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3-2 Bitvise SSH Client 사용하여 flaskServer 인스턴스에 접속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lMc21/btsALXN4rld/vIvohBTlut6UvkaWniYK4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lMc21/btsALXN4rld/vIvohBTlut6UvkaWniYK4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lMc21/btsALXN4rld/vIvohBTlut6UvkaWniYK4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlMc21%2FbtsALXN4rld%2FvIvohBTlut6UvkaWniYK4K%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;632&quot; height=&quot;643&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700698136490&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install python3

git clone &amp;lt;github url&amp;gt;

ubuntu@ip-10-0-10-203:~$ ls
FIRSTSTEP_BE_AWS

ubuntu@ip-10-0-10-203:~$ cd FIRSTSTEP_BE_AWS/

pip install flask

pip install -r requirements.txt

ubuntu@ip-10-0-10-203:~/FIRSTSTEP_BE_AWS$ flask run --host=0.0.0.0
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://10.0.10.203:5000
Press CTRL+C to quit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;=&amp;gt; --host=0.0.0.0 : 옵션을 주지 않으면 인스턴스 로컬에 실행이되어 접근할 수 없어 외부로 실행되어야 함&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;background-color: #f89009;&quot;&gt;**error&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700698154042&quot; class=&quot;ada&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;E: Unable to locate package python3-pip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 해결 방법&lt;/p&gt;
&lt;pre id=&quot;code_1700698154043&quot; class=&quot;smali&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo add-apt-repository universe 
sudo apt-get update 
sudo apt-get install python3-pip&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#3-3 브라우저에서 접속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCfLZh/btsAJyodMp8/KMb1jjr1kcRdSTSpvPh0l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCfLZh/btsAJyodMp8/KMb1jjr1kcRdSTSpvPh0l1/img.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;551&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCfLZh/btsAJyodMp8/KMb1jjr1kcRdSTSpvPh0l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCfLZh%2FbtsAJyodMp8%2FKMb1jjr1kcRdSTSpvPh0l1%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;958&quot; height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KzeMz/btsALbeNKIm/q2yzHE8hUm1ARLF79W8lek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KzeMz/btsALbeNKIm/q2yzHE8hUm1ARLF79W8lek/img.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;551&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KzeMz/btsALbeNKIm/q2yzHE8hUm1ARLF79W8lek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKzeMz%2FbtsALbeNKIm%2Fq2yzHE8hUm1ARLF79W8lek%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;958&quot; height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/div&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;size14&quot;&gt;Not Found =&amp;gt; 서버가 실행 중인 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인스턴스 생성 시 인바운드 규칙에 5000 추가했기 때문에 연결 가능(인스턴스 생성 시 빼먹었다면 보안그룹에 가서 포트 열어주기!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- postman을 통해 RDS와 연결 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwk1qX/btsALblyGCn/hXAqIyjMtnvYip8rPD77Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwk1qX/btsALblyGCn/hXAqIyjMtnvYip8rPD77Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwk1qX/btsALblyGCn/hXAqIyjMtnvYip8rPD77Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwk1qX%2FbtsALblyGCn%2FhXAqIyjMtnvYip8rPD77Nk%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;1164&quot; height=&quot;766&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4 React&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4-1 S3 버킷 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;firststep&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GkpK3/btsAKblNxMm/wWPeJmFRNgsS90eddHKnTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GkpK3/btsAKblNxMm/wWPeJmFRNgsS90eddHKnTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GkpK3/btsAKblNxMm/wWPeJmFRNgsS90eddHKnTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGkpK3%2FbtsAKblNxMm%2FwWPeJmFRNgsS90eddHKnTK%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;672&quot; height=&quot;923&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4-2 react 어플리케이션 코드 수정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;flaskServer로 연결하는 axios url 을 flaskServer 퍼블릭주소:5000으로 변경&lt;/p&gt;
&lt;pre id=&quot;code_1700699290371&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;axios.get(`${process.env.REACT_APP_SERVER_URL}/board/detail/${boardId}/${sessionStorage.getItem('token')}`)
        .then(res =&amp;gt; {
            console.log(res)
            
...

### .env ###
REACT_APP_SERVER_URL = http://52.78.120.29:5000 &amp;lt;= flask 퍼블릭주소&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;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4-3 react 어플리케이션을 빌드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700699586741&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;User@DESKTOP-UDC737O MINGW64 /c/FirstStep_project/FIRSTSTEP_FE_AWS (main)
$ npm run build

&amp;gt; client@0.1.0 build
&amp;gt; react-scripts build

Creating an optimized production build...

...&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;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4-4 build 한 react app 파일을 S3버킷에 업로드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJyPCA/btsAMT5fBwp/WmXR8mHGFX5kUeky7y0pQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJyPCA/btsAMT5fBwp/WmXR8mHGFX5kUeky7y0pQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJyPCA/btsAMT5fBwp/WmXR8mHGFX5kUeky7y0pQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJyPCA%2FbtsAMT5fBwp%2FWmXR8mHGFX5kUeky7y0pQK%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;861&quot; height=&quot;339&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/so3hH/btsAJF1HHEA/tYDhQBvAoWIkvExNHrKyD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/so3hH/btsAJF1HHEA/tYDhQBvAoWIkvExNHrKyD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/so3hH/btsAJF1HHEA/tYDhQBvAoWIkvExNHrKyD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fso3hH%2FbtsAJF1HHEA%2FtYDhQBvAoWIkvExNHrKyD1%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;671&quot; height=&quot;750&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buWiy3/btsAJy9Cayx/7iDc5dgdeSKkPWPIunbm4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buWiy3/btsAJy9Cayx/7iDc5dgdeSKkPWPIunbm4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buWiy3/btsAJy9Cayx/7iDc5dgdeSKkPWPIunbm4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuWiy3%2FbtsAJy9Cayx%2F7iDc5dgdeSKkPWPIunbm4K%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;661&quot; height=&quot;475&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clDt17/btsALIXFoch/iCRZ0IKIG78B8eIBv8lF30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clDt17/btsALIXFoch/iCRZ0IKIG78B8eIBv8lF30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clDt17/btsALIXFoch/iCRZ0IKIG78B8eIBv8lF30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclDt17%2FbtsALIXFoch%2FiCRZ0IKIG78B8eIBv8lF30%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;831&quot; height=&quot;584&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;879&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/34SFi/btsALV3NL40/6z4AGDgpODGDWkPZeZnEDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/34SFi/btsALV3NL40/6z4AGDgpODGDWkPZeZnEDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/34SFi/btsALV3NL40/6z4AGDgpODGDWkPZeZnEDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F34SFi%2FbtsALV3NL40%2F6z4AGDgpODGDWkPZeZnEDK%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;664&quot; height=&quot;879&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;879&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;#4-4 브라우저에서 버킷 웹 사이트 엔드포인트로 접속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s1O1X/btsAPKHcUrl/644FxkG38HRjtMKzfIzfYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s1O1X/btsAPKHcUrl/644FxkG38HRjtMKzfIzfYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s1O1X/btsAPKHcUrl/644FxkG38HRjtMKzfIzfYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs1O1X%2FbtsAPKHcUrl%2F644FxkG38HRjtMKzfIzfYK%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;835&quot; height=&quot;538&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhAO6j/btsAO5LIEJW/QK86CCZ14qWnKf8bwpnvHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhAO6j/btsAO5LIEJW/QK86CCZ14qWnKf8bwpnvHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhAO6j/btsAO5LIEJW/QK86CCZ14qWnKf8bwpnvHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhAO6j%2FbtsAO5LIEJW%2FQK86CCZ14qWnKf8bwpnvHk%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;958&quot; height=&quot;622&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;622&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;**error&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w1LjL/btsAOQVzInK/EY2LuyEKUQHkdCtvUipkmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w1LjL/btsAOQVzInK/EY2LuyEKUQHkdCtvUipkmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w1LjL/btsAOQVzInK/EY2LuyEKUQHkdCtvUipkmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw1LjL%2FbtsAOQVzInK%2FEY2LuyEKUQHkdCtvUipkmk%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;790&quot; height=&quot;211&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>flask</category>
      <category>mysql</category>
      <category>React</category>
      <category>s3</category>
      <category>배포</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/45</guid>
      <comments>https://kalswn.tistory.com/45#entry45comment</comments>
      <pubDate>Fri, 24 Nov 2023 00:01:00 +0900</pubDate>
    </item>
    <item>
      <title>AWS - EKS</title>
      <link>https://kalswn.tistory.com/44</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;EKS (Amazon Elastic Kubernetes Service)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 클라우드와 온프레미스 데이터 센터에서 Kubernetes를 실행하는 데 사용되는 관리형 Kubernetes 서비스&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;EKS 생성 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Amazon EKS 클러스터 생성&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: #000000;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-cluster.html&quot;&gt;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-cluster.html&lt;/a&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: #000000;&quot;&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: #000000;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-managed-node-group.html&quot;&gt;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-managed-node-group.html&lt;/a&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt; &lt;b&gt;#1 VPC 생성 - CloudFormation을 이용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EYQTI/btsAx0xVz6n/BOPExJMPNYuNb9yyDKC4G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EYQTI/btsAx0xVz6n/BOPExJMPNYuNb9yyDKC4G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EYQTI/btsAx0xVz6n/BOPExJMPNYuNb9yyDKC4G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEYQTI%2FbtsAx0xVz6n%2FBOPExJMPNYuNb9yyDKC4G0%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;784&quot; height=&quot;420&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmj1G/btsAyLHkKkU/ep4nRmtQPl8Shln4dEuuI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmj1G/btsAyLHkKkU/ep4nRmtQPl8Shln4dEuuI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmj1G/btsAyLHkKkU/ep4nRmtQPl8Shln4dEuuI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqmj1G%2FbtsAyLHkKkU%2Fep4nRmtQPl8Shln4dEuuI0%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;784&quot; height=&quot;724&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;881&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFxXzo/btsAxZTkZdo/WUXDMCLw6JftQX3qKiQkJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFxXzo/btsAxZTkZdo/WUXDMCLw6JftQX3qKiQkJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFxXzo/btsAxZTkZdo/WUXDMCLw6JftQX3qKiQkJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFxXzo%2FbtsAxZTkZdo%2FWUXDMCLw6JftQX3qKiQkJK%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;784&quot; height=&quot;875&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DckkR/btsAxTej8CR/ML0Nzx3QTNlzkki8P6W1zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DckkR/btsAxTej8CR/ML0Nzx3QTNlzkki8P6W1zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DckkR/btsAxTej8CR/ML0Nzx3QTNlzkki8P6W1zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDckkR%2FbtsAxTej8CR%2FML0Nzx3QTNlzkki8P6W1zk%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;784&quot; height=&quot;221&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1445&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bomBpS/btsAx0xV8pi/50DMDxKHtcDATpSEm31JSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bomBpS/btsAx0xV8pi/50DMDxKHtcDATpSEm31JSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bomBpS/btsAx0xV8pi/50DMDxKHtcDATpSEm31JSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbomBpS%2FbtsAx0xV8pi%2F50DMDxKHtcDATpSEm31JSK%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;784&quot; height=&quot;272&quot; data-origin-width=&quot;1445&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;#2&amp;nbsp;클러스터 서비스 역할을 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컨트롤 플레인이 사용자를 대신해서 AWS 리소스를 관리하는데 사용하는 역할 (마스터 노드)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JemHC/btsACnFoLAR/LXitH6mknBM8Pjm4OiMjz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JemHC/btsACnFoLAR/LXitH6mknBM8Pjm4OiMjz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JemHC/btsACnFoLAR/LXitH6mknBM8Pjm4OiMjz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJemHC%2FbtsACnFoLAR%2FLXitH6mknBM8Pjm4OiMjz1%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;784&quot; height=&quot;172&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csSfo8/btsAvt8GWeu/nqpR2YGm0lhbGaduGikdbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csSfo8/btsAvt8GWeu/nqpR2YGm0lhbGaduGikdbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csSfo8/btsAvt8GWeu/nqpR2YGm0lhbGaduGikdbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsSfo8%2FbtsAvt8GWeu%2FnqpR2YGm0lhbGaduGikdbK%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;750&quot; height=&quot;865&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X0scU/btsAy6RGuww/x55OhYnn0qBFOtuHKF0QZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X0scU/btsAy6RGuww/x55OhYnn0qBFOtuHKF0QZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X0scU/btsAy6RGuww/x55OhYnn0qBFOtuHKF0QZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX0scU%2FbtsAy6RGuww%2Fx55OhYnn0qBFOtuHKF0QZk%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;771&quot; height=&quot;372&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nLC4r/btsAyUYgxbh/KNwrKgoEKTSlvIxkKE6gYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nLC4r/btsAyUYgxbh/KNwrKgoEKTSlvIxkKE6gYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nLC4r/btsAyUYgxbh/KNwrKgoEKTSlvIxkKE6gYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnLC4r%2FbtsAyUYgxbh%2FKNwrKgoEKTSlvIxkKE6gYk%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;747&quot; height=&quot;421&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;#3&amp;nbsp; &lt;b&gt;클러스터 생성&lt;/b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GXx0P/btsAw50lJ1z/1ofqa7ehJ65ZTDGTCL5yH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GXx0P/btsAw50lJ1z/1ofqa7ehJ65ZTDGTCL5yH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GXx0P/btsAw50lJ1z/1ofqa7ehJ65ZTDGTCL5yH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGXx0P%2FbtsAw50lJ1z%2F1ofqa7ehJ65ZTDGTCL5yH1%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;784&quot; height=&quot;368&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpaos2/btsAzAZBVKY/Dy8VLRTVcdSnAGKYuXTYQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpaos2/btsAzAZBVKY/Dy8VLRTVcdSnAGKYuXTYQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpaos2/btsAzAZBVKY/Dy8VLRTVcdSnAGKYuXTYQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpaos2%2FbtsAzAZBVKY%2FDy8VLRTVcdSnAGKYuXTYQ0%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;750&quot; height=&quot;815&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;815&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw3KAM/btsAyV3Z8Hi/oQ1GqZ10QR2HxudjqMt0Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw3KAM/btsAyV3Z8Hi/oQ1GqZ10QR2HxudjqMt0Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw3KAM/btsAyV3Z8Hi/oQ1GqZ10QR2HxudjqMt0Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw3KAM%2FbtsAyV3Z8Hi%2FoQ1GqZ10QR2HxudjqMt0Ek%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;784&quot; height=&quot;839&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FncJS/btsAvlbCg6S/HKyYSZZXIrC8tVGtZnpy3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FncJS/btsAvlbCg6S/HKyYSZZXIrC8tVGtZnpy3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FncJS/btsAvlbCg6S/HKyYSZZXIrC8tVGtZnpy3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFncJS%2FbtsAvlbCg6S%2FHKyYSZZXIrC8tVGtZnpy3K%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;784&quot; height=&quot;333&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클러스터 엔드포인트&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- private : vpc내 특정 호스트를 통해서만 접근가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- public : kubectl이 컴퓨터에 설치되어 있어 kubectl을 통해 접근해보기위해&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxhhx/btsAwqjEbCp/eH0SDQaZ3yu5p0MW5iZpk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxhhx/btsAwqjEbCp/eH0SDQaZ3yu5p0MW5iZpk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxhhx/btsAwqjEbCp/eH0SDQaZ3yu5p0MW5iZpk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frxhhx%2FbtsAwqjEbCp%2FeH0SDQaZ3yu5p0MW5iZpk1%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;749&quot; height=&quot;773&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QHBcZ/btsAyMTIThW/Za5xbw36HPI9D6fCY1D0kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QHBcZ/btsAyMTIThW/Za5xbw36HPI9D6fCY1D0kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QHBcZ/btsAyMTIThW/Za5xbw36HPI9D6fCY1D0kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQHBcZ%2FbtsAyMTIThW%2FZa5xbw36HPI9D6fCY1D0kK%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;772&quot; height=&quot;706&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7EsvC/btsAw9odANs/Gj5wW1kf5037VRKCoCBD91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7EsvC/btsAw9odANs/Gj5wW1kf5037VRKCoCBD91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7EsvC/btsAw9odANs/Gj5wW1kf5037VRKCoCBD91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7EsvC%2FbtsAw9odANs%2FGj5wW1kf5037VRKCoCBD91%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;748&quot; height=&quot;860&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZGlZ/btsAzCwnV6d/95DPXB5HV6KDmA9gdX8Iu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZGlZ/btsAzCwnV6d/95DPXB5HV6KDmA9gdX8Iu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZGlZ/btsAzCwnV6d/95DPXB5HV6KDmA9gdX8Iu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZGlZ%2FbtsAzCwnV6d%2F95DPXB5HV6KDmA9gdX8Iu0%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;784&quot; height=&quot;707&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tFPXa/btsAzT5DRnj/xX4hmIG2AOar6KmQNUCo1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tFPXa/btsAzT5DRnj/xX4hmIG2AOar6KmQNUCo1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tFPXa/btsAzT5DRnj/xX4hmIG2AOar6KmQNUCo1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtFPXa%2FbtsAzT5DRnj%2FxX4hmIG2AOar6KmQNUCo1k%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;784&quot; height=&quot;301&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;306&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;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt; &lt;b&gt;#4 생성된 클러스터와 kubectl이 통신하도록 설정&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700444127334&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\User&amp;gt;aws eks update-kubeconfig --region ap-northeast-2 --name MyEKSCluster
Added new context arn:aws:eks:ap-northeast-2:561845507088:cluster/MyEKSCluster to C:\Users\user\.kube\config&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;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;** error&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;토큰 오류가 발생하는 경우 액세스 키를 새로 발급한 후 aws configure 명령으로 등록&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700444282149&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\User&amp;gt;aws eks update-kubeconfig --region ap-northeast-2 --name MyEKSCluster

An error occurred (UnrecognizedClientException) when calling the DescribeCluster operation: 
The security token included in the request is invalid.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUgRDF/btsAy7bXynZ/6ELjf6p69JLL6t33WtsTM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUgRDF/btsAy7bXynZ/6ELjf6p69JLL6t33WtsTM0/img.png&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;289&quot; data-is-animation=&quot;false&quot; style=&quot;width: 28.8996%; margin-right: 10px;&quot; data-widthpercent=&quot;29.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUgRDF/btsAy7bXynZ/6ELjf6p69JLL6t33WtsTM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUgRDF%2FbtsAy7bXynZ%2F6ELjf6p69JLL6t33WtsTM0%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;255&quot; height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clPnfy/btsAvsWeu1N/bk81t2jKbHrM48feraicVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clPnfy/btsAvsWeu1N/bk81t2jKbHrM48feraicVK/img.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;303&quot; data-is-animation=&quot;false&quot; style=&quot;width: 69.9376%;&quot; data-widthpercent=&quot;70.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clPnfy/btsAvsWeu1N/bk81t2jKbHrM48feraicVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclPnfy%2FbtsAvsWeu1N%2Fbk81t2jKbHrM48feraicVK%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;647&quot; height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/babH8U/btsAvriJCm6/jEhDJvVjZgm0e6Waf1UvzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/babH8U/btsAvriJCm6/jEhDJvVjZgm0e6Waf1UvzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/babH8U/btsAvriJCm6/jEhDJvVjZgm0e6Waf1UvzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbabH8U%2FbtsAvriJCm6%2FjEhDJvVjZgm0e6Waf1UvzK%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;717&quot; height=&quot;427&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4sFiZ/btsAxTyzvKz/oj08x1N1uKtckioAWiTgUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4sFiZ/btsAxTyzvKz/oj08x1N1uKtckioAWiTgUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4sFiZ/btsAxTyzvKz/oj08x1N1uKtckioAWiTgUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4sFiZ%2FbtsAxTyzvKz%2Foj08x1N1uKtckioAWiTgUK%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;717&quot; height=&quot;531&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700444764388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\User&amp;gt;aws configure
AWS Access Key ID [****************HJ2B]: 발급받은 access Key
AWS Secret Access Key [****************gk6f]: 발급받은 secret Key
Default region name [ap-northeast-2]:
Default output format [json]:


C:\Users\User&amp;gt;aws sts get-caller-identity     &amp;lt;= 등록 되었는지 확인
{
    &quot;UserId&quot;: &quot;748619042828&quot;,
    &quot;Account&quot;: &quot;748619042828&quot;,
    &quot;Arn&quot;: &quot;arn:aws:iam::748619042828:root&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#5 EKS 노드 역할을 생성&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-node-role.html&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsA2Ew/btsAyUKJ5jI/q9CuUFN9XmJBIVzPJfSWe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsA2Ew/btsAyUKJ5jI/q9CuUFN9XmJBIVzPJfSWe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsA2Ew/btsAyUKJ5jI/q9CuUFN9XmJBIVzPJfSWe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsA2Ew%2FbtsAyUKJ5jI%2Fq9CuUFN9XmJBIVzPJfSWe0%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;784&quot; height=&quot;177&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TML2Y/btsAzR7QmTm/mAE9OMAKoyhTYnJqXk7Yck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TML2Y/btsAzR7QmTm/mAE9OMAKoyhTYnJqXk7Yck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TML2Y/btsAzR7QmTm/mAE9OMAKoyhTYnJqXk7Yck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTML2Y%2FbtsAzR7QmTm%2FmAE9OMAKoyhTYnJqXk7Yck%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;749&quot; height=&quot;795&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XLRZ5/btsAx1KoqoL/hOJhbGpomnXkDUpK3TSX81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XLRZ5/btsAx1KoqoL/hOJhbGpomnXkDUpK3TSX81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XLRZ5/btsAx1KoqoL/hOJhbGpomnXkDUpK3TSX81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXLRZ5%2FbtsAx1KoqoL%2FhOJhbGpomnXkDUpK3TSX81%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;768&quot; height=&quot;520&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boNSiw/btsACm0NxCo/2YEyujMCkI0uk2s3Fmm7Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boNSiw/btsACm0NxCo/2YEyujMCkI0uk2s3Fmm7Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boNSiw/btsACm0NxCo/2YEyujMCkI0uk2s3Fmm7Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboNSiw%2FbtsACm0NxCo%2F2YEyujMCkI0uk2s3Fmm7Ak%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;749&quot; height=&quot;420&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;420&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#6 노드 그룹 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pd3Z4/btsAyMe8BCj/stZkHkQ75sMD6kUSzHF3sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pd3Z4/btsAyMe8BCj/stZkHkQ75sMD6kUSzHF3sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pd3Z4/btsAyMe8BCj/stZkHkQ75sMD6kUSzHF3sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpd3Z4%2FbtsAyMe8BCj%2FstZkHkQ75sMD6kUSzHF3sK%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;784&quot; height=&quot;851&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/evhc59/btsAvYtADu3/M72TGQwq8I8Y3MFF4bzGp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/evhc59/btsAvYtADu3/M72TGQwq8I8Y3MFF4bzGp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/evhc59/btsAvYtADu3/M72TGQwq8I8Y3MFF4bzGp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fevhc59%2FbtsAvYtADu3%2FM72TGQwq8I8Y3MFF4bzGp1%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;753&quot; height=&quot;566&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/codsPy/btsAxi6t6pF/rkH67dHQkgnx3HPsVkCpSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/codsPy/btsAxi6t6pF/rkH67dHQkgnx3HPsVkCpSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/codsPy/btsAxi6t6pF/rkH67dHQkgnx3HPsVkCpSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcodsPy%2FbtsAxi6t6pF%2FrkH67dHQkgnx3HPsVkCpSK%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;784&quot; height=&quot;575&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAS8Xm/btsAxbGf1Kq/rn1LGEDv25a2eByHaXbLH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAS8Xm/btsAxbGf1Kq/rn1LGEDv25a2eByHaXbLH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAS8Xm/btsAxbGf1Kq/rn1LGEDv25a2eByHaXbLH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAS8Xm%2FbtsAxbGf1Kq%2Frn1LGEDv25a2eByHaXbLH1%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;749&quot; height=&quot;776&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N8TFy/btsACoxCHR2/vLY6atwjhOXx4Ad2PJfl7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N8TFy/btsACoxCHR2/vLY6atwjhOXx4Ad2PJfl7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N8TFy/btsACoxCHR2/vLY6atwjhOXx4Ad2PJfl7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN8TFy%2FbtsACoxCHR2%2FvLY6atwjhOXx4Ad2PJfl7k%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;784&quot; height=&quot;436&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;1521&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIERgH/btsAxJiVB4V/LXlqam6aKwmLoBKrj9yOd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIERgH/btsAxJiVB4V/LXlqam6aKwmLoBKrj9yOd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIERgH/btsAxJiVB4V/LXlqam6aKwmLoBKrj9yOd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIERgH%2FbtsAxJiVB4V%2FLXlqam6aKwmLoBKrj9yOd1%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;784&quot; height=&quot;272&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700451352659&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\user&amp;gt; kubectl get node
NAME                                                 STATUS   ROLES    AGE    VERSION
ip-192-168-176-11.ap-northeast-2.compute.internal    Ready    &amp;lt;none&amp;gt;   103s   v1.28.3-eks-e71965b
ip-192-168-195-146.ap-northeast-2.compute.internal   Ready    &amp;lt;none&amp;gt;   102s   v1.28.3-eks-e71965b

C:\Users\user&amp;gt; kubectl get ns
NAME              STATUS   AGE
default           Active   27m
kube-node-lease   Active   27m
kube-public       Active   27m
kube-system       Active   27m

C:\Users\user&amp;gt; kubectl get pod -n kube-system
NAME                       READY   STATUS    RESTARTS   AGE
aws-node-b9rrn             2/2     Running   0          2m40s
aws-node-sz57m             2/2     Running   0          2m41s
coredns-6fbff78dcc-6dqxr   1/1     Running   0          27m
coredns-6fbff78dcc-nvcgk   1/1     Running   0          27m
kube-proxy-7dfrm           1/1     Running   0          2m41s
kube-proxy-xl6pj           1/1     Running   0          2m40s&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;1525&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4VLw5/btsAw6yfGdS/6k0n2S9bvZY7ZMb4PDYUKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4VLw5/btsAw6yfGdS/6k0n2S9bvZY7ZMb4PDYUKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4VLw5/btsAw6yfGdS/6k0n2S9bvZY7ZMb4PDYUKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4VLw5%2FbtsAw6yfGdS%2F6k0n2S9bvZY7ZMb4PDYUKK%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;784&quot; height=&quot;333&quot; data-origin-width=&quot;1525&quot; data-origin-height=&quot;647&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;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt; &lt;b&gt;#7 클러스터에 디플로이먼트 및 서비스 생성&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;webserver 3개 실행&amp;nbsp; &amp;amp; 로드밸런서 실행&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;&lt;span style=&quot;color: #000000;&quot;&gt;c:\aws\hostname-deployment.yaml&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700610883599&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: my-webserver
      labels:
        app: webserver
    spec:
      containers:
        - name: my-webserver
          image: alicek106/rr-test:echo-hostname
          ports:
            - containerPort: 80&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/home/vagrant/hostname-loadbalancer.yaml&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700610865672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: hostname-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: webserver
  ports:
    - name: web-port
      port: 80
      targetPort: 80&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700451697260&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; kubectl apply -f hostname-deployment.yaml
deployment.apps/hostname-deployment created

C:\aws&amp;gt; kubectl apply -f hostname-loadbalancer.yaml
service/hostname-loadbalancer created

C:\aws&amp;gt; kubectl get all
NAME                                       READY   STATUS    RESTARTS   AGE
pod/hostname-deployment-7f7d7755d8-6qhgk   1/1     Running   0          49s
pod/hostname-deployment-7f7d7755d8-9qcgl   1/1     Running   0          49s
pod/hostname-deployment-7f7d7755d8-czxk5   1/1     Running   0          49s

NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP                                                                   PORT(S)        AGE
service/hostname-loadbalancer   LoadBalancer   10.100.159.81   a4631ffd13c82447a83077629518842a-701860891.ap-northeast-2.elb.amazonaws.com   80:32253/TCP   14s
service/kubernetes              ClusterIP      10.100.0.1      &amp;lt;none&amp;gt;                                                                        443/TCP        34m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hostname-deployment   3/3     3            3           50s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/hostname-deployment-7f7d7755d8   3         3         3       50s&lt;/code&gt;&lt;/pre&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 style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;C:\aws&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;kubectl get pod -o wide&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;NAME &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; READY &amp;nbsp; STATUS&amp;nbsp; &amp;nbsp; RESTARTS &amp;nbsp; AGE &amp;nbsp; &amp;nbsp; IP&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NODE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NOMINATED NODE &amp;nbsp; READINESS GATES&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;hostname-deployment-7f7d7755d8-6qhgk &amp;nbsp; 1/1 &amp;nbsp; &amp;nbsp; Running &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2m24s &amp;nbsp; 192.168.251.136 &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: #f4cccc; color: #000000;&quot;&gt;ip-192-168-195-146.ap-northeast-2.compute.internal&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp; &amp;lt;none&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;hostname-deployment-7f7d7755d8-9qcgl &amp;nbsp; 1/1 &amp;nbsp; &amp;nbsp; Running &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2m24s &amp;nbsp; 192.168.227.0 &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: #f4cccc; color: #000000;&quot;&gt;ip-192-168-195-146.ap-northeast-2.compute.internal&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp; &amp;lt;none&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;hostname-deployment-7f7d7755d8-czxk5 &amp;nbsp; 1/1 &amp;nbsp; &amp;nbsp; Running &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2m24s &amp;nbsp; 192.168.166.25&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: #c9daf8; color: #000000;&quot;&gt;ip-192-168-176-11.ap-northeast-2.compute.internal&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;C:\aws&amp;gt; kubectl get node -o wide&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;NAME &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; STATUS &amp;nbsp; ROLES&amp;nbsp; &amp;nbsp; AGE &amp;nbsp; VERSION &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; INTERNAL-IP &amp;nbsp; &amp;nbsp; &amp;nbsp; EXTERNAL-IP &amp;nbsp; OS-IMAGE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; KERNEL-VERSION&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CONTAINER-RUNTIME&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #c9daf8; color: #000000;&quot;&gt;ip-192-168-176-11.ap-northeast-2.compute.internal&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; Ready&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt; &amp;nbsp; 11m &amp;nbsp; v1.28.3-eks-e71965b &amp;nbsp; 192.168.176.11&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Amazon Linux 2 &amp;nbsp; 5.10.198-187.748.amzn2.x86_64 &amp;nbsp; containerd://1.6.19&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #f4cccc; color: #000000;&quot;&gt;ip-192-168-195-146.ap-northeast-2.compute.internal&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp; Ready&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt; &amp;nbsp; 11m &amp;nbsp; v1.28.3-eks-e71965b &amp;nbsp; 192.168.195.146 &amp;nbsp; &amp;lt;none&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Amazon Linux 2 &amp;nbsp; 5.10.198-187.748.amzn2.x86_64 &amp;nbsp; containerd://1.6.19&lt;/span&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;#8 service/hostname-loadbalancer의 external -IP 를 통해 브라우저에서 접속 가능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://a4631ffd13c82447a83077629518842a-701860891.ap-northeast-2.elb.amazonaws.com/&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;* EKS 를 통해 쿠버네티스를 실행할경우 장점&amp;nbsp;&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;파드의 개수도 쉽게 증가시킬수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1c4587;&quot;&gt;리소스 정리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;EKS 노드 그룹 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;EKS 클러스터 삭제 &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; 인스턴스, 시작템플릿, ASG 등을 확인&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CloudFormation 스택 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;VPC 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;계정, 역할 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>EKS</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/44</guid>
      <comments>https://kalswn.tistory.com/44#entry44comment</comments>
      <pubDate>Wed, 22 Nov 2023 08:55:10 +0900</pubDate>
    </item>
    <item>
      <title>Terraform - 선언 블록</title>
      <link>https://kalswn.tistory.com/43</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HCL(Hashicorp Comfiguration Language)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테라폼에서 사용하는 설정 언어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확장자 .tf&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- provider&lt;/b&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;테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) AWS, Google Cloud Platform, Microsoft Azure - 범용 클라우드 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; GitHub, DataDog, DNSimple - 특정 기능을 제공하는 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; MySQL, RabbitMQ, Docker - 로컬 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- resource&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;provider가 제공하는 실제 자원을 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- variable&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;변수를 정의 (외부에서 입력 받음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- local&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- output&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- data&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;provider가 제공해주는 리소스의 정보&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- terraform&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# provider&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;provider version&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 style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테라폼 v0.13&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이전&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테라폼 v0.13 이후&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;provider 블록에 프로바이더 버전을 명시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;terraform 블록안에 required_providers에 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;provider &quot;aws&quot; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;version = &quot;~&amp;gt; 4.2.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;region&amp;nbsp; = &quot;ap-northeast-2&quot;&lt;br /&gt;}&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;terraform {&lt;br /&gt;&amp;nbsp;&amp;nbsp;required_version = &quot;&amp;gt;= 1.0.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;required_providers {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aws = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;source&amp;nbsp; = &quot;hashicorp/aws&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version = &quot;~&amp;gt; 4.2.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# resource&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;리소스 선언&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;resource &quot;&amp;lt;프로바이더 이름&amp;gt;_&amp;lt;프로바이더가 제공하는 리소스 유형&amp;gt;&quot; &quot;&amp;lt;이름&amp;gt;&quot; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;인수&amp;gt; = &amp;lt;값&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700610138692&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;
}


resource &quot;local_file&quot; &quot;abc&quot; {
  content  = &quot;abc&quot;
  filename = &quot;${path.module}/abc.txt&quot;
}


resource &quot;local_file&quot; &quot;def&quot; {
  content  = &quot;def&quot;
  filename = &quot;${path.module}/def.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700610138692&quot; class=&quot;livecodeserver&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform init -reconfigure

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/local from the dependency lock file
- Using previously-installed hashicorp/local v2.4.0

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running &quot;terraform plan&quot; to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700610138693&quot; class=&quot;pf&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform init -migrate-state

Initializing the backend...
Terraform has detected you're unconfiguring your previously set &quot;local&quot; backend.
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous &quot;local&quot; backend to the
  newly configured &quot;local&quot; backend. No existing state was found in the newly
  configured &quot;local&quot; backend. Do you want to copy this state to the new &quot;local&quot;
  backend? Enter &quot;yes&quot; to copy and &quot;no&quot; to start with an empty state.

  Enter a value: yes
  ...&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700610138693&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
local_file.test: Refreshing state... [id=1eebdf4fdc9fc7bf283031b93f9aef3338de9052]

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

...

local_file.test: Destroying... [id=1eebdf4fdc9fc7bf283031b93f9aef3338de9052]
local_file.test: Destruction complete after 0s
local_file.abc: Creating...				&amp;lArr; 의존 관계가 없는 경우 테라폼은 병렬 실행 방식으로 동작
local_file.def: Creating...
local_file.def: Creation complete after 0s [id=589c22335a381f122d129225f5c0ba3056ed5811]
local_file.abc: Creation complete after 0s [id=a9993e364706816aba3e25717850c26c9cd0d89d]

Apply complete! Resources: 2 added, 0 changed, 1 destroyed.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#1 의존관계&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700610138693&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;
}


resource &quot;local_file&quot; &quot;abc&quot; {
  content  = &quot;abc&quot;
  filename = &quot;${path.module}/abc.txt&quot;
}


resource &quot;local_file&quot; &quot;def&quot; {
  content  = local_file.abc.content			# &amp;lt;&amp;lt;&amp;lt; local_file def가 abc에 의존하도록 수정
  filename = &quot;${path.module}/def.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700610138694&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform destroy
C:\aws&amp;gt; terraform apply
		:
local_file.abc: Creating...
local_file.abc: Creation complete after 0s [id=a9993e364706816aba3e25717850c26c9cd0d89d]
local_file.def: Creating...
local_file.def: Creation complete after 0s [id=a9993e364706816aba3e25717850c26c9cd0d89d]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- terraform graph&lt;/p&gt;
&lt;pre id=&quot;code_1700610138694&quot; class=&quot;stata&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform graph
digraph {
        compound = &quot;true&quot;
        newrank = &quot;true&quot;
        subgraph &quot;root&quot; {
                &quot;[root] local_file.abc (expand)&quot; [label = &quot;local_file.abc&quot;, shape = &quot;box&quot;]
                &quot;[root] local_file.def (expand)&quot; [label = &quot;local_file.def&quot;, shape = &quot;box&quot;]
                &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/local\&quot;]&quot; [label = &quot;provider[\&quot;registry.terraform.io/hashicorp/local\&quot;]&quot;, shape = &quot;diamond&quot;]
                &quot;[root] local_file.abc (expand)&quot; -&amp;gt; &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/local\&quot;]&quot;
                &quot;[root] local_file.def (expand)&quot; -&amp;gt; &quot;[root] local_file.abc (expand)&quot;
                &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/local\&quot;] (close)&quot; -&amp;gt; &quot;[root] local_file.def (expand)&quot;
                &quot;[root] root&quot; -&amp;gt; &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/local\&quot;] (close)&quot;
        }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://dreampuf.github.io/GraphvizOnline&quot;&gt;https://dreampuf.github.io/GraphvizOnline&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B0Ihy/btsAColHZJg/XqXpjYAUddwnkXf7MCEj5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B0Ihy/btsAColHZJg/XqXpjYAUddwnkXf7MCEj5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B0Ihy/btsAColHZJg/XqXpjYAUddwnkXf7MCEj5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB0Ihy%2FbtsAColHZJg%2FXqXpjYAUddwnkXf7MCEj5K%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;784&quot; height=&quot;389&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#2 확실하게 의존관계를 명시하고 싶을 경우&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700610138696&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;
}


resource &quot;local_file&quot; &quot;abc&quot; {
  content  = &quot;abc&quot;
  filename = &quot;${path.module}/abc.txt&quot;
}


resource &quot;local_file&quot; &quot;def&quot; {

&amp;lt;======================================================
  depends_on = [ local_file.abc ]         # 명시적으로 의존 관계(=종속성)를 정의
======================================================&amp;gt;

  content  = &quot;def&quot;
  filename = &quot;${path.module}/def.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700610138697&quot; class=&quot;avrasm&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform destroy
C:\aws&amp;gt; terraform apply
		:
local_file.abc: Creating...
local_file.abc: Creation complete after 0s [id=a9993e364706816aba3e25717850c26c9cd0d89d]
local_file.def: Creating...
local_file.def: Creation complete after 0s [id=589c22335a381f122d129225f5c0ba3056ed5811]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#3 리소스 구성에서 인수와 속성을 참조할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인수 : 리소스 생성 시 사용자가 선언하는 값&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;속성 : 사용자가 설정하는 것은 불가능하지만 리솟스 생성 이후 획득 가능한 리소스 고유값&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 리소스 참조&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;프로바이더 이름&amp;gt;_&amp;lt;프로바이더가 제공하는 리소스 유형&amp;gt;.&amp;lt;이름&amp;gt;.&amp;lt;인수&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;프로바이더 이름&amp;gt;_&amp;lt;프로바이더가 제공하는 리소스 유형&amp;gt;.&amp;lt;이름&amp;gt;.&amp;lt;속성&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;생명주기 메타인자(The lifecycle Meta-Argument)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 생명주기를 의도적으로 변경할 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;create_before_destroy (bool): 리소스 수정 시 신규 리소스를 우선 생성하고 기존 리소스를 삭제&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;prevent_destroy (bool): 해당 리소스를 삭제하려 할 때 명시적으로 거부&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ignore_changes (list): 리소스 요소에 선언된 인수의 변경 사항을 테라폼 실행 시 무시&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;precondition: 리스트 요소에 선언된 인수의 조건을 검증&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;postcondition: plan과 applay 이후의 결과를 속성 값으로 검증&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;# 입력 변수&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선언&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;variable &quot;&amp;lt;이름&amp;gt;&quot; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt;인수&amp;gt; = &amp;lt;값&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700610269297&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;variable &quot;string&quot; {
  type = string
  description = &quot;string 변수&quot;
  default = &quot;mystring&quot;
}

output &quot;string&quot; {
  value = var.string
}

variable &quot;number&quot; {
  type = number
  default = 1234  
}

output &quot;number&quot; {
  value = var.number
}

variable &quot;boolean&quot; {
  type = bool
  default = true
}

output &quot;boolean&quot; {
  value = var.boolean
}

variable &quot;list&quot; {
  type = list
  default = [&quot;aaa&quot;, &quot;bbb&quot;, &quot;ccc&quot;, &quot;ddd&quot;]
}

output &quot;list_index_0&quot; {
  value = var.list.0
}

output &quot;list_all&quot; {
  value = var.list
}

output &quot;list_all_upper&quot; {
  value = [
    for v in var.list:
      upper(v)
  ]
}

variable &quot;map&quot; {
  type = map
  default = {
    aws = &quot;amazon&quot;,
    azure = &quot;microsoft&quot;,
    gcp = &quot;google&quot;
  }  
}

output &quot;map_all&quot; {
  value = var.map
}

output &quot;map_all_upper&quot; {
  value = [
    for k in var.map:
      upper(k)
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#1 민감한 변수 취급&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700610269300&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;variable &quot;password&quot; {
  sensitive = true
}

resource &quot;local_file&quot; &quot;abc&quot; {
  content = var.password
  filename = &quot;${path.module}/abc.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700610269301&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
var.password
  Enter a value:				&amp;lArr; 입력하는 내용이 표시되지 않음

local_file.abc: Refreshing state... [id=57b2ad99044d337197c0c39fd3823568ff81e48a]

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # local_file.abc must be replaced
-/+ resource &quot;local_file&quot; &quot;abc&quot; {
      ~ content              = (sensitive value) # forces replacement &amp;lArr; 입력하는 내용이 표시되지 않음
      ~ content_base64sha256 = &quot;oHXRfz1FMHOFP4E4OMFbgCO4xIcDhDY1T+WZw5QuH5U=&quot; -&amp;gt; (known after apply)
      ~ content_base64sha512 = 
...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; 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;/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;&lt;span style=&quot;color: #000000;&quot;&gt;data &quot;&amp;lt;프로바이더&amp;gt;_&amp;lt;리소스 유형&amp;gt;&quot; &quot;&amp;lt;이름&amp;gt;&quot; {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;인수&amp;gt; = &amp;lt;값&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;데이터 소스 참조&lt;/p&gt;
&lt;pre id=&quot;code_1700610335135&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;
}


resource &quot;local_file&quot; &quot;abc&quot; {
  content  = &quot;abc&quot;
  filename = &quot;${path.module}/abc.txt&quot;
}


data &quot;local_file&quot; &quot;abc&quot; {
  filename = local_file.abc.filename
}


resource &quot;local_file&quot; &quot;def&quot; {
  content  = data.local_file.abc.content
  filename = &quot;${path.module}/def.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;# local&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1700610241203&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;variable &quot;prefix&quot; {
  default = &quot;hello&quot;
}

locals {
  name    = &quot;terraform&quot;
  content = &quot;${var.prefix} ${local.name}&quot;
}

resource &quot;local_file&quot; &quot;abc&quot; {
  content  = local.content
  filename = &quot;${path.module}/abc.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;# terraform&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;b&gt;-semantic versioning&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;version = major.minor.patch&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;--major 내부 동작의 API가 변경 또는 삭제되거나 하위 호환이 되지 않는 버전&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;--minor 신규 기능이 추가되거나 개선되고 하위 호환이 가능한 버전&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;--patch&amp;nbsp;버그&amp;nbsp;수정&amp;nbsp;또는&amp;nbsp;일부&amp;nbsp;기능이&amp;nbsp;개선된&amp;nbsp;하위&amp;nbsp;호환이&amp;nbsp;가능한&amp;nbsp;버전&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; 버전 제약 구문&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; --&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;= 또는 연산자 없음 : 지정된 버전만 허용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;-- != : 지정된 버전을 제외&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;-- &amp;gt;, &amp;gt;=, &amp;lt;, &amp;lt;= : 지정한 버전과 비교해서 조건에 맞는 경우 허용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;-- ~&amp;gt; : 지정한 버전에서 가장 자리수가 낮은 구성요소만 증가하는 것을 허용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;--- ~&amp;gt; x.y &amp;rarr; x.y ~ x.y+n&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;--- ~&amp;gt; x.y.z &amp;rarr; x.y.z ~ x.y.z+n&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;size18&quot;&gt;&lt;b&gt;#1 테라폼 버전 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700536616799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform version
Terraform v1.6.4
on windows_386
+ provider registry.terraform.io/hashicorp/aws v5.26.0&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;size18&quot;&gt;&lt;b&gt;#2 main.tf 파일에 terraform 블록 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700536649054&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;lt; 1.0.0&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;#3 terraform init&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700536689150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform init

Initializing the backend...
╷
│ Error: Unsupported Terraform Core version
│
│   on main.tf line 2, in terraform:
│    2:   required_version = &quot;&amp;lt; 1.0.0&quot;
│
│ This configuration does not support Terraform version 1.6.4. To proceed, either choose another supported
│ Terraform version or update this version constraint. Version constraints are normally set for good reason,
│ so updating the constraint may lead to other errors or unexpected behavior.&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;size18&quot;&gt;&lt;b&gt;#4 실행 환경에 맞게 버전 조건을 수정한 후 terraform init 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700537063735&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700537075854&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform init

Initializing the backend...
Initializing provider plugins...

...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;# 백엔드 블록&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테라폼 실행 시 저장된 상태 파일(State)의 저장 위치를 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-- 상태파일 : 코드로 관리되는 리소스 정보 -&amp;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;민감한 데이터가 포함될 수 있으므로 접근 제어가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로 활성화되는 백엔드는 local &amp;rArr; 작업자의 로컬 환경에 저장하고 관리&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테라폼이 실행되는 동안 .terraform.tfstate.lock.info 파일이 생성되면서 해당 상태를 동시에 사용하지 못하도록 잠금 처리&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700543967068&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### .terraform.tfstate.lock.info ###
{
&quot;ID&quot;:&quot;d30715d2-3b6f-0247-8075-f11fb6e09ac9&quot;,
&quot;Operation&quot;:&quot;OperationTypeApply&quot;,
&quot;Info&quot;:&quot;&quot;,
&quot;Who&quot;:&quot;DESKTOP-O0MUMK8\\myanj@DESKTOP-O0MUMK8&quot;,
&quot;Version&quot;:&quot;1.6.4&quot;,
&quot;Created&quot;:&quot;2023-11-21T05:18:38.478762Z&quot;,
&quot;Path&quot;:&quot;terraform.tfstate&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#1 main.tf 수정 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700544486116&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;
}


# https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file
resource &quot;local_file&quot; &quot;test&quot; {
  content  = &quot;test content&quot;
  filename = &quot;${path.module}/test.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;#2&amp;nbsp; C:\aws&amp;gt; terraform init &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bg3d2/btsAJysY4nI/OoWbfkk3XmNt5FMQHMtry0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bg3d2/btsAJysY4nI/OoWbfkk3XmNt5FMQHMtry0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bg3d2/btsAJysY4nI/OoWbfkk3XmNt5FMQHMtry0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBg3d2%2FbtsAJysY4nI%2FOoWbfkk3XmNt5FMQHMtry0%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;564&quot; height=&quot;427&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;867&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8iwgi/btsAHZ5KHmq/YiaWI1lgWkkT4mh2Okvkb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8iwgi/btsAHZ5KHmq/YiaWI1lgWkkT4mh2Okvkb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8iwgi/btsAHZ5KHmq/YiaWI1lgWkkT4mh2Okvkb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8iwgi%2FbtsAHZ5KHmq%2FYiaWI1lgWkkT4mh2Okvkb0%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;784&quot; height=&quot;425&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;867&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;span style=&quot;color: #000000;&quot;&gt;-lock=false 옵션을 추가하면 잠금을 무시할 수 있음&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#3 &lt;b&gt;백엔드 설정 변경&lt;/b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700544924400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;

&amp;lt;=========================================
  backend &quot;local&quot; {					
    path = &quot;state/myterraform.tfstate&quot;    		
  }
=========================================&amp;gt;  
}


# https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file
resource &quot;local_file&quot; &quot;test&quot; {
  content  = &quot;test content&quot;
  filename = &quot;${path.module}/test.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700544943195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPE0g7/btsAGVbiYMB/CWwks9O8wOzEbgyCzbcDK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPE0g7/btsAGVbiYMB/CWwks9O8wOzEbgyCzbcDK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPE0g7/btsAGVbiYMB/CWwks9O8wOzEbgyCzbcDK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPE0g7%2FbtsAGVbiYMB%2FCWwks9O8wOzEbgyCzbcDK0%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;529&quot; height=&quot;423&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; state 폴더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;myterraform.tfstate 파일이 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;#4 새로운 백엔드로의 전환을 위한 조건(옵션)&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700545125091&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.0.0&quot;


  backend &quot;local&quot; {
    path = &quot;state/myterraform.tfstate.v2&quot;    
  }
}


# https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file
resource &quot;local_file&quot; &quot;test&quot; {
  content  = &quot;test content&quot;
  filename = &quot;${path.module}/test.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700545136339&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform init -migrate-state

Initializing the backend...
Backend configuration changed!

Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.

Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous &quot;local&quot; backend to the
  newly configured &quot;local&quot; backend. No existing state was found in the newly
  configured &quot;local&quot; backend. Do you want to copy this state to the new &quot;local&quot;
  backend? Enter &quot;yes&quot; to copy and &quot;no&quot; to start with an empty state.

  Enter a value: yes

...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;867&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QcKy6/btsAGSeB7zO/yIFGpXyp6ExqXAkPFaegCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QcKy6/btsAGSeB7zO/yIFGpXyp6ExqXAkPFaegCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QcKy6/btsAGSeB7zO/yIFGpXyp6ExqXAkPFaegCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQcKy6%2FbtsAGSeB7zO%2FyIFGpXyp6ExqXAkPFaegCK%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;719&quot; height=&quot;390&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;867&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; state 폴더&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;myterraform.tfstate.&lt;b&gt;v2&lt;/b&gt; 파일이 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700545259136&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform init -reconfigure

Initializing the backend...

Successfully configured the backend &quot;local&quot;! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
- Reusing previous version of hashicorp/local from the dependency lock file
- Using previously-installed hashicorp/local v2.4.0

...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rArr; myterraform.tfstate.v3 파일이 생성되지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rArr; terraform apply 명령을 실행하면 myterraform.tfstate.v3 파일이 생성됨&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;#반복문&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- count&lt;/p&gt;
&lt;pre id=&quot;code_1700554239017&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;local_file&quot; &quot;abc&quot; {
  count    = 5
  content  = &quot;abc&quot;
  filename = &quot;${path.module}/abc${count.index}.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700554248032&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;variable &quot;names&quot; {
  type    = list(string)
  default = [&quot;aaa&quot;, &quot;bbb&quot;, &quot;ccc&quot;]
}


resource &quot;local_file&quot; &quot;abc&quot; {
  count    = length(var.names)
  content  = var.names[count.index]
  filename = &quot;${path.module}/file-${var.names[count.index]}-${count.index}.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- for_each&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700554266776&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;variable &quot;venders&quot; {
  type    = map
  default = {
    aws = &quot;amazon&quot;,
    azure = &quot;microsoft&quot;,
    gcp = &quot;google&quot;
  }
}


resource &quot;local_file&quot; &quot;abc&quot; {
  for_each = var.venders
  content  = each.value
  filename = &quot;${path.module}/file-${each.key}.txt&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-for&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;복합 형식 값의 형태를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-- list : 값 또는 인덱스와 값을 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-- map : key 또는 key와 value를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-- set : key 값에 대해 반환&lt;/p&gt;
&lt;pre id=&quot;code_1700610022913&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;variable &quot;venders&quot; {
  type    = map
  default = {
    aws = &quot;amazon&quot;,
    azure = &quot;microsoft&quot;,
    gcp = &quot;google&quot;
  }
}

locals {
  products = [ for k, v in var.venders: &quot;${upper(k)}&quot; ]
  venders = [ for k, v in var.venders: &quot;${upper(v)}&quot; ]
  products-venders = [ for k, v in var.venders: &quot;${upper(k)} - ${upper(v)}&quot; ]
}

output &quot;products&quot; {
  value = local.products
}

output &quot;venders&quot; {
  value = local.venders
}

output &quot;products-venders&quot; {
  value = local.products-venders  
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>terraform</category>
      <category>선언블록</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/43</guid>
      <comments>https://kalswn.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 22 Nov 2023 08:47:09 +0900</pubDate>
    </item>
    <item>
      <title>AWS - Terraform (ASG , LB)</title>
      <link>https://kalswn.tistory.com/42</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;b&gt;웹 서버 클러스터 배포&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# ASG 구성 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;=&amp;gt; EC2 인스턴스 클러스터 시작, 각 인스턴스 상태 모니터링, 실패한 인스턴스 교체, 부하에 따른 클러스터 크기 조정 등 많은 작업을 자동으로 처리&lt;/b&gt;&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;#1 시작 구성(Launch Configuration) 정의&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ~~~~~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ASG에서 EC2 인스턴스를 구성하는 방법을 지정&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;aws_launch_configuration 리소스를 사용 =&amp;gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_configuration &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;- &lt;span style=&quot;color: #000000;&quot;&gt;aws_instance 리소스와 거의 동일한 파라미터를 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000;&quot;&gt;tags와 user_data_replace_on_change 파라미터를 지원하지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;~~~~ &amp;nbsp; ~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; +-- ASG는 기본적으로 새 인스턴스를 시작하므로 필요하지 않음&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; +--- aws_autoscaling_group 리소스에서 처리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #000000;&quot;&gt;파라미터 중 다음 두 개는 다른 이름을 가짐&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;--&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ami &amp;rarr; image_id&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;-- &lt;span style=&quot;color: #000000;&quot;&gt;vpc_security_group_ids &amp;rarr; security_groups&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700526354407&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}
&amp;lt;==================================================
# resource &quot;aws_instance&quot; &quot;example&quot; {
#   ami                    = &quot;ami-086cae3329a3f7d75&quot;
#   instance_type          = &quot;t2.micro&quot;
#   vpc_security_group_ids = [aws_security_group.webserversg.id]
#   user_data              = &amp;lt;&amp;lt;-EOF
#     #!/bin/bash
#     echo &quot;Hello, World&quot; &amp;gt; index.html
#     nohup busybox httpd -f -p ${var.service_port} &amp;amp;
#   EOF

#   user_data_replace_on_change = true

#   tags = {
#     Name = &quot;terraform-example&quot;
#   }
# }

resource &quot;aws_launch_configuration&quot; &quot;webserverlg&quot; {
  image_id        = &quot;ami-086cae3329a3f7d75&quot;
  instance_type   = &quot;t2.micro&quot;
  security_groups = [aws_security_group.webserversg.id]
  user_data       = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p ${var.service_port} &amp;amp;
  EOF
}
==================================================&amp;gt;

resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = var.service_port
    to_port     = var.service_port
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
  default     = 8080
}

output &quot;public_ip&quot; {
  value       = aws_instance.example.public_ip
  description = &quot;Public IP for WebServer&quot;
}

output &quot;service_url&quot; {
  value       = &quot;http://${aws_instance.example.public_ip}:${var.service_port}&quot;
  description = &quot;WebServer Service URL&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; &lt;b&gt;#2 ASG 정의&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;aws_autoscaling_group 리소스로 정의 &amp;rArr; https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_group&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700526914763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

# resource &quot;aws_instance&quot; &quot;example&quot; {
#   ami                    = &quot;ami-086cae3329a3f7d75&quot;
#   instance_type          = &quot;t2.micro&quot;
#   vpc_security_group_ids = [aws_security_group.webserversg.id]
#   user_data              = &amp;lt;&amp;lt;-EOF
#     #!/bin/bash
#     echo &quot;Hello, World&quot; &amp;gt; index.html
#     nohup busybox httpd -f -p ${var.service_port} &amp;amp;
#   EOF

#   user_data_replace_on_change = true

#   tags = {
#     Name = &quot;terraform-example&quot;
#   }
# }

resource &quot;aws_launch_configuration&quot; &quot;webserverlg&quot; {
  image_id        = &quot;ami-086cae3329a3f7d75&quot;
  instance_type   = &quot;t2.micro&quot;
  security_groups = [aws_security_group.webserversg.id]
  user_data       = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p ${var.service_port} &amp;amp;
  EOF
}

&amp;lt;=========================================================
resource &quot;aws_autoscaling_group&quot; &quot;webserverasg&quot; {
  launch_configuration = aws_launch_configuration.webserverlg.name
  min_size             = 2
  max_size             = 5
  tag {
    key                 = &quot;Name&quot;
    value               = &quot;terraform-asg&quot;
    propagate_at_launch = true
  }
}
=========================================================&amp;gt;

resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = var.service_port
    to_port     = var.service_port
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
  default     = 8080
}

output &quot;public_ip&quot; {
  value       = aws_instance.example.public_ip
  description = &quot;Public IP for WebServer&quot;
}

output &quot;service_url&quot; {
  value       = &quot;http://${aws_instance.example.public_ip}:${var.service_port}&quot;
  description = &quot;WebServer Service URL&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;#3 수명 주기 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;create_before_destroy&lt;/b&gt;를 true로 설정하면 테라폼은 리소스를 교체하는 순서를 반전하여 먼저 대체 리소스를 생성한 다음&amp;nbsp; (이전 리소스를 가리키는 모든 참조를 새로운 리소스를 가리키도록 업데이트한 후) 이전 리소스를 삭제함&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700527062603&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

# resource &quot;aws_instance&quot; &quot;example&quot; {
#   ami                    = &quot;ami-086cae3329a3f7d75&quot;
#   instance_type          = &quot;t2.micro&quot;
#   vpc_security_group_ids = [aws_security_group.webserversg.id]
#   user_data              = &amp;lt;&amp;lt;-EOF
#     #!/bin/bash
#     echo &quot;Hello, World&quot; &amp;gt; index.html
#     nohup busybox httpd -f -p ${var.service_port} &amp;amp;
#   EOF

#   user_data_replace_on_change = true

#   tags = {
#     Name = &quot;terraform-example&quot;
#   }
# }

resource &quot;aws_launch_configuration&quot; &quot;webserverlg&quot; {
  image_id        = &quot;ami-086cae3329a3f7d75&quot;
  instance_type   = &quot;t2.micro&quot;
  security_groups = [aws_security_group.webserversg.id]
  user_data       = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p ${var.service_port} &amp;amp;
  EOF
&amp;lt;========================================================================
  # 시작 구성을 재생성해야 하는 경우, 새로운 시작 구성을 먼저 생성한 후 
  예전 시작 구성을 삭제하도록 설정
  lifecycle {
    create_before_destroy = true
  }
========================================================================&amp;gt;
}

resource &quot;aws_autoscaling_group&quot; &quot;webserverasg&quot; {
  launch_configuration = aws_launch_configuration.webserverlg.name
  min_size             = 2
  max_size             = 5
  tag {
    key                 = &quot;Name&quot;
    value               = &quot;terraform-asg&quot;
    propagate_at_launch = true
  }
}

resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = var.service_port
    to_port     = var.service_port
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
  default     = 8080
}

output &quot;public_ip&quot; {
  value       = aws_instance.example.public_ip
  description = &quot;Public IP for WebServer&quot;
}

output &quot;service_url&quot; {
  value       = &quot;http://${aws_instance.example.public_ip}:${var.service_port}&quot;
  description = &quot;WebServer Service URL&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt;#4 &lt;b&gt;데이터 소스를 이용해서 서브넷 정보를 조회&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 소스&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 테라폼을 실행할 때 마다 공급자에서 가져오는 읽기 전용 정보&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 공급자의 API를 호출해서 해당 데이터를 나머지 테라폼 코드에서 사용할 수 있도록 하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- &lt;span style=&quot;color: #000000;&quot;&gt;예) AWS 공급자의 경우, VPC 데이터, Subnet 데이터, AMI ID, IP 주소 범위, 현재 사용자의 ID 등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- data &quot;&amp;lt;PROVIDER&amp;gt;_&amp;lt;TYPE&amp;gt;&quot; &quot;&amp;lt;NAME&amp;gt;&quot; {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;[CONFIG ...]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; -- PROVIDER&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공급자 이름 (예: aws)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; -- TYPE&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 소스 유형 (예: vpc)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; -- NAME&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 소스를 참조할 때 사용할 식별자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; -- CONFIG&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 소스와 관련된 parametar&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 조회방법&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;data.&amp;lt;PROVIDER&amp;gt;_&amp;lt;TYPE&amp;gt;.&amp;lt;NAME&amp;gt;.&amp;lt;ATTRIBUTE&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700527974967&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

# resource &quot;aws_instance&quot; &quot;example&quot; {
#   ami                    = &quot;ami-086cae3329a3f7d75&quot;
#   instance_type          = &quot;t2.micro&quot;
#   vpc_security_group_ids = [aws_security_group.webserversg.id]
#   user_data              = &amp;lt;&amp;lt;-EOF
#     #!/bin/bash
#     echo &quot;Hello, World&quot; &amp;gt; index.html
#     nohup busybox httpd -f -p ${var.service_port} &amp;amp;
#   EOF

#   user_data_replace_on_change = true

#   tags = {
#     Name = &quot;terraform-example&quot;
#   }
# }

resource &quot;aws_launch_configuration&quot; &quot;webserverlg&quot; {
  image_id        = &quot;ami-086cae3329a3f7d75&quot;
  instance_type   = &quot;t2.micro&quot;
  security_groups = [aws_security_group.webserversg.id]
  user_data       = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p ${var.service_port} &amp;amp;
  EOF
  lifecycle {
    create_before_destroy = true
  }
}

&amp;lt;========================================================
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc
data &quot;aws_vpc&quot; &quot;default&quot; {
  default = true
}

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/subnets
data &quot;aws_subnets&quot; &quot;default&quot; {
  filter {
    name   = &quot;vpc-id&quot;
    values = [data.aws_vpc.default.id]
  }
}
========================================================&amp;gt;

resource &quot;aws_autoscaling_group&quot; &quot;webserverasg&quot; {
  launch_configuration = aws_launch_configuration.webserverlg.name
&amp;lt;========================================================
  vpc_zone_identifier  = data.aws_subnets.default.ids
========================================================&amp;gt;
  min_size             = 2
  max_size             = 5
  tag {
    key                 = &quot;Name&quot;
    value               = &quot;terraform-asg&quot;
    propagate_at_launch = true
  }
}

resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = var.service_port
    to_port     = var.service_port
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
  default     = 8080
}

&amp;lt;========================================================
# aws_instance 리소스를 삭제했으므로 관련한 출력을 주석 처리
# output &quot;public_ip&quot; {
#   value       = aws_instance.example.public_ip
#   description = &quot;Public IP for WebServer&quot;
# }

# output &quot;service_url&quot; {
#   value       = &quot;http://${aws_instance.example.public_ip}:${var.service_port}&quot;
#   description = &quot;WebServer Service URL&quot;
# }
========================================================&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 139px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 52px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 52px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &quot;&lt;span style=&quot;background-color: #f4cccc;&quot;&gt;aws_vpc&lt;/span&gt;&quot; &quot;default&quot; {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;default = true&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 52px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; default vpc를 가져옴 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 70px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 70px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; filter {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name &amp;nbsp; = &quot;vpc-id&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values = [data.&lt;span style=&quot;background-color: #f4cccc;&quot;&gt;aws_vpc&lt;/span&gt;.default.id]&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 70px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; default vpc 이름을 지닌 vpc의 서브넷을 추출 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; vpc_zone_identifier&amp;nbsp; = data.&lt;span style=&quot;background-color: #d9ead3;&quot;&gt;aws_subnets&lt;/span&gt;.default.ids &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; default 값의 vpc의 서브넷 아이디를 추출 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;***error&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;디폴트 서브넷 중 일부는 t2.micro 인스턴스 타입을 지원하지 않는 가용영역에 생성되어 있으므로 인스턴스 생성 시 아래와 같은 오류가 발생할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700529560466&quot; class=&quot;ruby&quot; data-ke-language=&quot;ruby&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws_autoscaling_group.webserverasg: Creating...
╷
│ Error: waiting for Auto Scaling Group (terraform-20231121005600354100000002) capacity satisfied: scaling activity (60b62fbd-8263-1441-9a0f-8165a3723c81): Failed: Authentication Failure. Launching EC2 instance failed.
│ scaling activity (66b62fbd-8260-c3f6-484d-9ea65ebf73b0): Failed: Authentication Failure. Launching EC2 instance failed.
│
│   with aws_autoscaling_group.webserverasg,
│   on main.tf line 50, in resource &quot;aws_autoscaling_group&quot; &quot;webserverasg&quot;:
│   50: resource &quot;aws_autoscaling_group&quot; &quot;webserverasg&quot; {&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해결방안 : 가용 영역 지우기 or filter 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- t2.micro 인스턴스 타입을 지원하지 않는 가용영역에 생성된 서브넷을 삭제하고 테스트를 진행&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZ7wq/btsAAPXzaxo/EeErp8PhmXb2ZSYEAb11M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZ7wq/btsAAPXzaxo/EeErp8PhmXb2ZSYEAb11M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZ7wq/btsAAPXzaxo/EeErp8PhmXb2ZSYEAb11M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZ7wq%2FbtsAAPXzaxo%2FEeErp8PhmXb2ZSYEAb11M0%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;784&quot; height=&quot;224&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cscPna/btsAGUQw53S/p2Nk8KFNVkpg5Kv8HBBcl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cscPna/btsAGUQw53S/p2Nk8KFNVkpg5Kv8HBBcl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cscPna/btsAGUQw53S/p2Nk8KFNVkpg5Kv8HBBcl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcscPna%2FbtsAGUQw53S%2Fp2Nk8KFNVkpg5Kv8HBBcl0%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;784&quot; height=&quot;201&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700530059659&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
data.aws_vpc.default: Reading...
data.aws_vpc.default: Read complete after 1s [id=vpc-06c8a58be6f0a60f4]
data.aws_subnets.default: Reading...
data.aws_subnets.default: Read complete after 0s [id=ap-northeast-2]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  + create

...

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_security_group.webserversg: Creating...
aws_security_group.webserversg: Creation complete after 1s [id=sg-0a292fea0dd4310dc]
aws_launch_configuration.webserverlg: Creating...
aws_launch_configuration.webserverlg: Creation complete after 1s [id=terraform-20231121012509275900000001]
aws_autoscaling_group.webserverasg: Creating...
aws_autoscaling_group.webserverasg: Still creating... [10s elapsed]
aws_autoscaling_group.webserverasg: Still creating... [20s elapsed]
aws_autoscaling_group.webserverasg: Still creating... [30s elapsed]
aws_autoscaling_group.webserverasg: Still creating... [40s elapsed]
aws_autoscaling_group.webserverasg: Creation complete after 44s [id=terraform-20231121012509767100000002]

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BovoO/btsAD2PmBss/VaZzgpoFYlK1R2BtIRZ7ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BovoO/btsAD2PmBss/VaZzgpoFYlK1R2BtIRZ7ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BovoO/btsAD2PmBss/VaZzgpoFYlK1R2BtIRZ7ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBovoO%2FbtsAD2PmBss%2FVaZzgpoFYlK1R2BtIRZ7ik%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;784&quot; height=&quot;621&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdRJLR/btsAAOLbM0D/KRaH8ZkDYMXdHZflbNpiY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdRJLR/btsAAOLbM0D/KRaH8ZkDYMXdHZflbNpiY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdRJLR/btsAAOLbM0D/KRaH8ZkDYMXdHZflbNpiY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdRJLR%2FbtsAAOLbM0D%2FKRaH8ZkDYMXdHZflbNpiY0%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;784&quot; height=&quot;131&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbv7Xv/btsAzCKUo0l/21S7kHvHPikfDuWAiUUye0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbv7Xv/btsAzCKUo0l/21S7kHvHPikfDuWAiUUye0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbv7Xv/btsAzCKUo0l/21S7kHvHPikfDuWAiUUye0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbv7Xv%2FbtsAzCKUo0l%2F21S7kHvHPikfDuWAiUUye0%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;784&quot; height=&quot;119&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt; propagate_at_launch : 인스턴스 이름 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddz9Ct/btsAFwbyDK9/kY8HzymLIc16IMtvxxsxF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddz9Ct/btsAFwbyDK9/kY8HzymLIc16IMtvxxsxF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddz9Ct/btsAFwbyDK9/kY8HzymLIc16IMtvxxsxF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fddz9Ct%2FbtsAFwbyDK9%2FkY8HzymLIc16IMtvxxsxF0%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;784&quot; height=&quot;79&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3Lrx/btsAClhBoK5/ZsjoxwF96oK3zTT1yM7bH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3Lrx/btsAClhBoK5/ZsjoxwF96oK3zTT1yM7bH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3Lrx/btsAClhBoK5/ZsjoxwF96oK3zTT1yM7bH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3Lrx%2FbtsAClhBoK5%2FZsjoxwF96oK3zTT1yM7bH1%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;784&quot; height=&quot;79&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;91&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;h4 style=&quot;color: #000000; text-align: start;&quot; 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;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#1 ALB(Aws Load Balancer) 생성 = aws_lb&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700530821996&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_lb&quot; &quot;webserverlb&quot; {
  name               = &quot;terraform-lb&quot;
  load_balancer_type = &quot;application&quot;
  subnets            = data.aws_subnets.default.ids
}&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;b&gt;#2 로드밸런스에 대한 리스너를 정의 = aws_lb_listener&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_listener&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700531207547&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_lb_listener&quot; &quot;http&quot; {
  load_balancer_arn = aws_lb.webserverlb.arn
  port              = 80
  protocol          = &quot;HTTP&quot;
  # 리스너 규칙과 일치하지 않는 요청에 대해 기본 응답으로 404 페이지를 반환
  default_action {
    type = &quot;fixed-response&quot;          
    fixed_response {
      status_code  = 404
      content_type = &quot;text/plain&quot;
      message_body = &quot;404 Not Found&quot;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#3 보안 그룹 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;들어오는 포드 80 허용 나가는 모든 포트 허용&lt;/p&gt;
&lt;pre id=&quot;code_1700531397916&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_security_group&quot; &quot;lbsg&quot; {
  name = &quot;terraform-lbsg&quot;
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = &quot;-1&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;#4 로드밸런스에 보안그룹을 적용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700531429348&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_lb&quot; &quot;webserverlb&quot; {
  name               = &quot;terraform-lb&quot;
  load_balancer_type = &quot;application&quot;
  subnets            = data.aws_subnets.default.ids
  security_groups    = [aws_security_group.lbsg.id]			# 추가
}&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;size18&quot;&gt;&lt;b&gt;#5 로드밸런스의 대상그룹을 정의 = aws_lb_target-group&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_target_group&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700531832860&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_lb_target_group&quot; &quot;webservertg&quot; {
  name     = &quot;terraform-tg&quot;
  port     = var.service_port
  protocol = &quot;HTTP&quot;
  vpc_id   = data.aws_vpc.default.id
  health_check {
    path                = &quot;/&quot;
    protocol            = &quot;HTTP&quot;
    matcher             = &quot;200&quot;
    interval            = 15
    timeout             = 3
    healthy_threshold   = 2
    unhealthy_threshold = 2
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#6 ASG에 대상 그룹 지정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스가 추가될 경우(새로 생성되는 경우) ALB 의 대상그룹에 포함되어야함&lt;/p&gt;
&lt;pre id=&quot;code_1700532055275&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_autoscaling_group&quot; &quot;webserverasg&quot; {
  launch_configuration = aws_launch_configuration.webserverlg.name
  vpc_zone_identifier  = data.aws_subnets.default.ids

&amp;lt;=================================================================
  target_group_arns = [aws_lb_target_group.webservertg.arn]	# 추가
  health_check_type = &quot;ELB&quot;						# 추가
=================================================================&amp;gt;

  min_size = 2
  max_size = 5
  tag {
    key                 = &quot;Name&quot;
    value               = &quot;terraform-asg&quot;
    propagate_at_launch = true
  }
}&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;b&gt;#7 리스너 규칙을 추가&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 로드밸런서로 들어와 ASG에 전달해야하므로&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;http 80으로 들어오면 모든 경로를 target그룹으로 포워드(전송)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700532562788&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_lb_listener_rule&quot; &quot;asg&quot; {
  listener_arn = aws_lb_listener.http.arn
  priority = 100
  condition {
    path_pattern {
      values = [&quot;*&quot;]
    }
  }
  action {
    type = &quot;forward&quot;
    target_group_arn = aws_lb_target_group.webservertg.arn
  }  
}&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;b&gt;#8 로드밸런스의 주소(DNS 이름)를 출력&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700532652340&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output &quot;alb_dns_name&quot; {
  value       = aws_lb.webserverlb.dns_name
  description = &quot;Domain name of the ELB&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700532890732&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

# resource &quot;aws_instance&quot; &quot;example&quot; {
#   ami                    = &quot;ami-086cae3329a3f7d75&quot;
#   instance_type          = &quot;t2.micro&quot;
#   vpc_security_group_ids = [aws_security_group.webserversg.id]
#   user_data              = &amp;lt;&amp;lt;-EOF
#     #!/bin/bash
#     echo &quot;Hello, World&quot; &amp;gt; index.html
#     nohup busybox httpd -f -p ${var.service_port} &amp;amp;
#   EOF

#   user_data_replace_on_change = true

#   tags = {
#     Name = &quot;terraform-example&quot;
#   }
# }

resource &quot;aws_launch_configuration&quot; &quot;webserverlg&quot; {
  image_id        = &quot;ami-086cae3329a3f7d75&quot;
  instance_type   = &quot;t2.micro&quot;
  security_groups = [aws_security_group.webserversg.id]
  user_data       = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p ${var.service_port} &amp;amp;
  EOF
  lifecycle {
    create_before_destroy = true
  }
}


data &quot;aws_vpc&quot; &quot;default&quot; {
  default = true
}

data &quot;aws_subnets&quot; &quot;default&quot; {
  filter {
    name   = &quot;vpc-id&quot;
    values = [data.aws_vpc.default.id]
  }
}

#1 ALB(Aws Load Balancer) 생성 = aws_lb
resource &quot;aws_lb&quot; &quot;webserverlb&quot; {
  name               = &quot;terraform-lb&quot;
  load_balancer_type = &quot;application&quot;
  subnets            = data.aws_subnets.default.ids
  security_groups    = [aws_security_group.lbsg.id]			#4 로드밸런스에 보안그룹을 적용
}
#5 로드밸런스의 대상그룹을 정의
resource &quot;aws_lb_target_group&quot; &quot;webservertg&quot; {
  name     = &quot;terraform-tg&quot;
  port     = var.service_port
  protocol = &quot;HTTP&quot;
  vpc_id   = data.aws_vpc.default.id
  health_check {
    path                = &quot;/&quot;
    protocol            = &quot;HTTP&quot;
    matcher             = &quot;200&quot;
    interval            = 15
    timeout             = 3
    healthy_threshold   = 2
    unhealthy_threshold = 2
  }
}
#2 로드밸런스에 대한 리스너를 정의 
resource &quot;aws_lb_listener&quot; &quot;http&quot; {
  load_balancer_arn = aws_lb.webserverlb.arn
  port              = 80
  protocol          = &quot;HTTP&quot;
  # 리스너 규칙과 일치하지 않는 요청에 대해 기본 응답으로 404 페이지를 반환
  default_action {
    type = &quot;fixed-response&quot;          
    fixed_response {
      status_code  = 404
      content_type = &quot;text/plain&quot;
      message_body = &quot;404 Not Found&quot;
    }
  }
}
#3 보안 그룹 추가
resource &quot;aws_security_group&quot; &quot;lbsg&quot; {
  name = &quot;terraform-lbsg&quot;
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = &quot;-1&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

resource &quot;aws_autoscaling_group&quot; &quot;webserverasg&quot; {
  launch_configuration = aws_launch_configuration.webserverlg.name
  vpc_zone_identifier  = data.aws_subnets.default.ids

  #6 ASG에 대상 그룹 추가
  target_group_arns = [aws_lb_target_group.webservertg.arn]	# 추가
  health_check_type = &quot;ELB&quot;						# 추가

  min_size             = 2
  max_size             = 5
  tag {
    key                 = &quot;Name&quot;
    value               = &quot;terraform-asg&quot;
    propagate_at_launch = true
  }
}
#7 리스너 규칙을 추가
resource &quot;aws_lb_listener_rule&quot; &quot;asg&quot; {
  listener_arn = aws_lb_listener.http.arn
  priority = 100
  condition {
    path_pattern {
      values = [&quot;*&quot;]
    }
  }
  action {
    type = &quot;forward&quot;
    target_group_arn = aws_lb_target_group.webservertg.arn
  }  
}


resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = var.service_port
    to_port     = var.service_port
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
  default     = 8080
}

# aws_instance 리소스를 삭제했으므로 관련한 출력을 주석 처리
# output &quot;public_ip&quot; {
#   value       = aws_instance.example.public_ip
#   description = &quot;Public IP for WebServer&quot;
# }

# output &quot;service_url&quot; {
#   value       = &quot;http://${aws_instance.example.public_ip}:${var.service_port}&quot;
#   description = &quot;WebServer Service URL&quot;
# }

#8 로드밸런스의 주소(DNS 이름)를 출력
output &quot;alb_dns_name&quot; {
  value       = aws_lb.webserverlb.dns_name
  description = &quot;Domain name of the ELB&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700533002692&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
data.aws_vpc.default: Reading...
aws_security_group.webserversg: Refreshing state... [id=sg-0a292fea0dd4310dc]
aws_launch_configuration.webserverlg: Refreshing state... [id=terraform-20231121012509275900000001]
data.aws_vpc.default: Read complete after 0s [id=vpc-06c8a58be6f0a60f4]
data.aws_subnets.default: Reading...
data.aws_subnets.default: Read complete after 0s [id=ap-northeast-2]
aws_autoscaling_group.webserverasg: Refreshing state... [id=terraform-20231121012509767100000002]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  + create
  ~ update in-place

...

aws_lb.webserverlb: Creation complete after 2m51s [id=arn:aws:elasticloadbalancing:ap-northeast-2:561845507088:loadbalancer/app/terraform-lb/793b1b20c2d72a4a]
aws_lb_listener.http: Creating...
aws_lb_listener.http: Creation complete after 1s [id=arn:aws:elasticloadbalancing:ap-northeast-2:561845507088:listener/app/terraform-lb/793b1b20c2d72a4a/77f59508b44f6040]
aws_lb_listener_rule.asg: Creating...
aws_lb_listener_rule.asg: Creation complete after 0s [id=arn:aws:elasticloadbalancing:ap-northeast-2:561845507088:listener-rule/app/terraform-lb/793b1b20c2d72a4a/77f59508b44f6040/ff57d8ec2a971a3d]

Apply complete! Resources: 5 added, 1 changed, 0 destroyed.

Outputs:

alb_dns_name = &quot;terraform-lb-977828332.ap-northeast-2.elb.amazonaws.com&quot;&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;804&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZqPNB/btsAEnsLLDF/YnbnhOPpeGC63yesiPOJKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZqPNB/btsAEnsLLDF/YnbnhOPpeGC63yesiPOJKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZqPNB/btsAEnsLLDF/YnbnhOPpeGC63yesiPOJKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZqPNB%2FbtsAEnsLLDF%2FYnbnhOPpeGC63yesiPOJKk%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;784&quot; height=&quot;83&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&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;1107&quot; data-origin-height=&quot;849&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mMyVi/btsAyqjrU0Y/3MdYKx56iadvRhjkkpHrq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mMyVi/btsAyqjrU0Y/3MdYKx56iadvRhjkkpHrq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mMyVi/btsAyqjrU0Y/3MdYKx56iadvRhjkkpHrq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmMyVi%2FbtsAyqjrU0Y%2F3MdYKx56iadvRhjkkpHrq0%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;784&quot; height=&quot;601&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;849&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSbndN/btsABBR3leW/fFyyCOS6uWuBXnyeV83wa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSbndN/btsABBR3leW/fFyyCOS6uWuBXnyeV83wa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSbndN/btsABBR3leW/fFyyCOS6uWuBXnyeV83wa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSbndN%2FbtsABBR3leW%2FfFyyCOS6uWuBXnyeV83wa0%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;784&quot; height=&quot;247&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리소스 정리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700534855702&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform destroy&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>Launch Configuration</category>
      <category>terraform</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/42</guid>
      <comments>https://kalswn.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 21 Nov 2023 11:48:46 +0900</pubDate>
    </item>
    <item>
      <title>AWS - 웹 서비스 환경 구성 실습</title>
      <link>https://kalswn.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#1 IAM 사용자 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;admin / p@ssw0rd&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tHoLy/btsAxjYdidQ/kyGx6q5bbllBBOVX3CrDp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tHoLy/btsAxjYdidQ/kyGx6q5bbllBBOVX3CrDp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tHoLy/btsAxjYdidQ/kyGx6q5bbllBBOVX3CrDp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtHoLy%2FbtsAxjYdidQ%2FkyGx6q5bbllBBOVX3CrDp1%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;963&quot; height=&quot;549&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;919&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPExAd/btsAxKaCDh0/0O3hBzFwwVQHh5ZKartpy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPExAd/btsAxKaCDh0/0O3hBzFwwVQHh5ZKartpy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPExAd/btsAxKaCDh0/0O3hBzFwwVQHh5ZKartpy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPExAd%2FbtsAxKaCDh0%2F0O3hBzFwwVQHh5ZKartpy0%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;962&quot; height=&quot;919&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;919&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U4Yja/btsAyNSdKqm/XUiIqKmn5QgkkXpglk0iZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U4Yja/btsAyNSdKqm/XUiIqKmn5QgkkXpglk0iZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U4Yja/btsAyNSdKqm/XUiIqKmn5QgkkXpglk0iZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU4Yja%2FbtsAyNSdKqm%2FXUiIqKmn5QgkkXpglk0iZ0%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;959&quot; height=&quot;923&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqVSLC/btsAySFIqT0/PHk3aSnzEkpOaPcPoh98X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqVSLC/btsAySFIqT0/PHk3aSnzEkpOaPcPoh98X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqVSLC/btsAySFIqT0/PHk3aSnzEkpOaPcPoh98X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqVSLC%2FbtsAySFIqT0%2FPHk3aSnzEkpOaPcPoh98X1%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;951&quot; height=&quot;689&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;689&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt; &lt;b&gt;#2 (다른 브라우저) 복사한 url 열고 생성한 admin 사용자로 로그인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmHPLh/btsABB4odia/aoTE8g4AhKoGBtdlhUxstk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmHPLh/btsABB4odia/aoTE8g4AhKoGBtdlhUxstk/img.png&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;557&quot; data-is-animation=&quot;false&quot; style=&quot;width: 66.9717%; margin-right: 10px;&quot; data-widthpercent=&quot;67.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmHPLh/btsABB4odia/aoTE8g4AhKoGBtdlhUxstk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmHPLh%2FbtsABB4odia%2FaoTE8g4AhKoGBtdlhUxstk%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;937&quot; height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWhKaR/btsAuNlDffv/mMB0jTyOaIQyZogM6kack0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWhKaR/btsAuNlDffv/mMB0jTyOaIQyZogM6kack0/img.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;486&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.8655%;&quot; data-widthpercent=&quot;32.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWhKaR/btsAuNlDffv/mMB0jTyOaIQyZogM6kack0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWhKaR%2FbtsAuNlDffv%2FmMB0jTyOaIQyZogM6kack0%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;389&quot; height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/div&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#3 네트워크 구성 ( admin 사용자)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#3-1 vpc 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MP5bF/btsAyL7V3a9/7HZ3CkirTjyNSK1SaPpnF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MP5bF/btsAyL7V3a9/7HZ3CkirTjyNSK1SaPpnF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MP5bF/btsAyL7V3a9/7HZ3CkirTjyNSK1SaPpnF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMP5bF%2FbtsAyL7V3a9%2F7HZ3CkirTjyNSK1SaPpnF0%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;602&quot; height=&quot;563&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTZHbT/btsAuI5yGln/2y6KiNa74nUoHkFMRCf8fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTZHbT/btsAuI5yGln/2y6KiNa74nUoHkFMRCf8fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTZHbT/btsAuI5yGln/2y6KiNa74nUoHkFMRCf8fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTZHbT%2FbtsAuI5yGln%2F2y6KiNa74nUoHkFMRCf8fk%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;954&quot; height=&quot;794&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (1).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8KFih/btsAEoxdoWS/9bnhZRQE0DfABXO5kmPEbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8KFih/btsAEoxdoWS/9bnhZRQE0DfABXO5kmPEbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8KFih/btsAEoxdoWS/9bnhZRQE0DfABXO5kmPEbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8KFih%2FbtsAEoxdoWS%2F9bnhZRQE0DfABXO5kmPEbk%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (1).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#3-2 서브넷 생성 (public-subnet-A / public-subnet-B)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVs46T/btsAxUKFFHu/sInzsp3bBDRXxFY0hPo9t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVs46T/btsAxUKFFHu/sInzsp3bBDRXxFY0hPo9t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVs46T/btsAxUKFFHu/sInzsp3bBDRXxFY0hPo9t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVs46T%2FbtsAxUKFFHu%2FsInzsp3bBDRXxFY0hPo9t1%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;945&quot; height=&quot;309&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VBivK/btsAx0jYcTe/6xE9s1NFTcNBlS2XIwKrT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VBivK/btsAx0jYcTe/6xE9s1NFTcNBlS2XIwKrT0/img.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;659&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;43.82&quot; style=&quot;width: 43.3152%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VBivK/btsAx0jYcTe/6xE9s1NFTcNBlS2XIwKrT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVBivK%2FbtsAx0jYcTe%2F6xE9s1NFTcNBlS2XIwKrT0%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;441&quot; height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pLzPi/btsAvtUJckV/5UMEeGosPKQNrJma28f7K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pLzPi/btsAvtUJckV/5UMEeGosPKQNrJma28f7K0/img.png&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;668&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.522%;&quot; data-widthpercent=&quot;56.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pLzPi/btsAvtUJckV/5UMEeGosPKQNrJma28f7K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpLzPi%2FbtsAvtUJckV%2F5UMEeGosPKQNrJma28f7K0%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;573&quot; height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bckegQ/btsAzbym2ZX/RjxFZ9PEky2IT95XzerC9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bckegQ/btsAzbym2ZX/RjxFZ9PEky2IT95XzerC9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bckegQ/btsAzbym2ZX/RjxFZ9PEky2IT95XzerC9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbckegQ%2FbtsAzbym2ZX%2FRjxFZ9PEky2IT95XzerC9k%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;921&quot; height=&quot;203&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (2).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yCrip/btsAzcdfk0A/Kej2seVuctd5hdvS29fHhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yCrip/btsAzcdfk0A/Kej2seVuctd5hdvS29fHhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yCrip/btsAzcdfk0A/Kej2seVuctd5hdvS29fHhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyCrip%2FbtsAzcdfk0A%2FKej2seVuctd5hdvS29fHhK%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (2).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&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;background-color: #c0d1e7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#3-3 인터넷게이트웨이 생성&amp;nbsp;&lt;/span&gt;&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;883&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE4Pr4/btsAwttsc9e/B1nPs8pK14HNOUwItgbMv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE4Pr4/btsAwttsc9e/B1nPs8pK14HNOUwItgbMv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE4Pr4/btsAwttsc9e/B1nPs8pK14HNOUwItgbMv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE4Pr4%2FbtsAwttsc9e%2FB1nPs8pK14HNOUwItgbMv1%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;883&quot; height=&quot;491&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c98teK/btsAzC3IjiW/ElLe7welVn855pQ830uCEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c98teK/btsAzC3IjiW/ElLe7welVn855pQ830uCEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c98teK/btsAzC3IjiW/ElLe7welVn855pQ830uCEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc98teK%2FbtsAzC3IjiW%2FElLe7welVn855pQ830uCEK%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;677&quot; height=&quot;521&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbXJdO/btsAvYUm7fW/XQEJBD68T6BNyvofkqEoz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbXJdO/btsAvYUm7fW/XQEJBD68T6BNyvofkqEoz1/img.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;361&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.8015%; margin-right: 10px;&quot; data-widthpercent=&quot;51.4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbXJdO/btsAvYUm7fW/XQEJBD68T6BNyvofkqEoz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbXJdO%2FbtsAvYUm7fW%2FXQEJBD68T6BNyvofkqEoz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wdUjZ/btsAyVP07gl/TGYWHwAUAzV6jkYqnXen8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wdUjZ/btsAyVP07gl/TGYWHwAUAzV6jkYqnXen8k/img.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;383&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.0357%;&quot; data-widthpercent=&quot;48.6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wdUjZ/btsAyVP07gl/TGYWHwAUAzV6jkYqnXen8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwdUjZ%2FbtsAyVP07gl%2FTGYWHwAUAzV6jkYqnXen8k%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;631&quot; height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (3).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/croPi9/btsAvtgwUX2/MXHMWxUPRLzNA48pkSXwJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/croPi9/btsAvtgwUX2/MXHMWxUPRLzNA48pkSXwJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/croPi9/btsAvtgwUX2/MXHMWxUPRLzNA48pkSXwJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcroPi9%2FbtsAvtgwUX2%2FMXHMWxUPRLzNA48pkSXwJk%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (3).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;#3-4 라우팅 테이블에 인터넷 게이트웨이로의 라우팅을 추가&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H41Sm/btsAuQJqFkS/5xKt17cAXTV5PuVeJ5FkIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H41Sm/btsAuQJqFkS/5xKt17cAXTV5PuVeJ5FkIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H41Sm/btsAuQJqFkS/5xKt17cAXTV5PuVeJ5FkIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH41Sm%2FbtsAuQJqFkS%2F5xKt17cAXTV5PuVeJ5FkIK%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;851&quot; height=&quot;417&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kX082/btsAuMz86cS/VQBgKVUBd7LFkpHBMh4cEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kX082/btsAuMz86cS/VQBgKVUBd7LFkpHBMh4cEK/img.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;719&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.9783%; margin-right: 10px;&quot; data-widthpercent=&quot;31.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kX082/btsAuMz86cS/VQBgKVUBd7LFkpHBMh4cEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkX082%2FbtsAuMz86cS%2FVQBgKVUBd7LFkpHBMh4cEK%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;387&quot; height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brpSMP/btsAzAEPMvh/N6C2uqXIpg6Il9iqgT5nIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brpSMP/btsAzAEPMvh/N6C2uqXIpg6Il9iqgT5nIk/img.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;525&quot; data-is-animation=&quot;false&quot; style=&quot;width: 67.8589%;&quot; data-widthpercent=&quot;68.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brpSMP/btsAzAEPMvh/N6C2uqXIpg6Il9iqgT5nIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrpSMP%2FbtsAzAEPMvh%2FN6C2uqXIpg6Il9iqgT5nIk%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;619&quot; height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (4).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2eCl/btsAEnSC8mP/SvzJXEsP6dLKKhtjUckEH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2eCl/btsAEnSC8mP/SvzJXEsP6dLKKhtjUckEH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2eCl/btsAEnSC8mP/SvzJXEsP6dLKKhtjUckEH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2eCl%2FbtsAEnSC8mP%2FSvzJXEsP6dLKKhtjUckEH1%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (4).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#3-5 public-subnet-A 서브넷을 퍼블릭 서브넷으로 설정(또는 확인) &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwYxw/btsAuN60pHS/pZlMGHs7whSvedwYgg59FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwYxw/btsAuN60pHS/pZlMGHs7whSvedwYgg59FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwYxw/btsAuN60pHS/pZlMGHs7whSvedwYgg59FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkwYxw%2FbtsAuN60pHS%2FpZlMGHs7whSvedwYgg59FK%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;855&quot; height=&quot;493&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (5).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVn2ud/btsAANj08Z1/okF0kRql3auwYhC36EHRD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVn2ud/btsAANj08Z1/okF0kRql3auwYhC36EHRD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVn2ud/btsAANj08Z1/okF0kRql3auwYhC36EHRD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVn2ud%2FbtsAANj08Z1%2FokF0kRql3auwYhC36EHRD1%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (5).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;#3-6&amp;nbsp;&lt;/span&gt;public-subnet-C 서브넷을 퍼블릭 서브넷으로 설정(또는 확인) &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zH7Oy/btsAxHdSNlx/Nbor14t1t9JvZbRe9ykvV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zH7Oy/btsAxHdSNlx/Nbor14t1t9JvZbRe9ykvV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zH7Oy/btsAxHdSNlx/Nbor14t1t9JvZbRe9ykvV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzH7Oy%2FbtsAxHdSNlx%2FNbor14t1t9JvZbRe9ykvV0%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;851&quot; height=&quot;489&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (6).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM1Gxl/btsAzTR5GGV/aDI1LY1kX0THLXduVfnKuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM1Gxl/btsAzTR5GGV/aDI1LY1kX0THLXduVfnKuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM1Gxl/btsAzTR5GGV/aDI1LY1kX0THLXduVfnKuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM1Gxl%2FbtsAzTR5GGV%2FaDI1LY1kX0THLXduVfnKuK%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (6).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#3-7 보안 그룹 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서브넷에 생성할(배치할) 인스턴스로 HTTP(80), SSH(22) 접근을 허용하도록 설정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEM4NP/btsAxeP9fXE/JTUpFP39laBnh45q8cqbQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEM4NP/btsAxeP9fXE/JTUpFP39laBnh45q8cqbQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEM4NP/btsAxeP9fXE/JTUpFP39laBnh45q8cqbQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEM4NP%2FbtsAxeP9fXE%2FJTUpFP39laBnh45q8cqbQ1%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;857&quot; height=&quot;179&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W13s6/btsAy5LHAL1/cka0DW4bDtjyoc4TQVAa21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W13s6/btsAy5LHAL1/cka0DW4bDtjyoc4TQVAa21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W13s6/btsAy5LHAL1/cka0DW4bDtjyoc4TQVAa21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW13s6%2FbtsAy5LHAL1%2Fcka0DW4bDtjyoc4TQVAa21%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;1263&quot; height=&quot;655&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uL5Tf/btsAyNxTSHd/VgkoMFp8xPURXVWhJd52w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uL5Tf/btsAyNxTSHd/VgkoMFp8xPURXVWhJd52w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uL5Tf/btsAyNxTSHd/VgkoMFp8xPURXVWhJd52w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuL5Tf%2FbtsAyNxTSHd%2FVgkoMFp8xPURXVWhJd52w1%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;1135&quot; height=&quot;545&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;545&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;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt; &lt;b&gt;#4 웹 서버 인스턴스를 생성&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;#4-1&amp;nbsp;웹&amp;nbsp;서버&amp;nbsp;인스턴스를&amp;nbsp;생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;779&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC9rCe/btsAyWnPV0q/farfqN97Zx05ik4FsPpeqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC9rCe/btsAyWnPV0q/farfqN97Zx05ik4FsPpeqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC9rCe/btsAyWnPV0q/farfqN97Zx05ik4FsPpeqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC9rCe%2FbtsAyWnPV0q%2FfarfqN97Zx05ik4FsPpeqk%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;663&quot; height=&quot;779&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;779&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN7gVu/btsAuNy8lIQ/VbIdW7csumVUn6KyKQDEo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN7gVu/btsAuNy8lIQ/VbIdW7csumVUn6KyKQDEo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN7gVu/btsAuNy8lIQ/VbIdW7csumVUn6KyKQDEo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN7gVu%2FbtsAuNy8lIQ%2FVbIdW7csumVUn6KyKQDEo1%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;615&quot; height=&quot;787&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bROrAD/btsAwp5FIAT/TjS5SoKWdEGjS5mbu5p34K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bROrAD/btsAwp5FIAT/TjS5SoKWdEGjS5mbu5p34K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bROrAD/btsAwp5FIAT/TjS5SoKWdEGjS5mbu5p34K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbROrAD%2FbtsAwp5FIAT%2FTjS5SoKWdEGjS5mbu5p34K%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;617&quot; height=&quot;683&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YQvPl/btsAzaMZXll/Xhx8KlWsrxSadk01ODSjTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YQvPl/btsAzaMZXll/Xhx8KlWsrxSadk01ODSjTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YQvPl/btsAzaMZXll/Xhx8KlWsrxSadk01ODSjTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYQvPl%2FbtsAzaMZXll%2FXhx8KlWsrxSadk01ODSjTk%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;453&quot; height=&quot;453&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bazthu/btsAwrI9oyd/hQnOSOvd3ngxQecUeHtppK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bazthu/btsAwrI9oyd/hQnOSOvd3ngxQecUeHtppK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bazthu/btsAwrI9oyd/hQnOSOvd3ngxQecUeHtppK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbazthu%2FbtsAwrI9oyd%2FhQnOSOvd3ngxQecUeHtppK%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;609&quot; height=&quot;446&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 74.0698%; height: 698px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;#!/bin/sh &lt;br /&gt;&lt;br /&gt;amazon-linux-extras&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;lamp-mariadb10.2-php7.2&amp;nbsp;php7.2 &lt;br /&gt;yum&amp;nbsp;-y&amp;nbsp;install&amp;nbsp;httpd&amp;nbsp;php-mbstring &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;Start&amp;nbsp;the&amp;nbsp;web&amp;nbsp;server &lt;br /&gt;chkconfig&amp;nbsp;httpd&amp;nbsp;on &lt;br /&gt;systemctl&amp;nbsp;start&amp;nbsp;httpd &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;Install&amp;nbsp;the&amp;nbsp;web&amp;nbsp;pages&amp;nbsp;for&amp;nbsp;our&amp;nbsp;lab &lt;br /&gt;if&amp;nbsp;[&amp;nbsp;!&amp;nbsp;-f&amp;nbsp;/var/www/html/immersion-day-app-php7.tar.gz&amp;nbsp;];&amp;nbsp;then &lt;br /&gt;cd&amp;nbsp;/var/www/html &lt;br /&gt;wget&amp;nbsp;&lt;a href=&quot;https://aws-joozero.s3.ap-northeast-2.amazonaws.com/immersion-day-app-php7.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aws-joozero.s3.ap-northeast-2.amazonaws.com/immersion-day-app-php7.tar.gz&lt;/a&gt;&amp;nbsp;&lt;br /&gt;tar&amp;nbsp;xvfz&amp;nbsp;immersion-day-app-php7.tar.gz &lt;br /&gt;fi &lt;br /&gt;&lt;br /&gt;cat&amp;nbsp;&amp;lt;&amp;lt;EOF&amp;nbsp;&amp;gt;&amp;nbsp;/var/www/html/get-index-meta-data.php &lt;br /&gt;&amp;lt;?php &lt;br /&gt;&amp;nbsp;&amp;nbsp;\$hostname&amp;nbsp;=&amp;nbsp;gethostname(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;\$results&amp;nbsp;=&amp;nbsp;explode(&quot;.&quot;,&amp;nbsp;\$hostname); &lt;br /&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;&amp;lt;table&amp;nbsp;style='width:100%'&amp;gt;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;nbsp;style='width:30%'&amp;gt;Meta-Data&amp;lt;/th&amp;gt;&amp;lt;th&amp;nbsp;style='width:70%'&amp;gt;Value&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Private&amp;nbsp;IP&amp;nbsp;DNS&amp;nbsp;Name&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&quot;.\$hostname.&quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Private&amp;nbsp;IP&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&quot;.getHostByName(\$hostname).&quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Region&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&quot;.\$results[1].&quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;&amp;lt;/table&amp;gt;&quot;; &lt;br /&gt;?&amp;gt; &lt;br /&gt;EOF &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;Install&amp;nbsp;the&amp;nbsp;AWS&amp;nbsp;SDK&amp;nbsp;for&amp;nbsp;PHP &lt;br /&gt;if&amp;nbsp;[&amp;nbsp;!&amp;nbsp;-f&amp;nbsp;/var/www/html/aws.zip&amp;nbsp;];&amp;nbsp;then &lt;br /&gt;cd&amp;nbsp;/var/www/html &lt;br /&gt;mkdir&amp;nbsp;vendor &lt;br /&gt;cd&amp;nbsp;vendor &lt;br /&gt;wget&amp;nbsp;&lt;a href=&quot;https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip&lt;/a&gt;&lt;br /&gt;unzip&amp;nbsp;aws.zip &lt;br /&gt;fi &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;Update&amp;nbsp;existing&amp;nbsp;packages &lt;br /&gt;yum&amp;nbsp;-y&amp;nbsp;update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcaEIL/btsAw3HUDET/OnJP9HMnEYVHlewHyJhNfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcaEIL/btsAw3HUDET/OnJP9HMnEYVHlewHyJhNfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcaEIL/btsAw3HUDET/OnJP9HMnEYVHlewHyJhNfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcaEIL%2FbtsAw3HUDET%2FOnJP9HMnEYVHlewHyJhNfK%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;907&quot; height=&quot;505&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;505&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;- 퍼블릭 IPv4주소로 확인해서 브라우저로 접근&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGQVKc/btsAxYfoHYw/k6NmfxeIPdn3A8eKCWVPkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGQVKc/btsAxYfoHYw/k6NmfxeIPdn3A8eKCWVPkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGQVKc/btsAxYfoHYw/k6NmfxeIPdn3A8eKCWVPkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGQVKc%2FbtsAxYfoHYw%2Fk6NmfxeIPdn3A8eKCWVPkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;205&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- webserver EC2 인스턴스에 SSH 접속&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bat8Tc/btsAzz0e4Uw/8fvscKeJyZma4ZxCJXPYD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bat8Tc/btsAzz0e4Uw/8fvscKeJyZma4ZxCJXPYD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bat8Tc/btsAzz0e4Uw/8fvscKeJyZma4ZxCJXPYD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbat8Tc%2FbtsAzz0e4Uw%2F8fvscKeJyZma4ZxCJXPYD1%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;913&quot; height=&quot;169&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXm5g/btsAzd32UEJ/2kkTuqFHlAVkDPdRs9eumk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXm5g/btsAzd32UEJ/2kkTuqFHlAVkDPdRs9eumk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXm5g/btsAzd32UEJ/2kkTuqFHlAVkDPdRs9eumk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXm5g%2FbtsAzd32UEJ%2F2kkTuqFHlAVkDPdRs9eumk%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;655&quot; height=&quot;544&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ez1rkZ/btsAAO3Wne0/8r7J9nFEAkokK0IWdmakO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ez1rkZ/btsAAO3Wne0/8r7J9nFEAkokK0IWdmakO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ez1rkZ/btsAAO3Wne0/8r7J9nFEAkokK0IWdmakO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fez1rkZ%2FbtsAAO3Wne0%2F8r7J9nFEAkokK0IWdmakO1%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;939&quot; height=&quot;741&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;741&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;- SSH&amp;nbsp;Client&amp;nbsp;프로그램을&amp;nbsp;이용해서&amp;nbsp;접속&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpvM7g/btsAvsO4X04/22SyvLZhE0Uhef5zxbTwHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpvM7g/btsAvsO4X04/22SyvLZhE0Uhef5zxbTwHK/img.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;641&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3855%; margin-right: 10px;&quot; data-widthpercent=&quot;49.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpvM7g/btsAvsO4X04/22SyvLZhE0Uhef5zxbTwHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpvM7g%2FbtsAvsO4X04%2F22SyvLZhE0Uhef5zxbTwHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb8LGM/btsAuQvQKLf/T5kKFiCmQnDHEZkiZgaK8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb8LGM/btsAuQvQKLf/T5kKFiCmQnDHEZkiZgaK8K/img.png&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;632&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4517%;&quot; data-widthpercent=&quot;50.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb8LGM/btsAuQvQKLf/T5kKFiCmQnDHEZkiZgaK8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb8LGM%2FbtsAuQvQKLf%2FT5kKFiCmQnDHEZkiZgaK8K%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;621&quot; height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NQ7zA/btsAueDDo1M/K2iukJftaffHH6VmKxDS41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NQ7zA/btsAueDDo1M/K2iukJftaffHH6VmKxDS41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NQ7zA/btsAueDDo1M/K2iukJftaffHH6VmKxDS41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNQ7zA%2FbtsAueDDo1M%2FK2iukJftaffHH6VmKxDS41%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;919&quot; height=&quot;773&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;773&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (7).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB3I2I/btsAxdRzwsQ/VVrqxz2xKDZhsYWLpmvhgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB3I2I/btsAxdRzwsQ/VVrqxz2xKDZhsYWLpmvhgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB3I2I/btsAxdRzwsQ/VVrqxz2xKDZhsYWLpmvhgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB3I2I%2FbtsAxdRzwsQ%2FVVrqxz2xKDZhsYWLpmvhgk%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (7).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#4-2&amp;nbsp;(웹&amp;nbsp;서버&amp;nbsp;설정이&amp;nbsp;모든&amp;nbsp;끝난&amp;nbsp;상태에서)&amp;nbsp;AMI를&amp;nbsp;생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjeyBo/btsAvXBcsXj/v3uYSygXbR03ukxCkABOJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjeyBo/btsAvXBcsXj/v3uYSygXbR03ukxCkABOJk/img.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;255&quot; data-is-animation=&quot;false&quot; style=&quot;width: 69.1833%; margin-right: 10px;&quot; data-widthpercent=&quot;70&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjeyBo/btsAvXBcsXj/v3uYSygXbR03ukxCkABOJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjeyBo%2FbtsAvXBcsXj%2Fv3uYSygXbR03ukxCkABOJk%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;717&quot; height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJUi5h/btsAzVa0hz1/8bEbrlwtY8L8KLlK1z2Ll0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJUi5h/btsAzVa0hz1/8bEbrlwtY8L8KLlK1z2Ll0/img.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;346&quot; data-is-animation=&quot;false&quot; style=&quot;width: 29.6539%;&quot; data-widthpercent=&quot;30&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJUi5h/btsAzVa0hz1/8bEbrlwtY8L8KLlK1z2Ll0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJUi5h%2FbtsAzVa0hz1%2F8bEbrlwtY8L8KLlK1z2Ll0%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;417&quot; height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (8).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HBEVI/btsAzVvBhS0/XitRf79i7qcQiv7vYdMXb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HBEVI/btsAzVvBhS0/XitRf79i7qcQiv7vYdMXb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HBEVI/btsAzVvBhS0/XitRf79i7qcQiv7vYdMXb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHBEVI%2FbtsAzVvBhS0%2FXitRf79i7qcQiv7vYdMXb0%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (8).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#4-3&amp;nbsp;생성한&amp;nbsp;webserver-ami&amp;nbsp;이미지를&amp;nbsp;이용해서&amp;nbsp;웹&amp;nbsp;서버&amp;nbsp;인스턴스를&amp;nbsp;public-subnet-C&amp;nbsp;서브넷에&amp;nbsp;인스턴스를&amp;nbsp;생성&amp;nbsp;&amp;rarr;&amp;nbsp;사용자&amp;nbsp;데이터&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RBa8w/btsAySMxqmB/2ov8wZmFKv6z2K2BFfEXK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RBa8w/btsAySMxqmB/2ov8wZmFKv6z2K2BFfEXK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RBa8w/btsAySMxqmB/2ov8wZmFKv6z2K2BFfEXK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRBa8w%2FbtsAySMxqmB%2F2ov8wZmFKv6z2K2BFfEXK1%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;519&quot; height=&quot;146&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b45RNc/btsAvW3mVF2/ytUrMkxKpbEG39KUHN8XA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b45RNc/btsAvW3mVF2/ytUrMkxKpbEG39KUHN8XA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b45RNc/btsAvW3mVF2/ytUrMkxKpbEG39KUHN8XA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb45RNc%2FbtsAvW3mVF2%2FytUrMkxKpbEG39KUHN8XA1%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;542&quot; height=&quot;545&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7ParG/btsAuILnF3y/GxeklaWcBBTrtO4PfOHzC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7ParG/btsAuILnF3y/GxeklaWcBBTrtO4PfOHzC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7ParG/btsAuILnF3y/GxeklaWcBBTrtO4PfOHzC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7ParG%2FbtsAuILnF3y%2FGxeklaWcBBTrtO4PfOHzC1%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;545&quot; height=&quot;801&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGTbbD/btsAxe3L9SM/JzZzdciFhKGjAhrKifKoxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGTbbD/btsAxe3L9SM/JzZzdciFhKGjAhrKifKoxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGTbbD/btsAxe3L9SM/JzZzdciFhKGjAhrKifKoxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGTbbD%2FbtsAxe3L9SM%2FJzZzdciFhKGjAhrKifKoxK%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;693&quot; height=&quot;231&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (9).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOil5q/btsAw3nQ3ES/1hUQULg4iQxY1qKZaIfkt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOil5q/btsAw3nQ3ES/1hUQULg4iQxY1qKZaIfkt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOil5q/btsAw3nQ3ES/1hUQULg4iQxY1qKZaIfkt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOil5q%2FbtsAw3nQ3ES%2F1hUQULg4iQxY1qKZaIfkt0%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (9).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#5&amp;nbsp;로드밸런서&amp;nbsp;구성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한&amp;nbsp;내용의&amp;nbsp;서비스를&amp;nbsp;제공하는&amp;nbsp;인스턴스&amp;nbsp;두&amp;nbsp;개가&amp;nbsp;실행되고&amp;nbsp;있음 &lt;br /&gt;개별&amp;nbsp;인스턴스의&amp;nbsp;주소로&amp;nbsp;접속하는&amp;nbsp;경우,&amp;nbsp;이용의&amp;nbsp;불편과&amp;nbsp;부하&amp;nbsp;집중의&amp;nbsp;문제가&amp;nbsp;문제가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;&amp;rArr;&amp;nbsp;로드밸런서를&amp;nbsp;이용해서&amp;nbsp;서비스될&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;수정&amp;nbsp; &lt;br /&gt;&amp;rArr;&amp;nbsp;부하&amp;nbsp;분산과&amp;nbsp;서비스&amp;nbsp;편의를&amp;nbsp;제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; color: #000000;&quot;&gt;&lt;b&gt;#5-1 애플리케이션 로드밸런서를 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oScOt/btsABz6BwOH/eydv1ak14H2gxmh9JBCkNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oScOt/btsABz6BwOH/eydv1ak14H2gxmh9JBCkNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oScOt/btsABz6BwOH/eydv1ak14H2gxmh9JBCkNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoScOt%2FbtsABz6BwOH%2Feydv1ak14H2gxmh9JBCkNk%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;891&quot; height=&quot;373&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;373&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;#5-2 로드밸런서 유형을 선택 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ozA6I/btsAyNxVrF5/NKgYQUIXfRnZsBQQB7zq4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ozA6I/btsAyNxVrF5/NKgYQUIXfRnZsBQQB7zq4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ozA6I/btsAyNxVrF5/NKgYQUIXfRnZsBQQB7zq4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FozA6I%2FbtsAyNxVrF5%2FNKgYQUIXfRnZsBQQB7zq4k%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;747&quot; height=&quot;763&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPXP7Y/btsAy73Payc/eqkBfuPK6FUQajRuHtqZik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPXP7Y/btsAy73Payc/eqkBfuPK6FUQajRuHtqZik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPXP7Y/btsAy73Payc/eqkBfuPK6FUQajRuHtqZik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPXP7Y%2FbtsAy73Payc%2FeqkBfuPK6FUQajRuHtqZik%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;801&quot; height=&quot;703&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M1vNf/btsAxhF8Seh/bSQTzWrYVL6E11mFknrGk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M1vNf/btsAxhF8Seh/bSQTzWrYVL6E11mFknrGk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M1vNf/btsAxhF8Seh/bSQTzWrYVL6E11mFknrGk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM1vNf%2FbtsAxhF8Seh%2FbSQTzWrYVL6E11mFknrGk0%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;791&quot; height=&quot;597&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드밸런서는&amp;nbsp;SSH&amp;nbsp;접속이&amp;nbsp;필요&amp;nbsp;없으므로,&amp;nbsp;80&amp;nbsp;포트&amp;nbsp;접속만&amp;nbsp;허용하는&amp;nbsp;보안&amp;nbsp;그룹을&amp;nbsp;새롭게&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;781&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebWBfk/btsAwtGZHvx/8zk6tYstPULsXDjmjcZWv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebWBfk/btsAwtGZHvx/8zk6tYstPULsXDjmjcZWv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebWBfk/btsAwtGZHvx/8zk6tYstPULsXDjmjcZWv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebWBfk%2FbtsAwtGZHvx%2F8zk6tYstPULsXDjmjcZWv1%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;781&quot; height=&quot;242&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V03pd/btsAxh7c2ZF/7vSMLcyWMq68lKAkTNvkWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V03pd/btsAxh7c2ZF/7vSMLcyWMq68lKAkTNvkWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V03pd/btsAxh7c2ZF/7vSMLcyWMq68lKAkTNvkWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV03pd%2FbtsAxh7c2ZF%2F7vSMLcyWMq68lKAkTNvkWK%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;829&quot; height=&quot;635&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqNJqn/btsAufWRsLh/9xHNzirCDjnmaqPNKIZptK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqNJqn/btsAufWRsLh/9xHNzirCDjnmaqPNKIZptK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqNJqn/btsAufWRsLh/9xHNzirCDjnmaqPNKIZptK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqNJqn%2FbtsAufWRsLh%2F9xHNzirCDjnmaqPNKIZptK%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;789&quot; height=&quot;245&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbvm8J/btsABCbbkud/KpCFlec5SNABcb4udVZ6H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbvm8J/btsABCbbkud/KpCFlec5SNABcb4udVZ6H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbvm8J/btsABCbbkud/KpCFlec5SNABcb4udVZ6H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbvm8J%2FbtsABCbbkud%2FKpCFlec5SNABcb4udVZ6H1%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;435&quot; height=&quot;745&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCPT0q/btsAuhUJpXW/AuKaka0w0TAoXH2vzNOHDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCPT0q/btsAuhUJpXW/AuKaka0w0TAoXH2vzNOHDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCPT0q/btsAuhUJpXW/AuKaka0w0TAoXH2vzNOHDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCPT0q%2FbtsAuhUJpXW%2FAuKaka0w0TAoXH2vzNOHDk%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;837&quot; height=&quot;877&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhk1OM/btsAxHyem74/qJ2hMNtm3KLdF5KMT3Rs9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhk1OM/btsAxHyem74/qJ2hMNtm3KLdF5KMT3Rs9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhk1OM/btsAxHyem74/qJ2hMNtm3KLdF5KMT3Rs9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhk1OM%2FbtsAxHyem74%2FqJ2hMNtm3KLdF5KMT3Rs9k%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;907&quot; height=&quot;429&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbJHYI/btsAzCioutD/eWGPSW4Zwc8heolrljwKg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbJHYI/btsAzCioutD/eWGPSW4Zwc8heolrljwKg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbJHYI/btsAzCioutD/eWGPSW4Zwc8heolrljwKg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbJHYI%2FbtsAzCioutD%2FeWGPSW4Zwc8heolrljwKg0%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;885&quot; height=&quot;445&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;445&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;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;#5-3 로드밸런서 상태 및 DNS 이름을 확인&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcbT4x/btsAzbE9cF7/HV1PxQHmP6wzVUNlWeshp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcbT4x/btsAzbE9cF7/HV1PxQHmP6wzVUNlWeshp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcbT4x/btsAzbE9cF7/HV1PxQHmP6wzVUNlWeshp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcbT4x%2FbtsAzbE9cF7%2FHV1PxQHmP6wzVUNlWeshp1%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;1117&quot; height=&quot;709&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;#5-4&amp;nbsp;웹&amp;nbsp;브라우저를&amp;nbsp;이용해서&amp;nbsp;DNS&amp;nbsp;이름으로&amp;nbsp;접속&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;641&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Jzpg/btsAxT57z1B/LWj4QivrmvvqTmSIypKnH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Jzpg/btsAxT57z1B/LWj4QivrmvvqTmSIypKnH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Jzpg/btsAxT57z1B/LWj4QivrmvvqTmSIypKnH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Jzpg%2FbtsAxT57z1B%2FLWj4QivrmvvqTmSIypKnH1%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;641&quot; height=&quot;159&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 1 (10).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWOYy/btsAyrJiJOi/zOndRS4ACVT5JaGkovQp3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWOYy/btsAyrJiJOi/zOndRS4ACVT5JaGkovQp3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWOYy/btsAyrJiJOi/zOndRS4ACVT5JaGkovQp3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWOYy%2FbtsAyrJiJOi%2FzOndRS4ACVT5JaGkovQp3K%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;946&quot; height=&quot;591&quot; data-filename=&quot;Frame 1 (10).png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;#6 로드밸런서를 통해서만 서비스를 이용할 수 있도록 제한&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는&amp;nbsp;사용자가&amp;nbsp;로드밸런서를&amp;nbsp;이용하지&amp;nbsp;않고&amp;nbsp;개별&amp;nbsp;인스턴스로&amp;nbsp;직접&amp;nbsp;접근하는&amp;nbsp;것도&amp;nbsp;가능&amp;nbsp; &lt;br /&gt;&amp;rArr;&amp;nbsp;모든&amp;nbsp;요청을&amp;nbsp;로드밸런서를&amp;nbsp;통해서만&amp;nbsp;처리하도록&amp;nbsp;제한 &lt;br /&gt;&amp;rArr;&amp;nbsp;개별&amp;nbsp;인스턴스에&amp;nbsp;로드밸런서로부터&amp;nbsp;오는&amp;nbsp;HTTP(80)만&amp;nbsp;허용하도록&amp;nbsp;수정&amp;nbsp;&amp;rArr;&amp;nbsp;보안&amp;nbsp;그룹(webserver-sg)을&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;1109&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU6Q3f/btsAyLz8ljL/hmBzhIorwjw8k0M3W6i3k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU6Q3f/btsAyLz8ljL/hmBzhIorwjw8k0M3W6i3k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU6Q3f/btsAyLz8ljL/hmBzhIorwjw8k0M3W6i3k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU6Q3f%2FbtsAyLz8ljL%2FhmBzhIorwjw8k0M3W6i3k0%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;1109&quot; height=&quot;659&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8J2dh/btsAvk4qMBD/vIDVhGbIP5eKhfTlbUkgS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8J2dh/btsAvk4qMBD/vIDVhGbIP5eKhfTlbUkgS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8J2dh/btsAvk4qMBD/vIDVhGbIP5eKhfTlbUkgS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8J2dh%2FbtsAvk4qMBD%2FvIDVhGbIP5eKhfTlbUkgS0%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;1075&quot; height=&quot;559&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsyftY/btsAuNzafSA/nwBTFLIC4INTedgzDKyv5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsyftY/btsAuNzafSA/nwBTFLIC4INTedgzDKyv5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsyftY/btsAuNzafSA/nwBTFLIC4INTedgzDKyv5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsyftY%2FbtsAuNzafSA%2FnwBTFLIC4INTedgzDKyv5K%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;1083&quot; height=&quot;875&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uOP4g/btsAySFK1Pa/iqVsYrKQtVYl3mtZ53pMO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uOP4g/btsAySFK1Pa/iqVsYrKQtVYl3mtZ53pMO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uOP4g/btsAySFK1Pa/iqVsYrKQtVYl3mtZ53pMO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuOP4g%2FbtsAySFK1Pa%2FiqVsYrKQtVYl3mtZ53pMO1%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;925&quot; height=&quot;639&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;639&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;679&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tvkv4/btsAw4fJCDQ/iaSYz1Xawmh999cLFdnQI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tvkv4/btsAw4fJCDQ/iaSYz1Xawmh999cLFdnQI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tvkv4/btsAw4fJCDQ/iaSYz1Xawmh999cLFdnQI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTvkv4%2FbtsAw4fJCDQ%2FiaSYz1Xawmh999cLFdnQI1%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;679&quot; height=&quot;597&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;597&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;605&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vdR5K/btsAyVJe2Tg/LkaoqhGOpOFOmIJynAUip0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vdR5K/btsAyVJe2Tg/LkaoqhGOpOFOmIJynAUip0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vdR5K/btsAyVJe2Tg/LkaoqhGOpOFOmIJynAUip0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvdR5K%2FbtsAyVJe2Tg%2FLkaoqhGOpOFOmIJynAUip0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;127&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/41</guid>
      <comments>https://kalswn.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 20 Nov 2023 23:58:23 +0900</pubDate>
    </item>
    <item>
      <title>AWS - Terraform</title>
      <link>https://kalswn.tistory.com/40</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Terraform&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공급자의 고유한 기능을 활용하여 각 공급자에 특정한 코드를 작성할 수 있도록 하는 동시에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 공급자에 대해 동일한 언어, 도구 세트 및 IaC 방식을 사용할 수 있도록 하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인프라 구조를 코드로 정의하고 관리하는 도구로 클라우드 환경에서의 자원 배포 및 관리를 간편하게 할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;terraform 코드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확장자가 .tf 인 파일에 HCL(HachCorp 구성언어)로 작성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;--&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;선언&lt;/b&gt;&lt;/span&gt;적 언어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 어떤 형태의 최종적인 인프라의 목표를 명시 최종적인 결과만 중요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 항상 인프라의 최신 상태를 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;-&amp;gt; 절차적 언어:&amp;nbsp; 실행되기 위한 과정들이 중요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;- terraform init&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테라폼 코드를 스캔하고, 사용 중인 공급자를 파악하고 해당 코드를 다운로드 &amp;rArr; .terraform 폴더에 다운로드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700470325319&quot; class=&quot;jboss-cli&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;C:\aws&amp;gt;terraform init

Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v5.26.0...                  &amp;lArr; provider를 가져와서 설치
- Installed hashicorp/aws v5.26.0 (signed by HashiCorp)
...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;- terraform plan&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;&amp;nbsp;+ 리소스 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;nbsp; 리소스 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;~ 리소스 수정&lt;/p&gt;
&lt;pre id=&quot;code_1700470325320&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  + create

Terraform will perform the following actions:
 # aws_instance.example will be created
  + resource &quot;aws_instance&quot; &quot;example&quot; {
      + ami                                  = &quot;ami-01123b84e2a4fba05&quot;
      + arn                                  = (known after apply)

...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;- terraform apply&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;출력을 표시하고 실제로 이 계획을 진행할 것인지 확인하라는 메시지를 표시&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700470325321&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.example will be created
  + resource &quot;aws_instance&quot; &quot;example&quot; {
      + ami                                  = &quot;ami-01123b84e2a4fba05&quot;
      + arn                                  = (known after apply)
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;- terraform destroy&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 인프라를 삭제&lt;/p&gt;
&lt;pre id=&quot;code_1700470325322&quot; class=&quot;pf&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform destroy
aws_security_group.webserversg: Refreshing state... [id=sg-0e6dca42f57a8b3f5]
aws_instance.example: Refreshing state... [id=i-06e3a32a8e93a8958]
...&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #456771; color: #ffffff;&quot;&gt;&lt;b&gt;단일 서버 배포&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;#1 AWS 계정 생성&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c20IBS/btsAzDPWf2N/vJgGKS20Rg18HObM5kUxFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c20IBS/btsAzDPWf2N/vJgGKS20Rg18HObM5kUxFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c20IBS/btsAzDPWf2N/vJgGKS20Rg18HObM5kUxFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc20IBS%2FbtsAzDPWf2N%2FvJgGKS20Rg18HObM5kUxFK%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;851&quot; height=&quot;427&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MI5OR/btsACm72N4B/RXnIRhKFbckCfjifBAZeP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MI5OR/btsACm72N4B/RXnIRhKFbckCfjifBAZeP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MI5OR/btsACm72N4B/RXnIRhKFbckCfjifBAZeP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMI5OR%2FbtsACm72N4B%2FRXnIRhKFbckCfjifBAZeP0%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;853&quot; height=&quot;731&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7ETa5/btsAAN5UXAn/faTt1AxEz4L1KvHGbpXYUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7ETa5/btsAAN5UXAn/faTt1AxEz4L1KvHGbpXYUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7ETa5/btsAAN5UXAn/faTt1AxEz4L1KvHGbpXYUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7ETa5%2FbtsAAN5UXAn%2FfaTt1AxEz4L1KvHGbpXYUK%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;709&quot; height=&quot;771&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xYZqZ/btsAFqIQqNI/WedMnRHm7JV3qcY3c93Sr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xYZqZ/btsAFqIQqNI/WedMnRHm7JV3qcY3c93Sr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xYZqZ/btsAFqIQqNI/WedMnRHm7JV3qcY3c93Sr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxYZqZ%2FbtsAFqIQqNI%2FWedMnRHm7JV3qcY3c93Sr0%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;715&quot; height=&quot;533&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;533&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: #1a5490;&quot;&gt;#2 Terraform 설치 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/install?product_intent=terraform&quot;&gt;https://developer.hashicorp.com/terraform/install?product_intent=terraform&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700458057236&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;Install | Terraform | HashiCorp Developer&quot; data-og-description=&quot;Explore Terraform product documentation, tutorials, and examples.&quot; data-og-host=&quot;developer.hashicorp.com&quot; data-og-source-url=&quot;https://developer.hashicorp.com/terraform/install?product_intent=terraform&quot; data-og-url=&quot;https://developer.hashicorp.com/terraform/install?product_intent=terraform&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dsgGiZ/hyUCfGWW4s/KvenRDTgWuI7JcmYbgt2n1/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/bgBHpM/hyUB4k7LK4/kmi0ky8Ng7PUlKZ7XwuyuK/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800&quot;&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/install?product_intent=terraform&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.hashicorp.com/terraform/install?product_intent=terraform&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dsgGiZ/hyUCfGWW4s/KvenRDTgWuI7JcmYbgt2n1/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/bgBHpM/hyUB4k7LK4/kmi0ky8Ng7PUlKZ7XwuyuK/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800');&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;Install | Terraform | HashiCorp Developer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Explore Terraform product documentation, tutorials, and examples.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.hashicorp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb08d6/btsAvXaLVoi/kFhfu96EK34axoB4DDZGQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb08d6/btsAvXaLVoi/kFhfu96EK34axoB4DDZGQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb08d6/btsAvXaLVoi/kFhfu96EK34axoB4DDZGQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb08d6%2FbtsAvXaLVoi%2FkFhfu96EK34axoB4DDZGQ1%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;784&quot; height=&quot;484&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700464442903&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; set path
Path=C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Bandizip\;C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\Git\cmd;C:\Program Files\Microsoft VS Code\bin;C:\Program Files\jdk-17.0.2\bin;C:\Program Files\Go\bin;c:\Users\myanj\Downloads\openssl-0.9.8k_X64\bin\;c:\Users\myanj\Downloads\openssl-0.9.8k_X64\;C:\HashiCorp\Vagrant\bin;C:\minikube;C:\Program Files (x86)\Bitvise SSH Client;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files\nodejs\;C:\Program Files\Amazon\AWSCLIV2\;C:\Users\myanj\AppData\Local\Programs\Python\Python311\Scripts\;C:\Users\myanj\AppData\Local\Programs\Python\Python311\;C:\Users\myanj\AppData\Local\Microsoft\WindowsApps;C:\Users\myanj\go\bin;C:\Users\myanj\AppData\Roaming\npm
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

경로에 넣으면 어디에서든지 사용가능

C:\aws&amp;gt; terraform
Usage: terraform [global options] &amp;lt;subcommand&amp;gt; [args]
. . .&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;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;#3 AWS 계정 정보를 등록&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700464472591&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\User&amp;gt;aws configure
AWS Access Key ID [****************V6F4]: 사용자 생성시 발급받은 Access Key
AWS Secret Access Key [****************1/Sz]: 사용자 생성시 발급받은 Secret Key
Default region name [ap-northeast-2]:
Default output format [json]:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;#4 기본 VPC를 추가&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;기본 vpc가 없는 경우 =&amp;gt; 가상 네트워크를 생성하기 위해&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rf8Me/btsAxcZ12iy/TB47Wxw9EBT61hhHjmCOD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rf8Me/btsAxcZ12iy/TB47Wxw9EBT61hhHjmCOD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rf8Me/btsAxcZ12iy/TB47Wxw9EBT61hhHjmCOD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frf8Me%2FbtsAxcZ12iy%2FTB47Wxw9EBT61hhHjmCOD1%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;784&quot; height=&quot;124&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;190&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;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;#5 terraform provider 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700470984667&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

# 사용하려는 공급자를 구성
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs
provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}


# 일반적인 리소스 생성 구문
# resource &quot;&amp;lt;PROVIDER&amp;gt;_&amp;lt;TYPE&amp;gt;&quot; &quot;&amp;lt;NAME&amp;gt;&quot; {
#     [CONFIG ...]    
# }
resource &quot;aws_instance&quot; &quot;example&quot; {
  ami = &quot;ami-086cae3329a3f7d75&quot;     # 인스턴스 실행에 사용할 머신 이미지 =&amp;gt; 반드시 Ubuntu 이미지를 사용
  instance_type = &quot;t2.micro&quot;        # 인스턴스 유형                       ~~~~~ 사용자 데이터 실행을 위해 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- terraform 초기화&lt;/p&gt;
&lt;pre id=&quot;code_1700472350773&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform init
Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v5.26.0...				&amp;lArr; provider를 가져와서 설치
- Installed hashicorp/aws v5.26.0 (signed by HashiCorp)
...&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 id=&quot;code_1700472736892&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.example will be created
  + resource &quot;aws_instance&quot; &quot;example&quot; {
      + ami                                  = &quot;ami-01123b84e2a4fba05&quot;
      + arn                  
...&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 id=&quot;code_1700472835212&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.example will be created
  + resource &quot;aws_instance&quot; &quot;example&quot; {
      + ami                            
...&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;1240&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZxK19/btsAzcZjLdL/ShfhKfnBGYA8eikjNnEBB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZxK19/btsAzcZjLdL/ShfhKfnBGYA8eikjNnEBB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZxK19/btsAzcZjLdL/ShfhKfnBGYA8eikjNnEBB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZxK19%2FbtsAzcZjLdL%2FShfhKfnBGYA8eikjNnEBB1%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;784&quot; height=&quot;555&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cId5xr/btsABzT2iDt/sySuAomxEbewe66ZGr2NY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cId5xr/btsABzT2iDt/sySuAomxEbewe66ZGr2NY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cId5xr/btsABzT2iDt/sySuAomxEbewe66ZGr2NY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcId5xr%2FbtsABzT2iDt%2FsySuAomxEbewe66ZGr2NY1%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;784&quot; height=&quot;349&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7akxi/btsAxVqbL2k/CUBvlCjC4iuM0d8HhQsVgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7akxi/btsAxVqbL2k/CUBvlCjC4iuM0d8HhQsVgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7akxi/btsAxVqbL2k/CUBvlCjC4iuM0d8HhQsVgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7akxi%2FbtsAxVqbL2k%2FCUBvlCjC4iuM0d8HhQsVgK%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;784&quot; height=&quot;232&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;.tstate 실행된 정보들이 적혀있음&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.lock 테라폼에서 관리하는 파일&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;gt; 협업 시 동일한 인프라를 구성하기 위해&amp;nbsp; 깃헙에 default 파일들을 공유&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#6 main.tf를 수정 - 인스턴스의 이름을 부여&amp;nbsp; &amp;nbsp;&lt;/span&gt; &amp;nbsp; &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUvGMj/btsAF4el4QJ/ZikqWmUwSO4EdUTlUXmEGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUvGMj/btsAF4el4QJ/ZikqWmUwSO4EdUTlUXmEGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUvGMj/btsAF4el4QJ/ZikqWmUwSO4EdUTlUXmEGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUvGMj%2FbtsAF4el4QJ%2FZikqWmUwSO4EdUTlUXmEGK%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;784&quot; height=&quot;555&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700462151205&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###
provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance
resource &quot;aws_instance&quot; &quot;example&quot; {
  ami = &quot;ami-01123b84e2a4fba05&quot;
  instance_type = &quot;t2.micro&quot;
&amp;lt;======================================
  tags = {
    Name = &quot;terraform-example&quot;
  }
  ======================================&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700461562920&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
aws_instance.example: Refreshing state... [id=i-060ecf5b27718c689]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # aws_instance.example will be updated in-place
  ~ resource &quot;aws_instance&quot; &quot;example&quot; {
        id                                   = &quot;i-060ecf5b27718c689&quot;
      ~ tags                                 = {
          + &quot;Name&quot; = &quot;terraform-example&quot;
        }
      ~ tags_all                             = {
          + &quot;Name&quot; = &quot;terraform-example&quot;
        }
        # (30 unchanged attributes hidden)

        # (8 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_instance.example: Modifying... [id=i-060ecf5b27718c689]
aws_instance.example: Modifications complete after 1s [id=i-060ecf5b27718c689]

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.&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;1239&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyy4Uk/btsAw4HxtIQ/TMuJ1BRP1SFJkCVNlKdWL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyy4Uk/btsAw4HxtIQ/TMuJ1BRP1SFJkCVNlKdWL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyy4Uk/btsAw4HxtIQ/TMuJ1BRP1SFJkCVNlKdWL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyy4Uk%2FbtsAw4HxtIQ%2FTMuJ1BRP1SFJkCVNlKdWL1%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;784&quot; height=&quot;108&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #456771;&quot;&gt;&lt;b&gt;단일 웹 서버 배포 - HTTP 요청에 응답할 수 있는 웹 서버를 EC2 배포&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;#1 코드 수정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700462057167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
echo &quot;Hello, World&quot; &amp;gt; index.html
nohup busybox httpd -f -p 8080 &amp;amp;

==&amp;gt; 간단한 웹 서버를 띄움 / 8080으로 접근하면 Hello, World 를 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700462302183&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###
provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
  ami = &quot;ami-01123b84e2a4fba05&quot;
  instance_type = &quot;t2.micro&quot;
  
  =============================================
  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#user_data
  # 사용자 데이터는 첫번째 부팅 시에만 실행
  # EC2 생성시 작성했던 userdata 와 같음
  =============================================
  user_data = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p 8080 &amp;amp;
  EOF
  =============================================
  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#user_data_replace_on_change
  # user_data가 변경되면 원래 인스턴스를 종료하고 새로운 인스턴스를 시작

  user_data_replace_on_change = true
  =============================================
  
  tags = {
    Name = &quot;terraform-example&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #383a42; text-align: start;&quot;&gt;** user_data_replace_on_change&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; : userdata 수정시 삭제하고 새로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;#2 재배포&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700463576240&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
aws_instance.example: Refreshing state... [id=i-060ecf5b27718c689]

   . . . 

    }

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_instance.example: Destroying... [id=i-060ecf5b27718c689]
aws_instance.example: Still destroying... [id=i-060ecf5b27718c689, 10s elapsed]
aws_instance.example: Still destroying... [id=i-060ecf5b27718c689, 20s elapsed]
aws_instance.example: Destruction complete after 30s
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Creation complete after 22s [id=i-004016526705354cc]

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.&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;1241&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEj32y/btsAzA6VgcC/bsvpar3ykTKUHmheqpf0gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEj32y/btsAzA6VgcC/bsvpar3ykTKUHmheqpf0gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEj32y/btsAzA6VgcC/bsvpar3ykTKUHmheqpf0gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEj32y%2FbtsAzA6VgcC%2Fbsvpar3ykTKUHmheqpf0gK%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;784&quot; height=&quot;343&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #073763;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#3 새 인스턴스의 퍼블릭 주소 접근&lt;/span&gt; &lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #073763;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rArr; 8080 포트로 접속이 허용되지 않음 = ssh 로 붙을 수 없음 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Usml1/btsAzBdIV6P/YTr22JkKpI2Nfs9uEf9wB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Usml1/btsAzBdIV6P/YTr22JkKpI2Nfs9uEf9wB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Usml1/btsAzBdIV6P/YTr22JkKpI2Nfs9uEf9wB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUsml1%2FbtsAzBdIV6P%2FYTr22JkKpI2Nfs9uEf9wB0%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;784&quot; height=&quot;477&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #073763;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#4 인바운드 8080 포트를 허용하는 보안그룹을 추가&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700463260904&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###
provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
  ami = &quot;ami-01123b84e2a4fba05&quot;
  instance_type = &quot;t2.micro&quot;
&amp;lt;================================================  
  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#vpc_security_group_ids
  vpc_security_group_ids = [aws_security_group.webserversg.id]
================================================&amp;gt;
  user_data = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p 8080 &amp;amp;
  EOF

  user_data_replace_on_change = true
  
  tags = {
    Name = &quot;terraform-example&quot;
  }
}

&amp;lt;================================================
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = 8080
    to_port     = 8080
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}
================================================&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700463555272&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
aws_instance.example: Refreshing state... [id=i-004016526705354cc]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
  + create
  ~ update in-place
...
       ~ vpc_security_group_ids               = [
          - &quot;sg-0380b404f6530ca72&quot;,
        ] -&amp;gt; (known after apply)
...

aws_security_group.webserversg: Creating...
aws_security_group.webserversg: Creation complete after 1s [id=sg-0c791caedd7ddd330]
aws_instance.example: Modifying... [id=i-004016526705354cc]
aws_instance.example: Modifications complete after 2s [id=i-004016526705354cc]

Apply complete! Resources: 1 added, 1 changed, 0 destroyed.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;***ERROR&lt;/span&gt;&lt;/b&gt;&amp;nbsp; user_data 의 내용이 실행되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Amazon Linux 이미지에는 busybox 명령어가 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결방안 busybox 를 설치 or ubuntu 이미지로 변경&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: #073763;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#5 Amazon Linux 이미지를 ubuntu 이미지로 변경 후 배포&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700465035680&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### main.tf ###

provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
&amp;lt;========================================
  ami = &quot;ami-086cae3329a3f7d75&quot;     # 인스턴스 실행에 사용할 머신 이미지 =&amp;gt; 반드시 Ubunt
========================================&amp;gt; 
  instance_type = &quot;t2.micro&quot;  
}

...&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700466090363&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt;terraform destroy &amp;lt;=보안그룹과 인스턴스 내려감&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;b&gt;&lt;span style=&quot;color: #073763;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#6 브라우저를 이용해서 서비스 접속을 확인&lt;/span&gt;&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;620&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXlqg7/btsAxXhiGiW/7oKi7xKJefIR96S525UrRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXlqg7/btsAxXhiGiW/7oKi7xKJefIR96S525UrRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXlqg7/btsAxXhiGiW/7oKi7xKJefIR96S525UrRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXlqg7%2FbtsAxXhiGiW%2F7oKi7xKJefIR96S525UrRK%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;620&quot; height=&quot;95&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #073763;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#7 종속 관계를 그래프로 확인&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700474663173&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform graph
digraph {
        compound = &quot;true&quot;
        newrank = &quot;true&quot;
        subgraph &quot;root&quot; {
                &quot;[root] aws_instance.example (expand)&quot; [label = &quot;aws_instance.example&quot;, shape = &quot;box&quot;]
                &quot;[root] aws_security_group.webserversg (expand)&quot; [label = &quot;aws_security_group.webserversg&quot;, shape = &quot;box&quot;]
                &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/aws\&quot;]&quot; [label = &quot;provider[\&quot;registry.terraform.io/hashicorp/aws\&quot;]&quot;, shape = &quot;diamond&quot;]
                &quot;[root] aws_instance.example (expand)&quot; -&amp;gt; &quot;[root] aws_security_group.webserversg (expand)&quot;
                &quot;[root] aws_security_group.webserversg (expand)&quot; -&amp;gt; &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/aws\&quot;]&quot;
                &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/aws\&quot;] (close)&quot; -&amp;gt; &quot;[root] aws_instance.example (expand)&quot;
                &quot;[root] root&quot; -&amp;gt; &quot;[root] provider[\&quot;registry.terraform.io/hashicorp/aws\&quot;] (close)&quot;
        }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1c4587;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #073763;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#7 &lt;b&gt;GraphvizOnline 사이트에서 종속성 그래프를 이미지로 변환&lt;/b&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://dreampuf.github.io/GraphvizOnline&quot;&gt;https://dreampuf.github.io/GraphvizOnline&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYyLwp/btsAFs1nf9D/TlaU69OqOhW2FXuCjxHlWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYyLwp/btsAFs1nf9D/TlaU69OqOhW2FXuCjxHlWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYyLwp/btsAFs1nf9D/TlaU69OqOhW2FXuCjxHlWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYyLwp%2FbtsAFs1nf9D%2FTlaU69OqOhW2FXuCjxHlWk%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;1600&quot; height=&quot;794&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #456771;&quot;&gt;&lt;b&gt;구성 가능한 웹 서버 배포&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스 포트를 입력할 수 있도록 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #073763;&quot;&gt;입력 변수 정의&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;variable &quot;NAME&quot; {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[CONFIG ...]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변수가 어떻게 사용되는지 문서화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;값이 전달되지 않을 때 사용하는 기본값&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type 제약 조건을 적용 (string, number, bool, list, map, set, object, tuple, any 등)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;validation&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력 변수에 대한 유효성 검사&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sensitive&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;민감 정보인 경우, plan 또는 apply를 실행할 때 기록하지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700466447249&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
  ami           = &quot;ami-086cae3329a3f7d75&quot;
  instance_type = &quot;t2.micro&quot;
  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#vpc_security_group_ids
  vpc_security_group_ids = [aws_security_group.webserversg.id]
  user_data              = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p 8080 &amp;amp;
  EOF

  user_data_replace_on_change = true

  tags = {
    Name = &quot;terraform-example&quot;
  }
}

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = 8080
    to_port     = 8080
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}
&amp;lt;====================================================
variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
}
====================================================&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt; 변수값 지정 #1 기본값이 설정되지 않은 입력 변수를 정의하지 않은 상태에서 terraform apply&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700466490120&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply

var.service_port
  Service Port for HTTP Request
  Enter a value: 				&amp;lArr; 입력 변수를 입력하도록 프롬프트를 제공&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;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;변수값 지정 #2&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;var 옵션을 이용해서 변수 값을 제공&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700466572689&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform plan -var &quot;service_port=8080&quot;

aws_security_group.webserversg: Refreshing state... [id=sg-0e6dca42f57a8b3f5]

aws_instance.example: Refreshing state... [id=i-06e3a32a8e93a8958]
No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no

changes are needed.&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;span style=&quot;color: #1a5490;&quot;&gt; &lt;b&gt;변수값 지정 #3 &lt;/b&gt;&lt;b&gt;TF_VAR_&amp;lt;변수이름&amp;gt; 이름의 환경 변수를 이용해서 변수 값을 제공&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700466777041&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; set TF_VAR_service_port=8080			&amp;lArr; 환경변수 설정

C:\aws&amp;gt; echo %TF_VAR_service_port%			&amp;lArr; 환경변수 확인
8080

C:\aws&amp;gt; terraform plan
aws_security_group.webserversg: Refreshing state... [id=sg-0e6dca42f57a8b3f5]		
&amp;lArr; 변수 값을 묻지 않고 진행
aws_instance.example: Refreshing state... [id=i-06e3a32a8e93a8958]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no
changes are needed.&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;span style=&quot;color: #1a5490;&quot;&gt; &lt;b&gt;기본값 설정&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700466987649&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
  ami           = &quot;ami-086cae3329a3f7d75&quot;
  instance_type = &quot;t2.micro&quot;
  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#vpc_security_group_ids
  vpc_security_group_ids = [aws_security_group.webserversg.id]
  user_data              = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p 8080 &amp;amp;
  EOF

  user_data_replace_on_change = true

  tags = {
    Name = &quot;terraform-example&quot;
  }
}

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = 8080
    to_port     = 8080
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
  default     = 8080						&amp;lt;= 기본값으로 설정
}&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;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;변수 참조하는 방법 &amp;rArr; var.&amp;lt;변수이름&amp;gt;&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700467177002&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
  ami                    = &quot;ami-086cae3329a3f7d75&quot;
  instance_type          = &quot;t2.micro&quot;
  vpc_security_group_ids = [aws_security_group.webserversg.id]
  user_data              = &amp;lt;&amp;lt;-EOF
    #!/bin/bash
    echo &quot;Hello, World&quot; &amp;gt; index.html
    nohup busybox httpd -f -p ${var.service_port} &amp;amp;  		&amp;lt;= 변수 적용
  EOF

  user_data_replace_on_change = true

  tags = {
    Name = &quot;terraform-example&quot;
  }
}

resource &quot;aws_security_group&quot; &quot;webserversg&quot; {
  name = &quot;terraform-example-webserversg&quot;

  ingress {
    from_port   = var.service_port					&amp;lt;= 변수 사용
    to_port     = var.service_port
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}

variable &quot;service_port&quot; {
  description = &quot;Service Port for HTTP Request&quot;
  type        = number
  default     = 8080
}
&amp;lt;====================================
output &quot;public_ip&quot; {						&amp;lt;= 출력
  value       = aws_instance.example.public_ip
  description = &quot;Public IP for WebServer&quot;
}
====================================&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700467263637&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform apply
aws_security_group.webserversg: Refreshing state... [id=sg-0e6dca42f57a8b3f5]
aws_instance.example: Refreshing state... [id=i-06e3a32a8e93a8958]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no
changes are needed.

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

public_ip = &quot;3.35.175.254&quot;		=&amp;gt; public IP 가 출력되는 것을 확인&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;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;변경 사항을 적용하지 않고 출력만 확인할 때&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700467288682&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform output
public_ip = &quot;3.35.175.254&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;리소스 정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1700467387409&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\aws&amp;gt; terraform destroy
aws_security_group.webserversg: Refreshing state... [id=sg-0e6dca42f57a8b3f5]
aws_instance.example: Refreshing state... [id=i-06e3a32a8e93a8958]
...&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>terraform</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/40</guid>
      <comments>https://kalswn.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 20 Nov 2023 19:08:59 +0900</pubDate>
    </item>
    <item>
      <title>AWS - EC2</title>
      <link>https://kalswn.tistory.com/39</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;EC2 ( Elastic Compute Cloud)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;안전하고 크기 조정이 가능한 컴퓨팅 파워를 클라우드에서 제공하는 웹 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;안정적인 확장 가능한 인프라에 온디맨드로 액세스&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;99.99%의 가용성을 지원하는 SLA 약정을 기반으로 몇 분 안에 용량 크기를 조정&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;AMI (Amazon Machine Image)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인스턴스를 시작하는데 필요한 정보를 제공하는 AWS에서 지원되고 유지 관리되는 이미지&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;EBS(Elastic Block Store)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;EC2를 위해 설계된 사용이 쉽고 확장 가능한 고성능 블록 스토리지 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;EBS 볼륨은 특정 가용 영역에 위치하며 자동으로&amp;nbsp; 복제되므로, 단일 구성 요소에 장애가 발생하더라도 안정하게 보호됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;모든 EBS볼륨 유형은 안정적인 스냅샷 기능을 제공하며, 높은 가용성을 제공하도록 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp;- EBS 스냅샷&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;데이터의 특정 시점 복사본이며, 재해 복구를 지원하고 리전 및 계정 간에 데이터를 마이그레이션하며 백업 규정 준수를 개선하는데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EIP (Elastic IP, 탄력적 IP)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;정적 IPv4 주소로, AWS 계정에 할당되며 릴리스할 때까지 할당된 상태를 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;EC2 인스턴스를 중지하고 다시 시작하면 퍼블릭 IP주소가 변경되나, EC2 인스턴스에 EIP주소를 연결하면 다시 시작해도 동일한 IP 주소로 접속이 가능&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;ELB(Elastic Load Balacing)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;네트워크 트래픽 분산을 통해 어플리케이션 확장성 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;Amazon EC2 Auto Scaling&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;변화하는 수요에 동적으로 대응하고 비용을 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;비정상적인 인스턴스 교체 / 수요에 맞게 확장&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>EC2</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/39</guid>
      <comments>https://kalswn.tistory.com/39#entry39comment</comments>
      <pubDate>Sat, 18 Nov 2023 19:17:41 +0900</pubDate>
    </item>
    <item>
      <title>AWS - VPC</title>
      <link>https://kalswn.tistory.com/38</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1t9Pl/btsAxH5XXln/Xnofbp1ktKu0taFcamRuC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1t9Pl/btsAxH5XXln/Xnofbp1ktKu0taFcamRuC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1t9Pl/btsAxH5XXln/Xnofbp1ktKu0taFcamRuC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1t9Pl%2FbtsAxH5XXln%2FXnofbp1ktKu0taFcamRuC1%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;594&quot; height=&quot;405&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;VPC(Virtual Private Cloud)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AWS 사용자 계정 전용 가상 네트워크&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AWS 클라우드에서 다른 가상 네트워크와 논리적으로 분리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하나의 AWS 리전 안에서만 존재할 수 있고, 한 리전에 만든 VPC는 다른 리전에서는 보이지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;생성시 RFC 1918에 지정된 프라이빗 주소 체계 사용을 권장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;10.0.0.0/8&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt; &amp;nbsp; &amp;rArr; 10.0.0.0 - 10.255.255.255 &lt;/span&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;A클래스 사설 네트워크 주소 영역&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&amp;nbsp;- 172.16.0.0/12&amp;nbsp; &amp;rArr; 172.16.0.0 - 172.31.255.255 &lt;/span&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;B클래스 사설 네트워크 주소 영역&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&amp;nbsp;- 192.168.0.0/16 &amp;rArr; 192.168.0.0 - 192.168.255.255 &lt;/span&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;C클래스 사설 네트워크 주소 영역&lt;/span&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;기본 VPC (default VPC)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;각 AWS 리전에는 기본 VPC가 존재&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;각 가용 영역의 퍼블릭 서브넷, 인터넷 게이트웨이, 및 DNS 확인 활성화 설정과 함께 제공&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;VPC 구성 옵션&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 가용영역 (AZ, Avality Zone)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; AWS 리전에 중복 전원, 네트워킹 및 연결이 있는 하나 이상의 개별 데이터 센터&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 인터넷 게이트웨이&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 인터넷(누구나 연결할 수 있는 public 망) 에 vpc 연결&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 외부와 연결하기 위한 중계역할&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- NAT 게이트 웨이&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; private 서브넷의 인스턴스가 아웃바운드 트랩픽을 전송할 수 있도록 하지만 인터넷의 리소스가 인스턴스에 연결하는 것을 방지&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 서브넷(subnet)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; vpc 내 논리 구분&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 인스턴스는 서브넷 안에 위치 =&amp;gt; EC2 인스턴스를 배치하는 장소&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;-- 한번 서브넷에 인스턴스를 생성하면 다른 서브넷으로 옮길 수 없음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 인스턴스를 서로 격리하고, 인스턴스 간의 트래픽 흐름(public에 있는 인스턴스가 private 인스턴스로의 접근)을 제어하고, 인스턴스를 기능별로 묶는 역할&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 하나의 가용영역내에서만 존재할 수 있음&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 서브넷 CIDR 블록&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;** CIDR(Class Inter Domain Routing) : 주소의 영역을 여러 네트워크 영역으로 나누기 위해 IP를 묶는 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; CIDR 블록 : 주소 범위를 지정 0.0.0.0/&lt;u&gt;16&lt;/u&gt;&amp;nbsp;&amp;nbsp; 밑줄친 부분&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;VPC의 일부, VCP 내에서는 unique 해야함&lt;/span&gt;&lt;span style=&quot;color: #0b6125;&quot;&gt; = 중첩되면 안됨&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 모든 서브넷에서 처음 4개의 IP와 마지막 1개는 예약되어 있으므로 인스턴스에 할당할 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; --예) 서브넷 CIDR이 172.16.100.0/24인 경우&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;172.16.100.0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;네트워크 주소&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 172.16.100.1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AWS에서 VPC 라우터용으로 예약&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 172.16.100.2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNS 서버 주소&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 172.16.100.3&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AWS에서 나중에 사용하려고 예약&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 172.16.100.255 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;네트워크 브로드캐스트 주소&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; public 서브넷 : 서브넷이 인터넷 게이트 웨이로 향하는 라우팅이 있는 라우팅 테이블과 연결된 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; private 서브넷 : 서브넷이 인터넷 게이트 웨이로 향아는 라우팅이 없는 라우팅 테이블과 연결된 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 탄력적 네트워크 인터페이스(ENI, Elastic Network Interface)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 물리 서버의 네트워크 인터페이스와 같은 기능을 수행 = 네트워크 카드 서비스&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; VPC에서 가상 네트워크 카드를 나타내는 논리ㅐ적 네트워크 구성 요소&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 여러 네트워크에 접근할 수 있음( 네크워크 카드를 뺐다 꼈다 하는 것과 같은 원리)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 인터넷 게이트웨이(IGW, Internet Gate Way)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 퍼블릭 IP 주소를 갖는 인스턴스가 인터넷에 연결할 수 있도록 기능을 제공&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 처음 VPC( default VPC x = 직접 생성한 VPC)를 만들면 IGW가 연결되어 있지 않으므로, 직접 IGW를 만들고 생성한 VPC와 연결해야 함&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 하나의 VPC에는 하나의 IGW 만 연결 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 라우팅(routing)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; VPC의 네트워크 트래픽을 전달할 위치를 결정하는데 사용되는 규칙&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 트래픽을 전달할 IP 주소 범위(대상 주소)와 트래픽을 전송할 게이트웨이, 네트워크 인터페이스 또는 연결(대상)을 지정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; VPC는 소프트웨어 함수로 IP 라우팅을 구현 -&amp;gt; 사용자는 라우팅 테이블만 관리&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 라우팅테이블(routing table)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 라우팅의 집합으로, 서브넷과 연결할 수 있음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 라우팅 테이블의 항목들간의 순서는 중요하지 않음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; default 라우팅 테이블 =&amp;gt; VPC와 함께 자동으로 제공되는 라우팅 테이블&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; -- 기본 vpc인 경우, local 및 igw로의 라우팅을 포함&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; -- 기본 vpc가 아닌 경우, local 라우팅만 포함&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; -- 예시&lt;/span&gt;&lt;/span&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 style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;---------------------------------&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;---------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;대상 주소&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대상&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;---------------------------------&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;---------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;10.0.0.0/16&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Local&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2001:db8:1234:1a00::/56&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Local&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;172.31.0.0/16&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pcx-11223344556677889&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 0.0.0.0/0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;igw-12345678901234567&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;::/0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;eigw-aabbccddee1122334&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;---------------------------------&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;---------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;VPC(10.0.0.0/16) 내에서 라우팅되는 IPv4 트래픽은 Local 경로로 처리&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;VPC(2001:db8:1234:1a00::/56) 내에서 라우팅되는 IPv6 트래픽은 Local 경로로 처리&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;172.31.0.0/16의 경로는 피어링 연결로 트래픽을 전송&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 IPv4 트래픽(0.0.0.0/0)의 경로는 인터넷 게이트웨이로 트래픽을 전송 &amp;rArr; VPC 내 그리고 피어링 연결을 통한 트래픽을 제외한 모든 IPv4 트래픽은 인터넷 게이트웨이로 라우팅&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 IPv6 트래픽(::/0)의 경로는 외부 전용 인터넷 게이트웨이로 트래픽을 전송 &amp;rArr; VPC 내 트래픽을 제외한 모든 IPv6 트래픽은 외부 전용 인터넷 게이트웨이로 라우팅&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- 보안그룹(security group)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 인스턴스의 ENI(Elastic Network Ip) 에서 송수신하는 트래픽을 제어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 모든 ENI는 최소 한 개 이상의 보안 그룹과 연결되어야 하고, 보안그룹은 여러 ENI와 연결될 수 있음 (N:N)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 생성할때 보안그룹 이름, 설명, 포함될 vpc를 지정하고, 생성 후에 인바운드(인스턴스로 들어옴), 아웃바운드(인스턴스에서 나감) 규칙을 지정 =&amp;gt; 트래픽을 허용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;상태 저장 방화벽 역할&lt;/span&gt; =&amp;gt; 보안 그룹이 트래픽을 한 방향으로 전달하도록 허용할 때 반대 방향의 응답 트래픽을 지능적으로 허용 = 인바운드 source port를 기억하고 아웃바운드시 기억한 port를 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- 네트워크 접근 제어 리스트(NACL, Network Access Control List)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 원본 또는 대상 주소 CIDR,프로토콜, 포트를 기반 트래픽을 인바운드,아웃바운드 규칙으로 제어 =&amp;gt; 방어벽과 같은 역할&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 서브넷에 연결되어 해당 서브넷과 송수신되는 트래픽을 제어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;상태비저장&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; -- NACL을 통과한 연결상태를 추적하지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; -- 모든 인바운드와 아웃바운드 트래픽의 허용 규칙을 별도로 작성해야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 규칙을 적용할 때 규칙 번호의 오름차순으로 처리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;보안그룹 vs NACL&lt;/b&gt;&lt;/span&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 style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 보안 그룹 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; NACL &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;인스턴스 레벨에서 운영&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;서브넷 레벨에서 운영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;허용 규칙만 지원&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;허용 및 거부 규칙 지원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;트래픽 허용 여부를 결정하기 전에 모든 규칙을 평가 =&amp;gt; 전체를 평가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;트래픽 허용 여부를 결정할 때 가장 낮은 번호의 규칙부터 순서대로 규칙을 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상태 저장 : 규칙에 관계없이 반환 트래픽이 허용됨&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;인바운드가 저장되면 아웃바운드는 자동으로 저장&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상태 비저장 : 반환 트래픽이 규칙에 따라 명시적으로 허용되어야함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/38</guid>
      <comments>https://kalswn.tistory.com/38#entry38comment</comments>
      <pubDate>Sat, 18 Nov 2023 17:23:26 +0900</pubDate>
    </item>
    <item>
      <title>AWS - IAM</title>
      <link>https://kalswn.tistory.com/37</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;AWS IAM (Identity and Access Management)&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;ID(IAM 자격 증명)&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;AWS 계정 루트 사용자&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정 생성 시 해당 계정의 모든 AWS 서비스 및 리소스에 대한 완전한 액세스 권한이 있는 단일 로그인 ID&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;사용자(user)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS의 기능과 자원을 이용하는 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람 또는 어플리케이션에 대한 특정 권한을 가지고 있는 AWS 계정 내 자격 증명&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;background-color: #c1bef9;&quot;&gt;- 사용자를 식별하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 사용자 생성 시 지정한 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 사용자의&amp;nbsp; 고유 식별자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) ARN(Amazon Resource Name) =&amp;gt; &lt;span style=&quot;color: #000000;&quot;&gt;arn:aws:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;region&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;account-id&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;resource &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&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;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;- 사용자의 자격증명 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) AWS Management Console 암호 =&amp;gt; 사람이 AWS서비스를 사용하기 위해서 로그인할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Access Key = Access Key ID + Secret Access Key =&amp;gt; 프로그램 방식으로 서비스를 사용할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) ssh 키 =&amp;gt; AWS에 생성한 EC2 인스턴스로 SSH 접속할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 서버 인증서&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;사용자 그룹(user group)&lt;/span&gt;&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;권한(permission)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS의 서비스나 자원에 어떤 작업을 수행할수 있는지 여부를 명시한 규칙&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;정책(policy)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자격 증명이나 리소스와 연결될 때 해당 권한을 정의하는 AWS의 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;- 자격증명 기반 정책 = 아이덴티티 정책&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&amp;nbsp;--관리형정책 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다수의 사용자, 그룹, 역할에 독립적으로 연결할 수 있는 자격 증명 기반 정책&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS 관리형 정책 AWS가 미리 예측해서 만들어놓은 정책&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;background-color: #c1bef9;&quot;&gt;&amp;nbsp;--인라인정책&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;- 리소스 기반 정책&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청이 적용되는 AWS 리소스(=서비스) 측에 연결하는 정책&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;- 권한 경계 (permission boundary)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IAM 사용자 및 역할에 부여할 수 있는 권한의 최대범위를 제한하는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IAM 사용자와 권한경계 교집합 = IAM 사용자 권한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;- 서비스 제어 정책(SCP, Service Control Policies)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조직의 권한을 관리하는데 사용할 수 있는 &lt;span style=&quot;color: #8a3db6;&quot;&gt;조직&lt;/span&gt; 정책 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;여러 AWS 계정에 걸쳐 중앙에서 AWS 서비스를 제어&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;- 접근 제어 목록(ACL, Access Control List)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9; color: #333333; text-align: start;&quot;&gt;- 세션 정책&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;역할 또는 페더레이션 사용자에 대해 임시 세션을 프로그래밍 방식으로 생성할 때 파라미터로 전달하는 고급 정책&lt;/span&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9; color: #333333; text-align: start;&quot;&gt;- json 정책&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;version : 정책 문서의 형식 버전&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sid : 정책을 설명하기위한 용도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Effect : Action이나 Resource에 대해서 허용하는 정책 or 거부하는정책 , 명시적으로 거부(=일반적으로 거부)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Principal (선택 ) : 특정사용자 or 그룹에게 권한 부여&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Action : 정책이 허용하거나 거부하는 작업목록&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Resource: 해당 Action안에서 리소스를 특정지을때&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;condition(선택) : 정책을 세부적으로 제안할 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;역할(role)&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;객체가 사용자가 아닌 서비스나 다른 AWS 계정의 사용자&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 아닌 특정 서비스에서 생성한 객체에 권한을 부여하는 데 사용&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>IAM</category>
      <category>역할</category>
      <category>정책</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/37</guid>
      <comments>https://kalswn.tistory.com/37#entry37comment</comments>
      <pubDate>Sat, 18 Nov 2023 12:13:22 +0900</pubDate>
    </item>
    <item>
      <title>11월 1주차 (23.11.01 - 23.11.07)</title>
      <link>https://kalswn.tistory.com/34</link>
      <description>&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DAY1.&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMpDw4/btszL0rXNuW/tBoE6hQRjHXUnoKWzJ1MKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMpDw4/btszL0rXNuW/tBoE6hQRjHXUnoKWzJ1MKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMpDw4/btszL0rXNuW/tBoE6hQRjHXUnoKWzJ1MKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMpDw4%2FbtszL0rXNuW%2FtBoE6hQRjHXUnoKWzJ1MKK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;운동했다&lt;br /&gt;프로젝트했다&lt;br /&gt;하루가 끝났다&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DAY2.&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfTkud/btszUstVVTy/e0JIVF6fhIhYUDT5EiE1z1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfTkud/btszUstVVTy/e0JIVF6fhIhYUDT5EiE1z1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfTkud/btszUstVVTy/e0JIVF6fhIhYUDT5EiE1z1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfTkud%2FbtszUstVVTy%2Fe0JIVF6fhIhYUDT5EiE1z1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EwNab/btszTAFMKXC/pwLtJ1vdRh74BvLB8tmmek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EwNab/btszTAFMKXC/pwLtJ1vdRh74BvLB8tmmek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EwNab/btszTAFMKXC/pwLtJ1vdRh74BvLB8tmmek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEwNab%2FbtszTAFMKXC%2FpwLtJ1vdRh74BvLB8tmmek%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;1917&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rUDPZ/btszUecJ6UB/rJBoW9KhZkwk3belRcqcO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rUDPZ/btszUecJ6UB/rJBoW9KhZkwk3belRcqcO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rUDPZ/btszUecJ6UB/rJBoW9KhZkwk3belRcqcO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrUDPZ%2FbtszUecJ6UB%2FrJBoW9KhZkwk3belRcqcO0%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;1917&quot; height=&quot;1080&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;20분 수업받고 20분 볼머신기인데 자리남아서 20분 더하고&lt;br /&gt;아침에 유산소 못한거 다했지요 뿌덧&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DAY3.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x5DGa/btszKb0EMTU/Al5Gk9qg0FjbeDriki3Vf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x5DGa/btszKb0EMTU/Al5Gk9qg0FjbeDriki3Vf1/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;1907&quot; style=&quot;width: 60.3635%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;61.07&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x5DGa/btszKb0EMTU/Al5Gk9qg0FjbeDriki3Vf1/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx5DGa%2FbtszKb0EMTU%2FAl5Gk9qg0FjbeDriki3Vf1%2Fimg.jpg&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;2992&quot; height=&quot;1907&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esIKIz/btszLrhkTrn/zXeLFV8mkSaXCSkEz6Dnv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esIKIz/btszLrhkTrn/zXeLFV8mkSaXCSkEz6Dnv0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 38.4737%;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;38.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esIKIz/btszLrhkTrn/zXeLFV8mkSaXCSkEz6Dnv0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesIKIz%2FbtszLrhkTrn%2FzXeLFV8mkSaXCSkEz6Dnv0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;프로젝트 때문에 어제 아침에 운동 못하고 &lt;br /&gt;3시간 자고 플젝 발표하고 레포트 작성하고 테니스 1시간 치고 집 도착 22시에 하자마자 침대에 폰던지고 씻고 누웠는데 그 후 기억이 없다ㅎㅎ 6시에 일어나서 아침운동하러 고고&lt;br /&gt;천국계단 처음에는 6분도 못했는데 이제는 26분 할만하구여 러닝머신보다 더 재밌는거 같다...ㅎ&lt;br /&gt;유산소하면 땀이 이상한곳에서 나는데 이거 맞는거죠??&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kR05D/btszLpDPJ11/v3lk1cekvXR0AcsS4r0cn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kR05D/btszLpDPJ11/v3lk1cekvXR0AcsS4r0cn0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kR05D/btszLpDPJ11/v3lk1cekvXR0AcsS4r0cn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkR05D%2FbtszLpDPJ11%2Fv3lk1cekvXR0AcsS4r0cn0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEvcRi/btszJHMhXgK/M4oKqeSIUsvYCBmbuCERjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEvcRi/btszJHMhXgK/M4oKqeSIUsvYCBmbuCERjk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEvcRi/btszJHMhXgK/M4oKqeSIUsvYCBmbuCERjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEvcRi%2FbtszJHMhXgK%2FM4oKqeSIUsvYCBmbuCERjk%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;점심에 맛집 추천 받아서 미슐랭 임병주 산동칼국수 갔는데 만두사진만 찍고 칼국수 사진은 왜 없는건가요?&lt;br /&gt;그냥 바지락칼국수맛 그냥 만두맛 &lt;br /&gt;칼국수로 빌딩지었다는데 음...?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9mjyP/btszJ0SEdz7/56McV20vczXp5PFxYbQXq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9mjyP/btszJ0SEdz7/56McV20vczXp5PFxYbQXq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9mjyP/btszJ0SEdz7/56McV20vczXp5PFxYbQXq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9mjyP%2FbtszJ0SEdz7%2F56McV20vczXp5PFxYbQXq1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;버스타기전에 과자먹구 핫도그먹구&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DAY4.&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/se0Im/btszQBEHEEc/yi3ZZFOtmzwABs2ifbQWJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/se0Im/btszQBEHEEc/yi3ZZFOtmzwABs2ifbQWJk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/se0Im/btszQBEHEEc/yi3ZZFOtmzwABs2ifbQWJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fse0Im%2FbtszQBEHEEc%2Fyi3ZZFOtmzwABs2ifbQWJk%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;도착하자마자 cu로 엄마택배 심부름 다녀왔구요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B6xHW/btszK5NFT4Y/ysXgw2eDURqs3sZ4lpf5A0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B6xHW/btszK5NFT4Y/ysXgw2eDURqs3sZ4lpf5A0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B6xHW/btszK5NFT4Y/ysXgw2eDURqs3sZ4lpf5A0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB6xHW%2FbtszK5NFT4Y%2FysXgw2eDURqs3sZ4lpf5A0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZWVuC/btszKE3Itlv/IcfF5ChL59GKQBDODJOSs0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZWVuC/btszKE3Itlv/IcfF5ChL59GKQBDODJOSs0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 49.4186%;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZWVuC/btszKE3Itlv/IcfF5ChL59GKQBDODJOSs0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZWVuC%2FbtszKE3Itlv%2FIcfF5ChL59GKQBDODJOSs0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;12시50분 전주 더메이에서 결혼식&lt;br /&gt;15시 군산 호텔은파펠리스웨딩&lt;br /&gt;&amp;nbsp;&lt;br /&gt;전주에서 더메이 웨딩홀 뷔페 맛있다고 소문났는데 축의금내고 식권이 다 소진됐다고 못받는 기이한현상&lt;br /&gt;가려는데 아저씨 한분께서 식권한장 더있다고 초록색 스티커 있으면 다시 들어갈 수 있다고 하셔서&amp;nbsp;&lt;br /&gt;뷔페를 맛보게 되었는데 사람 너무 많아서 정신없고 자리도 없어서 눈치싸움이여서 기가 빨렸다....&lt;br /&gt;내가 만약 결혼식한다면 여기 절대 안해&amp;nbsp; 뷔페도 그저그렇고....&lt;br /&gt;&amp;nbsp;&lt;br /&gt;5년전인가 세계태권도선수권대회 자원봉사하면서 일년에 한번씩이라도 연락했던 팀장님이 결혼을 하게 되어서 서울에서 군산까지 갔지요&lt;br /&gt;신랑님 인스타에서만 보던 환호를 하며 등장 ㅋㅋ 역시 팀장님답다&amp;nbsp;&lt;br /&gt;오랜만에 김태훈매니저님도 보고 딸들도 보고 아기들이 나 좋아하는데..... 딸들이 날 싫어했다는.......&lt;br /&gt;답례품으로 와인받구 인사하고 서울에서 만나기로 했지요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2206&quot; data-origin-height=&quot;2206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLEG0t/btszSKg2pOt/yVXVFlQAHTM6Gw6cu2G4gk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLEG0t/btszSKg2pOt/yVXVFlQAHTM6Gw6cu2G4gk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLEG0t/btszSKg2pOt/yVXVFlQAHTM6Gw6cu2G4gk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLEG0t%2FbtszSKg2pOt%2FyVXVFlQAHTM6Gw6cu2G4gk%2Fimg.jpg&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;2206&quot; height=&quot;2206&quot; data-origin-width=&quot;2206&quot; data-origin-height=&quot;2206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3개월동안 폐인처럼 다녔다가 오랜만에 꾸며서 하나 건짐 S2&lt;br /&gt;&amp;nbsp;&lt;br /&gt;외할머니 집가서 막내이모부랑 막내이모랑 술한잔하면서 간짬뽕이랑 불닭 섞어서 먹구 찰밥에 김 싸먹었습니다요&amp;nbsp;&lt;br /&gt;역시 외할머니 집에서 먹는건 다 맛있어&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DAY5.&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;외할머니집에서 자고 일어나서&lt;br /&gt;블루베리+당근+들깨+검은콩+꿀 등 건강음료 마시고 사과먹고 한숨자고 닭도리탕 먹고 싶다고 하니까 외할머니가 마트에서 닭사오셔서 뚝딱 만들어주고 존마탱..왜 사진 못찍었지.....&lt;br /&gt;점심에 막내이모랑 엄마랑 외할머니랑 고스톱쳐서 침대에 누워서 넷플릭스 봤는데&lt;br /&gt;5분만에 바로 잠들었어요... 이게 바로 번아웃....&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfb57D/btszLuM26IO/3ke74JFivtHiLkRpQzzmGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfb57D/btszLuM26IO/3ke74JFivtHiLkRpQzzmGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfb57D/btszLuM26IO/3ke74JFivtHiLkRpQzzmGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfb57D%2FbtszLuM26IO%2F3ke74JFivtHiLkRpQzzmGk%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NBFpr/btszK5z0Zuu/dotnsjozNiFPcx2wNomLVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NBFpr/btszK5z0Zuu/dotnsjozNiFPcx2wNomLVK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NBFpr/btszK5z0Zuu/dotnsjozNiFPcx2wNomLVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNBFpr%2FbtszK5z0Zuu%2FdotnsjozNiFPcx2wNomLVK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;엄마랑 모듬튀김에 맥주 크~&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DAY6.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg2MuS/btszOPpzHBA/bMbcEmvpFArwR5OaFw8vK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg2MuS/btszOPpzHBA/bMbcEmvpFArwR5OaFw8vK0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 70.1425%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;70.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg2MuS/btszOPpzHBA/bMbcEmvpFArwR5OaFw8vK0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg2MuS%2FbtszOPpzHBA%2FbMbcEmvpFArwR5OaFw8vK0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kC1O3/btszM3VWXX9/b1CfsfkTUWxhVqu0SdVEd0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kC1O3/btszM3VWXX9/b1CfsfkTUWxhVqu0SdVEd0/img.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; style=&quot;width: 28.6947%;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;29.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kC1O3/btszM3VWXX9/b1CfsfkTUWxhVqu0SdVEd0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkC1O3%2FbtszM3VWXX9%2Fb1CfsfkTUWxhVqu0SdVEd0%2Fimg.jpg&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;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;9시까지 가야해서 전주에 하루 더있으려고 첫차타기 5시 45분!&lt;br /&gt;8시30분쯤인가 차가 안움직여서 지도 찍어봤는데 54분.....ㅋㅋㅋㅋ&lt;br /&gt;맘 놓고 있었는데 정체풀리더니 55분쯤 도착해서 뛰어서 지하철타고 달려서 도착&lt;br /&gt;스릴넘쳤다ㅎㅎ&lt;br /&gt;&amp;nbsp;&lt;br /&gt;점심에 뜸들이다에서 어깨살간장덮밥먹고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCgpEF/btszQDJFh4H/KWSLYiPoNNIyMQLzq7h9LK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCgpEF/btszQDJFh4H/KWSLYiPoNNIyMQLzq7h9LK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCgpEF/btszQDJFh4H/KWSLYiPoNNIyMQLzq7h9LK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCgpEF%2FbtszQDJFh4H%2FKWSLYiPoNNIyMQLzq7h9LK%2Fimg.jpg&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;751&quot; height=&quot;282&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1기 발표 엿들으러 가기&lt;br /&gt;머싯다....나도 프로젝트 잘해야지&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;028&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/028.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/028.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DAY7.&lt;br /&gt;&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;2992&quot; data-origin-height=&quot;1729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1ZNq3/btszRVwUk0C/zaL3zCQUA4pzfxU7BzQE7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1ZNq3/btszRVwUk0C/zaL3zCQUA4pzfxU7BzQE7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1ZNq3/btszRVwUk0C/zaL3zCQUA4pzfxU7BzQE7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1ZNq3%2FbtszRVwUk0C%2FzaL3zCQUA4pzfxU7BzQE7k%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;2992&quot; height=&quot;1729&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;1729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;토일월 운동 못하고 오랜만에 유산소했더니 힘들었다... 3일동안 운동을 못하고 먹기만했더니 뱃살 가득 나왔구....26일까지 운동 열심히해야지!&lt;br /&gt;&amp;nbsp;&lt;br /&gt;z플립4 사용하고 있는데&amp;nbsp;&lt;br /&gt;상단화면에 세로줄 생기고 힌지부분에 검은가로줄 생기고 마지막으로 화면이 안켜졌다...&lt;br /&gt;출근도장찍고 서비스센터 다녀왔는데 다행히 무상수리해주신다고......&lt;br /&gt;아이폰으로 바꿀까 했는데 이번에 조심히 사용하고&lt;br /&gt;고장날때까지 사용해야지.....  &lt;br /&gt;&amp;nbsp;&lt;br /&gt;삼성서비스센터 대치점 접수대 12군데 있어서 대기없이 바로 접수했고&lt;br /&gt;수리받는데 40분정도 걸렸습니다!&lt;br /&gt;&amp;nbsp;&lt;br /&gt;힌지부분에 상처있으면 무상수리 안된다고 하니까 확인해보세요!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S4EPw/btszUyIyGKI/8iSXr3QKUrN6dueWdpzws0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S4EPw/btszUyIyGKI/8iSXr3QKUrN6dueWdpzws0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S4EPw/btszUyIyGKI/8iSXr3QKUrN6dueWdpzws0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS4EPw%2FbtszUyIyGKI%2F8iSXr3QKUrN6dueWdpzws0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;한달 개근해서 스타벅스 기프티콘 받았다&lt;br /&gt;기프티콘이 중요한게 아니라 조퇴하고 싶은날 꾹 참고 버텼다는것&lt;br /&gt;뿌듯하다뿌듯해&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YzBVC/btszXZMbj4J/cPQHVk8QDZZecyl5TbJp91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YzBVC/btszXZMbj4J/cPQHVk8QDZZecyl5TbJp91/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YzBVC/btszXZMbj4J/cPQHVk8QDZZecyl5TbJp91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYzBVC%2FbtszXZMbj4J%2FcPQHVk8QDZZecyl5TbJp91%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2oKei/btszU2wbB5E/pGag2cKwftI9Xd6hHzJzA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2oKei/btszU2wbB5E/pGag2cKwftI9Xd6hHzJzA1/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2oKei/btszU2wbB5E/pGag2cKwftI9Xd6hHzJzA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2oKei%2FbtszU2wbB5E%2FpGag2cKwftI9Xd6hHzJzA1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;유튜브에서만 보던 신궁동감자탕에서 뼈찜을 먹었다. 해장국도 같이 나온다.&lt;br /&gt;생각보다 매웠고 예전에 먹었던 청량리? 근처에서 먹었던 음식점이 더 맛있는 것 같다.&lt;br /&gt;매운거 못 먹는 사람은 가지 마세요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnvUhP/btszUANln4P/f88WNYOmSHwLlL2kfaSsrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnvUhP/btszUANln4P/f88WNYOmSHwLlL2kfaSsrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnvUhP/btszUANln4P/f88WNYOmSHwLlL2kfaSsrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnvUhP%2FbtszUANln4P%2Ff88WNYOmSHwLlL2kfaSsrK%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;1916&quot; height=&quot;1080&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;강습받기전 볼머신기 20분 그리고 강습 20분 그리고 볼머신기 50분 정도?&lt;br /&gt;3개월 한번에 결제해서 나름? 저렴하게 강습받고 있는데 사람 많아지면 안되니 끝날때쯤 공개할게요&lt;br /&gt;사실 목표는 2월 설에 본가가서 남동생이랑 랠리하고 싶네요&lt;br /&gt;&lt;br /&gt;크리스마스 두달전부터 캐롤 듣고 있는데 이른건 아닌지.... 듣고 싶었던 건 아니고 유튜브에 뜨길래&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;It Is What It Is - Jenna Raine 요즘 빠져있는 곡&amp;nbsp; 지금 상황에 딱 맞는 가사라 1곡 무한반복중 &lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 비 속에 꽃이 피어나다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Flowers bloom in the rain&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;성장하는 것은 고통이다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Growing up is a pain &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 불타는 곳에는 언제나 빛이 있다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;There's always light where it burns &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  기억의 조각/일상 그리고 운동</category>
      <category>결혼식</category>
      <category>신궁동감자탕</category>
      <category>운동</category>
      <category>전주더메이</category>
      <category>테니스</category>
      <category>헬스</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/34</guid>
      <comments>https://kalswn.tistory.com/34#entry34comment</comments>
      <pubDate>Wed, 8 Nov 2023 09:04:05 +0900</pubDate>
    </item>
    <item>
      <title>AWS - 리전 / 가용영역 / 로컬 영역 / AWS Wavelength</title>
      <link>https://kalswn.tistory.com/33</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmCS5U/btszZkI3Jmq/GHkkGf7K5KVtXVwtIsFE30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmCS5U/btszZkI3Jmq/GHkkGf7K5KVtXVwtIsFE30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmCS5U/btszZkI3Jmq/GHkkGf7K5KVtXVwtIsFE30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmCS5U%2FbtszZkI3Jmq%2FGHkkGf7K5KVtXVwtIsFE30%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;610&quot; height=&quot;479&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;리전( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Region )&lt;/span&gt;&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;각 AWS 리전은 지리적 영역 내에서 격리되고 물리적으로 분리된 최소 3개의 AZ로 구성&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;font-family: 'Noto Sans Light'; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;가용영역( AZ = Availability Zone)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;AWS 리전의 중복 전력, 네트워킹 및 연결이 제공되는 하나 이상의 개별 데이터 센터로 구성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;단일 데이터 센터를 사용하는 것보다 더 높은 가용성, 내결함성 및 확장성을 갖춘 프로덕션 애플리케이션과 데이터 베이스를 운영할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;모든 AZ는 상호 연결되어있어 AZ 간에 높은 처리량과 지연시간이 짧은 네트워킹을 제공&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;&lt;span style=&quot;font-family: 'Noto Sans Light'; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;로컬영역(Edge Location)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;AWS 서비스를 최종 사용자에게 더 가까운 위치에서 실행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;지연 시간에 민감한 애플리케이션을 실행할 수 있는 AWS 리전의 확장&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;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;AWS Wavelength&lt;/span&gt;&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;size14&quot;&gt;ex) 미디어 및 엔터테인먼트 애플리케이션 구축 - 고해상도 라이브 비디오 스트리밍&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 엣지에서 기계 학습 추론 가속화 = 인공지능 AI 및 기계 학습 ML 중심 비디오 및 이미지 분석을 실행&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>가용영역</category>
      <category>로컬영역</category>
      <category>리전</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/33</guid>
      <comments>https://kalswn.tistory.com/33#entry33comment</comments>
      <pubDate>Wed, 8 Nov 2023 05:47:04 +0900</pubDate>
    </item>
    <item>
      <title>AWS - 공동 책임 모델</title>
      <link>https://kalswn.tistory.com/32</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;공동 책임 모델&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;보안과 규정 준수는 AWS와 고객의 공동책임&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VxXJ3/btszZkPPdRp/6aqES1HvtCkuZxnbcEaE1k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VxXJ3/btszZkPPdRp/6aqES1HvtCkuZxnbcEaE1k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VxXJ3/btszZkPPdRp/6aqES1HvtCkuZxnbcEaE1k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVxXJ3%2FbtszZkPPdRp%2F6aqES1HvtCkuZxnbcEaE1k%2Fimg.jpg&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;1212&quot; height=&quot;664&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;AWS 책임 = 클라우드의 보안&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;AWS 클라우드에서 제공되는 모든 서비스를 실행하는 인프라를 보호할 책임&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt; AWS 클라우드 서비스를 실행하는 하드웨어, 소프트웨어, 네트워킹 및 시설로 구성 &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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;고객 책임 = 클라우드에서의 보안&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;고객이 선택하는 AWS클라우드 서비스에 따라 달라짐&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;ex) EC2 서비스는 Iaas로 분류되며 고객이 필요한 모든 보안 구성 및 관리 작업을 수행하도록 요구&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;EC2 인스턴스를 배포하는 고객은 게스트 운영체제의 관리(업데이트, 보안 패치), 고객이 인스턴스에 설치한 모든 애플리케이션 소프트웨어 또는 유틸리티의 관리, 인스턴스별로 AWS에서 제공한 방화벽의 구성관리에 대한 책임이 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #9d9d9d;&quot;&gt;출처 &lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://aws.amazon.com/ko/compliance/shared-responsibility-model/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aws.amazon.com/ko/compliance/shared-responsibility-model/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>공동 책임 모델</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/32</guid>
      <comments>https://kalswn.tistory.com/32#entry32comment</comments>
      <pubDate>Wed, 8 Nov 2023 05:05:01 +0900</pubDate>
    </item>
    <item>
      <title>AWS - 클라우드 컴퓨팅</title>
      <link>https://kalswn.tistory.com/31</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;클라우드 컴퓨팅&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;: IT 리소스를 인터넷을 통해 온디맨드로 제공하고 사용한 만큼만 비용을 지불하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;** 온디맨드(On-Demand) : 내가 원하는 시간에 원하는 것을 얻을 수 있도록 한 플랫폼 서비스&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;On-Premise vs Cloud&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;구분&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7751%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;On-Premise&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6124%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Cloud&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;도입비용&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7751%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;구매 시 많은 예산이 소요되며, 장비 교체 시 비용 발생&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;운영이 장기화되면 유지보수 비용 외의 추가비용이 적음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6124%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;월정액 기반으로 사용한만큼 요금을 지불(예측가능)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;서비스증설로 인한 추가적인 비용 상승 가능성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;인력&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7751%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;시스템 운영 인력 필요&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6124%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;시스템 운영 인력 감원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;구축기간&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7751%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;시스템 설계 후 하드웨어와 소프트웨어를 조달하고 배치하는 데 시간이 설림&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6124%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;클라우드 사업자가 준비한 인프라를 활용하여 신속하게 시스템 구축 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;탄력성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7751%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;서버 구축과 시스템 확장에는 고도의 기술과 엄청난 비용이 필요 구축된 시스템을 가볍게 확장하거나 축소 불가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6124%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;컴퓨팅 리소스를 떼어서 팔기 때문에 필요할 때 필요한만큼 확장 및 축소 가능&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;경제성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7751%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사전에 시스템 이용 피크 타임을 예측해서 그만큼의 장비와 소프트웨어를 구매해야 함&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;피크타임 이외에는 리소스 낭비가 발생&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;클라우드에 비해 규모의 경제가 작동하지 않음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6124%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사용하고자 하는 기능을 사용하고자 하는 기간만 사용하므로 낭비가 적음&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;관리가 제대로 이루어지지 않을 경우 과다한 비용이 청구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;가용성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7751%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;시스템 이중화 및 백업 등의 조치가 필요&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6124%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;재해를 대비한 데이터센터를 이용하거나 장애에 대비한 시스템을 구성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;**온프레미스(On-Premise) : 물리적 데이터 센터와 서버를 구입, 소유 및 유지 관리를 직접&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;클라우드 컴퓨팅 서비스 유형&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;(서비스 범위에 따라 구분)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;IaaS ( &lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;Infrastructure-as-a-Service&lt;/span&gt; ) &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;PaaS( Platform-as-a-Service ) &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;가상화된 인프라 위에 런타임 환경, os(운영체제), 미들웨어를 추가한 유형&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Iaas 형태의 클라우드 인프라 위에 고객이 원하는 서비스를 개발하도록 개발환경(플랫폼)을 미리 구축하여 서비스형태로 제공&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;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;SaaS (Software-as-a-Service ) &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&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;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;** 인프라 : &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;IT 환경을 운영하고&amp;nbsp;&lt;/span&gt;관리&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;하는 데 필요한 구성 요소&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7; font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;클라우드 컴퓨팅 환경&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;(구성 방식에 따라 구분)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Private Cloud &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 단일 조직 전용 클라우드 컴퓨팅 환경&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&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;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Public Cloud&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;타사&amp;nbsp;제공업체가&amp;nbsp;인터넷을&amp;nbsp;통해&amp;nbsp;리소스를&amp;nbsp;제공하고&amp;nbsp;리소스를&amp;nbsp;사용하거나&amp;nbsp;구매하려는&amp;nbsp;조직&amp;nbsp;및&amp;nbsp;개인이&amp;nbsp;공유하는&amp;nbsp;컴퓨팅&amp;nbsp;유형&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;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #000000;&quot;&gt;&lt;b&gt;Hybrid cloud&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Light';&quot;&gt; 기업의 퍼블릭 클라우드와 프라이빗 클라우드를 원활하게 통합하는 IT 인프라 설계 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Light';&quot;&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;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Light';&quot;&gt;Multi Colud&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;여러&amp;nbsp;클라우드&amp;nbsp;서비스&amp;nbsp;제공자들의&amp;nbsp;인프라와&amp;nbsp;서비스를&amp;nbsp;동시에&amp;nbsp;사용하여&amp;nbsp;IT&amp;nbsp;인프라,&amp;nbsp;애플리케이션,&amp;nbsp;및&amp;nbsp;서비스를&amp;nbsp;구축하고&amp;nbsp;관리하는&amp;nbsp;전략&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;클라우드 컴퓨팅 이점&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;민첩성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&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;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;탄력성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&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;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;비용절감&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;고정 비용(데이터 센터, 물리적 서버 등)을 가변 비용으로 전환하고, 사용한 만큼만 IT 비용을 지불할 수 있음&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;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;몇 분 만에 전 세계에 배포&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;새로운 지리적 리전으로 확장하고 전세계에 배포 가능&lt;/span&gt;&lt;/p&gt;</description>
      <category>  개발 일지/AWS</category>
      <category>AWS</category>
      <category>온프레미스</category>
      <category>클라우드</category>
      <category>클라우드 컴퓨팅</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/31</guid>
      <comments>https://kalswn.tistory.com/31#entry31comment</comments>
      <pubDate>Wed, 8 Nov 2023 04:34:26 +0900</pubDate>
    </item>
    <item>
      <title>10월 일상 -  Reverse</title>
      <link>https://kalswn.tistory.com/30</link>
      <description>&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;28일&lt;br /&gt;&lt;/span&gt;&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z1wb5/btszlmIlidX/80j49L6baykeUIPa1DSvtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z1wb5/btszlmIlidX/80j49L6baykeUIPa1DSvtK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z1wb5/btszlmIlidX/80j49L6baykeUIPa1DSvtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ1wb5%2FbtszlmIlidX%2F80j49L6baykeUIPa1DSvtK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;2796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKV78y/btszk5UbJzI/jxGeVnkziEMktMozym6lSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKV78y/btszk5UbJzI/jxGeVnkziEMktMozym6lSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKV78y/btszk5UbJzI/jxGeVnkziEMktMozym6lSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKV78y%2Fbtszk5UbJzI%2FjxGeVnkziEMktMozym6lSk%2Fimg.jpg&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;1887&quot; height=&quot;2796&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;2796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;나름 2개월동안 6시에 일어나서 유튜브 보고 따라한다고 열심히 했는데 근육량 오르고 체지방률 낮아져서 뿌듯했네&lt;br /&gt;더 열심히해야지&lt;br /&gt;처음에는 웨이트기구 4개로 돌렸는데 지금은 방법익히면서 8개정도는 할줄 아는것같다!!&lt;br /&gt;&lt;br /&gt;당황해서 사진 못찍었는데&lt;br /&gt;23시까지 학원에서 공부하다가 나왔는데 문에 철창? 내려져있어서 관리아저씨 찾으로 전층 순회하다가 결국 혼자 버튼눌러서 올리고 나왔다^^ 학원에서 자야되는줄 알았네...ㅎ&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;27일&lt;/span&gt;&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biVPEk/btszk39TO6y/kPohtQD4f2BO5gac5UeV0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biVPEk/btszk39TO6y/kPohtQD4f2BO5gac5UeV0k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biVPEk/btszk39TO6y/kPohtQD4f2BO5gac5UeV0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiVPEk%2Fbtszk39TO6y%2FkPohtQD4f2BO5gac5UeV0k%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Td6qW/btszkRoiyyT/mR4fikrF1EJUWtNnL9dT61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Td6qW/btszkRoiyyT/mR4fikrF1EJUWtNnL9dT61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Td6qW/btszkRoiyyT/mR4fikrF1EJUWtNnL9dT61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTd6qW%2FbtszkRoiyyT%2FmR4fikrF1EJUWtNnL9dT61%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;요즘 점심도시락 챙겨서 다니는데&lt;br /&gt;밖에서 사먹을때보다 적정량 먹을수있어서 속이 편하다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yQF58/btszk8QUd3Q/2pS8AxKgVDUGveVwz0pY61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yQF58/btszk8QUd3Q/2pS8AxKgVDUGveVwz0pY61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yQF58/btszk8QUd3Q/2pS8AxKgVDUGveVwz0pY61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyQF58%2Fbtszk8QUd3Q%2F2pS8AxKgVDUGveVwz0pY61%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1V1Lc/btszmzAqJWm/3oVt7ND2EJ2GDuW1SKQZo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1V1Lc/btszmzAqJWm/3oVt7ND2EJ2GDuW1SKQZo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1V1Lc/btszmzAqJWm/3oVt7ND2EJ2GDuW1SKQZo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1V1Lc%2FbtszmzAqJWm%2F3oVt7ND2EJ2GDuW1SKQZo1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;1080&quot; data-origin-height=&quot;2640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF3nzO/btszlw472eI/FKzZuukEIFVfkvRBDBu7R1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF3nzO/btszlw472eI/FKzZuukEIFVfkvRBDBu7R1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF3nzO/btszlw472eI/FKzZuukEIFVfkvRBDBu7R1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF3nzO%2Fbtszlw472eI%2FFKzZuukEIFVfkvRBDBu7R1%2Fimg.jpg&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;1080&quot; height=&quot;2640&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사실 3시간 17분 잤는데 졸립지도 않고 피곤하지도 않았는데 집 오자마자 그냥 기절&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;26일&lt;/span&gt;&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ji28M/btszcRh624B/J5OvKDIeyDoFU7Uep1WxZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ji28M/btszcRh624B/J5OvKDIeyDoFU7Uep1WxZ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ji28M/btszcRh624B/J5OvKDIeyDoFU7Uep1WxZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJi28M%2FbtszcRh624B%2FJ5OvKDIeyDoFU7Uep1WxZ1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IuImn/btszb9jc6Yf/S0K0mHzZwwuG0A82TiKid0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IuImn/btszb9jc6Yf/S0K0mHzZwwuG0A82TiKid0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IuImn/btszb9jc6Yf/S0K0mHzZwwuG0A82TiKid0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIuImn%2Fbtszb9jc6Yf%2FS0K0mHzZwwuG0A82TiKid0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCQv5B/btszbVk3Dj3/pRVwStAYO8rUu3BttJbaQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCQv5B/btszbVk3Dj3/pRVwStAYO8rUu3BttJbaQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCQv5B/btszbVk3Dj3/pRVwStAYO8rUu3BttJbaQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCQv5B%2FbtszbVk3Dj3%2FpRVwStAYO8rUu3BttJbaQ1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSjvQW/btszf3Wa1FO/pN8uqgQdiggkFk3VAu2CG0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSjvQW/btszf3Wa1FO/pN8uqgQdiggkFk3VAu2CG0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSjvQW/btszf3Wa1FO/pN8uqgQdiggkFk3VAu2CG0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSjvQW%2Fbtszf3Wa1FO%2FpN8uqgQdiggkFk3VAu2CG0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;도시락 안가져와서 한솥에서 10월 한정 유린기 도시락 먹었는데 존마탱 11월에도 진행시켜주세요&lt;br /&gt;(유린기도시락 배승원씨가 먹고 3주동안 극찬했음)&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;25일&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdu3xf/btszb1S3qQN/SKk5BlHwRNgOn8sfw5yp10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdu3xf/btszb1S3qQN/SKk5BlHwRNgOn8sfw5yp10/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdu3xf/btszb1S3qQN/SKk5BlHwRNgOn8sfw5yp10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdu3xf%2Fbtszb1S3qQN%2FSKk5BlHwRNgOn8sfw5yp10%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I0bl4/btszeLhpeSE/hOKqBPN2lqZK0KB1yrGFd1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I0bl4/btszeLhpeSE/hOKqBPN2lqZK0KB1yrGFd1/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I0bl4/btszeLhpeSE/hOKqBPN2lqZK0KB1yrGFd1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI0bl4%2FbtszeLhpeSE%2FhOKqBPN2lqZK0KB1yrGFd1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이정도면 운동 기록인거지&lt;br /&gt;파주 아울렛가서 나이키 구경하다가 2만원대 초반이라 구매했는데 한글날 추가 할인들어가서 만구천원정도에 get!&lt;br /&gt;7부 레깅스는 처음 입어보는데 생각보다 괜찮다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt3tfd/btszcHzXFyt/6VoMSjP6tGBh8X4TNCD9Ik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt3tfd/btszcHzXFyt/6VoMSjP6tGBh8X4TNCD9Ik/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt3tfd/btszcHzXFyt/6VoMSjP6tGBh8X4TNCD9Ik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt3tfd%2FbtszcHzXFyt%2F6VoMSjP6tGBh8X4TNCD9Ik%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXNFET/btszb7MsptR/oTb7O0QDSLfeVHhlWvGVbK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXNFET/btszb7MsptR/oTb7O0QDSLfeVHhlWvGVbK/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXNFET/btszb7MsptR/oTb7O0QDSLfeVHhlWvGVbK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXNFET%2Fbtszb7MsptR%2FoTb7O0QDSLfeVHhlWvGVbK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;걷다가 빵 먹고 싶어서 LALA BAEKERY 들어갔는데 핸드크림으로 가장한 잼도 있았거 치킨으로 가장한 빵도 있었다ㅋㅋ&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;24일&lt;/span&gt;&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dProcI/btsy0kkqVPo/RuHDKrud7XZvg5WBtP3D00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dProcI/btsy0kkqVPo/RuHDKrud7XZvg5WBtP3D00/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dProcI/btsy0kkqVPo/RuHDKrud7XZvg5WBtP3D00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdProcI%2Fbtsy0kkqVPo%2FRuHDKrud7XZvg5WBtP3D00%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;렛풀다운 + 레그프레스 + 힙 쓰러스터 + &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;인어사이 + 아웃사이 +복근운동 + 폼롤러&lt;/span&gt;&lt;/b&gt;&lt;br /&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HJy3K/btszhulmeE8/9Zp72XKstD1RQ3K8U79hU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HJy3K/btszhulmeE8/9Zp72XKstD1RQ3K8U79hU0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HJy3K/btszhulmeE8/9Zp72XKstD1RQ3K8U79hU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHJy3K%2FbtszhulmeE8%2F9Zp72XKstD1RQ3K8U79hU0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;운동 후 아아 한잔 느낌인데&lt;br /&gt;테니스 하고 찍은 사진은 없네...&lt;br /&gt;월목 수업받는데 최근에 새로 생긴 대치 테니스 홀릭에서 무료강습 1회 해준다고 하셨는데 지금 다니고 있는곳과 방식이 매우 달라서 고민중이다!&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;23일&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQ3bD/btsyWhaAdoi/ndUWv6MS7cycu1GpvwQcYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQ3bD/btsyWhaAdoi/ndUWv6MS7cycu1GpvwQcYK/img.jpg&quot; data-origin-width=&quot;2208&quot; data-origin-height=&quot;2208&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQ3bD/btsyWhaAdoi/ndUWv6MS7cycu1GpvwQcYK/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQ3bD%2FbtsyWhaAdoi%2FndUWv6MS7cycu1GpvwQcYK%2Fimg.jpg&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;2208&quot; height=&quot;2208&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0hFAK/btsy4tG9KdY/yVqJNg70kHAWyP7k7udfp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0hFAK/btsy4tG9KdY/yVqJNg70kHAWyP7k7udfp1/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0hFAK/btsy4tG9KdY/yVqJNg70kHAWyP7k7udfp1/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0hFAK%2Fbtsy4tG9KdY%2FyVqJNg70kHAWyP7k7udfp1%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfENT9/btsy0kkhiJI/yJS9bFIZxAUIKuul24iQzK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfENT9/btsy0kkhiJI/yJS9bFIZxAUIKuul24iQzK/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfENT9/btsy0kkhiJI/yJS9bFIZxAUIKuul24iQzK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfENT9%2Fbtsy0kkhiJI%2FyJS9bFIZxAUIKuul24iQzK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;조하선배 청첩장 받을 겸 빛내미를 오랜만에 만나 너무 들떴는지 인사하면서 이어폰 빼면서 이어캡 검정색인데 아스팔트 바닥에 떨어졌구요.... 결국 못찾았습니다...&lt;br /&gt;&amp;nbsp;&lt;br /&gt;z플립4 필름 힌지부분 들떠서 필름 교체할겸 서비스 센터 다녀왔는데 재고 없다고 예약해야한다 해서 하고&lt;br /&gt;오늘 받았는데 맙소사&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;흰색이더라구요 &lt;br /&gt;땅에 떨어지면 잘 보이겠구나 그리고 덤벙거리는 나를 믿지 못해 4개나 미리 구비해둔덕에 짝짝이는 되지않았다는 점&lt;br /&gt;암튼 qcy 사용하다가 버즈 프로 사용하니 신세계네요&lt;br /&gt;다신 잃어버리지 않을게 잘 부탁해 &lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;22일&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;목감기 + 코감기 + 하루에 5시간 이하 잠 =피로만땅 상태였는데&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6시부터 교회가야한다고 깨우고.... 교회는 너무 춥고.....&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;26년동안 나 자신도 믿지 못했는데.... 억지로 가는 게 맞을까요...? 쉬고싶어요...&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;교회다녀와서 콧물약 먹구 자고 잠 덜깬 상태로 저녁 먹고 다시 자고.....&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;21일&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zQ1Yd/btsy3hAq64T/5A0PPfD7Druy98cgvw2MHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zQ1Yd/btsy3hAq64T/5A0PPfD7Druy98cgvw2MHk/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zQ1Yd/btsy3hAq64T/5A0PPfD7Druy98cgvw2MHk/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzQ1Yd%2Fbtsy3hAq64T%2F5A0PPfD7Druy98cgvw2MHk%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NeJsk/btsyViOiwSy/BqVy1vAmkG3K4KuArgKr0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NeJsk/btsyViOiwSy/BqVy1vAmkG3K4KuArgKr0K/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NeJsk/btsyViOiwSy/BqVy1vAmkG3K4KuArgKr0K/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNeJsk%2FbtsyViOiwSy%2FBqVy1vAmkG3K4KuArgKr0K%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv2IG2/btsy3PKNOrL/bOgKtVGfDKamjxAnylPNtk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv2IG2/btsy3PKNOrL/bOgKtVGfDKamjxAnylPNtk/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 32.5581%;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv2IG2/btsy3PKNOrL/bOgKtVGfDKamjxAnylPNtk/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv2IG2%2Fbtsy3PKNOrL%2FbOgKtVGfDKamjxAnylPNtk%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;나이키에서 새로 산 레깅스 입고&lt;br /&gt;러닝하고 하체 + 복근 + 스트레칭&lt;br /&gt;프로티원 초코맛 첫 개시했는데 요거 JMT 물에 타먹었는데도 맛있더라구요 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDRqM5/btsyUI69tHZ/oxSZsDtM7298faGFDJHZx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDRqM5/btsyUI69tHZ/oxSZsDtM7298faGFDJHZx0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDRqM5/btsyUI69tHZ/oxSZsDtM7298faGFDJHZx0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDRqM5%2FbtsyUI69tHZ%2FoxSZsDtM7298faGFDJHZx0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zrqVN/btsy38XGoiZ/p3qb7iM8x9fqA6RQ0mVQdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zrqVN/btsy38XGoiZ/p3qb7iM8x9fqA6RQ0mVQdK/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 49.4186%;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zrqVN/btsy38XGoiZ/p3qb7iM8x9fqA6RQ0mVQdK/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzrqVN%2Fbtsy38XGoiZ%2Fp3qb7iM8x9fqA6RQ0mVQdK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;주말이지만 자습하려고 학원 나갔다가&lt;br /&gt;배씨친구가 맛있다는 이가네 양꼬치 먹었습니다.&lt;br /&gt;꼬치 2개까지는 정말 맛있었는데 꿔바로우 먹으니 느끼해지기 시작&lt;br /&gt;조미료? 한접시에 청양고추 한접시 추가해서 먹었구요~&lt;br /&gt;칭따오 논알코올 처음봐서 요건 못참지 하고 마셨는데&lt;br /&gt;역시 맥주는 알코올이다~ (다신 안먹어)&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;20일&lt;br /&gt;&lt;/span&gt;&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;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ZlYC/btsy6iL00Ia/Pc4cX7D0IDBNW8pIMmLaIK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ZlYC/btsy6iL00Ia/Pc4cX7D0IDBNW8pIMmLaIK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ZlYC/btsy6iL00Ia/Pc4cX7D0IDBNW8pIMmLaIK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ZlYC%2Fbtsy6iL00Ia%2FPc4cX7D0IDBNW8pIMmLaIK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;오운완! 인증샷은 계속 될테다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DXAt3/btsy4lvGP0z/gwthCb3RbOZt76I0RlmfoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DXAt3/btsy4lvGP0z/gwthCb3RbOZt76I0RlmfoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DXAt3/btsy4lvGP0z/gwthCb3RbOZt76I0RlmfoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDXAt3%2Fbtsy4lvGP0z%2FgwthCb3RbOZt76I0RlmfoK%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;426&quot; height=&quot;704&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;한번도 비염을 걸려본적 없는 내가&lt;br /&gt;카페트 깔려있는 강의실에서 비염이 걸린 것 같다....&lt;br /&gt;&amp;nbsp;&lt;br /&gt;매니저님께 이야기해서 공기청정기 마련하고&lt;br /&gt;내 폰에 연결!&lt;br /&gt;제발 코 살려주라........&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DRE9r/btsyUMBKa5l/akqpfAOMZVppYKDUwvsetK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DRE9r/btsyUMBKa5l/akqpfAOMZVppYKDUwvsetK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DRE9r/btsyUMBKa5l/akqpfAOMZVppYKDUwvsetK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDRE9r%2FbtsyUMBKa5l%2FakqpfAOMZVppYKDUwvsetK%2Fimg.jpg&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;423&quot; height=&quot;423&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;3종류 김치 반찬과 미역국&lt;br /&gt;JMT&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AmOcJ/btsyUI69GP1/RZzw1KG161oJfagARpcLP1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AmOcJ/btsyUI69GP1/RZzw1KG161oJfagARpcLP1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AmOcJ/btsyUI69GP1/RZzw1KG161oJfagARpcLP1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAmOcJ%2FbtsyUI69GP1%2FRZzw1KG161oJfagARpcLP1%2Fimg.jpg&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;418&quot; height=&quot;418&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;결국 내 인생 처음으로 콧물약을 먹어봤고&lt;br /&gt;빨리 나으려고 2개 먹었는데 졸림도 x2배가 되버렸다.....&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;10일&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhRIxC/btsy6h0LlXB/Fbo8KpRkrdwv9Gl3rGfNF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhRIxC/btsy6h0LlXB/Fbo8KpRkrdwv9Gl3rGfNF0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhRIxC/btsy6h0LlXB/Fbo8KpRkrdwv9Gl3rGfNF0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhRIxC%2Fbtsy6h0LlXB%2FFbo8KpRkrdwv9Gl3rGfNF0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZh5l5/btsy4cy801h/Wlqyihh6gKAgngreBMx28k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZh5l5/btsy4cy801h/Wlqyihh6gKAgngreBMx28k/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 49.4186%;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZh5l5/btsy4cy801h/Wlqyihh6gKAgngreBMx28k/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZh5l5%2Fbtsy4cy801h%2FWlqyihh6gKAgngreBMx28k%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VyETw/btsy47xkho0/UFunKEid96rjV4YLYpc6UK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VyETw/btsy47xkho0/UFunKEid96rjV4YLYpc6UK/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 32.5581%; margin-right: 10px; margin-top: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VyETw/btsy47xkho0/UFunKEid96rjV4YLYpc6UK/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVyETw%2Fbtsy47xkho0%2FUFunKEid96rjV4YLYpc6UK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL5MlB/btsy02RdkNF/3mzcAYoKFCvXZtacElZWOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL5MlB/btsy02RdkNF/3mzcAYoKFCvXZtacElZWOK/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 32.5581%; margin-right: 10px; margin-top: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL5MlB/btsy02RdkNF/3mzcAYoKFCvXZtacElZWOK/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL5MlB%2Fbtsy02RdkNF%2F3mzcAYoKFCvXZtacElZWOK%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDUNWI/btsy4kDHIaf/0QVG5Wrn9FtW2l8QxjKyX0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDUNWI/btsy4kDHIaf/0QVG5Wrn9FtW2l8QxjKyX0/img.jpg&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;2992&quot; style=&quot;width: 32.5581%; margin-top: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDUNWI/btsy4kDHIaf/0QVG5Wrn9FtW2l8QxjKyX0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDUNWI%2Fbtsy4kDHIaf%2F0QVG5Wrn9FtW2l8QxjKyX0%2Fimg.jpg&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;2992&quot; height=&quot;2992&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dq9bAv/btsy4pZcbPl/LkOXEfw8GnIfcX8tfQyc8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dq9bAv/btsy4pZcbPl/LkOXEfw8GnIfcX8tfQyc8k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dq9bAv/btsy4pZcbPl/LkOXEfw8GnIfcX8tfQyc8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdq9bAv%2Fbtsy4pZcbPl%2FLkOXEfw8GnIfcX8tfQyc8k%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;대학교 홍보대사 선배 청첩장을 받기(?) 위해 역삼역 에피스에 모였다.&lt;br /&gt;2년?3년? 만에 만나는 동기들&lt;br /&gt;선배 덕분에 모일 수 있었고 내 인생 최초 대면청첩장이었다!!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;기대된다 결혼식&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  기억의 조각/일상 그리고 운동</category>
      <category>결혼식</category>
      <category>운동</category>
      <category>일상</category>
      <category>프로젝트</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/30</guid>
      <comments>https://kalswn.tistory.com/30#entry30comment</comments>
      <pubDate>Tue, 7 Nov 2023 00:41:56 +0900</pubDate>
    </item>
    <item>
      <title>API - 게시판 목록 조회, 상세 조회, 등록, 삭제 _ postman</title>
      <link>https://kalswn.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;API( Application Programing Interface)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&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;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;flask.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698500100186&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, request
import pymysql
import json, datetime

app = Flask(__name__)

# 데이터 베이스 연결
def getCon():
  return pymysql.connect(host=&quot;localhost&quot;, 
                     user=&quot;root&quot;, password=&quot;1234&quot;, 
                     db=&quot;testConnection&quot;,
                     charset=&quot;utf8&quot;,
                     cursorclass=pymysql.cursors.DictCursor)

def json_default(value):
  if isinstance(value, datetime.date):
    return value.strftime('%Y-%m-%d')
  raise TypeError('not JSON serializable')  

# BoardContent.js 게시물 목록
@app.route('/boardlist', methods=['GET', 'POST'])
def boardlist() :
    con = getCon()
    cursor = con.cursor()
    cursor.execute(&quot;SELECT b.boardId, b.title, u.ID, b.location, date_format(b.createAt, '%Y-%m-%d') AS date FROM Board as b LEFT OUTER JOIN User as u on u.userId = b.userId WHERE b.status = 'active' ORDER BY b.createAt DESC;&quot;)
    data = cursor.fetchall()
    # return_data = json.dumps(data, default=json_default)

    # 반환할 때 json형식으로 반환
    return json.dumps(data, default=json_default)

# BoardContent.js 게시물 상세정보
@app.route('/boardDetail', methods=[ 'POST'])
def getBoardId():
  # boardId =int(request.get_data())
  boardId = request.get_json()
  id = boardId['id']

  con = getCon()
  cursor = con.cursor()
  sql = 'SELECT * FROM Board WHERE boardId = %s;'
  cursor.execute(sql, (id, ))
  data = cursor.fetchall()
  cursor.close()
    
  # 반환할 때 json형식으로 반환
  return json.dumps(data, default=json_default)

# BoardViewContent.js 게시물 수정
@app.route('/boardEdit', methods=['POST'])
def boardEdit() :
  boardData = request.get_json()
  print(boardData)
  con = getCon()
  cursor = con.cursor()

  cursor.execute(&quot;UPDATE Board SET title = '{}' WHERE boardId = {};&quot;.format(boardData['title'], boardData['boardId']))
  cursor.execute(&quot;UPDATE Board SET content = '{}' WHERE boardId = {};&quot;.format(boardData['content'], boardData['boardId']))
  cursor.connection.commit()


  return '성공적으로 수정되었습니다:)'

 # BoardViewContent.js 게시물 삭제
@app.route('/boardDelete', methods=['POST'])
def boardDelete() :
  boardData = request.get_json()
  print(boardData)
  con = getCon()
  cursor = con.cursor()

  cursor.execute(&quot;UPDATE Board SET status = 'inactive' WHERE boardId = {};&quot;.format(boardData['boardId']))
  cursor.connection.commit()


  return '성공적으로 삭제되었습니다'

# BoardWrite.js 게시물 등록
@app.route('/boardWrite', methods=['POST'])
def boardWrite() :
  boardData = request.get_json()
  print(boardData)

  con = getCon()
  cursor = con.cursor()
  sql = &quot;INSERT INTO Board (userId, title, content, location) VALUES ((SELECT userId FROM User WHERE ID = %s), %s, %s, %s);&quot;
  cursor.execute(sql, ('test', boardData['title'], boardData['content'], boardData['location']))
  cursor.connection.commit()


  return '성공적으로 등록되었습니다:)'


if __name__ == &quot;__main__&quot; :
    app.run(debug=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1698500381937&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//게시물 목록
axios.get('/boardlist')
        .then(res =&amp;gt; {
            console.log(res.data)
        }).catch(error =&amp;gt; console.log(error));
    }, []);
    
//게시물 상세조회
axios.post('/boardDetail', {id : boardId}, { headers: { 'Content-Type': 'application/json' } })
        .then(res =&amp;gt; {
            console.log(res.data)
        }).catch(err =&amp;gt; console.log(err));
        
//게시물 등록
axios.post('/boardWrite', {title : title, location : location, content : content }, { headers: { 'Content-Type': 'application/json' } })
    .then(res =&amp;gt; {
            console.log(res.data)
	}).catch(err =&amp;gt; console.log(err));

 // 게시물 삭제
axios.post('/boardDelete', {boardId: boardId}, { headers: { 'Content-Type': 'application/json' } })
    .then(res =&amp;gt; {
            console.log(res.data)
    }).catch(err =&amp;gt; console.log(err));
    
// 게시물 수정
axios.post('/boardEdit', {title : title, content : content, boardId: boardId }, { headers: { 'Content-Type': 'application/json' } })
    .then(res =&amp;gt; {
            console.log(res.data)
    }).catch(err =&amp;gt; console.log(err));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;postman&lt;/b&gt; 으로 api 잘 작동되는지 확인해보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;method=['GET']&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDRCHo/btszi7ZIt4q/ECHCxRfLBy5un8qHo7CO70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDRCHo/btszi7ZIt4q/ECHCxRfLBy5un8qHo7CO70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDRCHo/btszi7ZIt4q/ECHCxRfLBy5un8qHo7CO70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDRCHo%2Fbtszi7ZIt4q%2FECHCxRfLBy5un8qHo7CO70%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;1294&quot; height=&quot;807&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;method=['POST']&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B2rKW/btszkaBBEni/bCeAWQsPMdChx6vEaPx6S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B2rKW/btszkaBBEni/bCeAWQsPMdChx6vEaPx6S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B2rKW/btszkaBBEni/bCeAWQsPMdChx6vEaPx6S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB2rKW%2FbtszkaBBEni%2FbCeAWQsPMdChx6vEaPx6S0%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;1294&quot; height=&quot;807&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;807&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;</description>
      <category>  개발 일지/Python</category>
      <category>axios</category>
      <category>flask</category>
      <category>React</category>
      <category>route</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/27</guid>
      <comments>https://kalswn.tistory.com/27#entry27comment</comments>
      <pubDate>Sat, 28 Oct 2023 22:41:58 +0900</pubDate>
    </item>
    <item>
      <title>React - Flask - Mysql 연동</title>
      <link>https://kalswn.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp; 프로젝트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698478031939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\react&amp;gt;npx create-react-app data-app
C:\react&amp;gt;npm start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flask&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698478183529&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\react&amp;gt;mkdir server

C:\react&amp;gt;pip install Flask&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vEvv7/btszkTfboCl/kd1aEHUXbdCIl0GPjnhnUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vEvv7/btszkTfboCl/kd1aEHUXbdCIl0GPjnhnUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vEvv7/btszkTfboCl/kd1aEHUXbdCIl0GPjnhnUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvEvv7%2FbtszkTfboCl%2Fkd1aEHUXbdCIl0GPjnhnUK%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;261&quot; height=&quot;166&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;workbench 사용하여 database를 만든 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table을 생성했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698494825952&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create database testConnection;
use testConnection;
CREATE TABLE `testTable` (
    `id` int unsigned AUTO_INCREMENT NOT NULL ,
    `name` int unsigned  NOT NULL ,
    `age` varchar(30)  NOT NULL ,
     PRIMARY KEY (
        `id`
    )
);


데이터 삽입
INSERT INTO testTable(id,name,age) values(2,'233',26);
INSERT INTO testTable(id,name,age) values(1,'121',26);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1698498752971&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import './App.css';
import { useEffect, useState } from 'react';
import axios from 'axios';

function App() {

  const [data, setData] = useState([])

  useEffect(() =&amp;gt; {
    axios.get('/data')
    .then(res =&amp;gt; {
        setData(res.data)
        console.log(res.data)
    }).catch(error =&amp;gt; console.log(error));
  }, []);

  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt; testTable data 가져오기 &amp;lt;/h1&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;사용하는모듈 설치&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;npm install axios&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;package.json&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&quot;proxy&quot;: &quot;http://localhost:5000&quot;, 추가&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;server.py&lt;/p&gt;
&lt;pre id=&quot;code_1698498775969&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, jsonify, request
import pymysql
import json, datetime

app = Flask(__name__)

# 데이터 베이스 연결
def getCon():
  return pymysql.connect(host=&quot;localhost&quot;, 
                     user=&quot;root&quot;, password=&quot;1234&quot;, 
                     db=&quot;testConnection&quot;,
                     charset=&quot;utf8&quot;,
                     cursorclass=pymysql.cursors.DictCursor)

def json_default(value):
  if isinstance(value, datetime.date):
    return value.strftime('%Y-%m-%d')
  raise TypeError('not JSON serializable') 

# testConnection DB / testTable Table 가져오기
@app.route('/data', methods=['GET'])
def getData():
    print(&quot;1111111111111111&quot;)
    con = getCon()
    cursor = con.cursor()
    sql = 'SELECT * FROM testTable'
    cursor.execute(sql)
    
    data = cursor.fetchall()
    print(data)
    cursor.close()
    
    # 반환할 때 json형식으로 반환
    return json.dumps(data, default=json_default)

if __name__ == &quot;__main__&quot; :
    app.run(debug=True)&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;import json&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: python이 기본적으로 지원하는 데이터 타입인 list와 dictionary 구조를 유지한 채 json 형식으로 바꿔주고, json문자열을 해독해서 python 데이터타입으로 바꿔주는 모듈&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;def&amp;nbsp;json_default(value)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: json.dumps 에 데이터를 넣는 경우 json 이 알지못하는 타입이 포함되어있을때 json string으로 변환해주는 함수를 선언&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: #000000; text-align: start;&quot;&gt;TypeError: Object of type date is not JSON serializable &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에러가 발생할수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/React</category>
      <category>flask</category>
      <category>mysql</category>
      <category>React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/26</guid>
      <comments>https://kalswn.tistory.com/26#entry26comment</comments>
      <pubDate>Sat, 28 Oct 2023 22:16:18 +0900</pubDate>
    </item>
    <item>
      <title>SSG I&amp;amp;C  project_2</title>
      <link>https://kalswn.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 데이터 반영 오류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: flask 에서 db 데이터를 react로&amp;nbsp; 보내주는 과정 중&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flask 서버를 새로 실행해줘야 sql에 넣는 데이터가 조회됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1698383731843&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, {useState, useEffect} from &quot;react&quot;;
import axios, { Axios } from 'axios';

function App() {
	const [ data, setData ] = useState([{}]);
    
useEffect(() =&amp;gt; {
        axios.post('/boardDetail', {id : boardId}, { headers: { 'Content-Type': 'application/json' } })
        .then(response =&amp;gt; {
            setBoardData(response.data)
        }).catch(err =&amp;gt; console.log(err));
    }, [])

  return (
    &amp;lt;&amp;gt;
     
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;server.py&lt;/p&gt;
&lt;pre id=&quot;code_1698383541218&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, jsonify, request
import pymysql
import json, datetime

app = Flask(__name__)

# 데이터 베이스 연결
db = pymysql.connect(host=&quot;localhost&quot;, 
                     user=&quot;root&quot;, password=&quot;1234&quot;, 
                     db=&quot;test3&quot;,
                     charset=&quot;utf8&quot;,
                     cursorclass=pymysql.cursors.DictCursor)
# cursor 열기
cursor = db.cursor()

def json_default(value):
  if isinstance(value, datetime.date):
    return value.strftime('%Y-%m-%d')
  raise TypeError('not JSON serializable')  

@app.route(&quot;/boardDetail&quot;, methods=['GET', 'POST'])
def boardDetail():
    #db connection 연결
    con = getCon()
    cursor = con.cursor()
   
    cursor.execute(&quot;select * from board&quot;)
    data = cursor.fetchall()
    cursor.close()
   
    # 반환할 때 json형식으로 반환
    return json.dumps(data, default=json_default)
  
if __name__ == &quot;__main__&quot; :
    app.run(debug=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정한 server.py&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db 연결하는 부분을 함수로 변경&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1698476446359&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, jsonify, request
import pymysql
import json, datetime

app = Flask(__name__)
# 데이터 베이스 연결
def getCon():
  return pymysql.connect(host=&quot;localhost&quot;,
                     user=&quot;root&quot;, password=&quot;1234&quot;,
                     db=&quot;test3&quot;,
                     charset=&quot;utf8&quot;,
                     cursorclass=pymysql.cursors.DictCursor)

//JSON serializable 에러 피하기 위해
def json_default(value):
  if isinstance(value, datetime.date):
    return value.strftime('%Y-%m-%d')
  raise TypeError('not JSON serializable')

@app.route(&quot;/boardDetail&quot;, methods=['GET', 'POST'])
def boardDetail():
    #db connection 연결
    con = getCon()
    cursor = con.cursor()
   
    cursor.execute(&quot;select * from board&quot;)
    data = cursor.fetchall()
    cursor.close()
   
    # 반환할 때 json형식으로 반환
    return json.dumps(data, default=json_default)
    
if __name__ == &quot;__main__&quot; :
    app.run(debug=True)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/25</guid>
      <comments>https://kalswn.tistory.com/25#entry25comment</comments>
      <pubDate>Sat, 28 Oct 2023 16:06:14 +0900</pubDate>
    </item>
    <item>
      <title>React - Hooks _ useState / useEffect /useRef</title>
      <link>https://kalswn.tistory.com/24</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;nbsp;Hooks&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 함수형 컴포넌트에서 클래스형 컴포넌트에서 제공하는 기능(state,ref, life cycle function 등)을 지원하기 위해서 도입된 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) useState&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 함수형 컴포넌트에서 상태(state)를 관리하기 위해서 사용&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;background-color: #c0d1e7;&quot;&gt;const [name,setName] = useState('');&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;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1698277812203&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Info from './Info';

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Info /&amp;gt;
    &amp;lt;/&amp;gt;  
  );
}
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Info.js =&amp;gt; 사용자이름과 별명을 관리하는 컴포넌트를 구현&lt;/p&gt;
&lt;pre id=&quot;code_1698407603984&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState } from &quot;react&quot;;

function Info() {
    const [name, setName] = useState('');
    const [nickname, setNickname] = useState('');

    const handlerChangeName = e =&amp;gt; setName(e.target.value);
    const handlerChangeNickname = e =&amp;gt; setNickname(e.target.value);

    return (
        &amp;lt;&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: {name}&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: {nickname}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: &amp;lt;input type=&quot;text&quot; value={name} onChange={handlerChangeName}/&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: &amp;lt;input type=&quot;text&quot; value={nickname} onChange={handlerChangeNickname}/&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
}
export default Info;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) useEffect&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스형 컴포넌트의 componentDidMount, componentDidUpdate, componentWillUnmount를 합친 사용법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useEffect(이펙트 함수, 의존성배열);&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;Info.js =&amp;gt; useEffect 추가 =&amp;gt; 렌더링 될 때마다 이펙트 함수 실행&lt;/p&gt;
&lt;pre id=&quot;code_1698407888353&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect, useState } from &quot;react&quot;;

function Info() {
    const [name, setName] = useState('');
    const [nickname, setNickname] = useState('');

    const handlerChangeName = e =&amp;gt; setName(e.target.value);
    const handlerChangeNickname = e =&amp;gt; setNickname(e.target.value);

    // 의존 배열을 생략 	&amp;rArr; 마운트, 업데이트 시 마다 이팩트 함수를 실행
    //                  	&amp;rArr; 렌더링 완료 시 마다 이팩트 함수를 실행
    useEffect(() =&amp;gt; {
        console.log('렌더링이 완료되었습니다.');
        console.log({ name, nickname });
    });
    return (
        &amp;lt;&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: {name}&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: {nickname}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: &amp;lt;input type=&quot;text&quot; value={name} onChange={handlerChangeName}/&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: &amp;lt;input type=&quot;text&quot; value={nickname} onChange={handlerChangeNickname}/&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
}
export default Info;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Info.js =&amp;gt;&lt;span&gt; 마운트 될때만 이펙트 함수가 실행되도록 수정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698407960625&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect, useState } from &quot;react&quot;;

function Info() {
    const [name, setName] = useState('');
    const [nickname, setNickname] = useState('');

    const handlerChangeName = e =&amp;gt; setName(e.target.value);
    const handlerChangeNickname = e =&amp;gt; setNickname(e.target.value);

    // 의존 배열로 빈 배열([])을 설정
    // ==&amp;gt; 마운트될 때만 이팩트 함수를 실행
    useEffect(() =&amp;gt; {
        console.log('렌더링이 완료되었습니다.');
        console.log({ name, nickname });
    }, []);
    return (
        &amp;lt;&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: {name}&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: {nickname}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: &amp;lt;input type=&quot;text&quot; value={name} onChange={handlerChangeName}/&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: &amp;lt;input type=&quot;text&quot; value={nickname} onChange={handlerChangeNickname}/&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
}
export default Info;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Info.js =&amp;gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 특정 값이 업데이트 될 때만 이펙트 함수가 실행되도록 수정 = 의존 배열에 검사할 상태 변수이름을 값으로 설정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698408011998&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect, useState } from &quot;react&quot;;

function Info() {
    const [name, setName] = useState('');
    const [nickname, setNickname] = useState('');

    const handlerChangeName = e =&amp;gt; setName(e.target.value);
    const handlerChangeNickname = e =&amp;gt; setNickname(e.target.value);

    // 마운트될 때와 name 상태변수가 변경될 때만 이팩트 함수가 실행
    useEffect(() =&amp;gt; {
        console.log('렌더링이 완료되었습니다.');
        console.log({ name, nickname });
    }, [name]);
    return (
        &amp;lt;&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: {name}&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: {nickname}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: &amp;lt;input type=&quot;text&quot; value={name} onChange={handlerChangeName}/&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: &amp;lt;input type=&quot;text&quot; value={nickname} onChange={handlerChangeNickname}/&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
}
export default Info;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Info.js =&amp;gt; 후처리(cleanup) 함수를 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: component가 언마운트 또는 리렌더링되기 전에 어떤 작업을 수행하고 싶을때 cleanup 함수를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;useEffect의 첫번째 파라미터로 전달되는 콜백 함수(이펙트 함수)가 반환하는 함수&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;Info.js&amp;nbsp; Info 컴포넌트를 보이고 / 숨기기&lt;/p&gt;
&lt;pre id=&quot;code_1698408276598&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect, useState } from &quot;react&quot;;

function Info() {
    const [name, setName] = useState('');
    const [nickname, setNickname] = useState('');

    const handlerChangeName = e =&amp;gt; setName(e.target.value);
    const handlerChangeNickname = e =&amp;gt; setNickname(e.target.value);

    useEffect(() =&amp;gt; {
        console.log('렌더링이 완료되었습니다.');
        console.log({ name, nickname });
        return () =&amp;gt; console.log('cleanup', name);	&amp;lArr; componentWillUnmount() 함수와 동일한 역할
    }, [name]);					   의존 배열에 name 상태 변수가 설정되어 있기 때문에,
    return (						   name 상태 변수가 변경되거나 언마운트될 때 cleanup 함수가 실행
        &amp;lt;&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: {name}&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: {nickname}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: &amp;lt;input type=&quot;text&quot; value={name} onChange={handlerChangeName}/&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: &amp;lt;input type=&quot;text&quot; value={nickname} onChange={handlerChangeNickname}/&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
}
export default Info;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1698408362366&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState } from 'react';
import Info from './hook/Info';

function App() {
  const [visible, setVisible] = useState(true);
  const handlerClick = () =&amp;gt; setVisible(!visible);
  return (
    &amp;lt;&amp;gt;
      &amp;lt;button onClick={handlerClick}&amp;gt;{ visible ? '숨기기' : '보이기' }&amp;lt;/button&amp;gt;
      &amp;lt;br /&amp;gt;
      { visible &amp;amp;&amp;amp; &amp;lt;Info /&amp;gt; }
    &amp;lt;/&amp;gt;  
  );
}
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Info.js =&amp;gt; 언마운트 될때만 cleanup함수가 호출되도록 하고 싶으면 의존 배열에 빈 배열을 설정&lt;/p&gt;
&lt;pre id=&quot;code_1698408741566&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect, useState } from &quot;react&quot;;

function Info() {
    const [name, setName] = useState('');
    const [nickname, setNickname] = useState('');

    const handlerChangeName = e =&amp;gt; setName(e.target.value);
    const handlerChangeNickname = e =&amp;gt; setNickname(e.target.value);

    useEffect(() =&amp;gt; {
        console.log('렌더링이 완료되었습니다.');
        console.log({ name, nickname });
        return () =&amp;gt; console.log('cleanup', name);
    }, []);
    return (
        &amp;lt;&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: {name}&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: {nickname}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;이름: &amp;lt;input type=&quot;text&quot; value={name} onChange={handlerChangeName}/&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;별명: &amp;lt;input type=&quot;text&quot; value={nickname} onChange={handlerChangeNickname}/&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
}
export default Info;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) useRef&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 함수형 컴포넌트에서 DOM 요소를 직접 제어하기 위해서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 숫자를 입력할 수 있는 입력창과 입력한 숫자를 등록하는 버튼을 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 입력창에 숫자를 입력하면 입력한 숫자를 입력값에 출력&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 등록 버튼을 클릭하면 등록된 숫자들을 리스트에 출력하고 입력창에 포커스를 이동&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Average.js&lt;/p&gt;
&lt;pre id=&quot;code_1698408894469&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState, useRef } from &quot;react&quot;;

const Average = () =&amp;gt; {
    const [number, setNumber] = useState('');
    const [list, setList] = useState([]);

    const handlerChangeNumber = e =&amp;gt; setNumber(e.target.value);
    const handlerButtonClick = e =&amp;gt; {
        const newList = list.concat(number);
        setList(newList);

        setNumber('');
        inputElement.current.focus();		//current 잊지말기
    }

	useEffect(() =&amp;gt; inputElement.current.focus(), []);		//마운트 될때마다 입력창에 포커스를 설정하도록 수정

    const inputElement = useRef(); 		//useRef 추가

    return (
        &amp;lt;&amp;gt;
            &amp;lt;div&amp;gt;
                등록된 숫자:
                &amp;lt;ul&amp;gt;
                    { list.map((num, idx) =&amp;gt; &amp;lt;li key={idx}&amp;gt;{num}&amp;lt;/li&amp;gt;) }
                &amp;lt;/ul&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;p&amp;gt;입력값: {number}&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;input ref={inputElement} type=&quot;number&quot; value={number} onChange={handlerChangeNumber}/&amp;gt;
                    &amp;lt;button onClick={handlerButtonClick}&amp;gt;등록&amp;lt;/button&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
};
export default Average;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/24</guid>
      <comments>https://kalswn.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:19:17 +0900</pubDate>
    </item>
    <item>
      <title>React - Ref</title>
      <link>https://kalswn.tistory.com/23</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Ref&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: DOM 요소나 React 컴포넌트에 대한 &lt;b&gt;참조를 생성하고 관리&lt;/b&gt;하는데 사용되는 특별한 속성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;render 메소드에서 생성된 DOM 노드나 React 엘리먼트에 접근하는 방법을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 사용방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 콜백 ref useRef 를 이용&lt;/p&gt;
&lt;pre id=&quot;code_1698222923501&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyComponent extends Component {

    const handler = () =&amp;gt; {
		this.myref.focus();
	}
	render() {
		return &amp;lt;input ref={ x =&amp;gt; this.myinput = x } /&amp;gt;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) React.createRef() API를이용 =&amp;gt; current 사용하는거 잊지 말기&lt;/p&gt;
&lt;pre id=&quot;code_1698222587686&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyComponent extends React.Component {
	constructor() {
		super();
		this.myref = React.createRef();
	}
	render() {
		return &amp;lt;input type=&quot;text&quot; ref={this.myref} /&amp;gt;;
	}
	const handler = () =&amp;gt; {
		this.myref.current.focus();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password 검증 컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; &lt;b&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;패스워드 입력창에 입력된 값이 &quot;0000&quot;와 일치하는 여부를 판단&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;일치하면 패스워드 입력창의 색깔을 파란색으로, 일치하지 않으면 패스워드 입력창의 색깔을 붉은색으로 설정&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698221515373&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component } from &quot;react&quot;;

class ValidatePassword extends Component {
    state = {
        password: '',
        isValid: false
    };
    handlerPasswordChange = e =&amp;gt; this.setState({ password: e.target.value });
    handlerPasswordCheck = () =&amp;gt; {
        if (this.state.password === '0000') {
            this.setState({ isValid: true });
        } else {
            this.setState({ isValid: false });
        }
    };
    render() {
        return (
            &amp;lt;&amp;gt;
                &amp;lt;input type=&quot;password&quot; 
                    value={this.state.password} 
                    onChange={this.handlerPasswordChange} 
                    style={this.state.isValid ? {backgroundColor: 'blue'} : {backgroundColor: 'red'}} /&amp;gt;
                &amp;lt;button onClick={this.handlerPasswordCheck}&amp;gt;패스워드 검증&amp;lt;/button&amp;gt;
            &amp;lt;/&amp;gt;
        );
    }
}
export default ValidatePassword;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;+) 패스워드를 잘못 입력했을 때 패스워드 입력창에 포커스를 전달하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 콜백 ref 이용&lt;/p&gt;
&lt;pre id=&quot;code_1698223716238&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component } from &quot;react&quot;;

class ValidatePassword extends Component {
    state = {
        password: '',
        isValid: false
    };
    handlerPasswordChange = e =&amp;gt; this.setState({ password: e.target.value });
    handlerPasswordCheck = () =&amp;gt; {
        if (this.state.password === '0000') {
            this.setState({ isValid: true });
        } else {
            this.setState({ isValid: false });
            console.log(this.passwordInput);
            this.passwordInput.focus();
        }
    };
    render() {
        return (
            &amp;lt;&amp;gt;
                &amp;lt;input type=&quot;password&quot; 
                    ref={ x =&amp;gt; this.passwordInput = x }
                    value={this.state.password} 
                    onChange={this.handlerPasswordChange} 
                    style={this.state.isValid ? {backgroundColor: 'blue'} : {backgroundColor: 'red'}} /&amp;gt;
                &amp;lt;button onClick={this.handlerPasswordCheck}&amp;gt;패스워드 검증&amp;lt;/button&amp;gt;
            &amp;lt;/&amp;gt;
        );
    }
}
export default ValidatePassword;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) React.createRef()를 이용&lt;/p&gt;
&lt;pre id=&quot;code_1698223804586&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from &quot;react&quot;;

class ValidatePassword extends Component {
    state = {
        password: '',
        isValid: false
    };

    passwordInput = React.createRef();

    handlerPasswordChange = e =&amp;gt; this.setState({ password: e.target.value });
    handlerPasswordCheck = () =&amp;gt; {
        if (this.state.password === '0000') {
            this.setState({ isValid: true });
        } else {
            this.setState({ isValid: false });
            console.log(this.passwordInput);
            console.log(this.passwordInput.current);
            this.passwordInput.current.focus();
        }
    };
    render() {
        return (
            &amp;lt;&amp;gt;
                &amp;lt;input type=&quot;password&quot; 
                    ref={this.passwordInput}
                    value={this.state.password} 
                    onChange={this.handlerPasswordChange} 
                    style={this.state.isValid ? {backgroundColor: 'blue'} : {backgroundColor: 'red'}} /&amp;gt;
                &amp;lt;button onClick={this.handlerPasswordCheck}&amp;gt;패스워드 검증&amp;lt;/button&amp;gt;
            &amp;lt;/&amp;gt;
        );
    }
}
export default ValidatePassword;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/React</category>
      <category>React</category>
      <category>Ref</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/23</guid>
      <comments>https://kalswn.tistory.com/23#entry23comment</comments>
      <pubDate>Wed, 25 Oct 2023 17:50:53 +0900</pubDate>
    </item>
    <item>
      <title>k8s - pod</title>
      <link>https://kalswn.tistory.com/22</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;pod?&lt;/b&gt;&lt;/h3&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;&amp;nbsp; &amp;nbsp;Voloume + Container&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. status&lt;/b&gt;&lt;/h4&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 style=&quot;width: 50%;&quot;&gt;Container Creating&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;이미지 다운 중이거나 컨테이너 생성 중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;CrashLoopBackOff&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;파드 내의 컨테이너가 종료되어 다음 기동시까지 대기 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Pending&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;리소스가 부족해 생성이 보류된상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Terminating&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;컨테이너에 종료 요청 시그널을 보낸 후 컨테이너가 종료할때까지 대기 중을 의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;파드 내 컨테니너가 정상적으로 종료되었음을 의미&lt;br /&gt;파드 내에 복수의 컨테이너가 생성된 경우, 첫 번째 컨테이너가 정상 종료된 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Error&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;컨테이너가 이상 종료된 경우&lt;br /&gt;파드 재에 복수의 컨테이너가 생성된 경우 , 첫 번째 컨테이너가 이상 종료된 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. pod 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx 컨테이너로 구성된 파드를 생성&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) CLI&lt;/p&gt;
&lt;pre id=&quot;code_1698104118227&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;root@master:/home/vagrant# kubectl run my-nginx-pod-cli --image=nginx:latest --port 80
pod/my-nginx-pod-cli created           ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~  
                                       파드 이름        파드 생성에 사용할 이미지     컨테이너에서 사용하는 포트
root@master:/home/vagrant# kubectl get pod
NAME               READY   STATUS              RESTARTS   AGE
my-nginx-pod-cli   0/1     ContainerCreating   0          7s

root@master:/home/vagrant# kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
my-nginx-pod-cli   1/1     Running   0          2m12s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) YAML&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698104363638&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;root@master:/home/vagrant# vi nginx-pod.yaml
apiVersion: v1				# YAML 파일에서 정의한 오브젝트의 API 버전
kind: Pod				# 리소스의 종류 ( kubectl api-resources 명령의 KIND 항목 )
metadata:				# 라벨, 주석(annotation), 이름과 같은 리소스의 부가 정의
  name: my-nginx-pod
spec:					# 리소스 생성을 위한 정보
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP


root@master:/home/vagrant# kubectl apply -f nginx-pod.yaml
pod/my-nginx-pod created

root@master:/home/vagrant# kubectl get pod
NAME               READY   STATUS              RESTARTS   AGE
my-nginx-pod       0/1     ContainerCreating   0          4s
my-nginx-pod-cli   1/1     Running             0          11m

root@master:/home/vagrant# kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
my-nginx-pod       1/1     Running   0          30s
my-nginx-pod-cli   1/1     Running   0          11m&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. pod의 자세한 정보 확인&lt;/p&gt;
&lt;pre id=&quot;code_1698104644160&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;root@master:/home/vagrant# kubectl describe pods my-nginx-pod
Name:             my-nginx-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             worker2/192.168.10.120
Start Time:       Thu, 05 Oct 2023 09:35:33 +0900
Labels:           &amp;lt;none&amp;gt;
Annotations:      cni.projectcalico.org/containerID: 0efd9cdd086dc6d97e07ac287031ed60737fb83a7394923c038ec9835267a28d
                  cni.projectcalico.org/podIP: 10.233.125.6/32
                  cni.projectcalico.org/podIPs: 10.233.125.6/32
Status:           Running
IP:               10.233.125.6	&amp;lArr; 파드 IP (클러스터 내부에서만 접근이 가능)
IPs:					   &amp;rarr; 쿠버네티스 외부 또는 내부에서 파드에 접근하려면 서비스를 생성해야 함
  IP:  10.233.125.6
Containers:
  my-nginx-container:
    Container ID:   containerd://3270e6b5ba24638ed577aa27a222912244babee1915e44188a6ea9444dacf7ba
    Image:          nginx:latest
    Image ID:       docker.io/library/nginx@sha256:32da30332506740a2f7c34d5dc70467b7f14ec67d912703568daff790ab3f755
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 05 Oct 2023 09:35:53 +0900
    Ready:          True
    Restart Count:  0
    Environment:    &amp;lt;none&amp;gt;
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-bs4qt (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-bs4qt:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       &amp;lt;nil&amp;gt;
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              &amp;lt;none&amp;gt;
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  10m   default-scheduler  Successfully assigned default/my-nginx-pod to worker2
  Normal  Pulling    10m   kubelet            Pulling image &quot;nginx:latest&quot;
  Normal  Pulled     10m   kubelet            Successfully pulled image &quot;nginx:latest&quot; in 18.263s (18.264s including waiting)
  Normal  Created    10m   kubelet            Created container my-nginx-container
  Normal  Started    10m   kubelet            Started container my-nginx-container&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;</description>
      <category>  개발 일지/K8s</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/22</guid>
      <comments>https://kalswn.tistory.com/22#entry22comment</comments>
      <pubDate>Wed, 25 Oct 2023 08:54:49 +0900</pubDate>
    </item>
    <item>
      <title>React - 이벤트 핸들링</title>
      <link>https://kalswn.tistory.com/21</link>
      <description>&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 리액트에서 이벤트를 사용할 때 주의사항&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 이벤트 이름은 카멜 표현식을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;첫 글자를 대문자로 적되, 맨 앞에 오는 글자는 소문자로 표기하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ex) onClick , onChange...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 이벤트 핸들러로 자바스크립트 코드를 사용할 수 없고, 함수 형태로 전달&lt;/p&gt;
&lt;pre id=&quot;code_1698138630141&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTML  &amp;rArr; &amp;lt;button onClick=&quot;console.log('클릭되었습니다.')&quot; /&amp;gt;
react &amp;rArr; &amp;lt;button onClick={ () =&amp;gt; console.log('클릭되었습니다.') } /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 이벤트는 DOM 요소(element)에만 사용이 가능&lt;/p&gt;
&lt;pre id=&quot;code_1698138664932&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div onMouseOver={ () =&amp;gt; { ... } }&amp;gt; ... &amp;lt;/div&amp;gt; 			&amp;lArr; div는 HTML DOM 요소이므로 이벤트 설정이 가능
&amp;lt;MyComponent onMouseOver={ () =&amp;gt; { ... }&amp;gt; ... &amp;lt;/MyComponent&amp;gt; 	&amp;lArr; MyComponent는 컴포넌트이므로 이벤트 설정이 불가&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 리액트에서 처리할 수 있는 이벤트 종류&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://legacy.reactjs.org/docs/events.html#supported-events&quot;&gt;https://legacy.reactjs.org/docs/events.html#supported-events&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698138699389&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SyntheticEvent &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;legacy.reactjs.org&quot; data-og-source-url=&quot;https://legacy.reactjs.org/docs/events.html#supported-events&quot; data-og-url=&quot;https://legacy.reactjs.org/docs/events.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bDoz7A/hyUkc5du7Q/EKkY3t6VXFHFbyfvdkec71/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://legacy.reactjs.org/docs/events.html#supported-events&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://legacy.reactjs.org/docs/events.html#supported-events&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bDoz7A/hyUkc5du7Q/EKkY3t6VXFHFbyfvdkec71/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;SyntheticEvent &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A JavaScript library for building user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;legacy.reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 종류마다 처리에 필요한 정보가 다르고, 해당 정보는 이벤트 객체(이벤트 핸들러 함수의 매개변수로 전달)을 통해서 전달&lt;/p&gt;
&lt;pre id=&quot;code_1698138789835&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;button onClick={e =&amp;gt; console.log('onClick', e)}&amp;gt;클릭&amp;lt;/button&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;input type=&quot;text&quot; onKeyUp={e =&amp;gt; console.log('onKeyUp', e)} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 자식 컴포넌트에서 발생한 이벤트를 부모 컴포넌트로 전달하고자하는 경우&lt;/b&gt; =&amp;gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;부모 컴포넌트에 이벤트 핸들러 함수를 정의하고 자식 컴포넌트의 props 변수로 전달하면, 자식 컴포넌트는 props&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수로 전달된 함수를 이벤트 핸들러 함수로 설정&lt;/p&gt;
&lt;pre id=&quot;code_1698138837163&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component, useState } from 'react';

function Child({ count, handlerReset }) {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;현재 카운트: {count}&amp;lt;/h1&amp;gt;
      &amp;lt;button onClick={handlerReset}&amp;gt;리셋&amp;lt;/button&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

function Parent() {
  const [count, setCount] = useState(0);
  const handlerPlusOne = () =&amp;gt; setCount(count + 1);
  const handlerMinusOne = () =&amp;gt; setCount(count - 1);
  const handlerReset = () =&amp;gt; setCount(0);
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Child count={count} handlerReset={handlerReset} /&amp;gt;
      &amp;lt;h1&amp;gt;현재 카운트: {count}&amp;lt;/h1&amp;gt;
      &amp;lt;button onClick={handlerPlusOne}&amp;gt;하나 증가&amp;lt;/button&amp;gt;
      &amp;lt;button onClick={handlerMinusOne}&amp;gt;하나 감소&amp;lt;/button&amp;gt;
      &amp;lt;button onClick={handlerReset}&amp;gt;리셋&amp;lt;/button&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Parent /&amp;gt;
    &amp;lt;/&amp;gt;  
  );
}
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;handlerReset함수를 부모컴포넌트에 정의하고 해당 함수를 자식 컴포넌트의 props로 전달해서 이벤트 핸들러로 설정&lt;/p&gt;</description>
      <category>  개발 일지/React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/21</guid>
      <comments>https://kalswn.tistory.com/21#entry21comment</comments>
      <pubDate>Tue, 24 Oct 2023 18:22:17 +0900</pubDate>
    </item>
    <item>
      <title>쿠버네티스(kubernetes, k8s)</title>
      <link>https://kalswn.tistory.com/20</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;쿠버네티스란?&amp;nbsp;&lt;/h3&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;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 style=&quot;width: 50%;&quot;&gt;Docker&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;k8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;한대의 물리적 서버&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;여러 대의 물리적 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;도커 컴포즈&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;매니페스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;컨테이너 생성에만 관여&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;컨테이너 상태를 유지(배포 , 관리)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) 설치환경&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;개발용도&lt;br /&gt;: minikube, Docker for Window 에 내장된 쿠버네티스=&amp;gt; 한대의 컴퓨터에 마스터노드와 워커노드 구축&lt;/li&gt;
&lt;li&gt;테스트/ 운영 용도&lt;br /&gt;: kops, kubespray, kubeadmin, EKS, AKS,GKE 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) cluster&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;애플리케이션 컨테이너를 실행하기 위한 일련의 노드 머신&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;마스터 노드와 워커 노드로 구성&lt;/span&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 style=&quot;width: 50%;&quot;&gt;마스터 노드&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;워커노드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;전체적인 제어 담당&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;실제 동작을 담당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;-kube-apiserver : 외부와 통신하는 프로세스, kubectl로부터 명령을 전달받아 실행&lt;br /&gt;- kube-controller-manager : 컨트롤러를 통합 관리, 실행&lt;br /&gt;- kube-scheduler : 파드를 워커노드에 할당&lt;br /&gt;- cloud-controller-manager : 클라우드 서비스와 연동해 서비스 생성&lt;br /&gt;- etcd : 클러스터 관련 정보 전반을 관리하는 데이터 베이스&lt;br /&gt;&lt;br /&gt;=&amp;gt; control-plane을 통해 워커노드를 관리&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;- kube-let : 마스터 노드의 kube-scheduler와 연동하며 워커노드에 파드릴 배치하고 실행&lt;br /&gt;실행 중인 파드의 상태를 정기적으로 모니터링하여 kube-scheduler에 통지&lt;br /&gt;- kube-proxy : 네트워크 통신의 라우팅 메커니즘&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3) 쿠버네티스 리소스&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 262px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;pod&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;기본적으로 컨테이너 + 볼륨, 쿠버네티스에서 관리하는 가장 작은 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;node&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;컨테이너를 배치하는 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;replicaset&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;파드의 수를 관리하는 반장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;deployment&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;파드의 디플로이(배포)를 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;daemonset&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;각 노드에 파드를 하나씩 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;service&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;여러개의 파드를 이끄는 반장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;Ingress&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;외부에서 내부로 들어오는 네트워크 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;namespace&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 20px;&quot;&gt;리소스를 논리적으로 구분하는 장벽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px;&quot;&gt;configMap&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 17px;&quot;&gt;컨테이너에서 필요한 환경설정 내용을 컨테이너와 분리해서 제공해 주기 위한 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px;&quot;&gt;secret&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 17px;&quot;&gt;비밀번호, OAuth 토큰, ssh 키 같은 민감한 정보들을 저장하는 용도로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px;&quot;&gt;Job&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 17px;&quot;&gt;특정 개수만큼의 파드를 정상적으로 실행 / 종료 되는 것을 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px;&quot;&gt;CronJob&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 17px;&quot;&gt;Job을 시간 기준으로 관리하도록 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px;&quot;&gt;Storage&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 17px;&quot;&gt;저장소...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px;&quot;&gt;Statefulset&lt;/td&gt;
&lt;td style=&quot;width: 86.1628%; height: 17px;&quot;&gt;파드 집합의 디플로이먼트와 스케일링을 관리하고, 파드들의 순서 및 고유성을 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스 관련 내용과 실습은 정리 후 차례대로 링크 넣을 예정!&lt;/p&gt;</description>
      <category>  개발 일지/K8s</category>
      <category>K8s</category>
      <category>Kubernetes</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/20</guid>
      <comments>https://kalswn.tistory.com/20#entry20comment</comments>
      <pubDate>Mon, 23 Oct 2023 18:13:55 +0900</pubDate>
    </item>
    <item>
      <title>React - 상태변수 state / setState()</title>
      <link>https://kalswn.tistory.com/19</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상태변수 state&lt;/b&gt;&lt;/h3&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;&amp;nbsp; &amp;nbsp;클래스형 컴포넌트는 setState() 메소드를 이용, 함수형 컴포넌트는 useState() 훅 함수가 반환하는 함수를 이용해서 값을 변경해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 클래스형 컴포넌트&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1698026073678&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Counter from './Counter';

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

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 클래스형 컴포넌트에서 state 사용&lt;/p&gt;
&lt;pre id=&quot;code_1698026637090&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component } from 'react';

class Counter extends Component{
	constructor(props){
            super(props);
            this.state = {
                number : 0       
            }
	};
	render(){
            return(
                &amp;lt;&amp;gt;
                        &amp;lt;h1&amp;gt; {this.state.number} &amp;lt;/h1&amp;gt;
                        &amp;lt;button onClick={ () =&amp;gt; {this.setState({number : this.state.number +1});
                        console.log(this.state.number);
                        }}&amp;gt; +1 &amp;lt;/button&amp;gt;
                &amp;lt;/&amp;gt;
            );
    };
};

export default Counter;&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;744&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boCysN/btsyVizIbHZ/oPbx677cBQ5NPmKY8TssF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boCysN/btsyVizIbHZ/oPbx677cBQ5NPmKY8TssF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boCysN/btsyVizIbHZ/oPbx677cBQ5NPmKY8TssF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboCysN%2FbtsyVizIbHZ%2FoPbx677cBQ5NPmKY8TssF1%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;744&quot; height=&quot;454&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&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;console : 업데이트 이전의 값이 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 상태변수 setState() 를 사용하지않고, 변경하는 형태로 코드를 수정&lt;/p&gt;
&lt;pre id=&quot;code_1698027636059&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &amp;lt;button onClick={ () =&amp;gt; {
                    console.log(this.state.number);
                    // this.setState({number : this.state.number +1});
                    this.state.number = this.state.number +1;
                    console.log(this.state.number);
                }}&amp;gt; +1 &amp;lt;/button&amp;gt;&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;744&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVjgyO/btsyTjGi5Sk/9OCB7ooAV1xrKfqOXRyJW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVjgyO/btsyTjGi5Sk/9OCB7ooAV1xrKfqOXRyJW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVjgyO/btsyTjGi5Sk/9OCB7ooAV1xrKfqOXRyJW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVjgyO%2FbtsyTjGi5Sk%2F9OCB7ooAV1xrKfqOXRyJW1%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;744&quot; height=&quot;454&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;화면 : 버튼 클릭할 때마다 숫자가 증가하지않음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;console : 업데이트 이전의 값과 클릭후 증가된 값이 변경됨을 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) number 변수를 상태변수가 아닌 일반변수로 변경&lt;/p&gt;
&lt;pre id=&quot;code_1698027818545&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component } from 'react';

class Counter extends Component{

    number = 0;
	render(){
    	return(
        	&amp;lt;&amp;gt;
            	&amp;lt;h1&amp;gt; {this.number} &amp;lt;/h1&amp;gt;

                &amp;lt;button onClick={ () =&amp;gt; {
                    console.log(this.number);
                    this.number = this.number +1;
                    console.log(this.number);
                }}&amp;gt; +1 &amp;lt;/button&amp;gt;
            &amp;lt;/&amp;gt;
        );
    };
};

export default Counter;&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;744&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmidLA/btsyT1SEhlM/vyy8D7S5QArK2fxfVM3BQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmidLA/btsyT1SEhlM/vyy8D7S5QArK2fxfVM3BQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmidLA/btsyT1SEhlM/vyy8D7S5QArK2fxfVM3BQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmidLA%2FbtsyT1SEhlM%2Fvyy8D7S5QArK2fxfVM3BQk%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;744&quot; height=&quot;454&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;화면 : 버튼 클릭할 때마다 숫자가 증가하지않음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;console : 업데이트 이전의 값과 클릭후 증가된 값이 변경됨을 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;=&amp;gt; 상태변수를 사용하는 이유&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 변수의 값 변화가 &lt;span style=&quot;color: #ee2323;&quot;&gt;화면에 반영&lt;/span&gt;되어야 하는 경우 &lt;span style=&quot;color: #ee2323;&quot;&gt;상태변수를 사용&lt;/span&gt;하고, &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 이때 상태변수의 값 변경을 위해서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;setState() 를 이용&lt;/span&gt;해야함&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) 상태변수를 지역변수로 재정의해서 사용&lt;/p&gt;
&lt;pre id=&quot;code_1698028266927&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component } from &quot;react&quot;;

class Counter extends Component {

    constructor(props) {
    	super(props);
        this.state = {
            number: 0   // 상태변수이름 : 상태변수초기값
        };
    }

    render() {
        // 상태 변수가 하나 또는 개수가 적다면 아래와 같이 직접 선언
        // const number = this.state.number;
        
        // 일반적으로 객체 비구조화를 이용해서 상태변수의 값을 분해해서 지역변수로 할당
        const { number } = this.state;
        
        return (
            &amp;lt;&amp;gt;
                {/* 상태변수의 값을 출력 */}
                &amp;lt;h1&amp;gt;{number}&amp;lt;/h1&amp;gt;

                {/* 버튼을 하나 추가해서 해당 버튼을 클릭할 때 마다 상태변수의 값을 하나씩 증가 */}
                &amp;lt;button onClick={() =&amp;gt; {
                    console.log(&quot;Before:&quot;, number);
                    this.setState({ number: number + 1 });
                    console.log(&quot;After:&quot;, number);
                }}&amp;gt;하나 증가&amp;lt;/button&amp;gt;
            &amp;lt;/&amp;gt;
        );
    }
}
export default Counter;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;setState()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 컴포넌트 state의 변경사항을 대기열에 집어넣고, React에 해당 컴포넌트와 자식들이 갱신된 state를 사용하여 다시 렌더링 되어야한다고 알려줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 컴포넌트를 갱신하는 데에 있어 즉각적인 명령이 아닌 요청임.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 클래스형 컴포넌트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) updater 함수 이용 =&amp;gt; setState(updater[,callback])&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698029880609&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onClick={ () =&amp;gt; {
    console.log(number);
    // this.setState({ number: number + 1 }); 
    this.setState(currentState =&amp;gt; ({number : currentState.number+1})); //update 함수 이용
    console.log(number);
}}&amp;gt; +1 &amp;lt;/button&amp;gt;&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;744&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NpSnB/btsyViNihlo/orcPiOa6VpssCPSEG9Wz5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NpSnB/btsyViNihlo/orcPiOa6VpssCPSEG9Wz5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NpSnB/btsyViNihlo/orcPiOa6VpssCPSEG9Wz5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNpSnB%2FbtsyViNihlo%2ForcPiOa6VpssCPSEG9Wz5k%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;744&quot; height=&quot;454&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;화면 : 버튼 클릭할 때마다 숫자가 증가함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;console : 업데이트 이전의 값이 출력됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 변경객체를 전달하는 방법 =&amp;gt; setState(stateChange[,callback])&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698031097125&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onClick={ () =&amp;gt; {
    console.log(number);
    // this.setState({ number: number + 1 }); 
    this.setState(currentState =&amp;gt; ({number : currentState.number+1}),
    				()=&amp;gt; console.log(this.state.number)    				
                    ); //update 함수 이용
}}&amp;gt; +1 &amp;lt;/button&amp;gt;&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;744&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4ZMkQ/btsyTonlWy4/z0dkMkgOxS6c1vTmPI6Ai0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4ZMkQ/btsyTonlWy4/z0dkMkgOxS6c1vTmPI6Ai0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4ZMkQ/btsyTonlWy4/z0dkMkgOxS6c1vTmPI6Ai0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4ZMkQ%2FbtsyTonlWy4%2Fz0dkMkgOxS6c1vTmPI6Ai0%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;744&quot; height=&quot;454&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 135px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 9.84493%; height: 20px;&quot;&gt;화면&lt;/td&gt;
&lt;td style=&quot;width: 16.124%; height: 20px;&quot;&gt;console&lt;/td&gt;
&lt;td style=&quot;width: 74.031%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 9.84493%; height: 51px;&quot;&gt;+1 증가&lt;/td&gt;
&lt;td style=&quot;width: 16.124%; height: 51px;&quot;&gt;before= after&lt;/td&gt;
&lt;td style=&quot;width: 74.031%; height: 51px;&quot;&gt;this.setState({num : num +1});&lt;br /&gt;this.setState({num : num +1}); &lt;br /&gt;this.setState({num : num +1}); &lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 9.84493%; height: 10px;&quot;&gt;+3 증가&lt;/td&gt;
&lt;td style=&quot;width: 16.124%; height: 10px;&quot;&gt;before = after&lt;/td&gt;
&lt;td style=&quot;width: 74.031%; height: 10px;&quot;&gt;this.setState(curNum =&amp;gt; ({num: curNum.num+1}));&lt;br /&gt;this.setState(curNum =&amp;gt; ({num: curNum.num+1})); &lt;br /&gt;this.setState(curNum =&amp;gt; ({num: curNum.num+1})); &lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 9.84493%; height: 20px;&quot;&gt;+3 증가&lt;/td&gt;
&lt;td style=&quot;width: 16.124%; height: 20px;&quot;&gt;before &amp;ne;&lt;span style=&quot;color: #202124;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; after(+3)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.031%; height: 20px;&quot;&gt;this.setState(curNum =&amp;gt; ({num: curNum.num+1}),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ()=&amp;gt; console.log(this.state.num)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 함수형 컴포넌트&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1698032144361&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState } from 'react';

function Counter(){

    const {number, setCount} = useState('');
    return(
        &amp;lt;&amp;gt;
            &amp;lt;h1&amp;gt; {number} &amp;lt;/h1&amp;gt;

            &amp;lt;button onClick={
                ()=&amp;gt;setCount(number+1)
            }&amp;gt; +1 &amp;lt;/button&amp;gt;
        &amp;lt;/&amp;gt;
    );

};
export default Counter;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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 style=&quot;width: 50%;&quot;&gt;클래스 Component&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;함수형 Component&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;this.setState(curState =&amp;gt; ({num : curState.num +1}));&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;const {num , setNum} = useState('');&lt;br /&gt;&lt;br /&gt;() =&amp;gt; setNum(num + 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>  개발 일지/React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/19</guid>
      <comments>https://kalswn.tistory.com/19#entry19comment</comments>
      <pubDate>Mon, 23 Oct 2023 12:46:35 +0900</pubDate>
    </item>
    <item>
      <title>React Practice - 함수형 Component 사용하여 생성한 신호등 클래스형 Component로 변경해보기</title>
      <link>https://kalswn.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kalswn.tistory.com/17&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kalswn.tistory.com/17&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698023035065&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;React Practice - 함수형 Component 사용하여 _ 신호등 만들기&quot; data-og-description=&quot;신호등 모양을 출력하는 컴포넌트 작성하기 - App.js 파일에 일정한 크기의 Lamp를 포함한 TrafficLight 컴포넌트를 포함 - TrafficLight 컴포넌트는 빨강, 초록, 노랑 속성을 가지는 같은 크기의 Lamp 컴포&quot; data-og-host=&quot;kalswn.tistory.com&quot; data-og-source-url=&quot;https://kalswn.tistory.com/17&quot; data-og-url=&quot;https://kalswn.tistory.com/17&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPp19e/hyUgKPMlPZ/LSGoiJc7yZmwPeHQXAKwCk/img.png?width=744&amp;amp;height=454&amp;amp;face=0_0_744_454,https://scrap.kakaocdn.net/dn/YigRK/hyUgT0gcuV/BwkQKTmFztkGM9llD87c31/img.png?width=744&amp;amp;height=454&amp;amp;face=0_0_744_454,https://scrap.kakaocdn.net/dn/3SQYr/hyUkhLVruJ/Sp7RWv7ntHNpKsuHyfONeK/img.png?width=744&amp;amp;height=454&amp;amp;face=0_0_744_454&quot;&gt;&lt;a href=&quot;https://kalswn.tistory.com/17&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kalswn.tistory.com/17&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPp19e/hyUgKPMlPZ/LSGoiJc7yZmwPeHQXAKwCk/img.png?width=744&amp;amp;height=454&amp;amp;face=0_0_744_454,https://scrap.kakaocdn.net/dn/YigRK/hyUgT0gcuV/BwkQKTmFztkGM9llD87c31/img.png?width=744&amp;amp;height=454&amp;amp;face=0_0_744_454,https://scrap.kakaocdn.net/dn/3SQYr/hyUkhLVruJ/Sp7RWv7ntHNpKsuHyfONeK/img.png?width=744&amp;amp;height=454&amp;amp;face=0_0_744_454');&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;React Practice - 함수형 Component 사용하여 _ 신호등 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;신호등 모양을 출력하는 컴포넌트 작성하기 - App.js 파일에 일정한 크기의 Lamp를 포함한 TrafficLight 컴포넌트를 포함 - TrafficLight 컴포넌트는 빨강, 초록, 노랑 속성을 가지는 같은 크기의 Lamp 컴포&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kalswn.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;TraffiLight.js&lt;/p&gt;
&lt;pre id=&quot;code_1698023959056&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {Component} from 'react';
import Lamp from './Lamp'

class TrafficLight extends Component {

    render(){
        const {size, colors} = this.props;
        return(
            &amp;lt;&amp;gt;
            {
                colors.map(color =&amp;gt; &amp;lt;Lamp size = {size} color = {color}/&amp;gt;)
            }
            &amp;lt;/&amp;gt;
        )
    }

}

// function TrafficLight({size,colors}){
//     console.log(size,colors);
//     return(
//         &amp;lt;&amp;gt;
//             {
//                 colors.map(color =&amp;gt; &amp;lt;Lamp size = {size} color = {color}/&amp;gt;)
//             }
        
//         &amp;lt;/&amp;gt;
//     );
// }

export default TrafficLight;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lamp.js&lt;/p&gt;
&lt;pre id=&quot;code_1698024145047&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component } from &quot;react&quot;;

class Lamp extends Component{
    render(){
        const {size, color} = this.props;
        return(
            &amp;lt;&amp;gt;
                &amp;lt;div style ={{width:size, height : size, borderRadius : size/2, backgroundColor : color}} /&amp;gt;
            &amp;lt;/&amp;gt;
        );
    }
}

// function Lamp({size,color}){
//     return(
//         &amp;lt;&amp;gt;
//             &amp;lt;div style ={{width:size, height : size, borderRadius : size/2, backgroundColor : color}} /&amp;gt;
//         &amp;lt;/&amp;gt;
//     );
// };

export default Lamp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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 style=&quot;width: 10.4651%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 39.5349%;&quot;&gt;함수형 Component&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;클래스형 Component&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;변수 선언&lt;/td&gt;
&lt;td style=&quot;width: 39.5349%;&quot;&gt;function TrafficLight({size,colors}){ ... }&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;class TrafficLight extends Component{&lt;br /&gt;&amp;nbsp; &amp;nbsp; render(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const {size,colors} = this.props;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ....}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/18</guid>
      <comments>https://kalswn.tistory.com/18#entry18comment</comments>
      <pubDate>Mon, 23 Oct 2023 10:27:05 +0900</pubDate>
    </item>
    <item>
      <title>React Practice - 함수형 Component 사용하여 _ 신호등 만들기</title>
      <link>https://kalswn.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;신호등 모양을 출력하는 컴포넌트 작성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- App.js 파일에 일정한 크기의 Lamp를 포함한 TrafficLight 컴포넌트를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TrafficLight 컴포넌트는 빨강, 초록, 노랑 속성을 가지는 같은 크기의 Lamp 컴포넌트 3개를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Lamp 컴포넌트는 색상과 크기를 부모 컴포넌트로부터 전달받아서 해당 색상과 크기의 원을 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 100px의 붉은색 동그라미를 출력 =&amp;gt; &amp;lt;div style ={{width:100, height : 100, borderRadius : 50, bacgroundColor : 'red'}} /&amp;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)&amp;nbsp; App.js 에 신호등 만들기&lt;/p&gt;
&lt;pre id=&quot;code_1698020637604&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;div style ={{width:100, height : 100, borderRadius : 50, backgroundColor : 'red'}} /&amp;gt;
      &amp;lt;div style ={{width:100, height : 100, borderRadius : 50, backgroundColor : 'yellow'}} /&amp;gt;
      &amp;lt;div style ={{width:100, height : 100, borderRadius : 50, backgroundColor : 'green'}} /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&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;744&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dx1CAV/btsyTXilPj9/3J5bkvubHtsg4z4uEWi5DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dx1CAV/btsyTXilPj9/3J5bkvubHtsg4z4uEWi5DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dx1CAV/btsyTXilPj9/3J5bkvubHtsg4z4uEWi5DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdx1CAV%2FbtsyTXilPj9%2F3J5bkvubHtsg4z4uEWi5DK%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;744&quot; height=&quot;454&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) TrafficLight.js 생성하여 App.js 에서 사이즈 전달하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698021662242&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import TrafficLight from './trafficLight/TrafficLight';

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;TrafficLight size={100}/&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TrafficLight.js&lt;/p&gt;
&lt;pre id=&quot;code_1698021711304&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function TrafficLight({size}){

    return(
        &amp;lt;&amp;gt;
            &amp;lt;div style ={{width:size, height : size, borderRadius : size/2, backgroundColor : 'red'}} /&amp;gt;
            &amp;lt;div style ={{width:size, height : size, borderRadius : size/2, backgroundColor : 'yellow'}} /&amp;gt;
            &amp;lt;div style ={{width:size, height : size, borderRadius : size/2, backgroundColor : 'green'}} /&amp;gt;        
        
        &amp;lt;/&amp;gt;
    );
}

export default TrafficLight;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Lamp.js 생성하여 부모 컴포넌트에서 사이즈 와 색상 전달받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TrafficLight.js&lt;/p&gt;
&lt;pre id=&quot;code_1698022136854&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Lamp from './Lamp'

function TrafficLight({size}){

    return(
        &amp;lt;&amp;gt;
            &amp;lt;Lamp size={size} color='red'/&amp;gt;
            &amp;lt;Lamp size={size} color='yellow'/&amp;gt;
            &amp;lt;Lamp size={size} color='green'/&amp;gt;
        
        &amp;lt;/&amp;gt;
    );
}

export default TrafficLight;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lamp.js&lt;/p&gt;
&lt;pre id=&quot;code_1698022155151&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Lamp({size,color}){

    return(
        &amp;lt;&amp;gt;
            &amp;lt;div style ={{width:size, height : size, borderRadius : size/2, backgroundColor : color}} /&amp;gt;
        &amp;lt;/&amp;gt;
    );
};

export default Lamp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) App.js 파일에서 색상을 배열로 넘겨주고 TrafficLight.js 에서 map함수 사용하여 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1698022882580&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import TrafficLight from './trafficLight/TrafficLight';

function App() {
  const tlSize = 100;
  const tlColors = ['red', 'yellow', 'green'];

  return (
    &amp;lt;&amp;gt;
      &amp;lt;TrafficLight size={tlSize} colors = {tlColors}/&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TrafficLight.js&lt;/p&gt;
&lt;pre id=&quot;code_1698022908523&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Lamp from './Lamp'

function TrafficLight({size,colors}){

    return(
        &amp;lt;&amp;gt;
            {
                colors.map(color =&amp;gt; &amp;lt;Lamp size = {size} color = {color}/&amp;gt;)
            }

            {/* &amp;lt;Lamp size={size} color='red'/&amp;gt;
            &amp;lt;Lamp size={size} color='yellow'/&amp;gt;
            &amp;lt;Lamp size={size} color='green'/&amp;gt; */}
        
        &amp;lt;/&amp;gt;
    );
}

export default TrafficLight;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lamp.js&lt;/p&gt;
&lt;pre id=&quot;code_1698022925580&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Lamp({size,color}){

    return(
        &amp;lt;&amp;gt;
            &amp;lt;div style ={{width:size, height : size, borderRadius : size/2, backgroundColor : color}} /&amp;gt;
        &amp;lt;/&amp;gt;
    );
};

export default Lamp;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/17</guid>
      <comments>https://kalswn.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 23 Oct 2023 10:02:56 +0900</pubDate>
    </item>
    <item>
      <title>React - 클래스형 컴포넌트 / 함수형 컴포넌트 / Props</title>
      <link>https://kalswn.tistory.com/16</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스형 컴포넌트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyComponentClass.js&lt;/p&gt;
&lt;pre id=&quot;code_1697881198971&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Component } from &quot;react&quot;;

class MyComponentClass extends Component {
    render() {
        return (
            &amp;lt;&amp;gt;
                &amp;lt;h1&amp;gt;이름은 홍길동입니다.&amp;lt;/h1&amp;gt;
                &amp;lt;h2&amp;gt;나이는 23살입니다.&amp;lt;/h2&amp;gt;
            &amp;lt;/&amp;gt;
        );
    }
}

export default MyComponentClass;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1697881223285&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import MyComponentClass from './MyComponentClass';

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

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수형 컴포넌트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyComponentFunction.js&lt;/p&gt;
&lt;pre id=&quot;code_1697881395070&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function MyComponentFunction(){
	return(
    	&amp;lt;&amp;gt;
        	&amp;lt;h1&amp;gt;이름은 홍길동입니다.&amp;lt;/h1&amp;gt;
            &amp;lt;h2&amp;gt;나이는 26살입니다.&amp;lt;/h2&amp;gt;
        &amp;lt;/&amp;gt;
    );
}

export default MyComponentFunction;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1697881435917&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import MyComponentFunction from './MyComponentFunction';

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

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Props&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: properties 줄임말&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; props 변수의 값은 해당 컴포넌트를 사용하는 부모 컴포넌트에서 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 컴포넌트 자신은 해당 props 값을 읽기 전용으로 사용만 가능&lt;/p&gt;
&lt;pre id=&quot;code_1697881744933&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Parent&amp;gt;
		&amp;lt;Child 변수이름=변수값 변수이름=변수값&amp;gt;&amp;lt;/Child&amp;gt;
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
                     props
&amp;lt;/Parent&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js&lt;/p&gt;
&lt;pre id=&quot;code_1697881779291&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import MyComponentClass from './MyComponentClass';
import MyComponentFunction from './MyComponentFunction';

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;MyComponentClass name=&quot;신길동&quot; /&amp;gt;
      &amp;lt;hr/&amp;gt;
      &amp;lt;MyComponentFunction name=&quot;고길동&quot; /&amp;gt;
    &amp;lt;/&amp;gt;  
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 37px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 56.5116%; height: 20px;&quot;&gt;&lt;b&gt;클래스형 컴포넌트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%; height: 20px;&quot;&gt;&lt;b&gt;함수형 컴포넌트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 56.5116%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;import { Component } from &quot;react&quot;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;class MyComponentClass extends Component {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;render() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.log(this);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;this.props&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;);&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;lArr; 부모 클래스(Componet)에 정의된 속성&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;this.props.&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;name}&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 23살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentClass;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;function MyComponentFunction(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;console.log(props);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;props.&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;name}&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 23살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentFunction;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 56.5116%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;this.props&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변수로 받아옴&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 56.5116%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;import { Component } from &quot;react&quot;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;class MyComponentClass extends Component {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;render() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const { name, age, nickname } = this.props; &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // {name: '신길동', age: 23, nickname: '길동'}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 {&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 {&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;별명은 {&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;nickname&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentClass;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;function MyComponentFunction(props) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const { name, age, nickname } = props;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 {&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 {&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;별명은 {&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;nickname&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentFunction;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 56.5116%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;defaultProps 설정&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;import { Component } from &quot;react&quot;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;class MyComponentClass extends Component {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;render() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const { name, age, nickname } = this.props; // {name: '신길동', age: 23, nickname: '길동'}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 {name}입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 {age}살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;별명은 {nickname}입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;MyComponentClass.defaultProps = {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name: '아무개',&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;age: 0,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nickname: '없음'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentClass;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;defaultProps 설정&lt;br /&gt;&lt;/b&gt; &lt;br /&gt;function MyComponentFunction({ name, age, nickname }) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 {name}입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 {age}살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;별명은 {nickname}입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;MyComponentFunction.defaultProps = {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name: '아무개',&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;age: 0,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nickname: '없음'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentFunction;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: left;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;props.children&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;import './App.css';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;import MyComponentClass from './MyComponentClass';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;import MyComponentFunction from './MyComponentFunction';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;function App() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;MyComponentClass&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt;i&amp;gt;어떤 내용&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MyComponentClass&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;hr/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MyComponentFunction&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;i&amp;gt;또 어떤 내용&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MyComponentFunction&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default App;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;=&amp;gt; &amp;lt;i&amp;gt; 어떤내용&amp;lt;/i&amp;gt; 는 화면에 나오지 않음&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 56.5116%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;import { Component } from &quot;react&quot;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;class MyComponentClass extends Component {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;render() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(this.props);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const { name, age, nickname } = this.props; // {name: '신길동', age: 23, nickname: '길동'}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 {name}입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 {age}살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;별명은 {nickname}입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;div&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;this.props.children&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;}&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MyComponentClass.defaultProps = {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name: '아무개',&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;age: 0,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nickname: '없음'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentClass;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;function MyComponentFunction({ name, age, nickname, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;children&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; }) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;이름은 {name}입니다.&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;나이는 {age}살입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;별명은 {nickname}입니다.&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;{children}&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MyComponentFunction.defaultProps = {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name: '아무개',&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;age: 0,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nickname: '없음'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;export default MyComponentFunction;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>  개발 일지/React</category>
      <category>Component</category>
      <category>React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/16</guid>
      <comments>https://kalswn.tistory.com/16#entry16comment</comments>
      <pubDate>Sat, 21 Oct 2023 22:24:09 +0900</pubDate>
    </item>
    <item>
      <title>JSX - 역할 / 장점 / 사용법</title>
      <link>https://kalswn.tistory.com/14</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSX&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: JavaScript + Xml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: A Syntax eXtension to JavaScript&amp;nbsp; 자바스크립트 확장 문법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;태그에 특화된 속성&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;스타일과 관련된 속성&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 이벤트 핸들러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;~~~~~~~~~~~~~~~~~~~~&amp;nbsp; &amp;nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&amp;nbsp; &amp;nbsp; ~~~~~~~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;img src=&quot;/images/data/test.png&quot; width=&quot;100&quot; height=&quot;100&quot; style=&quot;border: 1px solid red;&quot; onclick=&quot;...&quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;|&amp;nbsp; &amp;nbsp; &amp;nbsp; 속성 ( attribute) =&amp;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;+ㅡ 태그(tag) =&amp;gt; 시작 태그와 종료 태그로 구성 =&amp;gt; 종료 태그가 생략되거나 자기 종료되는 경우가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ~~~~~~~~~~~~~~~~&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ~~~~~~~~~~~~~&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ~~~~~~~~~~~~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div&amp;gt; ... &amp;lt;/div&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;input type =&quot;text&quot;&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;img src=&quot;&quot; /&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 내용(context)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요소(element) = 태그 + 속성 + 컨텍스트&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HTML =&amp;gt; XML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ~~~~~~~~~~~~~~~~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const element = &amp;lt;h1&amp;gt; Hello, World (/h1&amp;gt;;&amp;nbsp; &amp;nbsp; =&amp;gt; JavaScript + XML = JSX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;~~~~~~~~~~~~&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +ㅡㅡㅡㅡㅡJavaScriptㅡㅡㅡㅡㅡ+&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX는 내부적으로 XML/HTML 코드를 JavaScript로 변환하는 과정을 거침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ~~~~~~~~~~~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createElement() 함수가 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &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;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;React.createLement(&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type,&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 엘리먼트의 유형, HTML 태그 또는 다른 리액트 엘리먼트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [props],&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 부모 엘리먼트에서 자식 엘리먼트에게 전달하는 값&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [...children]&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 현재 엘리먼트가 포함하고 있는 자식 엘리먼트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 자바스크립트로 작성한 코드&lt;/p&gt;
&lt;pre id=&quot;code_1697877081964&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;funtion MyButton(){
	const [isClicked, setIsClicked ] = React.useState(false);
    
    return React.createElement(
    	'button'
        { onClick: () =&amp;gt; setIsClicked(!isClicked) },
        isClicked ? &quot;클릭되었습니다.&quot; : &quot;클릭해주세요.&quot;
    );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(React.createElement(MyButton));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX 로 작성한 코드&lt;/p&gt;
&lt;pre id=&quot;code_1697877353991&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App(){
	const [isClicked, setIsClicked] = useState(false);
    
    return (
    	&amp;lt;button onClick={()=&amp;gt; setIsClicked(!isClicked)}&amp;gt;
        {isClicked ? &quot;클릭되었습니다.&quot; : &quot;클릭해주세요.&quot;
        &amp;lt;/button&amp;gt;
    );
}

const root = ReactDOM.createRoot(Document.getElemnetById('roor'));
root.render(&amp;lt;App /&amp;gt;);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&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;&amp;nbsp;보안성이 향상된다. =&amp;gt; xss 공격을 방어할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 반드시 부모 요소 하나로 감싸야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697879177164&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import logo from './logo.svg';
import './App.css';

function App() {
  return (
    &amp;lt;div className=&quot;App&quot;&amp;gt;
      &amp;lt;header className=&quot;App-header&quot;&amp;gt;
        &amp;lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;h1&amp;gt;리액트 앱&amp;lt;/h1&amp;gt;	&amp;lArr; Adjacent JSX elements must be wrapped in an enclosing tag. 
  );				   Did you want a JSX fragment &amp;lt;&amp;gt;...&amp;lt;/&amp;gt;?	=&amp;gt; 오류 발생
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &amp;lt;div&amp;gt; 태그로 감싸는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1697879241437&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import logo from './logo.svg';
import './App.css';

function App() {
  return (
    &amp;lt;div&amp;gt;					&amp;lArr; 루트 엘리먼트를 추가
      &amp;lt;div className=&quot;App&quot;&amp;gt;
        &amp;lt;header className=&quot;App-header&quot;&amp;gt;
          &amp;lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&amp;gt;
        &amp;lt;/header&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;h1&amp;gt;리액트 앱&amp;lt;/h1&amp;gt; 
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Fragment 컴포넌트를 이용&lt;/p&gt;
&lt;pre id=&quot;code_1697879301381&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import logo from './logo.svg';
import './App.css';
import { Fragment } from 'react';

function App() {
  return (
    &amp;lt;Fragment&amp;gt;						&amp;lArr; 불필요하게 태그가 추가되는 것을 방지
      &amp;lt;div className=&quot;App&quot;&amp;gt;
        &amp;lt;header className=&quot;App-header&quot;&amp;gt;
          &amp;lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&amp;gt;
        &amp;lt;/header&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;h1&amp;gt;리액트 앱&amp;lt;/h1&amp;gt; 
    &amp;lt;/Fragment&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Fragment 를 축약 방식으로 사용&lt;/p&gt;
&lt;pre id=&quot;code_1697879369565&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import logo from './logo.svg';
import './App.css';

function App() {
  return (
    &amp;lt;&amp;gt;		// Fragement를 축약 방식으로 사용
      &amp;lt;div className=&quot;App&quot;&amp;gt;
        &amp;lt;header className=&quot;App-header&quot;&amp;gt;
          &amp;lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&amp;gt;
        &amp;lt;/header&amp;gt;
      &amp;lt;/div&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;b&gt;2) JSX 안에서는 자바스크립트의 표현식을 {}로 감싸서 작성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697879417036&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  const name = '홍길동';
  const age = 23;

  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;안녕, {name}&amp;lt;/h1&amp;gt;      
      &amp;lt;h2&amp;gt;내년에 나이는 {age+1}입니다.&amp;lt;/h2&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3)&amp;nbsp; JSX 내부에서는 자바스크립트의 if문을 사용할 수 없으므로 , 삼항연산자를 사용해야함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼항연산자?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건식 ? 참인경우 : 거짓인경우&lt;/p&gt;
&lt;pre id=&quot;code_1697879477780&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  const name = '홍길동';
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;{name}님, &amp;lt;/h1&amp;gt;      
      &amp;lt;h2&amp;gt;{ name === '홍길동' ? '환영합니다.' : '환영하지 않습니다.' }&amp;lt;/h2&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;b&gt;4) 조건을 만족할 때만 내용을 보여줄 경우 =&amp;gt; 조건부 렌더링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. 삼항연산자를 사용&lt;/p&gt;
&lt;pre id=&quot;code_1697879653289&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  const name = '홍길동';
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;{name}님, &amp;lt;/h1&amp;gt;      
      &amp;lt;h2&amp;gt;{ name === '홍길동' ? '환영합니다.' : null }&amp;lt;/h2&amp;gt;	&amp;lArr; 조건을 만족하지 않는 경우 null 반환
    &amp;lt;/&amp;gt;									                     &amp;rarr; 화면에 내용이 출력되지 않음
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. &amp;amp;&amp;amp; 연산자를 사용&lt;/p&gt;
&lt;pre id=&quot;code_1697879781195&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  const name = '홍길동';
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;{name}님, &amp;lt;/h1&amp;gt;      
      { name === '홍길동' &amp;amp;&amp;amp; &amp;lt;h2&amp;gt;환영합니다.&amp;lt;/h2&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;b&gt;5) 함수에서 undefined를 반환하지 않도록 해야 함&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697880002562&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  const name = undefined;
  return name || 'undefined 입니다.';	&amp;lArr; || 연산자를 이용해서 undefined이 경우 사용할 기본값을 지정할 수 있음
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) 인라인 스타일링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: DOM 요소에 스타일을 적용할 때는 객체 형태로 적용해야 하며, 스타일 이름은 카멜 표현식을 사용&lt;/p&gt;
&lt;pre id=&quot;code_1697880098661&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  const name = '리액트';
  const nameStyle = {
    backgroundColor: 'black', 
    color: 'yellow', 
    fontSize: 48,       // 단위를 생략하면 'px'이 기본
    padding: '16px'
  };
  return (
    &amp;lt;div style={nameStyle}&amp;gt;
      {name}
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7) CSS 클래스를 사용할 때 class가 아닌 className으로 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.css&lt;/p&gt;
&lt;pre id=&quot;code_1697880179410&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.react {
  background-color: black;
  color: yellow;
  font-size: 48px;
  padding: 16px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1697880193914&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import './App.css';

function App() {
  const name = '리액트';
  return (
    &amp;lt;div className=&quot;react&quot;&amp;gt;
      {name}
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8) 모든 태그는 반드시 닫는 태그를 사용해야 함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용이 없는 태그는 self-closing 태그를 사용&lt;/p&gt;
&lt;pre id=&quot;code_1697880247481&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import './App.css';

function App() {
  const name = '리액트';
  return (
    &amp;lt;&amp;gt;
      &amp;lt;div className=&quot;react&quot;&amp;gt;{name}&amp;lt;/div&amp;gt;

      &amp;lt;input type=&quot;text&quot;&amp;gt;&amp;lt;/input&amp;gt;
      &amp;lt;input type=&quot;text&quot; /&amp;gt;
      &amp;lt;input type=&quot;text&quot;&amp;gt;   &amp;lArr; Unterminated JSX contents. (닫는 태그를 사용하지 않으면 오류가 발생)
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9) 주석(comment)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697880365529&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import './App.css';

function App() {
  // 인라인 주석
  const name = '리액트';    // 인라인 주석 
  /*
      블럭 단위 주석
  */

  return (
    &amp;lt;&amp;gt;
      { /*
          요렇게 해약 주석 처리가 가능 
        */ }
      { // 요렇게 하는 것도 가능
      }
      {
        // 물론 요렇게 하는 것도 가능        
      }
      { // 이렇게 하면 닫는 중괄호가 해석도지 않을 을 수 있음... }
      }
      &amp;lt;div className=&quot;react&quot;&amp;gt;{name}&amp;lt;/div&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/14</guid>
      <comments>https://kalswn.tistory.com/14#entry14comment</comments>
      <pubDate>Sat, 21 Oct 2023 18:26:55 +0900</pubDate>
    </item>
    <item>
      <title>React - 의미 / 장점 / 단점 / 실행</title>
      <link>https://kalswn.tistory.com/13</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;React?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: A JavaScript library for building user interfaces. 사용자 인터페이스를 만들기 위한 자바스크립트 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사용자와 웹사이트의 상호작용을 돕는 인터페이스를 만들기 위한 자바스크립트 모음집&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 프레임워크 vs 라이브러리&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 114px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;프레임워크(Framework)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;라이브러리(Library)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;사용&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;앵귤러JS 뷰JS&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 40px;&quot;&gt;프로그램 흐름 제어 권한&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 40px;&quot;&gt;흐름 제어 권한을 개발자가 아닌 &lt;b&gt;프레임워크&lt;/b&gt; 갖음&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;흐름을 제어하지 않고 &lt;b&gt;개발자&lt;/b&gt;가 필요한 부분만 필요할 때 가져다 사용하는 형태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** SPA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Single Page Application 하나의 페이지만 존재하는 웹사이트 또는 웹 애플리케이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 업데이트와 렌더링 속도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 업데이트란 웹사이틀 탐색할 때 화면에 나타나는 내용이 바뀌는것으로, 리액트에서는 빠른 업데이트를 위해 내부적으로 virtaul DOM(Documnet object Model 을 사용&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;/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;&amp;nbsp; 하나의 컴포넌트를 계속해서 재사용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 재사용성이 높아질 때 장점 : 개발 기간이 단축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;유지 보수가 용이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타(페이스북)의 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 메타(페이스북)의 든든한 지원군을 가짐&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 리액트 네이티브 모바일 환경 UI 프레임워크를 사용하여 모바일 앱 개발 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/h4&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;create-react-app (CRA) :&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 애플리케이션을 개발하는 데 필요한 모든 설정이 되어있는 상태의 프로젝트를 생성해주는 도구&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업할 디렉토리에서 npx create-react-app 프로젝트이름&lt;/p&gt;
&lt;pre id=&quot;code_1697870344841&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\react&amp;gt; npx create-react-app my-app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트로 들어가 서버 실행&lt;/p&gt;
&lt;pre id=&quot;code_1697870449542&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\react&amp;gt; cd my-app
C:\react\my-app&amp;gt; npm start&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;890&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/79dq0/btsyTX3fVdU/Lf0i0O6hgxSAI0a86bPj8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/79dq0/btsyTX3fVdU/Lf0i0O6hgxSAI0a86bPj8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/79dq0/btsyTX3fVdU/Lf0i0O6hgxSAI0a86bPj8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F79dq0%2FbtsyTX3fVdU%2FLf0i0O6hgxSAI0a86bPj8k%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;890&quot; height=&quot;916&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/React</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/13</guid>
      <comments>https://kalswn.tistory.com/13#entry13comment</comments>
      <pubDate>Sat, 21 Oct 2023 15:51:18 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript -  Axios 이용한 외부 데이터 연동</title>
      <link>https://kalswn.tistory.com/12</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Axios&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: node.js와 브라우저를 위한 Promiss 기반 HTTP 클라이언트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;서버사이드에서는 네이티브 node.js의 http 모듈을 사용하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클라이언트(브라우저)에서는 XMLHttpReauests를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js 설치 : &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/download&quot;&gt;https://nodejs.org/ko/download&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697861104639&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&quot; data-og-description=&quot;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&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/GdP30/hyUgQWcGQ8/wx3VSuNsepvCbXorpQ1nvk/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/boTDMR/hyUgJW3Ck2/QILrvZkQCgePbMSAlQnyRk/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/GdP30/hyUgQWcGQ8/wx3VSuNsepvCbXorpQ1nvk/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/boTDMR/hyUgJW3Ck2/QILrvZkQCgePbMSAlQnyRk/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&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&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;node.js 설치 확인&lt;/p&gt;
&lt;pre id=&quot;code_1697861045655&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\&amp;gt;node -v
v18.18.2

C:\&amp;gt;npm -v
9.8.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 디렉터리를 생성 후 , 웹서버를 실행&lt;/p&gt;
&lt;pre id=&quot;code_1697861413261&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\&amp;gt;mkdir react
C:\&amp;gt;cd react

C:\react&amp;gt; npm install -g http-server // =&amp;gt; http-server : 웹 페이지에서 사용할 웹 서버

C:\react&amp;gt; npx http-server		// 현재 디렉터리를 웹 루트 디렉터리로 하는 웹 서버를 실행
Starting up http-server, serving ./

http-server version: 14.1.1

http-server settings:
CORS: disabled
Cache: 3600 seconds
Connection Timeout: 120 seconds
Directory Listings: visible
AutoIndex: visible
Serve GZIP Files: false
Serve Brotli Files: false
Default File Extension: none

Available on:
  http://172.28.0.1:8081
  http://172.18.128.1:8081
  http://192.168.10.1:8081
  http://10.0.0.1:8081
  http://192.168.153.1:8081
  http://192.168.111.1:8081
  http://192.168.0.12:8081
  http://127.0.0.1:8081
Hit CTRL-C to stop the server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 http://localhost:80080 으로 접속&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXj7IE/btsyTq5Uw3n/wGxkcW9u1pfjPwwYlM0mck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXj7IE/btsyTq5Uw3n/wGxkcW9u1pfjPwwYlM0mck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXj7IE/btsyTq5Uw3n/wGxkcW9u1pfjPwwYlM0mck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXj7IE%2FbtsyTq5Uw3n%2FwGxkcW9u1pfjPwwYlM0mck%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;784&quot; height=&quot;283&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.html 파일 생성&lt;/p&gt;
&lt;pre id=&quot;code_1697863011949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\react&amp;gt; code .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;index.html&lt;/p&gt;
&lt;pre id=&quot;code_1697863042867&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Hello React&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** html:5 - HTML5 boilerplate(반복적으로 사용되는 구문) 입력하는 방법 중 하나&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AvcLo/btsyTsintlc/174aKxzr4TsARY0oBmbkT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AvcLo/btsyTsintlc/174aKxzr4TsARY0oBmbkT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AvcLo/btsyTsintlc/174aKxzr4TsARY0oBmbkT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAvcLo%2FbtsyTsintlc%2F174aKxzr4TsARY0oBmbkT0%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;784&quot; height=&quot;199&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행에 필요한 자바스크립트 라이브러리 추가&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697863390030&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
   
    &amp;lt;!-- 실행에 필요한 자바스크립트 라이브러리를 추가 --&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://code.jquery.com/jquery-3.7.0.min.js&quot; integrity=&quot;sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;axios를 이용하여 국가 및 국기 데이터를 가져옴&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://restcountries.com/v3.1/all?fields=name,flags&quot;&gt;https://restcountries.com/v3.1/all?fields=name,flags&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbzXXJ/btsyV1DNwdY/MmwYBEkLw4fFG7qUMgjaNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbzXXJ/btsyV1DNwdY/MmwYBEkLw4fFG7qUMgjaNK/img.png&quot; data-alt=&quot;사용하는 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbzXXJ/btsyV1DNwdY/MmwYBEkLw4fFG7qUMgjaNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbzXXJ%2FbtsyV1DNwdY%2FMmwYBEkLw4fFG7qUMgjaNK%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;784&quot; height=&quot;419&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;716&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;index.html&lt;/p&gt;
&lt;pre id=&quot;code_1697863478736&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
   
    &amp;lt;!-- 실행에 필요한 자바스크립트 라이브러리를 추가 --&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://code.jquery.com/jquery-3.7.0.min.js&quot; integrity=&quot;sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
        // axios를 이용해서 국가 및 국기 데이터를 가져옮
        axios
        .get('https://restcountries.com/v3.1/all?fields=name,flags')
        .then(res =&amp;gt; {
            console.log(res);
        })
        .catch(err =&amp;gt; console.log(err));
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 가공하고 뿌려지는 코드 작성&lt;/p&gt;
&lt;pre id=&quot;code_1697863612964&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
   
    &amp;lt;!-- 실행에 필요한 자바스크립트 라이브러리를 추가 --&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://code.jquery.com/jquery-3.7.0.min.js&quot; integrity=&quot;sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;ul&amp;gt;
    &amp;lt;/ul&amp;gt;


    &amp;lt;script&amp;gt;
        // axios를 이용해서 국가 및 국기 데이터를 가져옮
        axios
        .get('https://restcountries.com/v3.1/all?fields=name,flags')
        .then(res =&amp;gt; {

            res.data.forEach(nf =&amp;gt; {		// 가져온 데어터는 res.data 에 들어있음
                const li = `				// forEach를 사용하여 필요한 데이터를 가져옴
                    &amp;lt;li&amp;gt;
                        &amp;lt;img src=&quot;${nf.flags.png}&quot; alt=&quot;${nf.flags.alt}&quot;&amp;gt;
                        &amp;lt;p&amp;gt;${nf.name.common} (${nf.name.official})&amp;lt;/p&amp;gt;
                    &amp;lt;/li&amp;gt;
                `;
                $('ul').append(li);
            });
        })
        .catch(err =&amp;gt; console.log(err));
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;763&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPcYkM/btsyQRXj7pA/k4qF1043m5X0k1mpOo2zJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPcYkM/btsyQRXj7pA/k4qF1043m5X0k1mpOo2zJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPcYkM/btsyQRXj7pA/k4qF1043m5X0k1mpOo2zJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPcYkM%2FbtsyQRXj7pA%2Fk4qF1043m5X0k1mpOo2zJ0%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;763&quot; height=&quot;829&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  개발 일지/JavaScript</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/12</guid>
      <comments>https://kalswn.tistory.com/12#entry12comment</comments>
      <pubDate>Sat, 21 Oct 2023 13:50:09 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 함수( 화살표 , map(), reduce(),filter())</title>
      <link>https://kalswn.tistory.com/11</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 화살표 함수 (arrow function)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: function 키워드 대신 화살표(=&amp;gt;)를 사용하여 간략한 방법으로 함수를 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697791620445&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 익명 함수  표현식을 이용한 함수 정의
let add = function(a, b) { return a+b };

//화살표 함수
let add2 = (a, b) =&amp;gt; { return a+b };

// 한줄일 경우 중괄호를 생략하면 화살표 오른쪽의 결과를 반환
let add3 = (a, b) =&amp;gt; a+b;

// 파라미터가 하나일 경우 파라미터를 감싸고 있는 소괄호도 생략 가능
let add4 = a =&amp;gt; a+4;

// 객체를 반환하는 경우에는 소괄호로 감싸야 함
let add5 = (a, b) =&amp;gt; {return {result:a+b}};
let add6 = (a, b) =&amp;gt; ({result:a+b});&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;2. map 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환&lt;/p&gt;
&lt;pre id=&quot;code_1697792641837&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, 4, 9, 16] ;

const twoTimes = numbers.map(number =&amp;gt; number * 2);
console.log(twoTimes); 		// [2, 8, 18, 32]

const f = value =&amp;gt; value *2;
const twoTimes = numbers.map(f)

const g = value =&amp;gt; value *10 ;

const gop = numbers.map(f).map(g);
console.log(gop)		// [20, 80, 180, 320]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. filter 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 입력한 조건을 바탕으로 데이터를 필터링하는 함수&lt;/p&gt;
&lt;pre id=&quot;code_1697792989077&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const words = [ 'srpay', 'limit', 'elite', 'destruction', 'present', 'exuberant' ];

// 길이가 여섯 글자 이상인 단어만 추출

const newWords = words.filter(word =&amp;gt; word.length &amp;gt;= 6);
console.log(newWords);		// ['destruction', 'present', 'exuberant']&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;+) map함수 + filter 함수&lt;/p&gt;
&lt;pre id=&quot;code_1697793149628&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 짝수만 추출해서 10배수한 결과를 출력

const numbers = [ 1, 3, 4, 6, 11, 14 ];

const newNum = numbers.filter(number =&amp;gt; number % 2 === 0).map(number =&amp;gt; number *10);
console.log(newNum);		// [40, 60, 140]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. reduce 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp; 배열의 요소를 하나로 줄이는 작업을 수행&lt;/p&gt;
&lt;pre id=&quot;code_1697793813937&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [ 1, 2, 3, 4, 5 ];

let sum = numbers.reduce((previous, current) =&amp;gt; previous + current);
console.log(sum);

// 각 과목의 총합 구하기
let scores = [];
scores[0] = {name: '홍길동', korean: 80, math: 90, english: 90};
scores.push({name: '고길동', korean: 90, math: 80, english: 80});
scores.push({name: '신길동', korean: 70, math: 80, english: 70});
console.log(scores);

const fk = scores.map(s =&amp;gt; s.korean).reduce((p, c) =&amp;gt; p+c);
const fe = scores.map(s =&amp;gt; s.english).reduce((p, c) =&amp;gt; p+c);
const fm = scores.map(s =&amp;gt; s.math).reduce((p, c) =&amp;gt; p+c);

console.log('국어 점수 총합', fk);		// 국어 점수 총합 240
console.log('영어 점수 총합', fe);		// 영어 점수 총합 240
console.log('수학 점수 총합', fm);		// 수학 점수 총합 250&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  개발 일지/JavaScript</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/11</guid>
      <comments>https://kalswn.tistory.com/11#entry11comment</comments>
      <pubDate>Fri, 20 Oct 2023 18:24:14 +0900</pubDate>
    </item>
    <item>
      <title>ES6(ECMAScript 6) - 단축 속성명 / 계산된 속성명 / 전개 연산자 / 비구조화</title>
      <link>https://kalswn.tistory.com/10</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 단축 속성명(shorthand property names)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp; 객체의 속성값이 이미 변수로 존재한다면 변수이름만 사용하여 객체 생성 가능&lt;/p&gt;
&lt;pre id=&quot;code_1697759740949&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let name = &quot;John&quot;;
const obj = {
    age: 21,
    name: name,
    getName: function getName() {
        return this.name;
    }
};


const obj = {
    age: 21,
    name,		// 속성이름과 속성값을 가지고 있는 변수 이름이 동일한 경우
    getName(){		// 속성이름과 함수(메소드) 이름이 동일한 경우 =&amp;gt; function 키워드와 함께 생략
        return this.name;
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 계산된 속성명(computed property names)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 변수를 이용해서 객체 속성의 키를 생성&lt;/p&gt;
&lt;pre id=&quot;code_1697776726323&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // 속성 이름(key)과 속성 값(value)을 전달받아 객체를 반환하는 함수를 정의 
 function returnObject(key, value) {
    /*
    const obj = {};
    obj[key] = value;
    return obj;
    */
    return { [key]: value };
}

 function returnObject(key, value) {
        /*
        const obj = {};
        obj[key] = value;
        return obj;
        */
        return { [key]: value };
    }

 // 속성 이름이 일련번호 형태를 가지는 객체를 반환하는 함수
 function returnObject2(key, value, no) {
    /*
    const obj = {};
    obj[key+no] = value;
    return obj;
    */
    return { [key+no]: value };
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 전개 연산자(spread operator) ...&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:배열 또는 객체를 하나하나 넘기는 용도로 사용&lt;/p&gt;
&lt;pre id=&quot;code_1697776911491&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [10, 20, 1, 30, 3, 2];

console.log(numbers);               // 배열
console.log(...numbers);            // 순열 (숫자의 나열) =&amp;gt; 배열 요소의 나열

// 객체를 복사하는 과정에서 새로운 속성을 추가하거나 속성의 값을 변경하는 경우
let obj1 = { age: 26, name: 'hong' };

 /*
let obj2 = { ...obj1 };
obj2.name = 'gildong';
*/
let obj2 = { ...obj1, name: 'gildong' };
console.log(obj2);  // {age: 40, name: 'gildong', color: Array(2)}

// 객체를 결합하는 경우
const obj1 = { age: 21, name: 'hong' };
const obj2 = { hobby: 'soccer', age: 40 };

const obj3 = { ...obj1, ...obj2 };
console.log(obj3);      // {age: 40, name: 'hong', hobby: 'soccer'}

const obj4 = { ...obj2, ...obj1 };
console.log(obj4);      // {hobby: 'soccer', age: 21, name: 'hong'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 배열 관련 유의사항&lt;/p&gt;
&lt;pre id=&quot;code_1697777723178&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr1 = [ 1, 2, 3 ];
let arr2 = arr1;
console.log(arr1);		// [1, 2, 3]
console.log(arr2);		// [1, 2, 3]

// 배열 값을 변경
 arr1[1] = 20;
console.log(arr1);		// [1, 20, 3]
console.log(arr2);		// [1, 20, 3]

// =&amp;gt; arr2는 arr1 배열의 주소를 복사한 것

// 배열의 주소가 아닌 배열의 값을 복사하는 것이 필요
// 전개 연산자를 이용해서 배열의 값을 복사
let arr5 = [ 1, 2, 3 ];
let arr6 = [ ...arr5 ];
 console.log(arr5);		// [1, 2, 3]
console.log(arr56;		// [1, 2, 3]

arr5[1] = 20;
console.log(arr5);		// [1, 20, 3]
console.log(arr6);		// [1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 비구조화(destructuring)&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;1) 배열&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1697789819207&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr = [ 1, 2, 3, 4, 5 ];

let [ c, d, e, f ] = arr;
console.log(c, d, e, f);		// 1 2 3 4 
								// =&amp;gt;c, d, e, f 변수에 arr 배열에 첫번째 인덱스부터 차례로 할당

 // 두 변수의 값을 교환
let x = 10;
let y = 20;

비구조화   배열
~~~~~~~~   ~~~~~~~~
[ x, y ] = [ y, x ];
console.log(x, y);		// 10 20

 // 배열의 크기 보다 변수의 개수가 많은 경우, 기본값 설정이 가능
const arr = [ 1, 2 ];
let [ a, b, c=30 , d ] = arr; 
console.log(a, b, c, d);		// 1 2 30 undefined

 // 배열의 일부값을 변수에 할당할 경우, 할당하지 않을 자리는 비워둠
  let arr= [1, 2, 3];
  let a=10, b=20, c=30;
  [ a, , c ] = arr;
  console.log(a, b, c);		//1 20 3
  
// 배열의 값을 할당하고 남은 나머지를 새로운 배열로 만드는 경우 
const arr = [ 1, 2, 3, 4, 5 ];
const [first, ...rest] = arr;

console.log(first);		// 1
console.log(rest);		// [2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 객체&lt;/h4&gt;
&lt;pre id=&quot;code_1697790673305&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 객체 비구조화를 할 때는 객체의 속성명(key)이 중요
const obj1 = { age: 21, name: 'mike' };
const obj2 = { age: 40, name: 'john' };

const { age, name } = obj1;
console.log(age, name);		// 21 'mike'

const { ageNew, nameNew } = obj1;
console.log(ageNew, nameNew);		// undefined undefined

// 객체 비구조화를 통해 가져온 값을 새로운 변수 이름으로 사용할 경우 =&amp;gt; 별칭을 부여
const { age: ageNew, name: nameNew } = obj1;
console.log(ageNew, nameNew);		//21 'mike'

// 객체에 존재하지 않는 요소를 변수에 할당할 때 적용할 기본값 설정도 가능
const { age, name: nameNew, email='default' } = obj1;
console.log(age, nameNew, email);   // 21 'mike' 'default'

// 객체 비구조화 시 객체의 일부 속성을 변수에 할당하고, 나머지를 새로운 객체로 저장
const obj3 = { age: 32, name: &quot;John&quot;, grade: &quot;c&quot; };

// obj3의 age 속성의 값을 johnAge 변수에 할당하고, 나머지를 rest 이름의 객체에 할당
const { age: johnAge, ...rest } = obj3;
console.log(johnAge, rest);     // 32 {name:'John', grade:'c'}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/JavaScript</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/10</guid>
      <comments>https://kalswn.tistory.com/10#entry10comment</comments>
      <pubDate>Fri, 20 Oct 2023 17:32:05 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 객체와 배열</title>
      <link>https://kalswn.tistory.com/8</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 키(key)과 값(value)으로 구성된 프로퍼티(Property)들의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697695972523&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 객체 선언
let person = {
    &quot;name&quot;: 'alswn', 
    'age': 26, 
    isMarried: false,
    'favorite color': ['빨강', '노랑'],
    hello: function() {
        return '안녕, 나는 ' + this.name + &quot;이야&quot;;
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1697705166987&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 객체 참조

console.log(person.name);		// 홍길동
console.log(person[&quot;name&quot;]);		// 홍길동
console.log(person.favorite color);  // Uncaught SyntaxError: =&amp;gt; key 에 공백이 있는 경우
console.log(person[&quot;favorite color&quot;]);		//&amp;nbsp;['빨강', '노랑'] =&amp;gt; key
console.log(person.hello());		// 안녕, 나는 홍길동이야

// 순차적으로 참조
for (let key in person) {
    console.log(key, ' 속성의 값은 ', person[key]);
}&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span style=&quot;background-color: #ffffff; color: #575757; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이름과 인덱스로 참조되는 정렬된 값의 집합&lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; color: #575757; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697707597971&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열 선언

let values = [&quot;빨강&quot;, &quot;노랑&quot;, &quot;파랑&quot;, true , 123];		// 배열 리터럴을 이용
let values = Array(&quot;빨강&quot;, &quot;노랑&quot;, &quot;파랑&quot;, true , 123);		 //Array 객체의 생성자를 이용
let values = new Array(&quot;빨강&quot;, &quot;노랑&quot;, &quot;파랑&quot;, true , 123);		//new 연산자를 이용&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1697707833344&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열 참조
// 배열이름[인덱스]

console.log('첫번째', values[0]);		// 첫번째 빨강
console.log('마지막', values[values.length-1]);		마지막 123

// 순차적을 접근하는 방법
// for문
for (let i = 0; i &amp;lt; values.length; i ++) {
    console.log(values[i]);
}

// for in 
 for (let index in values) {
    console.log(values[index]);
}

// for of
 for (let value of values) {
    console.log(value);
}

// forEach
 values.forEach(color =&amp;gt; console.log(color));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  개발 일지/JavaScript</category>
      <category>javascrip</category>
      <category>js</category>
      <category>객체</category>
      <category>배열</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/8</guid>
      <comments>https://kalswn.tistory.com/8#entry8comment</comments>
      <pubDate>Thu, 19 Oct 2023 18:43:38 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 함수 선언 방식</title>
      <link>https://kalswn.tistory.com/7</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 함수 선언식 (Function Declarations)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 일반적인 프로그래밍 언어에서의 함수 선언과 비슷&lt;/p&gt;
&lt;pre id=&quot;code_1697663514263&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function 함수이름(){
	.....
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1697662121749&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function add(x , y){         // add =&amp;gt; 함수 이름 정의
    return x + y;
}

console.log(add(10,20));     //함수 이름으로 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 함수 표현식(Function Expressions )&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 자바스크립트 언어의 특징을 활용한 선언&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697662675244&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 익명 함수 표현식

let add = function(x,y){ return x + y; };		
let sum = add;

console.log(add(10,20));        // 30   
console.log(sum(10,20));        // 30

// 기명 함수 표현식

let sum1 = function add(x, y) { return x + y; };		
let sum2 = sum1;

console.log(sum1(10, 20));  // 30
console.log(sum2(10, 30));  // 40
console.log(add(10, 40));   // 함수 외부에서 호출 시 =&amp;gt; Uncaught ReferenceError: add is not defined

//기명 함수 표현식 : 함수 외부에서는 함수 이름으로 사용할 수 없으나,
//					함수 내부에서 자기 호출할 때(=재귀 호출)는 사용 가능.


let myfactorial = function factorial(n) { 
    if (n &amp;lt;= 1) return 1;
    return n * factorial(n-1);		// 함수 내부에서 재귀 호출
}

console.log(myfactorial(10));  //3628800&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;b&gt;함수 선언식과 표현식의 차이점&lt;/b&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;&amp;nbsp; 한수 표현식은 호이스팅에 영향을 받지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;**함수 호이스팅&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1) 함수 표현식으로 함수를 선언하는 경우 : 함수 선언 이전에는 함수를 호출 할 수 없음&lt;/p&gt;
&lt;pre id=&quot;code_1697670924537&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;20 + 30 = &quot;, add(20, 30));		// Uncaught ReferenceError: Cannot access 'add' before initialization


let add = function(x, y) { return x + y; };&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2) 함수 선언문으로 함수를 선언하는 경우 : 함수 선언하기 전에 호출할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1697673102425&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;20 + 30 = &quot;, add(20, 30));     // 20 + 30 = 50
                                  
function add(x, y) { return x + y; }

console.log(&quot;30 + 40 = &quot;, add(30, 40));     // 30 + 40 = 70&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**+)&lt;b&gt; 변수 호이스팅&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) var &amp;lt;=&amp;nbsp;변수의 선언이 호이스팅되어 위치와 관계 없이 사용이 가능&lt;/p&gt;
&lt;pre id=&quot;code_1697673402986&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(i);     // undefined

var i;              
console.log(i);     // undefined

i = 10;
console.log(i);     // 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) let &amp;lt;= 호이스팅이 되지 않아 변수 선언 후 사용해야 함&lt;/p&gt;
&lt;pre id=&quot;code_1697674096172&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;j = &quot;, j);		// &amp;lt;==Uncaught ReferenceError: Cannot access 'j' before initialization
							//선언전에 참조하는 경우 오류가 발생
let j;
console.log(&quot;j = &quot;, j);     // j = undefined

j = 10;
console.log(&quot;j = &quot;, j);     // j = 10&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Function() 생성자 함수를 이용&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 새로운 Function 객체를 생성&lt;/p&gt;
&lt;pre id=&quot;code_1697663842904&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Function ([arg1[, arg2[, ...argN]],] functionBody)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1697663937724&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let add = new Function('x', 'y', 'return x + y');

console.log(add(10,20));		//30&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수 표현식과 함수 선언문 vs Function 생성자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Function 생성자로 생성한 Function 객체는 함수를 생성할 때 구문 분석을 수행&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;gt; Function 생성자가 더 비효율적&lt;/p&gt;</description>
      <category>  개발 일지/JavaScript</category>
      <category>javascript</category>
      <category>js</category>
      <category>함수</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/7</guid>
      <comments>https://kalswn.tistory.com/7#entry7comment</comments>
      <pubDate>Thu, 19 Oct 2023 13:48:43 +0900</pubDate>
    </item>
    <item>
      <title>쿠버네티스 실습</title>
      <link>https://kalswn.tistory.com/6</link>
      <description>&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 조건을 만족하는 플라스크 애플리케이션을 개발하고 쿠버네티스 클러스터에 배포해 보세요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;플라스크 애플리케이션은 /whoareyou 요청에 대해 작성자 이름, 호스트 이름, IP 주소를 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예) 홍길동, hostname-deployment-7d4f978855-2kkw6, 10.0.0.4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;플라스크 애플리케이션을 구동하는 컨테이너 이미지의 이름은 whoami-flask:v1 으로 설정해 본인의 도커 허브에 등록&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;디플로이먼트의 레플리카는 5개로 설정해서 배포하고, LoadBalancer 타입의 서비스를 이용해서 디플로이먼트를 연동&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) &lt;span style=&quot;background-color: #fafafa; color: #000000; text-align: start;&quot;&gt;플라스크 애플리케이션은 /whoareyou 요청에 대해 작성자 이름, 호스트 이름, IP 주소를 반환&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;가상환경을 만들어 flask 서버를 설치&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697068001713&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(whoami-flask) C:\kubernetes\whoami-flask&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성자이름 / 호스트 이름/ IP 주소를 반환하는 파일 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpaphC/btsx5XJ6MwB/VTR4zKKOk9vPnplpEXMPDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpaphC/btsx5XJ6MwB/VTR4zKKOk9vPnplpEXMPDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpaphC/btsx5XJ6MwB/VTR4zKKOk9vPnplpEXMPDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpaphC%2Fbtsx5XJ6MwB%2FVTR4zKKOk9vPnplpEXMPDk%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;487&quot; height=&quot;518&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tgUby/btsyaUsRTB8/kO4JtXSfmUy4plBu8Fuu3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tgUby/btsyaUsRTB8/kO4JtXSfmUy4plBu8Fuu3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tgUby/btsyaUsRTB8/kO4JtXSfmUy4plBu8Fuu3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtgUby%2FbtsyaUsRTB8%2FkO4JtXSfmUy4plBu8Fuu3K%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;478&quot; height=&quot;111&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) &lt;span style=&quot;background-color: #fafafa; color: #000000; text-align: start;&quot;&gt;플라스크 애플리케이션을 구동하는 컨테이너 이미지의 이름은 whoami-flask:v1 으로 설정해 본인의 도커 허브에 등록&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;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;현재 가상환경에 설치된 python 패키지를 버전과 함께 작성하여 requirements.txt 파일에 저장&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5rV5l/btsx1Rjy1Kg/oFYKtveCLHVyIGBgKrESb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5rV5l/btsx1Rjy1Kg/oFYKtveCLHVyIGBgKrESb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5rV5l/btsx1Rjy1Kg/oFYKtveCLHVyIGBgKrESb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5rV5l%2Fbtsx1Rjy1Kg%2FoFYKtveCLHVyIGBgKrESb1%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;619&quot; height=&quot;192&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile 작성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zj9Jw/btsx45O2E2G/bGsGp93Pqwx0ABkrJ6AgL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zj9Jw/btsx45O2E2G/bGsGp93Pqwx0ABkrJ6AgL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zj9Jw/btsx45O2E2G/bGsGp93Pqwx0ABkrJ6AgL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzj9Jw%2Fbtsx45O2E2G%2FbGsGp93Pqwx0ABkrJ6AgL1%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;472&quot; height=&quot;233&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 이미지 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnk8i9/btsygpkXkz3/KvHZ1F5NQfJjA2jguJt1Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnk8i9/btsygpkXkz3/KvHZ1F5NQfJjA2jguJt1Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnk8i9/btsygpkXkz3/KvHZ1F5NQfJjA2jguJt1Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdnk8i9%2FbtsygpkXkz3%2FKvHZ1F5NQfJjA2jguJt1Vk%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;965&quot; height=&quot;337&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;963&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpQba/btsx3NOvkgc/gGMpkk2T4mrN6Yz0kkmV0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpQba/btsx3NOvkgc/gGMpkk2T4mrN6Yz0kkmV0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpQba/btsx3NOvkgc/gGMpkk2T4mrN6Yz0kkmV0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtpQba%2Fbtsx3NOvkgc%2FgGMpkk2T4mrN6Yz0kkmV0K%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;963&quot; height=&quot;142&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz5IU8/btsx45VNuu8/ceEyMsmoj31KDIUss1QDk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz5IU8/btsx45VNuu8/ceEyMsmoj31KDIUss1QDk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz5IU8/btsx45VNuu8/ceEyMsmoj31KDIUss1QDk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz5IU8%2Fbtsx45VNuu8%2FceEyMsmoj31KDIUss1QDk0%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;497&quot; height=&quot;104&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 허프에 이미지 등록&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcH6N8/btsyeqRQ5Iy/npqx2xsQAXp6PJKSWrgkF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcH6N8/btsyeqRQ5Iy/npqx2xsQAXp6PJKSWrgkF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcH6N8/btsyeqRQ5Iy/npqx2xsQAXp6PJKSWrgkF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcH6N8%2FbtsyeqRQ5Iy%2Fnpqx2xsQAXp6PJKSWrgkF0%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;815&quot; height=&quot;262&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot; data-text-less=&quot;닫기&quot; data-text-more=&quot;더보기&quot; data-ke-type=&quot;moreLess&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;디플로이먼트의 레플리카는 5개로 설정해서 배포하고, LoadBalancer 타입의 서비스를 이용해서 디플로이먼트를 연동&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sTeAh/btsx1UgldBh/MJEgSvKpJLmgv2N06iFcf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sTeAh/btsx1UgldBh/MJEgSvKpJLmgv2N06iFcf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sTeAh/btsx1UgldBh/MJEgSvKpJLmgv2N06iFcf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsTeAh%2Fbtsx1UgldBh%2FMJEgSvKpJLmgv2N06iFcf0%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;641&quot; height=&quot;732&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; MetalLB 설치 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;strict ARP mode 활성화&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TmMEi/btsybYhmyiJ/tG5GAvnIGuDKad6VNG2bN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TmMEi/btsybYhmyiJ/tG5GAvnIGuDKad6VNG2bN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TmMEi/btsybYhmyiJ/tG5GAvnIGuDKad6VNG2bN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTmMEi%2FbtsybYhmyiJ%2FtG5GAvnIGuDKad6VNG2bN0%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;720&quot; height=&quot;71&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MetalLB 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcPX23/btsydS8Nztv/65SpL1pWlaJlUVha5rjKVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcPX23/btsydS8Nztv/65SpL1pWlaJlUVha5rjKVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcPX23/btsydS8Nztv/65SpL1pWlaJlUVha5rjKVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcPX23%2FbtsydS8Nztv%2F65SpL1pWlaJlUVha5rjKVK%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;965&quot; height=&quot;419&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 정의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFja3X/btsx3GowLZP/syDrMYhrLYzF4DrsYksUK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFja3X/btsx3GowLZP/syDrMYhrLYzF4DrsYksUK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFja3X/btsx3GowLZP/syDrMYhrLYzF4DrsYksUK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFja3X%2Fbtsx3GowLZP%2FsyDrMYhrLYzF4DrsYksUK0%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;535&quot; height=&quot;232&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxvJQz/btsyaRpsnl8/4oy5yajkWxOnhm41FT4BuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxvJQz/btsyaRpsnl8/4oy5yajkWxOnhm41FT4BuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxvJQz/btsyaRpsnl8/4oy5yajkWxOnhm41FT4BuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxvJQz%2FbtsyaRpsnl8%2F4oy5yajkWxOnhm41FT4BuK%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;682&quot; height=&quot;36&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;36&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b30g0R/btsyen8H388/kDvRHH589KkSkgxSZ88Sa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b30g0R/btsyen8H388/kDvRHH589KkSkgxSZ88Sa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b30g0R/btsyen8H388/kDvRHH589KkSkgxSZ88Sa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb30g0R%2Fbtsyen8H388%2FkDvRHH589KkSkgxSZ88Sa1%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;572&quot; height=&quot;48&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cks0BC/btsx2v1H1VQ/kBeEzksABATdG61b5Zq2tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cks0BC/btsx2v1H1VQ/kBeEzksABATdG61b5Zq2tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cks0BC/btsx2v1H1VQ/kBeEzksABATdG61b5Zq2tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcks0BC%2Fbtsx2v1H1VQ%2FkBeEzksABATdG61b5Zq2tk%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;790&quot; height=&quot;226&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXTERNAL - IP 10.0.0.30 임을 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgRgNf/btsydnOIaqh/VdTX8KDkOY1RAh384DpbG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgRgNf/btsydnOIaqh/VdTX8KDkOY1RAh384DpbG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgRgNf/btsydnOIaqh/VdTX8KDkOY1RAh384DpbG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgRgNf%2FbtsydnOIaqh%2FVdTX8KDkOY1RAh384DpbG1%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;1227&quot; height=&quot;117&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; pod의 ip 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2JX3K/btsygpFkFlW/Julssxe2y3TyU5AvrKGYnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2JX3K/btsygpFkFlW/Julssxe2y3TyU5AvrKGYnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2JX3K/btsygpFkFlW/Julssxe2y3TyU5AvrKGYnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2JX3K%2FbtsygpFkFlW%2FJulssxe2y3TyU5AvrKGYnK%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;1057&quot; height=&quot;100&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoadBalancer IP 10.0.0.30 으로 접속했을때 5개의 파드로 요청이 분배되는 것을 확인 할수 있다.&lt;/p&gt;</description>
      <category>  개발 일지/K8s</category>
      <author>_민주</author>
      <guid isPermaLink="true">https://kalswn.tistory.com/6</guid>
      <comments>https://kalswn.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 12 Oct 2023 14:00:41 +0900</pubDate>
    </item>
  </channel>
</rss>