<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>디자이너에서 개발자</title>
    <link>https://rosylee.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 2 Jul 2026 20:25:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Rosie, Lee</managingEditor>
    <image>
      <title>디자이너에서 개발자</title>
      <url>https://tistory1.daumcdn.net/tistory/4748847/attach/3155987f19ba4ac3a41e994331c9e599</url>
      <link>https://rosylee.tistory.com</link>
    </image>
    <item>
      <title>[패스트캠퍼스] 웹 개발 강의(OpenGraph,파이썬 패키지 관리)</title>
      <link>https://rosylee.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;국비지원교육으로&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;패스트캠퍼스에서&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;진행하는 웹 개발 강의를&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;듣고 정리한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;OpenGraph(Og태그)&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;html meta태그로 웹사이트 정보를 제공하는 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색엔진최적화[SEO(Search Engine Optimization)]를 위해 해야 한다. (검색엔진이 수집해갈 수 있는 코드로 사이트가 잘 나올 수 있도록 하는 것)&lt;/li&gt;
&lt;li&gt;SNS 공유할 때 meta 태그로 사용한 image와 description이 함께 공유된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1683697550422&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta property=&quot;title&quot; content=&quot;웹사이트 타이틀&quot;&amp;gt;
&amp;lt;meta property=&quot;description&quot; content=&quot;웹사이트 설명&quot;&amp;gt;
&amp;lt;meta property=&quot;image&quot; content=&quot;/static/c.jpg&quot;&amp;gt;
&amp;lt;meta property=&quot;og:title&quot; content=&quot;웹사이트 타이틀&quot;&amp;gt;
&amp;lt;meta property=&quot;og:description&quot; content=&quot;웹사이트 설명&quot;&amp;gt;
&amp;lt;meta property=&quot;og:image&quot; content=&quot;/static/c.jpg&quot;&amp;gt;&lt;/code&gt;&lt;/pre&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;
&lt;pre id=&quot;code_1683697550427&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;ps -ef&lt;/code&gt;&lt;/pre&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;/p&gt;
&lt;pre id=&quot;code_1683697550427&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;ps -ef | grap python3&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로그램 종료(띄어쓰기로 구분해서 여러개를 한꺼번에 종료할 수 있다)&lt;/p&gt;
&lt;pre id=&quot;code_1683697550427&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo kill -9 {종료할프로그램번호 종료할프로그램번호}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다시 프로그램 시작&lt;/p&gt;
&lt;pre id=&quot;code_1683697550428&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;sudo nohup python3 app.py &amp;amp;&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;인스턴스(PC) 안에다가 새로운 파일을 업로드해서 여러 프로젝트 관리가 가능하다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;venv(&lt;/span&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;virtual environment)&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;&lt;b&gt;venv 가상 환경 구성하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더를 vs code로 열어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 터미널에 명령어로 아래와 같이 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682609526434&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m venv {your venv name}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색기에 venv 폴더가 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSKizu/btscYxMW6Io/LVzW6WUXIUF1ypcZxmB7jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSKizu/btscYxMW6Io/LVzW6WUXIUF1ypcZxmB7jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSKizu/btscYxMW6Io/LVzW6WUXIUF1ypcZxmB7jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSKizu%2FbtscYxMW6Io%2FLVzW6WUXIUF1ypcZxmB7jK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;160&quot; height=&quot;136&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가상환경 활성화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;activate.bat 파일 실행&lt;/p&gt;
&lt;pre id=&quot;code_1682609780725&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source {your venv name}/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 터미널의 경로에 맨 앞에&amp;nbsp; (venv)라고 표시되며 가상 환경에서 작업할 수 있게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cceCwZ/btsc0p1fPjH/Y9WVkBpKvJ8CWiLimlWpj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cceCwZ/btsc0p1fPjH/Y9WVkBpKvJ8CWiLimlWpj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cceCwZ/btsc0p1fPjH/Y9WVkBpKvJ8CWiLimlWpj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcceCwZ%2Fbtsc0p1fPjH%2FY9WVkBpKvJ8CWiLimlWpj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;42&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트로 패키지 설치를 해본다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682610252814&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install requests&lt;/code&gt;&lt;/pre&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;312&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/12yDq/btscZVzhUkU/tMaRhKMV6YRDOR6IjRKA6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/12yDq/btscZVzhUkU/tMaRhKMV6YRDOR6IjRKA6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/12yDq/btscZVzhUkU/tMaRhKMV6YRDOR6IjRKA6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F12yDq%2FbtscZVzhUkU%2FtMaRhKMV6YRDOR6IjRKA6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;239&quot; height=&quot;743&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;970&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가상환경 비활성화&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682610347890&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deactivate&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;이렇게 가상환경을 사용하면 한개의 PC에서 여러 프로젝트별로 관리할 수 있다.&lt;/p&gt;</description>
      <category>패스트캠퍼스/웹개발</category>
      <category>K디지털기초역량훈련</category>
      <category>가상환경</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>웹개발강의</category>
      <category>코딩강의</category>
      <category>파이썬</category>
      <category>패스트캠퍼스</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/30</guid>
      <comments>https://rosylee.tistory.com/30#entry30comment</comments>
      <pubDate>Fri, 28 Apr 2023 01:09:22 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 프론트엔드 강의 학습일지(Redux)</title>
      <link>https://rosylee.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;국비지원교육으로&amp;nbsp;패스트캠퍼스에서&amp;nbsp;진행하는 프론트엔드 강의를 듣고 정리한 내용입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Redux&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리덕스는 상태 관리 라이브러리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;State를 Store에 넣어놓고 사용할 수 있다.&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;REDUCER&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 변경사항을 결정하고 업데이트된 상태를 반환하는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인수로 조치를 취하고, store 내부의 상태를 업데이트 합니다.&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;Store&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스가 아니고 Methods가 있는 객체 저장소이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션의 전체 상태 트리를 보유한다,&amp;nbsp; 내부 상태를 변경하는 방법은 상태에 대한 Action을 전달하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Props와 State의 구별&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Props&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Properties의 줄임말&lt;/li&gt;
&lt;li&gt;컴포넌트상 서로 통신하는 방법&lt;/li&gt;
&lt;li&gt;상위 구성 요소에서 아래쪽으로 흐른다(부모 -&amp;gt; 자식)&lt;/li&gt;
&lt;li&gt;자식이 가지고 있는 props를 변경하려면 부모 컴포넌트의 state를 변경해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;State&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 컴포넌트에서 자식 컴포넌트로 data를 보내는 게 아니고,  하나의 컴포넌트 안에서 데이터를 전달하기 위해 사용함(예를 들어서 검색 창에 글을 입력할 때 글이 변하는 것은 state로)&lt;/li&gt;
&lt;li&gt;state is mutable(조작할 수 있는) / State는 자체적으로 변경할 수 있다.&lt;/li&gt;
&lt;li&gt;state가 변하면 re-render 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;미들웨어 없이 리덕스 카운터 앱 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더를 만들고 그 안에서 명령어를 칠 때는 ./ 를 사용&lt;/p&gt;
&lt;pre id=&quot;code_1682382820965&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app ./ --template typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더도 같이 생성되게 하려면 폴더명과 함께 사용(ex: my-app)&lt;/p&gt;
&lt;pre id=&quot;code_1682382955661&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app my-app --template typescript&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;/p&gt;
&lt;pre id=&quot;code_1682382828167&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install redux --save&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;Subscribe()&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;change listener를 추가합니다.&lt;br /&gt;작업이 전달될 때마다 호출되며 상태 트리의 일부가 잠재적으로 변경될 수 있습니다.&lt;br /&gt;그런 다음 getState()를 호출하여 내부의 현재 상태 트리를 읽을 수 있습니다.&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #0f111a; color: #a6accd;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;store&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;subscribe&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;render&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://redux.js.org/api/store#subscribelistener&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://redux.js.org/api/store#subscribelistener&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682392579823&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;Store | Redux&quot; data-og-description=&quot;API &amp;gt; Store: the core Redux store methods&quot; data-og-host=&quot;redux.js.org&quot; data-og-source-url=&quot;https://redux.js.org/api/store#subscribelistener&quot; data-og-url=&quot;https://redux.js.org/api/store&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Pzrfb/hySou8Fc8s/D1RmrQJtjPqL21zBQ9Gfxk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/hipMr/hySoEXJZcg/BJU1s8iOcjcQEnksumVZHk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://redux.js.org/api/store#subscribelistener&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://redux.js.org/api/store#subscribelistener&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Pzrfb/hySou8Fc8s/D1RmrQJtjPqL21zBQ9Gfxk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/hipMr/hySoEXJZcg/BJU1s8iOcjcQEnksumVZHk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Store | Redux&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;API &amp;gt; Store: the core Redux store methods&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;redux.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;combineErducers&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;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;provider는 React Redux라는 라이브러리에서 가지고 올 수 있어서 설치를 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1682395600719&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install react-redux --save&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;useSelector&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토어의 값을 가지고 오는 hooks&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;useDispatch&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토어에 있는 dispach 함수에 접근하는 hooks(액션을 보내는 것)&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;blockquote data-ke-style=&quot;style2&quot;&gt;액션을 dispatch 하고 리듀서에 도달하는 순간 정해놓은 작업을 하는 중간지입니다.&lt;br /&gt;로깅, 충돌 보고, 비동기, API 통신, 라우팅 등을 위해 사용합니다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjP3qL/btscwoCRM2X/k0lCLrq2GRhoBJge5MOAj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjP3qL/btscwoCRM2X/k0lCLrq2GRhoBJge5MOAj0/img.png&quot; data-alt=&quot;로깅으로 사용하여 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjP3qL/btscwoCRM2X/k0lCLrq2GRhoBJge5MOAj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjP3qL%2FbtscwoCRM2X%2Fk0lCLrq2GRhoBJge5MOAj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;306&quot; height=&quot;317&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로깅으로 사용하여 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로깅 미들웨어 생성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리덕스를 이용할 때 로그를 찍어주는 미들웨어&lt;/p&gt;
&lt;div style=&quot;background-color: #0f111a; color: #a6accd;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;loggerMiddleware&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;store&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;any&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;any&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;action&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;any&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;code&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;..&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&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;리덕스 Thunk&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;thunk:&amp;nbsp; 일부 지연된 작업을 수행하는 코드 조각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리덕스를 사용하는 앱에서 &lt;u&gt;비동기 작업&lt;/u&gt;을 할 때 많이 사용하는 방법이 redux-thunk 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1682399808945&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install redux-thunk --save&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;서버에 요청을 보내서 데이터를 가져올 때 주로 비동기 요청을 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 위해 &lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Dummy 데이터&lt;/a&gt;를 가지고 와서 axios로 API 요청을 해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;axios 모듈 설치&lt;/p&gt;
&lt;pre id=&quot;code_1682397741746&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install axios --save&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;리덕스 toolkit&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;a href=&quot;https://redux-toolkit.js.org/tutorials/quick-start&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://redux-toolkit.js.org/tutorials/quick-start&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682400446302&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;Quick Start | Redux Toolkit&quot; data-og-description=&quot;&amp;nbsp;&quot; data-og-host=&quot;redux-toolkit.js.org&quot; data-og-source-url=&quot;https://redux-toolkit.js.org/tutorials/quick-start&quot; data-og-url=&quot;https://redux-toolkit.js.org/tutorials/quick-start&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2m5yh/hySoxdojgh/Wbd09jYyiorkSkWm8Lmjh1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://redux-toolkit.js.org/tutorials/quick-start&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://redux-toolkit.js.org/tutorials/quick-start&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2m5yh/hySoxdojgh/Wbd09jYyiorkSkWm8Lmjh1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Quick Start | Redux Toolkit&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;redux-toolkit.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1682400480553&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install @reduxjs/toolkit react-redux&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;a href=&quot;https://github.com/reduxjs/cra-template-redux&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/reduxjs/cra-template-redux&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682400513475&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - reduxjs/cra-template-redux: The official Redux template for Create React App&quot; data-og-description=&quot;The official Redux template for Create React App. Contribute to reduxjs/cra-template-redux development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/reduxjs/cra-template-redux&quot; data-og-url=&quot;https://github.com/reduxjs/cra-template-redux&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/un8z7/hySozWzxSS/FkRgPvvLMp13Z2D55pwX7k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/reduxjs/cra-template-redux&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/reduxjs/cra-template-redux&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/un8z7/hySozWzxSS/FkRgPvvLMp13Z2D55pwX7k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - reduxjs/cra-template-redux: The official Redux template for Create React App&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The official Redux template for Create React App. Contribute to reduxjs/cra-template-redux development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>패스트캠퍼스/React&amp;amp;Redux</category>
      <category>K디지털기초역량훈련</category>
      <category>React</category>
      <category>React&amp;amp;Redux로 시작하는 웹 프로그래밍</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>리액트</category>
      <category>패스트캠퍼스</category>
      <category>프론트엔드</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/29</guid>
      <comments>https://rosylee.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 25 Apr 2023 14:42:32 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 프론트엔드 강의 학습일지(React 앱 성능 개선)</title>
      <link>https://rosylee.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;국비지원교육으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;패스트캠퍼스에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;진행하는 프론트엔드 강의를 듣고 정리한 내용입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리액트 확장 프로그램&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko&quot;&gt;https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1682344307749&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;React Developer Tools&quot; data-og-description=&quot;Adds React debugging tools to the Chrome Developer Tools. Created from revision 28ce1c171 on 3/22/2023.&quot; data-og-host=&quot;chrome.google.com&quot; data-og-source-url=&quot;https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko&quot; data-og-url=&quot;https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dEvnfq/hySoH7tWGK/jL8lSS9fyQQf3CQW23K1W1/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dEvnfq/hySoH7tWGK/jL8lSS9fyQQf3CQW23K1W1/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&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 Developer Tools&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Adds React debugging tools to the Chrome Developer Tools. Created from revision 28ce1c171 on 3/22/2023.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chrome.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3AkaD/btscoEL5vdF/Uv2vPTcqg1XtOAjo7nMLQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3AkaD/btscoEL5vdF/Uv2vPTcqg1XtOAjo7nMLQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3AkaD/btscoEL5vdF/Uv2vPTcqg1XtOAjo7nMLQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3AkaD%2FbtscoEL5vdF%2FUv2vPTcqg1XtOAjo7nMLQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;257&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;554&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 data-ke-size=&quot;size20&quot;&gt;Profiler 성능 측정을 위한 테스트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설치한 확장프로그램에서 Profiler 기능을 확인해 보기 위해 앱을 만들어 본다.&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;가짜 데이터 API를 사용할 수 있는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jsonplaceholder.typicode.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682345782863&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;JSONPlaceholder - Free Fake REST API&quot; data-og-description=&quot;{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. Serving ~2 billion requests each month.&quot; data-og-host=&quot;jsonplaceholder.typicode.com&quot; data-og-source-url=&quot;https://jsonplaceholder.typicode.com/&quot; data-og-url=&quot;https://jsonplaceholder.typicode.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jsonplaceholder.typicode.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;JSONPlaceholder - Free Fake REST API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. Serving ~2 billion requests each month.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jsonplaceholder.typicode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #464b5d;&quot;&gt;A컴포넌트: 모든 요소를 하나의 컴포넌트에 넣음 |&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;B컴포넌트:&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;여러&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;컴포넌트로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;나누어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pfofiler로 성능 측정했을 때 A컴포넌트가 1.3ms, B컴포넌트가 2.8ms로 나누지 않은 게 성능이 더 좋게 나왔다.&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;1706&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf54nb/btscyZg1Vmp/zhxAVMToNkuWK3Lbk3UIO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf54nb/btscyZg1Vmp/zhxAVMToNkuWK3Lbk3UIO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf54nb/btscyZg1Vmp/zhxAVMToNkuWK3Lbk3UIO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf54nb%2FbtscyZg1Vmp%2FzhxAVMToNkuWK3Lbk3UIO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;242&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;734&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;1042&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHOBnt/btscoCOkQx7/f0xDbdtX02ITkI6PHiFtLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHOBnt/btscoCOkQx7/f0xDbdtX02ITkI6PHiFtLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHOBnt/btscoCOkQx7/f0xDbdtX02ITkI6PHiFtLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHOBnt%2FbtscoCOkQx7%2Ff0xDbdtX02ITkI6PHiFtLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;189&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 input에 작성하는 글만 렌더링 되어야 하는데, 리스트까지 모두 렌더링이 되고 있었다.(확장프로그램의 Components -&amp;gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Highlight updates when components render 를 체크하면 확인할 수 있다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 렌더링 되지 않아도 되는 부분까지도 렌더링이 돼서 성능이 안 좋게 나왔다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;React.memo&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 문제가 있는 B 컴포넌트를 React.memo로 성능 최적화를 해본다.&lt;/p&gt;
&lt;pre id=&quot;code_1682350681263&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';

const ListItem = React.memo(({ post }) =&amp;gt; {
  return (
    &amp;lt;li key={post.id}&amp;gt;
      &amp;lt;p&amp;gt;{post.title}&amp;lt;/p&amp;gt;
    &amp;lt;/li&amp;gt;
  );
});

const List = React.memo(({ posts }) =&amp;gt; {
  return (
    &amp;lt;ul&amp;gt;
      {posts.map((post) =&amp;gt; (
        &amp;lt;ListItem
          key={post.id}
          post={post}
        /&amp;gt;
      ))}
    &amp;lt;/ul&amp;gt;
  );
});

const Message = React.memo(({ message }) =&amp;gt; {
  return &amp;lt;p&amp;gt; {message} &amp;lt;/p&amp;gt;;
});

const B = ({ message, posts }) =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;B components&amp;lt;/h1&amp;gt;
      &amp;lt;Message message={message} /&amp;gt;
      &amp;lt;List posts={posts} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default B;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/plii4/btscfBPSdUy/JQ75smmEwYeoeEZhrPSjt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/plii4/btscfBPSdUy/JQ75smmEwYeoeEZhrPSjt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/plii4/btscfBPSdUy/JQ75smmEwYeoeEZhrPSjt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fplii4%2FbtscfBPSdUy%2FJQ75smmEwYeoeEZhrPSjt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;174&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드와 같이 수정하고 처음과 같은 방식으로 테스트했는데, A는 1.7ms, B는 0.1ms로 성능이 좋아졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React.memo() 란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트가 React.memo()로 둘러 쌓여 있다면, 처음 컴포넌트를 렌더링 하고 결과를 메모이징(Memoizing)한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다음 렌더링 시 Props가 같으면 메모이징 된 내용을 재사용한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Memoization은 주어진 입력 값에 대한 결과를 저장함으로써 같은 입력값에 대해 함수가 한 번만 실행(캐시 된 결과를 반환)해서 컴퓨터 프로그램 속도를 높이는데 주로 사용되는 최적화 기술입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;React.memo()를 사용할 때는 Profiler를 통해 성능 개선의 여지가 있을 경우에 사용한다. &lt;/u&gt;&lt;u&gt;너무 의존하면 버그 유발 가능성이 있다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;얕은 비교&lt;/h2&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;/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;얕은 비교가 사용되는 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React.memo()&lt;/li&gt;
&lt;li&gt;state 변경이 있을 때&lt;/li&gt;
&lt;li&gt;부모 컴포넌트가 렌더링 될 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고) 리액트가 리렌더링 되는 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;state 변경이 있을 때&lt;/li&gt;
&lt;li&gt;부모 컴포넌트가 렌더링 될 때&lt;/li&gt;
&lt;li&gt;새로운 props가 들어올 때&lt;/li&gt;
&lt;li&gt;shouldComponentUpdate에서 true가 반환될 때&lt;/li&gt;
&lt;li&gt;foceUpdate가 실행될 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최적화를 위한 방법&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;useCallback&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;특히나 자식 컴포넌트가 부모 컴포넌트의 함수를 똑같이 가지고 있다면, 같은 함수를 계속 다시 만들게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 useCallback()으로 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모이제이션된 함수를 반환하는 함수&lt;/p&gt;
&lt;div style=&quot;background-color: #0f111a; color: #a6accd;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;textFunction&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;useCallback&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{},&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; [])&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성 배열(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;usecallback의 마지막 인수인 &lt;span style=&quot;background-color: #dddddd; color: #333333; 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;h4 data-ke-size=&quot;size20&quot;&gt;useMemo&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예시&lt;/p&gt;
&lt;div style=&quot;background-color: #0f111a; color: #a6accd;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;component&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;({&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;})&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;useMemo&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;compute&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color: #a6accd;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>패스트캠퍼스/React&amp;amp;Redux</category>
      <category>K디지털기초역량훈련</category>
      <category>React</category>
      <category>React&amp;amp;Redux로 시작하는 웹 프로그래밍</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>리액트</category>
      <category>패스트캠퍼스</category>
      <category>프론트엔드</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/28</guid>
      <comments>https://rosylee.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 25 Apr 2023 01:16:47 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 웹 개발 강의(AWS 배포)</title>
      <link>https://rosylee.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;국비지원교육으로&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;패스트캠퍼스에서&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;진행하는 웹 개발 강의를&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;듣고 정리한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서버 준비&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포를 위해 클라우드 혹은 서버환경을 구성하는데, 여기서는 AWS EC2를 가지고 서버 구성을 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS &amp;gt; 컴퓨팅 &amp;gt; EC2 &amp;gt; 상단 오른쪽에 리전도 꼭 서울로 체크&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;웹사이트 제공용이니 SSH, HTTP, HTTPS 트래픽 허용 모두 체크한다.&lt;/li&gt;
&lt;/ul&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/obyBD/btscfCsAtBR/qXTuf8oJFaru5uf4lXiu51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/obyBD/btscfCsAtBR/qXTuf8oJFaru5uf4lXiu51/img.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1404&quot; data-is-animation=&quot;false&quot; width=&quot;482&quot; height=&quot;483&quot; style=&quot;width: 48.1428%; margin-right: 10px;&quot; data-widthpercent=&quot;48.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/obyBD/btscfCsAtBR/qXTuf8oJFaru5uf4lXiu51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FobyBD%2FbtscfCsAtBR%2FqXTuf8oJFaru5uf4lXiu51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRbYvN/btscjmiPiUP/E3TtfsRkRjpcbWyKCgeNk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRbYvN/btscjmiPiUP/E3TtfsRkRjpcbWyKCgeNk0/img.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;1360&quot; data-is-animation=&quot;false&quot; width=&quot;472&quot; height=&quot;450&quot; style=&quot;width: 50.6944%;&quot; data-widthpercent=&quot;51.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRbYvN/btscjmiPiUP/E3TtfsRkRjpcbWyKCgeNk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRbYvN%2FbtscjmiPiUP%2FE3TtfsRkRjpcbWyKCgeNk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1428&quot; height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;설정 값 스크린샷&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #545b64; text-align: left;&quot;&gt;퍼블릭 IPv4 주소가 서버의 IP이다.&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 python으로 작업한 코드에서 host와 port를 수정해줘야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682242311425&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 다른 주소로도 접속할 수 있도록 설정
# 0.0.0.0 = 모든 주소로 접속할 수 있다.
# 웹사이트는 기본적으로 사용하는 포트가 80이다.
app.run(host='0.0.0.0', port='80')&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드 업로드를 위해 &lt;a href=&quot;https://filezilla-project.org/download.php?type=client&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Filezilla&lt;/a&gt; 설치해서 SFTP 방식으로 업로드할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 ssh로 서버 접속하여 옮길 수도 있다.(vscode의 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Remote - SSH 확장프로그램&lt;/a&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드를 업로드하고 나서 EC2 서버 접속(AWS 인스턴스에서 연결 버튼 클릭해서 연결도 가능)해서 필요한 패키지를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682240058438&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo pip3 install flask Flask-PyMongo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치는 MongoDB의 문서를 참고해서 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682240359051&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 MongoDB Community Edition on Amazon Linux &amp;mdash; MongoDB Manual&quot; data-og-description=&quot;Docs Home &amp;rarr; MongoDB Manual MongoDB AtlasMongoDB Atlas is a hosted MongoDB service option in the cloud which requires no installation overhead and offers a free tier to get started.Use this tutorial to install MongoDB 4.4 Community Edition on Amazon Linux&quot; data-og-host=&quot;www.mongodb.com&quot; data-og-source-url=&quot;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/&quot; data-og-url=&quot;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c2zcgH/hySmYhNMpn/bgFF3LNpFwcd8WyWR6zjS1/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/zemIs/hySmX4guPD/uHMO25HHY9b79I9xBT0gU0/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c2zcgH/hySmYhNMpn/bgFF3LNpFwcd8WyWR6zjS1/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/zemIs/hySmX4guPD/uHMO25HHY9b79I9xBT0gU0/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601');&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 MongoDB Community Edition on Amazon Linux &amp;mdash; MongoDB Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docs Home &amp;rarr; MongoDB Manual MongoDB AtlasMongoDB Atlas is a hosted MongoDB service option in the cloud which requires no installation overhead and offers a free tier to get started.Use this tutorial to install MongoDB 4.4 Community Edition on Amazon Linux&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.mongodb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1682240449232&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vim /etc/yum.repos.d/mongodb-org-4.4.repo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vim에서 아래 내용 붙여 넣고 저장(ESC클릭 누르고 -&amp;gt; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;:wq&lt;/span&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1682240464132&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mongoDB 설치&lt;/p&gt;
&lt;pre id=&quot;code_1682240548266&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum install -y mongodb-org&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;monogDB 시작&lt;/p&gt;
&lt;pre id=&quot;code_1682240568283&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl start mongod&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 됐는지 확인(&lt;span style=&quot;color: #409d00;&quot;&gt;active(runngin)&lt;/span&gt; 나오면 실행 확인)&lt;/p&gt;
&lt;pre id=&quot;code_1682240591787&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status mongod&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python3 실행(리눅스에는 python2와 python3가 기본적으로 설치되어 있어서 3를 꼭 명시해 줘서 실행해야 한다.)&lt;/p&gt;
&lt;pre id=&quot;code_1682240629694&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo python3 app.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 IP가 생성된다. 그 IP로 접속이 가능하다.&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;그런데 python3를 종료하면 다시 접속이 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python3가 계속 실행 중이어야 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 nohub을 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682240755629&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nohup python3 app.py &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 IP로 접속하면 정상 동작함&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;네임서버 관리에서 A레코드(웹사이트 연결) 추가한다. (호스트 추가도 가능하다 (ex: www))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 IP에 python3 실행했던 IP로 연결한다.&lt;/p&gt;</description>
      <category>패스트캠퍼스/웹개발</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>K디지털기초역량훈련</category>
      <category>mongodb</category>
      <category>가상서버배포</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>웹개발강의</category>
      <category>코딩강의</category>
      <category>패스트캠퍼스</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/27</guid>
      <comments>https://rosylee.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 23 Apr 2023 18:34:10 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 웹 개발 강의(Flask)</title>
      <link>https://rosylee.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;국비지원교육으로 패스트캠퍼스에서&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;진행하는 웹 개발 강의를&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;듣고 정리한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬으로 웹개발을 시작할 수 있는 프레임워크는 Flask 또는 장고(&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;Django)&lt;/span&gt;가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에 Flask(Micro Framework)를 사용해 본다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가볍고 빠르고 쉽게 접근 가능하다.&lt;/li&gt;
&lt;li&gt;라우팅을 직관적으로 쉽게 할 수 있다.&lt;/li&gt;
&lt;li&gt;data를 html 코드에 렌더링 하는데 유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래에서 설명하는 대로 연습해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682130880016&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;빠르게 시작하기 &amp;mdash; Flask 0.11-dev documentation&quot; data-og-description=&quot;웹 어플리케이션에 있어서 클라이언트에서 서버로 보내는 데이타를 처리하는 것은 중요한 일이다. Flask에서 이 정보는 글로벌한 request 객체에 의해 제공된다. 여러분이 파이썬 경험이 있다면, &quot; data-og-host=&quot;flask-docs-kr.readthedocs.io&quot; data-og-source-url=&quot;https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html&quot; data-og-url=&quot;https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgekil/hySlAPiPY5/EPbBJpFobxQQSIGSWEHobk/img.png?width=669&amp;amp;height=570&amp;amp;face=0_0_669_570&quot;&gt;&lt;a href=&quot;https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgekil/hySlAPiPY5/EPbBJpFobxQQSIGSWEHobk/img.png?width=669&amp;amp;height=570&amp;amp;face=0_0_669_570');&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;빠르게 시작하기 &amp;mdash; Flask 0.11-dev documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹 어플리케이션에 있어서 클라이언트에서 서버로 보내는 데이타를 처리하는 것은 중요한 일이다. Flask에서 이 정보는 글로벌한 request 객체에 의해 제공된다. 여러분이 파이썬 경험이 있다면,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;flask-docs-kr.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Flask 설치&lt;/p&gt;
&lt;pre id=&quot;code_1682131229515&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install 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;i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;만드는&lt;i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;방법&lt;i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2&lt;/i&gt;가지&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;render_template은&amp;nbsp;html&amp;nbsp;파일을&amp;nbsp;렌더링&amp;nbsp;해주는&amp;nbsp;함수(html&amp;nbsp;파일을&amp;nbsp;응답해 줌)
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;루트에&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;templates&lt;/span&gt;&amp;nbsp;폴더를  만들어서 html 파일을 생성한다.&amp;nbsp;Flask에서 정의해 놓은 이름이므로 오타가 나지 않도록 주의하자&lt;/li&gt;
&lt;li&gt;그리고 그 폴더 안에 index.html 파일을 만들어서 레이아웃을 만든다.&lt;/li&gt;
&lt;li&gt;파이썬 파일에서 아래와 같이&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;render_template&lt;/span&gt;&amp;nbsp;함수로  hello_wordld.html을 적어주면, html 렌더링을 해준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;jsonify는&amp;nbsp;데이터&amp;nbsp;형식을&amp;nbsp;json형식의&amp;nbsp;파일로&amp;nbsp;변환해주는&amp;nbsp;함수(json&amp;nbsp;데이터를&amp;nbsp;응답해 줌)
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt; jsonify(오브젝트나 딕셔너리와 같은 객체) 이렇게 해주면 json 형식으로 변환해서 응답해 준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img style=&quot;caret-color: transparent; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dn/I8Y5Z/btsbShxfdoF/K8ZeSuDOKyPwnGguj2m8ek/img.png&quot; width=&quot;203&quot; height=&quot;163&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;296&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682141842564&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, render_template, jsonify

app = Flask(__name__)

@app.route('/')
def hello_world(): # define의 약자이고 함수를 만들 때 사용한다
    return render_template('hello_world.html')

@app.route('/fs')
def fs():
    res = []
    for i in range(10):
        res.append(
            {&quot;title&quot;: str(i) + &quot; title&quot;}
        )
    return jsonify(res)

 if __name__ == '__main__':
    app.run('localhost', port=5001)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본&amp;nbsp;포트는&amp;nbsp;5000번&amp;nbsp;포트로&amp;nbsp;열면&amp;nbsp;403&amp;nbsp;에러가&amp;nbsp;나서&amp;nbsp;5001번&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;i&gt;그리고 css, 혹은 js 파일 등은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;static&lt;/span&gt; 폴더를 만들어서 넣어주면 된다. 이것도 Flask에서 정의해 놓은 이름이기 때문에 오타가 없도록 주의하자&lt;/i&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;flask-pymongo 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST 작성을 위해 mongodb를 유용하게 사용할 수 있는 패키지를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682142431846&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install flask-pymongo&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1682142601209&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask_pymongo import PyMongo
app = Flask(__name__)
app.config['MONGO_URI'] ='mongodb://localhost:27017/local' # local DB 사용을 위한 연결
mongo = PyMongo(app)

// 아래와 같이 사용하여 쉽게 db에서 내용을 찾고, 가지고 올 수 있다
// mongo.db['디비명'].find()
// mongo.db['디비명'].insert_one({})&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈 내리를 javascript 효과를 만든 코드를 활용하여 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hyperstown/pure-snow.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hyperstown/pure-snow.js&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682140714153&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in&quot; data-og-description=&quot;Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in every modern browser. - GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript....&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hyperstown/pure-snow.js&quot; data-og-url=&quot;https://github.com/hyperstown/pure-snow.js&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGgJy5/hySmVEmsBr/rVCGDnpkCypbziiKyaH9YK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hyperstown/pure-snow.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hyperstown/pure-snow.js&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGgJy5/hySmVEmsBr/rVCGDnpkCypbziiKyaH9YK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in every modern browser. - GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript....&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;js 파일과 css 파일, 그리고 index.html에 사용한 부분을 확인하고 똑같이 적용해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hyperstown/pure-snow.js/blob/master/pure-snow.js&quot;&gt;https://github.com/hyperstown/pure-snow.js/blob/master/pure-snow.js&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682142686301&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in&quot; data-og-description=&quot;Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in every modern browser. - GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript....&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hyperstown/pure-snow.js/blob/master/pure-snow.js&quot; data-og-url=&quot;https://github.com/hyperstown/pure-snow.js&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Uz7xo/hySlMvvffn/EqwfpHZDkq6KRZ2WzCeyFk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hyperstown/pure-snow.js/blob/master/pure-snow.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hyperstown/pure-snow.js/blob/master/pure-snow.js&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Uz7xo/hySlMvvffn/EqwfpHZDkq6KRZ2WzCeyFk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Snowfall effect written in pure JavaScript. No additional libraries, no dependencies. Works in every modern browser. - GitHub - hyperstown/pure-snow.js: Snowfall effect written in pure JavaScript....&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 map 쉽게 적용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 지도에서 적용할 곳을 검색한 후 HTML 태그 복사하여 그대로 사용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0Sbco/btsbVcnR0xW/NNtudcKrOY0OEXjhjglZj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0Sbco/btsbVcnR0xW/NNtudcKrOY0OEXjhjglZj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0Sbco/btsbVcnR0xW/NNtudcKrOY0OEXjhjglZj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0Sbco%2FbtsbVcnR0xW%2FNNtudcKrOY0OEXjhjglZj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;700&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;700&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 파일 전달을 위해 form에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;enctype = &quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f1f1; color: #1b1b1b; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;multipart/form-data&quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #1b1b1b; text-align: left;&quot;&gt;로 변경해 준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682144520751&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;HTMLFormElement: enctype property - Web APIs | MDN&quot; data-og-description=&quot;The HTMLFormElement.enctype property is the MIME type of content that is used to submit the form to the server. Possible values are:&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bykSmQ/hySlBU3XvE/LgO0ErVpfnFMncZH37AEZ1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bykSmQ/hySlBU3XvE/LgO0ErVpfnFMncZH37AEZ1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;HTMLFormElement: enctype property - Web APIs | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The HTMLFormElement.enctype property is the MIME type of content that is used to submit the form to the server. Possible values are:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input type의 file을 만들고 전달한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682144767182&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os # 경로를 표현하기 위해 사용하는 패키지

...

# 파일 저장
fileinfo = request.files['image']
filepath = os.path.dirname(os.path.abspath(__file__))
filepath = os.path.join(filepath, 'static')
fileinfo.save(os.path.join(filepath, fileinfo.filename))

...
# db에 저장
product_db.insert_one({
	'image': fileinfo.filename
})

...&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;이미지가 없을 수도 있으니 if문으로 예외처리도 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ndxr8/btsbRz5P0PC/mIGIXjuTUzaL8u2MqEDtXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ndxr8/btsbRz5P0PC/mIGIXjuTUzaL8u2MqEDtXK/img.png&quot; data-alt=&quot;[강의 스크린샷]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ndxr8/btsbRz5P0PC/mIGIXjuTUzaL8u2MqEDtXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fndxr8%2FbtsbRz5P0PC%2FmIGIXjuTUzaL8u2MqEDtXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;166&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[강의 스크린샷]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&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;a href=&quot;https://postcode.map.daum.net/guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://postcode.map.daum.net/guide&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682144893805&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;Daum 우편번호 서비스&quot; data-og-description=&quot;우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.&quot; data-og-host=&quot;postcode.map.daum.net&quot; data-og-source-url=&quot;https://postcode.map.daum.net/guide&quot; data-og-url=&quot;https://postcode.map.daum.net/guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/flgCX/hySm3vE5w7/BRY9JUJ0doNsI17o6CJouK/img.png?width=402&amp;amp;height=219&amp;amp;face=0_0_402_219&quot;&gt;&lt;a href=&quot;https://postcode.map.daum.net/guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://postcode.map.daum.net/guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/flgCX/hySm3vE5w7/BRY9JUJ0doNsI17o6CJouK/img.png?width=402&amp;amp;height=219&amp;amp;face=0_0_402_219');&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;Daum 우편번호 서비스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;postcode.map.daum.net&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kenwheeler.github.io/slick/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kenwheeler.github.io/slick/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682141556364&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;slick - the last carousel you'll ever need&quot; data-og-description=&quot;slick is a responsive carousel jQuery plugin that supports multiple breakpoints, CSS3 transitions, touch events/swiping &amp;amp; much more!&quot; data-og-host=&quot;kenwheeler.github.io&quot; data-og-source-url=&quot;https://kenwheeler.github.io/slick/&quot; data-og-url=&quot;http://kenwheeler.github.io/slick/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bW8Yz3/hySm2Kgvme/nkOedX2R9pUyvJGZ7yqBkK/img.gif?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/nei4d/hySmVj3NOv/1JYDdQrxV8TJ6YPmf77g0K/img.png?width=560&amp;amp;height=400&amp;amp;face=149_81_386_140,https://scrap.kakaocdn.net/dn/mmKAU/hySlHuab8m/i1SDHrVVARP0lJqMrMGPXK/img.png?width=560&amp;amp;height=400&amp;amp;face=303_77_325_101&quot;&gt;&lt;a href=&quot;https://kenwheeler.github.io/slick/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kenwheeler.github.io/slick/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bW8Yz3/hySm2Kgvme/nkOedX2R9pUyvJGZ7yqBkK/img.gif?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/nei4d/hySmVj3NOv/1JYDdQrxV8TJ6YPmf77g0K/img.png?width=560&amp;amp;height=400&amp;amp;face=149_81_386_140,https://scrap.kakaocdn.net/dn/mmKAU/hySlHuab8m/i1SDHrVVARP0lJqMrMGPXK/img.png?width=560&amp;amp;height=400&amp;amp;face=303_77_325_101');&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;slick - the last carousel you'll ever need&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;slick is a responsive carousel jQuery plugin that supports multiple breakpoints, CSS3 transitions, touch events/swiping &amp;amp; much more!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kenwheeler.github.io&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;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pictogrammers.com/library/mdi/&quot;&gt;https://pictogrammers.com/library/mdi/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682142519216&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;Material Design Icons - Icon Library - Pictogrammers&quot; data-og-description=&quot;The original. Following Google's Material Design guidelines for system icons, MDI is our largest library, touting over 6500 unique icons!&quot; data-og-host=&quot;pictogrammers.com&quot; data-og-source-url=&quot;https://pictogrammers.com/library/mdi/&quot; data-og-url=&quot;https://pictogrammers.com/library/mdi/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xIQKA/hySlyc0qRn/pedu3KL1NVbB1I05a2TvG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bWoe5R/hySlEEdgoz/hf46P3QP36JHepJNKav1Pk/img.png?width=288&amp;amp;height=288&amp;amp;face=0_0_288_288&quot;&gt;&lt;a href=&quot;https://pictogrammers.com/library/mdi/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pictogrammers.com/library/mdi/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xIQKA/hySlyc0qRn/pedu3KL1NVbB1I05a2TvG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bWoe5R/hySlEEdgoz/hf46P3QP36JHepJNKav1Pk/img.png?width=288&amp;amp;height=288&amp;amp;face=0_0_288_288');&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;Material Design Icons - Icon Library - Pictogrammers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The original. Following Google's Material Design guidelines for system icons, MDI is our largest library, touting over 6500 unique icons!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pictogrammers.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WYSIWYG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://quilljs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://quilljs.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682143844100&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;Quill - Your powerful rich text editor&quot; data-og-description=&quot;Sailec Light Sofia Pro Slabo 27px Roboto Slab Inconsolata Ubuntu Mono Quill Rich Text Editor Quill is a free, open source WYSIWYG editor built for the modern web. With its modular architecture and expressive API, it is completely customizable to fit any ne&quot; data-og-host=&quot;quilljs.com&quot; data-og-source-url=&quot;https://quilljs.com/&quot; data-og-url=&quot;https://quilljs.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/szlXa/hySmZ05qJ9/ZHp4wTPLek6XuQ97BvKbb0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/b7AHi4/hySmWiZEFe/KLJpSMV58vKbabW9xDa1OK/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://quilljs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://quilljs.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/szlXa/hySmZ05qJ9/ZHp4wTPLek6XuQ97BvKbb0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/b7AHi4/hySmWiZEFe/KLJpSMV58vKbabW9xDa1OK/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;Quill - Your powerful rich text editor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Sailec Light Sofia Pro Slabo 27px Roboto Slab Inconsolata Ubuntu Mono Quill Rich Text Editor Quill is a free, open source WYSIWYG editor built for the modern web. With its modular architecture and expressive API, it is completely customizable to fit any ne&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;quilljs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>패스트캠퍼스/웹개발</category>
      <category>K디지털기초역량훈련</category>
      <category>mongodb</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>웹개발강의</category>
      <category>코딩강의</category>
      <category>패스트캠퍼스</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/26</guid>
      <comments>https://rosylee.tistory.com/26#entry26comment</comments>
      <pubDate>Sat, 22 Apr 2023 15:32:48 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 프론트엔드 강의 학습일지(React  동작 기록과 배포)</title>
      <link>https://rosylee.tistory.com/25</link>
      <description>&lt;p 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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Tic Tac Toe 앱 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;동작에 대한 기록 저장하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 만들던 Tic Tac Toe(&lt;a href=&quot;https://rosylee.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rosylee.tistory.com/20&lt;/a&gt;) 앱을 이어서 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 보드에 스퀘어를 누를 때마다 X나 O가 표시되는데, 이것을 저장하여 기록으로 남기는 기능을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 스퀘어를 누를 때 배열의 복사본(&lt;span style=&quot;background-color: #dddddd;&quot;&gt;slice()&lt;/span&gt;)을 만들어서 동작에 대한 기록 저장이 가능하다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;History Strate는 Board 컴포넌트와, Square 컴포넌트 둘 다 필요하기 때문에, 최상위 단계인 App에 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Board.js에 만들었던 state를 App.js에 옮겼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2696&quot; data-origin-height=&quot;1490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btgMMz/btsbPWGwqBH/8Pw456K5eXj1gTSKGkEU6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btgMMz/btsbPWGwqBH/8Pw456K5eXj1gTSKGkEU6k/img.png&quot; data-alt=&quot;기존 Board.js에 만들었던 state를 App.js에 옮겼다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btgMMz/btsbPWGwqBH/8Pw456K5eXj1gTSKGkEU6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtgMMz%2FbtsbPWGwqBH%2F8Pw456K5eXj1gTSKGkEU6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2696&quot; height=&quot;1490&quot; data-origin-width=&quot;2696&quot; data-origin-height=&quot;1490&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존 Board.js에 만들었던 state를 App.js에 옮겼다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;과거의 이동 표시하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;moves라는 함수를 만들어서 화면에 뿌려준다.&lt;/p&gt;
&lt;pre id=&quot;code_1682066087886&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const moves = history.map((step, index) =&amp;gt; {
  const desc = index ? 'Go to move #' + index : 'Go to game start';
  return (
    &amp;lt;li&amp;gt;
      &amp;lt;button&amp;gt;{desc}&amp;lt;/button&amp;gt;
    &amp;lt;/li&amp;gt;
  );
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 에러가 발생하는데, key(고유값)을 지정해 주면 해결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 고유 값은 index로 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Atm3/btsbPRyteD1/wfMkjJAiIoBk36PGVz05v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Atm3/btsbPRyteD1/wfMkjJAiIoBk36PGVz05v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Atm3/btsbPRyteD1/wfMkjJAiIoBk36PGVz05v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Atm3%2FbtsbPRyteD1%2FwfMkjJAiIoBk36PGVz05v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;109&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1682066233216&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const moves = history.map((step, index) =&amp;gt; {
  const desc = index ? 'Go to move #' + index : 'Go to game start';
  return (
    &amp;lt;li key={index}&amp;gt;
      &amp;lt;button&amp;gt;{desc}&amp;lt;/button&amp;gt;
    &amp;lt;/li&amp;gt;
  );
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JSX Key 속성&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;리액트에서 요소의 리스트를 나열할 때는 Key를 넣어줘야합니다. 키는 React가 변경, 추가 또는 제거된 항목을 식별하는데 도움이 됩니다. 요소에 안정적인 ID를 부여하려면 배열 내부의 요소에 키를 제공해야 합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상돔 비교해서 파악한 후 바뀐 부분만 실제 돔에 적용해주는데, 리스트를 나열할 때 바뀐 부분을 찾으려면 key를 이용해서 인식한다.&amp;nbsp;key로 index는 비추천한다. 추가되거나 제거되면 변경되기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전개 연산자(Spread Operator)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6에서 추가된 기능&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;background-color: #dddddd;&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_1682064693783&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj1 = {
	A: 'a',
    B: 'b'
};
const obj2 = {
	C: 'c',
    D: 'd'
};

const spreadObj = {...obj1, ...obj2};
console.log(spreadObj); // {A: 'a', B: 'b', C: 'c', D: 'd'};


const obj = {obj1, obj2};
console.log(obj);
/*
{
    &quot;obj1&quot;: {
        &quot;A&quot;: &quot;a&quot;,
        &quot;B&quot;: &quot;b&quot;
    },
    &quot;obj2&quot;: {
        &quot;C&quot;: &quot;c&quot;,
        &quot;D&quot;: &quot;d&quot;
    }
}
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 배열을 보존할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1682064851048&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr1 = [1,2,3];
const arr2 = arr1.reverse();
console.log(arr1); // [3,2,1]
console.log(arr2); // [3,2,1]

// 전개 연산자 사용하면 기존 배열을 보존해준다.
const arr3 = [1,2,3];
const arr4 = [...arr3].reverse();
console.log(arr3); // [1,2,3]
console.log(arr4); // [3,2,1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git 배포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;작업 순서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Working Directory &lt;span style=&quot;color: #9d9d9d;&quot;&gt;---(git add)---&amp;gt;&lt;/span&gt; Staging Area&amp;nbsp; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;---(git commit)---&amp;gt;&lt;/span&gt; Git repository(LOCAL) &lt;span style=&quot;color: #9d9d9d;&quot;&gt;---(git push)---&amp;gt;&lt;/span&gt; Git repository(REMOTE)&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;git 명령어&lt;/p&gt;
&lt;pre id=&quot;code_1682085725321&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 현재 디렉토리 상의 모든 변경 내용을 스테이징 영역에 추가
giit add .


// 스테이징 영역에 있는 소스 코드를 로컬 저장소에 메시지와 함께 저장
git commit -m &quot;commit message&quot;


// main 브랜치 설정
git branch -M main


// 로컬 git 저장소와 github remote(원격) 연결
git remote add origin {깃헙레포지토리주소}


// 로컬 git 저장소에 있는 소스 코드를 github 저장소로 push(local의 main branch에서 git push -u origin main이라고 치면, local의 main과 remote(orgin)의 main 브랜치와 연결된다.)
// 이때 -u는 upstream을 의미(upstream은 git repository끼리 동기화할 때 사용되는 용어이다)
// 한 번 -u를 달아서 커맨드를 날리면 이후엔 브랜치명을 생략하고 git push만 해도 된다.
// downstream 이란 용어도 있다.
git push -u origin main&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;size18&quot;&gt;먼저, gh-pages 모듈을 사용한 React 웹사이트 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈 설치 방법&lt;/p&gt;
&lt;pre id=&quot;code_1682086115576&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install gh-pages --save-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;package.json에 hompage url을 작성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https:// {깃허브유저이름}.github.io/{저장소이름}/&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuwVFB/btsbRAi0MBR/JdQjkvtuZUEcHBjeLMzUm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuwVFB/btsbRAi0MBR/JdQjkvtuZUEcHBjeLMzUm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuwVFB/btsbRAi0MBR/JdQjkvtuZUEcHBjeLMzUm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuwVFB%2FbtsbRAi0MBR%2FJdQjkvtuZUEcHBjeLMzUm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;396&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json 배포를 명령어 입력을 위해 script에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&quot;deploy&quot;: &quot;gh-pages -d build&quot;,&lt;/span&gt; 추가&lt;/p&gt;
&lt;pre id=&quot;code_1682086268194&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &quot;scripts&quot;: {
    &quot;start&quot;: &quot;react-scripts start&quot;,
    &quot;build&quot;: &quot;react-scripts build&quot;,
    &quot;deploy&quot;: &quot;gh-pages -d build&quot;,
    &quot;test&quot;: &quot;react-scripts test&quot;,
    &quot;eject&quot;: &quot;react-scripts eject&quot;
  },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 build 폴더 생성&lt;/p&gt;
&lt;pre id=&quot;code_1682086339587&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8SBIq/btsbVer6AKy/jJiGM8hFjt9iztBAVgZfH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8SBIq/btsbVer6AKy/jJiGM8hFjt9iztBAVgZfH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8SBIq/btsbVer6AKy/jJiGM8hFjt9iztBAVgZfH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8SBIq%2FbtsbVer6AKy%2FjJiGM8hFjt9iztBAVgZfH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;191&quot; height=&quot;205&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;438&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;npm run deploy&lt;/p&gt;
&lt;pre id=&quot;code_1682086329022&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run deploy&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;배포가 완료되면(Published) gitub 저장소에서 gh-pages 브랜치 생성되고, Settings &amp;gt; Pages에 배포된 경로가 나온다.&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/btxtC9/btsbQysv4Il/rlRP2yox707OLE9KN3DyS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btxtC9/btsbQysv4Il/rlRP2yox707OLE9KN3DyS1/img.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;616&quot; data-is-animation=&quot;false&quot; width=&quot;366&quot; height=&quot;300&quot; style=&quot;width: 33.5186%; margin-right: 10px;&quot; data-widthpercent=&quot;33.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btxtC9/btsbQysv4Il/rlRP2yox707OLE9KN3DyS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtxtC9%2FbtsbQysv4Il%2FrlRP2yox707OLE9KN3DyS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EfRLW/btsbQvvP6Pe/R7phAmlYVk4OloJzeg1mzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EfRLW/btsbQvvP6Pe/R7phAmlYVk4OloJzeg1mzK/img.png&quot; data-origin-width=&quot;2398&quot; data-origin-height=&quot;1008&quot; data-is-animation=&quot;false&quot; style=&quot;width: 65.3186%;&quot; data-widthpercent=&quot;66.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EfRLW/btsbQvvP6Pe/R7phAmlYVk4OloJzeg1mzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEfRLW%2FbtsbQvvP6Pe%2FR7phAmlYVk4OloJzeg1mzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2398&quot; height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>패스트캠퍼스/React&amp;amp;Redux</category>
      <category>K디지털기초역량훈련</category>
      <category>React</category>
      <category>React&amp;amp;Redux로 시작하는 웹 프로그래밍</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>리액트</category>
      <category>패스트캠퍼스</category>
      <category>프론트엔드</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/25</guid>
      <comments>https://rosylee.tistory.com/25#entry25comment</comments>
      <pubDate>Fri, 21 Apr 2023 23:45:36 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 프론트엔드 강의 학습일지(React  함수형 컴포넌트)</title>
      <link>https://rosylee.tistory.com/24</link>
      <description>&lt;p 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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;React Hooks&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;리액트 생명주기가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 할 때(Mounting)&lt;/li&gt;
&lt;li&gt;시작하고 난 이후(Updating)&lt;/li&gt;
&lt;li&gt;컴포넌트가 더 이상 사용하지 않을 때(Unmounting)&lt;/li&gt;
&lt;/ul&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;하지만 React Hooks가 업데이트되어서 함수형 컴포넌트에서도 생명주기를 사용할 수 있게 되었다.&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;size18&quot;&gt;함수형 컴포넌트의 장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;useEffect를 사용해서 Hooks(여러 가지의&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;생명주기를 간결하게 사용)&lt;/span&gt;를 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;state 업데이트는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;const [getter, setter(state를 정하는 함수)] = useState(&quot;&quot;)&lt;/span&gt; 이런 식으로 하고, getter를 이용해서 state를 업데이트할 수 있다.&lt;/li&gt;
&lt;li&gt;HOC 컴포넌트를 Custom React Hooks로 대체할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HOC(Higher Order Component): 재사용 가능한 로직만을 분리해서 컴포넌트로 만드는 방식이다.&lt;/li&gt;
&lt;li&gt;HOC 컴포넌트 사용 시 많은 Wrapper가 생길 수 있는 문제점이 있다.&lt;/li&gt;
&lt;li&gt;이러한 문제점을 Custom React Hooks로 대체하면 Wrapper로 감싸주는 게 아니라 넣어서 사용하면 돼서 Wrapper가 많아지는 문제를 해결할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rTy5E/btsbDuQqNxE/nmNguxAaukM8XcTFX51or1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rTy5E/btsbDuQqNxE/nmNguxAaukM8XcTFX51or1/img.png&quot; data-alt=&quot;[강의 중 스크린샷] 클래스와 함수형의 코드 차이점&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rTy5E/btsbDuQqNxE/nmNguxAaukM8XcTFX51or1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrTy5E%2FbtsbDuQqNxE%2FnmNguxAaukM8XcTFX51or1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;554&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[강의 중 스크린샷] 클래스와 함수형의 코드 차이점&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXIAuk/btsbI10JLD6/TQl2wmhIQBnfzGp633kTxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXIAuk/btsbI10JLD6/TQl2wmhIQBnfzGp633kTxK/img.png&quot; data-alt=&quot;[강의 중 스크린샷] HOC컴포넌트의 많은 Wrapper의 문제점&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXIAuk/btsbI10JLD6/TQl2wmhIQBnfzGp633kTxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXIAuk%2FbtsbI10JLD6%2FTQl2wmhIQBnfzGp633kTxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;257&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[강의 중 스크린샷] HOC컴포넌트의 많은 Wrapper의 문제점&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;클래스 컴포넌트와 함수형 컴포넌트의 비교&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Class Component&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&gt;많은 기능 제공&lt;/li&gt;
&lt;li&gt;긴 코드 양&lt;/li&gt;
&lt;li&gt;복잡한 코드&lt;/li&gt;
&lt;li&gt;더딘&lt;span&gt; &lt;/span&gt;성능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Functional Component&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적은 기능 제공&lt;/li&gt;
&lt;li&gt;짧은 코드&lt;/li&gt;
&lt;li&gt;심플한 코드&lt;/li&gt;
&lt;li&gt;빠른&lt;span&gt; &lt;/span&gt;성능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Tic Tac Toe 앱&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수형&lt;span&gt; &lt;/span&gt;컴포넌트로&lt;span&gt; &lt;/span&gt;변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이전에&lt;/span&gt; &lt;span&gt;만들었던&lt;/span&gt; &lt;span&gt;앱&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://rosylee.tistory.com/20&quot;&gt;https://rosylee.tistory.com/20&lt;/a&gt;)&lt;span&gt;에&lt;/span&gt; &lt;span&gt;클래스형&lt;/span&gt; &lt;span&gt;컴포넌트를&lt;/span&gt; &lt;span&gt;함수형&lt;/span&gt; &lt;span&gt;컴포넌트로&lt;/span&gt; &lt;span&gt;변경한다&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;imageblock&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyiexG/btsbBXeyt62/caiiInWW1mOmfd0gstY9LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyiexG/btsbBXeyt62/caiiInWW1mOmfd0gstY9LK/img.png&quot; data-alt=&quot;1.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyiexG/btsbBXeyt62/caiiInWW1mOmfd0gstY9LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyiexG%2FbtsbBXeyt62%2FcaiiInWW1mOmfd0gstY9LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;imageblock&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFff2b/btsbDFxErEb/KqTV28LKGc2MCkRG9uNjq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFff2b/btsbDFxErEb/KqTV28LKGc2MCkRG9uNjq1/img.png&quot; data-alt=&quot;1.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFff2b/btsbDFxErEb/KqTV28LKGc2MCkRG9uNjq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFff2b%2FbtsbDFxErEb%2FKqTV28LKGc2MCkRG9uNjq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;코드를 작성할 때 Snippet을 활용하면 자동완성 코드로 빠르게 생성할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682038664399&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rafce // react arrow function export
useStateSnippet // useState&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;useState&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useState를 사용하는 두 가지 방식이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;setNumber(number + 1)&lt;/span&gt;: 한 번만 실행&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;setNumber(prev =&amp;gt; prve +1)&lt;/span&gt;: 코드마다 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드에서 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1682038719331&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from 'react';
import Square from './Square';
import './Board.css';

const Board = () =&amp;gt; {
  const [squares] = useState(Array(9).fill(null));
  const [number, setNumber] = useState(0);

  const handleClick = (i) =&amp;gt; {
    setNumber(number + 1);
    setNumber(number + 1);
    console.log(number); // 위에서 1을 두번 더했지만 한번씩만 실행됨

    // setNumber((prev) =&amp;gt; prev + 1);
    // setNumber((prev) =&amp;gt; prev + 1);
    // console.log(number); // 두번 더한 값이 실행됨
  };

  const renderSquare = (i) =&amp;gt; {
    return (
      &amp;lt;Square
        value={squares[i]}
        onClick={() =&amp;gt; handleClick(i)}
      /&amp;gt;
    );
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;div className=&quot;status&quot;&amp;gt;Next Play: X, O&amp;lt;/div&amp;gt;
      &amp;lt;div className=&quot;board-row&quot;&amp;gt;
        {renderSquare(0)}
        {renderSquare(1)}
        {renderSquare(2)}
      &amp;lt;/div&amp;gt;
      ...
    &amp;lt;/div&amp;gt;
  );
};

export default Board;&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;size16&quot;&gt;setNumber(numver + 1)로 사용한 거는 두 번 더했지만 한 번씩만 실행돼서 console.log에 0,1,2,3... 이런 식으로 찍히고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setNumber(prev =&amp;gt; prev + 1)로 사용한거는 두 번 더해진 값이 실행돼서 console.log에 0,2,4,6... 이렇게 찍힌다.&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;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&quot;&gt;https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1682040298419&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;Tabnine AI Autocomplete for Javascript, Python, Typescript, PHP, Go, Java, Ruby &amp;amp; more - Visual Studio Marketplace&quot; data-og-description=&quot;Extension for Visual Studio Code - JavaScript, Python, Java, Typescript &amp;amp; all other languages - AI Code completion plugin. Tabnine makes developers more productive by auto-completing their code.&quot; data-og-host=&quot;marketplace.visualstudio.com&quot; data-og-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&quot; data-og-url=&quot;https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/boWZV7/hySlHmEYXj/mJKqu2iFcSbRk6VdkpkSKk/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/dFtLmj/hySlNmTjOx/N1nKEwqjv8hIUsXRJoderk/img.png?width=1448&amp;amp;height=918&amp;amp;face=0_0_1448_918,https://scrap.kakaocdn.net/dn/lGEVV/hySlzvo6YV/ACkUkrym4JkH9Qru4k8Hh1/img.png?width=1448&amp;amp;height=918&amp;amp;face=0_0_1448_918&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/boWZV7/hySlHmEYXj/mJKqu2iFcSbRk6VdkpkSKk/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/dFtLmj/hySlNmTjOx/N1nKEwqjv8hIUsXRJoderk/img.png?width=1448&amp;amp;height=918&amp;amp;face=0_0_1448_918,https://scrap.kakaocdn.net/dn/lGEVV/hySlzvo6YV/ACkUkrym4JkH9Qru4k8Hh1/img.png?width=1448&amp;amp;height=918&amp;amp;face=0_0_1448_918');&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;Tabnine AI Autocomplete for Javascript, Python, Typescript, PHP, Go, Java, Ruby &amp;amp; more - Visual Studio Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Extension for Visual Studio Code - JavaScript, Python, Java, Typescript &amp;amp; all other languages - AI Code completion plugin. Tabnine makes developers more productive by auto-completing their code.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;marketplace.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>패스트캠퍼스/React&amp;amp;Redux</category>
      <category>K디지털기초역량훈련</category>
      <category>React</category>
      <category>React&amp;amp;Redux로 시작하는 웹 프로그래밍</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>리액트</category>
      <category>패스트캠퍼스</category>
      <category>프론트엔드</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/24</guid>
      <comments>https://rosylee.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 21 Apr 2023 11:46:39 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 웹 개발 강의(MongoDB)</title>
      <link>https://rosylee.tistory.com/23</link>
      <description>&lt;p 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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MongoDB&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설치하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.mongodb.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681993218833&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;MongoDB: The Developer Data Platform&quot; data-og-description=&quot;Get your ideas to market faster with a developer data platform built on the leading modern database. MongoDB makes working with data easy.&quot; data-og-host=&quot;www.mongodb.com&quot; data-og-source-url=&quot;https://www.mongodb.com/&quot; data-og-url=&quot;https://www.mongodb.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h8LFF/hySlCrEf5f/0Bm1YO8C7bjm08I1coB7yk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.mongodb.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h8LFF/hySlCrEf5f/0Bm1YO8C7bjm08I1coB7yk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601');&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;MongoDB: The Developer Data Platform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Get your ideas to market faster with a developer data platform built on the leading modern database. MongoDB makes working with data easy.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.mongodb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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/dK3qIc/btsbCH9X3qx/KuWVxquVppKT8zCcd2DzKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dK3qIc/btsbCH9X3qx/KuWVxquVppKT8zCcd2DzKK/img.png&quot; data-origin-width=&quot;1994&quot; data-origin-height=&quot;558&quot; data-is-animation=&quot;false&quot; style=&quot;width: 67.369%; margin-right: 10px;&quot; data-widthpercent=&quot;68.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dK3qIc/btsbCH9X3qx/KuWVxquVppKT8zCcd2DzKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdK3qIc%2FbtsbCH9X3qx%2FKuWVxquVppKT8zCcd2DzKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1994&quot; height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5gXcl/btsbHkFUM2E/XZ63nP6Nujcea7MMT8U431/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5gXcl/btsbHkFUM2E/XZ63nP6Nujcea7MMT8U431/img.png&quot; data-origin-width=&quot;2654&quot; data-origin-height=&quot;1590&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.4683%;&quot; data-widthpercent=&quot;31.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5gXcl/btsbHkFUM2E/XZ63nP6Nujcea7MMT8U431/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5gXcl%2FbtsbHkFUM2E%2FXZ63nP6Nujcea7MMT8U431%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2654&quot; height=&quot;1590&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;강의에서는 사이트에서 다운로드하는 걸로 설치함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mac은 brew를 이용하여 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1681996945592&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew tab mongodb/brew
brew install mongodb-community@4.4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 설치하는데 아래와 같이 오류가 났다.&lt;/p&gt;
&lt;pre id=&quot;code_1681997022220&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Error: An exception occurred within a child process:
  CompilerSelectionError: mongodb/brew/mongodb-database-tools cannot be built with any available compilers.
Install GNU's GCC:
  brew install gcc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 메시지에서 gcc를 설치하라고 해서 설치하고, 다시 MongoDB 설치를 했는데 또 아래와 같은 오류가 났다.&lt;/p&gt;
&lt;pre id=&quot;code_1681997140319&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: Failure while executing; `/usr/bin/ld -version_details` exited with 1. Here's the output:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 구글링 해보니 xcode command line 설치가 되지 않아서 생긴 오류라고 해서 xcode를 설치했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681997195167&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;xcode-select --install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 완료하고 다시 MongoDB 설치하니 완료되었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB&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;MongoDB의 기본 포트인 27017로 로컬서버가 구동된다.&lt;/li&gt;
&lt;li&gt;http://localhost:27017&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1681997322034&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services start mongodb-community@4.4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB 종료&lt;/p&gt;
&lt;pre id=&quot;code_1682001423446&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services stop mongodb-community@4.4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brew로 서비스 중인 리스트 확인&lt;/p&gt;
&lt;pre id=&quot;code_1682003975681&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byPBIn/btsbHksqxlR/yDitkLaHCaoOGsvL5MYLm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byPBIn/btsbHksqxlR/yDitkLaHCaoOGsvL5MYLm1/img.png&quot; data-alt=&quot;brew services list&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byPBIn/btsbHksqxlR/yDitkLaHCaoOGsvL5MYLm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyPBIn%2FbtsbHksqxlR%2FyDitkLaHCaoOGsvL5MYLm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;209&quot; height=&quot;72&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;brew services list&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB Compass로 컬렉션 추가하는 등 다양한 데이터 관리를 할 수 있지만, 터미널에서도 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 터미널에서 서버를 시작하고, mongo를 활성화해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 시작&lt;/p&gt;
&lt;pre id=&quot;code_1682001744376&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services start mongodb-community@4.4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- connect&lt;/p&gt;
&lt;pre id=&quot;code_1682001764941&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mongo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 입력하면 &amp;gt; 활성화된다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;만약 안된다면, .zshrc 파일을 수정해줘야 한다.&lt;br /&gt;아래 명령어로 작성해야 할 내용을 확인한다.&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;brew info mongodb-community@4.4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I&lt;span style=&quot;background-color: #dddddd;&quot;&gt;f you need to have mongodb-community@4.4 first in your PATH, run:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp; echo 'export PATH=&quot;/usr/local/opt/mongodb-community@4.4/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;To restart mongodb/brew/mongodb-community@4.4 after an upgrade:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp; brew services restart mongodb/brew/mongodb-community@4.4&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Or, if you don't want/need a background service you can just run:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp; /usr/local/opt/mongodb-community@4.4/bin/mongod --config /usr/local/etc/mongod.conf&lt;/span&gt;&lt;br /&gt;라는 메시지를 확인하였다.&lt;br /&gt;&lt;br /&gt;.zshrc 파일을 열어서&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;export PATH=&quot;/usr/local/opt/mongodb-community@4.4/bin:$PATH&lt;/span&gt; 추가하고 저장해주거나&lt;br /&gt;명령어로 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;echo 'export PATH=&quot;/usr/local/opt/mongodb-community@4.4/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc&lt;/span&gt; 입력한다.&lt;br /&gt;그리고 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;brew services restart mongodb/brew/mongodb-community@4.4&lt;/span&gt; 로 서비스를 재시작해준다. &lt;br /&gt;그래도 mongo가 안되면 터미널을 껐다가 다시 킨 후 서버 시작해 준다.&lt;br /&gt;이제 mongo 연결이 가능하다.&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;/p&gt;
&lt;pre id=&quot;code_1682001677489&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use 데이터베이스명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터베이스 확인&lt;/p&gt;
&lt;pre id=&quot;code_1682001842496&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show dbs&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;a href=&quot;https://poiemaweb.com/mongdb-basics-shell-crud&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://poiemaweb.com/mongdb-basics-shell-crud&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682003080903&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;MongoDB Shell - CRUD | PoiemaWeb&quot; data-og-description=&quot;MongoDB Shell method를 사용한 CRUD의 기본&quot; data-og-host=&quot;poiemaweb.com&quot; data-og-source-url=&quot;https://poiemaweb.com/mongdb-basics-shell-crud&quot; data-og-url=&quot;https://poiemaweb.com/mongdb-basics-shell-crud&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGwA2z/hySlMOJETG/QumoHvViTMisVpTC17Dnqk/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/NYquN/hySlB0JnW9/4kjtUwYnNPQ7zeFVC2B8y1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/V5RLm/hySlMnFUpq/0OrtQzeDWJ1MgpNmLmyBJK/img.png?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/mongdb-basics-shell-crud&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://poiemaweb.com/mongdb-basics-shell-crud&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGwA2z/hySlMOJETG/QumoHvViTMisVpTC17Dnqk/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/NYquN/hySlB0JnW9/4kjtUwYnNPQ7zeFVC2B8y1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/V5RLm/hySlMnFUpq/0OrtQzeDWJ1MgpNmLmyBJK/img.png?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500');&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;MongoDB Shell - CRUD | PoiemaWeb&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB Shell method를 사용한 CRUD의 기본&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;poiemaweb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 본격적으로 파이썬을 이용해서 데이터를 다뤄본다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파이썬 pymongo 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pymongo를 설치하고 documentation을 확인하면서 개발한다.&lt;/p&gt;
&lt;pre id=&quot;code_1681994070373&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install pymongo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pymongo.readthedocs.io/en/stable/tutorial.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pymongo.readthedocs.io/en/stable/tutorial.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681994157940&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;Tutorial &amp;mdash; PyMongo 4.3.3 documentation&quot; data-og-description=&quot;Tutorial This tutorial is intended as an introduction to working with MongoDB and PyMongo. Prerequisites Before we start, make sure that you have the PyMongo distribution installed. In the Python shell, the following should run without raising an exception&quot; data-og-host=&quot;pymongo.readthedocs.io&quot; data-og-source-url=&quot;https://pymongo.readthedocs.io/en/stable/tutorial.html&quot; data-og-url=&quot;https://pymongo.readthedocs.io/en/stable/tutorial.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pymongo.readthedocs.io/en/stable/tutorial.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pymongo.readthedocs.io/en/stable/tutorial.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Tutorial &amp;mdash; PyMongo 4.3.3 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tutorial This tutorial is intended as an introduction to working with MongoDB and PyMongo. Prerequisites Before we start, make sure that you have the PyMongo distribution installed. In the Python shell, the following should run without raising an exception&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pymongo.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 조회하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 테스트로, local의 collection인 startup_log에 있는 내용을 조회해 본다.&lt;/p&gt;
&lt;pre id=&quot;code_1681998230785&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pymongo.mongo_client import MongoClient

client = MongoClient('localhost', 27017)
db = client.local

collection = db.startup_log
rows = collection.find()

for row in rows:
  print(row)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이번엔 새로운 컬렉션을 만들어서 데이터를 조회해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컬렉션 만들기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TYmyf/btsbBTCPO4R/bOgMjK4TpGWNqFbfGVQrm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TYmyf/btsbBTCPO4R/bOgMjK4TpGWNqFbfGVQrm1/img.png&quot; data-alt=&quot;Create collection 클릭해서 만들어준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TYmyf/btsbBTCPO4R/bOgMjK4TpGWNqFbfGVQrm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTYmyf%2FbtsbBTCPO4R%2FbOgMjK4TpGWNqFbfGVQrm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;263&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Create collection 클릭해서 만들어준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 넣기&lt;/p&gt;
&lt;pre id=&quot;code_1681998504874&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pymongo.mongo_client import MongoClient

client = MongoClient('localhost', 27017)
db = client.local

collection = db.fastcampus
rows = collection.find()

# 데이터 넣기(JSON과 비슷한 딕셔너리로 넣는다.)
collection.insert_one({
  &quot;title&quot;: &quot;fastcampus&quot;,
  &quot;content&quot;: &quot;hello!&quot;
})

for row in rows:
  print(row)&lt;/code&gt;&lt;/pre&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;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5sMJ8/btsbANwocfR/qBVNBExwf9c1nWppJ1Gso1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5sMJ8/btsbANwocfR/qBVNBExwf9c1nWppJ1Gso1/img.png&quot; data-alt=&quot;데이터가 잘 들어갔는지 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5sMJ8/btsbANwocfR/qBVNBExwf9c1nWppJ1Gso1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5sMJ8%2FbtsbANwocfR%2FqBVNBExwf9c1nWppJ1Gso1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;250&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;590&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;- 조건을 걸어서 데이터 찾기&lt;/p&gt;
&lt;pre id=&quot;code_1681998674288&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pymongo.mongo_client import MongoClient

client = MongoClient('localhost', 27017)
db = client.local

collection = db.fastcampus

# 조건을 걸어서 데이터 찾기
row = collection.find_one({'title': 'fastcampus'})
print(row)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹 스크래핑 결과 저장하고 출력하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 했던 YES24 크롤링 코드(&lt;a href=&quot;https://rosylee.tistory.com/22&quot;&gt;https://rosylee.tistory.com/22&lt;/a&gt;)를 이용해서 MongoDB 에 연동해 본다.&lt;/p&gt;
&lt;pre id=&quot;code_1681999215662&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup 
from pymongo.mongo_client import MongoClient

client = MongoClient('mongodb://localhost:27017/') # DB 접속
db = client.local # DB 선택

res = requests.get('http://www.yes24.com/24/Category/BestSeller')
soup = BeautifulSoup(res.text, &quot;html.parser&quot;)

for i in range(40):
    index = str(i+1)
    if index == &quot;19&quot;:
        index = &quot;19_line&quot;
    elif index == &quot;20&quot;:
        index = &quot;20_line&quot;
    title = soup.select_one(&quot;#bestList &amp;gt; ol &amp;gt; li.num&quot;+ index +&quot; &amp;gt; p:nth-child(3) &amp;gt; a&quot;)

    # 새 컬렉션을 생성할 때는 컬렉션이 이미 있는 것처럼 키로 접근하여 사용하면 자동으로 생성된다.
    db['yes24'].insert_one({
        'Title': title.text
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 실행하고, 데이터가 잘 들어갔는지 MongoDB Compass로 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCMNwg/btsbDuilmzi/gFyVOK2lpCZ1RQ9D5B9ldk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCMNwg/btsbDuilmzi/gFyVOK2lpCZ1RQ9D5B9ldk/img.png&quot; data-alt=&quot;추가된 데이터 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCMNwg/btsbDuilmzi/gFyVOK2lpCZ1RQ9D5B9ldk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCMNwg%2FbtsbDuilmzi%2FgFyVOK2lpCZ1RQ9D5B9ldk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2860&quot; height=&quot;1102&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;1102&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;추가된 데이터 조회해 보기&lt;/p&gt;
&lt;pre id=&quot;code_1681999409158&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup 
from pymongo.mongo_client import MongoClient

client = MongoClient('mongodb://localhost:27017/') # DB 접속
db = client.local # DB 선택
collection = db.yes24 # Collection 선택
rows = collection.find() # 조회
for row in rows:
    print(row)&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;1640&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUyqwy/btsbBP1zInq/Wu43JWW0TlvpKXebPRkiok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUyqwy/btsbBP1zInq/Wu43JWW0TlvpKXebPRkiok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUyqwy/btsbBP1zInq/Wu43JWW0TlvpKXebPRkiok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUyqwy%2FbtsbBP1zInq%2FWu43JWW0TlvpKXebPRkiok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1640&quot; height=&quot;176&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널로 잘 가져오는 걸 확인하였다.&lt;/p&gt;</description>
      <category>패스트캠퍼스/웹개발</category>
      <category>K디지털기초역량훈련</category>
      <category>mongodb</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>웹개발강의</category>
      <category>코딩강의</category>
      <category>패스트캠퍼스</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/23</guid>
      <comments>https://rosylee.tistory.com/23#entry23comment</comments>
      <pubDate>Thu, 20 Apr 2023 23:23:12 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 웹 개발 강의(파이썬으로 하는 크롤링)</title>
      <link>https://rosylee.tistory.com/22</link>
      <description>&lt;p 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;style6&quot; /&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;웹사이트 구성원리&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;주소(www.naver.com)를 입력하면 실제 숫자(IP)로 이루어진 주소로 컨텐츠 요청(네이버 서버)하면 서버에서 내용 확인하고 사용자 브라우저 HTML을 보내고 브라우저가 HTML을 해석해서 화면에 보여주는 형식으로 구성된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;서버와 통신&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt; Ajax 통신이 왜 필요할까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;매번 페이지가 새로고침되면 불편한 상황이 있다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;이런 상황에서 Ajax를 통해 페이지는 변경되지 않고 정보가 변경(서버와 통신)된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;API&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;데이터를 주는 주소로 제공해주는 인터페이스&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트해볼 수 있는 API&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jsonplaceholder.typicode.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683347024978&quot; style=&quot;color: #333333; text-align: left;&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;JSONPlaceholder - Free Fake REST API&quot; data-og-description=&quot;{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. Serving ~2 billion requests each month.&quot; data-og-host=&quot;jsonplaceholder.typicode.com&quot; data-og-source-url=&quot;https://jsonplaceholder.typicode.com/&quot; data-og-url=&quot;https://jsonplaceholder.typicode.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://jsonplaceholder.typicode.com/&quot; data-source-url=&quot;https://jsonplaceholder.typicode.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;JSONPlaceholder - Free Fake REST API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. Serving ~2 billion requests each month.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;jsonplaceholder.typicode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jsonplaceholder.typicode.com/posts&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(게시판 글 테스트용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;Python 설치&lt;/h2&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;/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;파이썬 설치 방법은 두 가지가 있다.&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;a href=&quot;https://www.python.org/&quot;&gt;https://www.python.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681917757660&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;Welcome to Python.org&quot; data-og-description=&quot;The official home of the Python Programming Language&quot; data-og-host=&quot;www.python.org&quot; data-og-source-url=&quot;https://www.python.org/&quot; data-og-url=&quot;https://www.python.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tSvre/hySkYJdBtn/XscCrpcwKktNmlI2HDehx0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.python.org/&quot; data-source-url=&quot;https://www.python.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tSvre/hySkYJdBtn/XscCrpcwKktNmlI2HDehx0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Welcome to Python.org&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;The official home of the Python Programming Language&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;www.python.org&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;2400&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmy9Up/btsblq9hdrD/HjafFU48cnXeG3MDKVNvR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmy9Up/btsblq9hdrD/HjafFU48cnXeG3MDKVNvR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmy9Up/btsblq9hdrD/HjafFU48cnXeG3MDKVNvR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmy9Up%2Fbtsblq9hdrD%2FHjafFU48cnXeG3MDKVNvR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2400&quot; height=&quot;1030&quot; data-origin-width=&quot;2400&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 이미지 표시된 버튼을 클릭한다.&lt;/li&gt;
&lt;li&gt;windows라면 설치 파일 실행할 때 확인되는&amp;nbsp; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Add Python 3.10 to PATH &lt;/span&gt;&amp;nbsp;를 체크하고 설치한다. 체크하지 않으면 vscode에서 python의 경로를 알 수 없어서 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;python&lt;/span&gt; 명령어를 사용할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째는 아나콘다 를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아나콘다로 설치하면 개발 환경도 같이 설치되고, 아나콘다 내에서 가상 환경을 사용할 수 있어서, 이 방식으로 설치했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.anaconda.com/download&quot;&gt;https://www.anaconda.com/download&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681917757661&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;Free Download | Anaconda&quot; data-og-description=&quot;Anaconda is the birthplace of Python data science. We are a movement of data scientists, data-driven enterprises, and open source communities.&quot; data-og-host=&quot;www.anaconda.com&quot; data-og-source-url=&quot;https://www.anaconda.com/download&quot; data-og-url=&quot;https://www.anaconda.com/download/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6UV3B/hySlCkeARi/hMtlFn5GY9t1jPcdbzgW81/img.jpg?width=1440&amp;amp;height=1100&amp;amp;face=0_0_1440_1100,https://scrap.kakaocdn.net/dn/DaXv3/hySlHlxYur/2PzEgTBb00NXRLVTFebjI0/img.png?width=1024&amp;amp;height=954&amp;amp;face=0_0_1024_954&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.anaconda.com/download&quot; data-source-url=&quot;https://www.anaconda.com/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6UV3B/hySlCkeARi/hMtlFn5GY9t1jPcdbzgW81/img.jpg?width=1440&amp;amp;height=1100&amp;amp;face=0_0_1440_1100,https://scrap.kakaocdn.net/dn/DaXv3/hySlHlxYur/2PzEgTBb00NXRLVTFebjI0/img.png?width=1024&amp;amp;height=954&amp;amp;face=0_0_1024_954');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Free Download | Anaconda&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Anaconda is the birthplace of Python data science. We are a movement of data scientists, data-driven enterprises, and open source communities.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;www.anaconda.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode에서 파이썬을 사용할 수 있도록 확장 프로그램 설치를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot;&gt;https://marketplace.visualstudio.com/items?itemName=ms-python.python&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1681917757662&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;Python - Visual Studio Marketplace&quot; data-og-description=&quot;Extension for Visual Studio Code - IntelliSense (Pylance), Linting, Debugging (multi-threaded, remote), Jupyter Notebooks, code formatting, refactoring, unit tests, and more.&quot; data-og-host=&quot;marketplace.visualstudio.com&quot; data-og-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot; data-og-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/doYKc4/hySlLVMEgs/EcQLjxkEVHeuwUTvERpXa0/img.png?width=600&amp;amp;height=607&amp;amp;face=0_0_600_607,https://scrap.kakaocdn.net/dn/qvx1V/hySlILwJwG/g8KdjkBXj5L4agVJI58R5K/img.png?width=600&amp;amp;height=607&amp;amp;face=0_0_600_607&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot; data-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/doYKc4/hySlLVMEgs/EcQLjxkEVHeuwUTvERpXa0/img.png?width=600&amp;amp;height=607&amp;amp;face=0_0_600_607,https://scrap.kakaocdn.net/dn/qvx1V/hySlILwJwG/g8KdjkBXj5L4agVJI58R5K/img.png?width=600&amp;amp;height=607&amp;amp;face=0_0_600_607');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Python - Visual Studio Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Extension for Visual Studio Code - IntelliSense (Pylance), Linting, Debugging (multi-threaded, remote), Jupyter Notebooks, code formatting, refactoring, unit tests, and more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;marketplace.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬이 잘 설치되었는지 터미널에서 확인해본다.&lt;/p&gt;
&lt;pre id=&quot;code_1681923235304&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 입력하고, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; 이렇게 표시되면 파이썬 실행 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중에서 나가려면 아래 명령어 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1681923274135&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;quit()&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹 스크래핑(Crawling)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링을 하기 위해 웹에 요청하는 방법과 분석하는 방법을 배운다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주의 사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;너무 많은 요청을 하지 않고 한 번만 데이터를 가지고 오는 방식으로 한다.&lt;/li&gt;
&lt;li&gt;이유는 yes24의 서버에 부담이 가고, 공격으로 여겨서 크롤링이 막힐 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링 할 웹사이트 분석하기&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹사이트에서 크롤링할 내용의 구조를 분석한다.&lt;/li&gt;
&lt;li&gt;구조는 크롬에서 해당하는 내용에 마우스 오른쪽 클릭하고  Copy &amp;gt; Copy selector 를 통해 확인한다.&lt;/li&gt;
&lt;li&gt;해당 강의 에서는 YES24의 베스트 책의 제목을 기준으로 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uMnwW/btsblpCKY9N/FsS8FqL9K1bNnESqB7Ax10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uMnwW/btsblpCKY9N/FsS8FqL9K1bNnESqB7Ax10/img.png&quot; data-alt=&quot;구조 분석을 위한 작업&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uMnwW/btsblpCKY9N/FsS8FqL9K1bNnESqB7Ax10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuMnwW%2FbtsblpCKY9N%2FFsS8FqL9K1bNnESqB7Ax10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;470&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;470&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;분석 결과 베스트 책 제목들이 아래와 같은 코드들이 반복되는 걸 확인했다.&lt;/p&gt;
&lt;pre id=&quot;code_1681955177712&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#bestList &amp;gt; ol &amp;gt; li.num1 &amp;gt; p:nth-child(3) &amp;gt; a
#bestList &amp;gt; ol &amp;gt; li.num2 &amp;gt; p:nth-child(3) &amp;gt; a
#bestList &amp;gt; ol &amp;gt; li.num3 &amp;gt; p:nth-child(3) &amp;gt; a&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;blockquote data-ke-style=&quot;style2&quot;&gt;참고사항:&amp;nbsp; 파이썬의 여러 패키지들이 있는 곳이다. (pip로 설치하는 것들)&lt;br /&gt;https://pypi.org/&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링을 하기 위해 두 가지의 패키지를 설치한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;requests 패키지(&lt;span style=&quot;background-color: #fdfdfd; color: #464646; text-align: start;&quot;&gt;HTTP 라이브러리, 웹 요청을 만드는 라이브러리)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;beautifulsoup4(&lt;span style=&quot;background-color: #fdfdfd; color: #464646; text-align: start;&quot;&gt;웹 페이지에서 정보를 쉽게 긁어낼 수 있게 해주는 라이브러리)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pypi.org/project/requests/&quot;&gt;https://pypi.org/project/requests/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681956003495&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;requests&quot; data-og-description=&quot;Python HTTP for Humans.&quot; data-og-host=&quot;pypi.org&quot; data-og-source-url=&quot;https://pypi.org/project/requests/&quot; data-og-url=&quot;https://pypi.org/project/requests/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4xK1l/hySkQqStDo/x2fhWh99vx1GsudaSDbxt0/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://pypi.org/project/requests/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pypi.org/project/requests/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4xK1l/hySkQqStDo/x2fhWh99vx1GsudaSDbxt0/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;requests&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python HTTP for Humans.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pypi.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pypi.org/project/beautifulsoup4/&quot;&gt;https://pypi.org/project/beautifulsoup4/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681956000599&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;beautifulsoup4&quot; data-og-description=&quot;Screen-scraping library&quot; data-og-host=&quot;pypi.org&quot; data-og-source-url=&quot;https://pypi.org/project/beautifulsoup4/&quot; data-og-url=&quot;https://pypi.org/project/beautifulsoup4/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nVda4/hySkM3eQWc/JHaJGYH0KCsRw7x6QmwybK/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://pypi.org/project/beautifulsoup4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pypi.org/project/beautifulsoup4/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nVda4/hySkM3eQWc/JHaJGYH0KCsRw7x6QmwybK/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;beautifulsoup4&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Screen-scraping library&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pypi.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #464646; text-align: start;&quot;&gt;Windows 설치 방법&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681955512574&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install beautifulsoup4&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1681955558751&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install requests&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mac 설치 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에는 기본적으로 파이썬이 설치되어 있기 때문에, 내가 설치한 python과 구분하기 위해 3을 작성해서 설치해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1681956041494&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php3 install beautifulsoup4&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1681955958864&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install requests&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;크롤링하려 print 해보기&lt;/h4&gt;
&lt;pre id=&quot;code_1681957168224&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup # bs4는 BeautifulSoup의 4버전 안에서 쓰겠다는 의미

res = requests.get('http://www.yes24.com/24/Category/BestSeller')
# print(res.text) 'http://www.yes24.com/24/Category/BestSeller'의 전체 내용을 긁어옴

# BeautifulSoup은 태그 특징을 이용해 찾을 수 있도록 도와주는 라이브러리
soup = BeautifulSoup(res.text, &quot;html.parser&quot;)

for i in range(40):
    index = str(i+1) # 파이썬은 같은 타입끼리 더하지 않으면 에러가 나기 때문에 문자열로 바꾸어줌 -&amp;gt; str()
    # 예외처리
    if index == &quot;19&quot;:
        index = &quot;19_line&quot;
    elif index == &quot;20&quot;:
        index = &quot;20_line&quot;
    
    title = soup.select_one(&quot;#bestList &amp;gt; ol &amp;gt; li.num&quot;+ index +&quot; &amp;gt; p:nth-child(3) &amp;gt; a&quot;)
    print(title.text)
# select_one: 조건에 맞는 태그 하나만 가지고 오겠다는 의미
# select: 조건에 맞는 모든 태그를 가져옴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select_one할 때 클래스명이 아래와 같이 다른 부분이 있어서 예외 처리하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wh3ev/btsbl969Mk0/mqeXKW17QgTkj3Id0mdyi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wh3ev/btsbl969Mk0/mqeXKW17QgTkj3Id0mdyi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wh3ev/btsbl969Mk0/mqeXKW17QgTkj3Id0mdyi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwh3ev%2Fbtsbl969Mk0%2FmqeXKW17QgTkj3Id0mdyi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;329&quot; height=&quot;143&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vs code에서 작성된 코드를 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRnBmH/btsboXx13EX/3VnA6uMQBG6nuaQww4AZUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRnBmH/btsboXx13EX/3VnA6uMQBG6nuaQww4AZUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRnBmH/btsboXx13EX/3VnA6uMQBG6nuaQww4AZUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRnBmH%2FbtsboXx13EX%2F3VnA6uMQBG6nuaQww4AZUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;531&quot; height=&quot;153&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;196&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;860&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3VT2/btsbmbX7Rxj/Olz4LBOFoQRc2iqVkq9HP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3VT2/btsbmbX7Rxj/Olz4LBOFoQRc2iqVkq9HP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3VT2/btsbmbX7Rxj/Olz4LBOFoQRc2iqVkq9HP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3VT2%2FbtsbmbX7Rxj%2FOlz4LBOFoQRc2iqVkq9HP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;306&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>패스트캠퍼스/웹개발</category>
      <category>Crawling</category>
      <category>K디지털기초역량훈련</category>
      <category>python</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>웹개발강의</category>
      <category>웹스크래핑</category>
      <category>코딩강의</category>
      <category>파이썬</category>
      <category>패스트캠퍼스</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/22</guid>
      <comments>https://rosylee.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 20 Apr 2023 11:31:31 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스] 프론트엔드 강의 학습일지(React 시작하기)</title>
      <link>https://rosylee.tistory.com/20</link>
      <description>&lt;p 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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리액트는 무엇일까?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리액트는 인터렉션이 많은 웹 앱을 개발하기 위해 사용한다.&lt;/li&gt;
&lt;li&gt;vue.js와 Angular는 프레임워크이고, 리액트는 라이브러리이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프레임워크: 앱을 만들기 위해 필요한 대부분의 것을 가지고 있는 것(프레임워크 안에 여러 모듈이 있다)&lt;/li&gt;
&lt;li&gt;라이브러리: 특정 기능을 모듈화 해놓은 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리액트는 View를 담당하는데, 그외에 Model과 Controler를 조작하기 위해서는 여러 모듈을 사용하게 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅(페이지이동): react-router-dom&lt;/li&gt;
&lt;li&gt;상태관리: redux, mobx, recoil&lt;/li&gt;
&lt;li&gt;테스트: Jest, Mocha&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Node.js가 필요한 이유?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 개발할때 필요한 모듈인 바벨이나 웹팩 등이 Node.js로 사용하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 설치는 아래 블로그에서 작성하였으니, 참고해 주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rosylee.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rosylee.tistory.com/18&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681886246273&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;[패스트캠퍼스] 프론트엔드 강의 학습일지(Node.js와 Git)&quot; data-og-description=&quot;국비지원교육으로 패스트캠퍼스에서 진행하는 프론트엔드 강의를 듣고 정리한 내용입니다. Node.js Node.js는 Chrome V8 JavaScript 엔진(자바스크립트 문법을 해석하는 엔진)으로 빌드된 JavaScript 런타임&quot; data-og-host=&quot;rosylee.tistory.com&quot; data-og-source-url=&quot;https://rosylee.tistory.com/18&quot; data-og-url=&quot;https://rosylee.tistory.com/18&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPKcMq/hySkPLWh4M/mlv7cnGCdnEGjXkeLX2fck/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/Wrfw9/hySkMBF1aj/4NJJmMitOSwAKIBiXyHN9K/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/bt1p4m/hySkTOkauw/e3hhiVqivkx1wXuCk5Qu1K/img.png?width=944&amp;amp;height=394&amp;amp;face=0_0_944_394&quot;&gt;&lt;a href=&quot;https://rosylee.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rosylee.tistory.com/18&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPKcMq/hySkPLWh4M/mlv7cnGCdnEGjXkeLX2fck/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/Wrfw9/hySkMBF1aj/4NJJmMitOSwAKIBiXyHN9K/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/bt1p4m/hySkTOkauw/e3hhiVqivkx1wXuCk5Qu1K/img.png?width=944&amp;amp;height=394&amp;amp;face=0_0_944_394');&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와 Git)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;국비지원교육으로 패스트캠퍼스에서 진행하는 프론트엔드 강의를 듣고 정리한 내용입니다. Node.js Node.js는 Chrome V8 JavaScript 엔진(자바스크립트 문법을 해석하는 엔진)으로 빌드된 JavaScript 런타임&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rosylee.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;b&gt;웹 페이지 빌드 과정(Critical Rendering Path CRP)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 HTML 문서를 브라우저에 전달하고, 브라우저가 문서에 따라 화면에 그리기 위해 HTML-&amp;gt;DOM생성, CSS 랜더링 등을 해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM에 변화(인터렉션)가 발생하면, Render Tree를 재생성된다. 이러면 성능과 비용이 커지는 문제가 발생한다.&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;이를 해결하기 위해 나온 것이 가상돔(Virtual Dom)이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 DOM은 실제DOM을 메모리에 복사해 둔 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 DOM과 비교해서 바뀌는 것만 가상 DOM에 렌더링(Diffing)이 되고, 바뀐 부분만 실제 DOM에 적용(재조정)한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면, 많은 요소가 바뀌더라도 한꺼번에 묶어서 한 번에 실제 DOM으로 적용되므로 DOM 조작 비용이 줄어들 수 있다.&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;&lt;a href=&quot;https://ko.reactjs.org/docs/create-a-new-react-app.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.reactjs.org/docs/create-a-new-react-app.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681887793192&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 앱 만들기 &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;ko.reactjs.org&quot; data-og-source-url=&quot;https://ko.reactjs.org/docs/create-a-new-react-app.html&quot; data-og-url=&quot;https://ko.reactjs.org/docs/create-a-new-react-app.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2oa9l/hySk0UjuFT/PbpqUGbK8ikP06YIGj98gk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/create-a-new-react-app.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.reactjs.org/docs/create-a-new-react-app.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2oa9l/hySk0UjuFT/PbpqUGbK8ikP06YIGj98gk/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;새로운 React 앱 만들기 &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;ko.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_1681886918480&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app {폴더 이름}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 폴더를 생성하고, 현재 폴더에 설치하려면 아래와 같은 명령어로 입력하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1681887416093&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; npx create-react-app ./&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npx란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드 패키지 실행을 도와주는 도구이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm 레지스트리에는 많은 라이브러리들이 있다.&lt;/li&gt;
&lt;li&gt;그중 create-react-app이라는 라이브러리를 사용해서 설치하는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 명령어로 설치하면, 아래 이미지처럼 되고 웹팩과 바벨등 여러 node module이 함께 설치된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y056V/btsblyZpbcJ/ToUhlJPeHdjppf48WB56r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y056V/btsblyZpbcJ/ToUhlJPeHdjppf48WB56r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y056V/btsblyZpbcJ/ToUhlJPeHdjppf48WB56r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy056V%2FbtsblyZpbcJ%2FToUhlJPeHdjppf48WB56r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;180&quot; height=&quot;178&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩(Webpack)이란?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오픈 소스 자바스크립트 모듈 번들러이다.&lt;/li&gt;
&lt;li&gt;여러 개의 파일을 하나의 자바스크립트 코드로 압축하고 최적화하는 라이브러리이다.&lt;/li&gt;
&lt;li&gt;로딩에 대한 네트워크 비용을 줄일 수 있다.&lt;/li&gt;
&lt;li&gt;모듈 단위로 개발이 가능하여 가독성과 유지보수가 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바벨(Babel)이란?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 자바스크립트를 지원하지 않는 브라우저에도 적용이 되도록 변환시켜 주는 라이브러리이다.&lt;/li&gt;
&lt;li&gt;최신 문법으로 개발을 할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ES6의 화살표 문법을 사용하더라도, 바벨을 사용하면 ES5문법으로 변환시켜 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SPA(Single Page Application)이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 사이트의 전체 페이지를 하나의 페이지에 담아서 동적으로 화면을 바꿔가며 표현하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML5의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/History_API&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;History API&lt;/a&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;Tic Tac Toe 앱 만들기&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;a href=&quot;https://ko.reactjs.org/tutorial/tutorial.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.reactjs.org/tutorial/tutorial.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681888838066&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 시작하기 &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;ko.reactjs.org&quot; data-og-source-url=&quot;https://ko.reactjs.org/tutorial/tutorial.html&quot; data-og-url=&quot;https://ko.reactjs.org/tutorial/tutorial.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cFRKUQ/hySkTgxBCH/WDlfV8eR6MqiSUNrxLVlfK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/pjlIw/hySkMob6QK/Xn8sxP5ALCMUjASYtWdbe1/img.png?width=476&amp;amp;height=304&amp;amp;face=0_0_476_304,https://scrap.kakaocdn.net/dn/biQltY/hySkM2Nipb/p5iEHoIYjKoAicGxH9K0L1/img.png?width=270&amp;amp;height=296&amp;amp;face=0_0_270_296&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/tutorial/tutorial.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.reactjs.org/tutorial/tutorial.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cFRKUQ/hySkTgxBCH/WDlfV8eR6MqiSUNrxLVlfK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/pjlIw/hySkMob6QK/Xn8sxP5ALCMUjASYtWdbe1/img.png?width=476&amp;amp;height=304&amp;amp;face=0_0_476_304,https://scrap.kakaocdn.net/dn/biQltY/hySkM2Nipb/p5iEHoIYjKoAicGxH9K0L1/img.png?width=270&amp;amp;height=296&amp;amp;face=0_0_270_296');&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 시작하기 &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;ko.reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX(Javascript&amp;nbsp;syntax&amp;nbsp;extension)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.reactjs.org/docs/introducing-jsx.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681896133728&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;JSX 소개 &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;ko.reactjs.org&quot; data-og-source-url=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; data-og-url=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1tEY0/hySlLBhKqc/DTRq8k2tdADsYzUSKYmfh1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.reactjs.org/docs/introducing-jsx.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1tEY0/hySlLBhKqc/DTRq8k2tdADsYzUSKYmfh1/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;JSX 소개 &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;ko.reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리액트에서는 HTML구조와 자바스크립트를 함께(JSX) 사용해서 UI를 나타낸다.&lt;/li&gt;
&lt;li&gt;JSX로 작성된 코드를 바벨을 통해 변환시켜준다.&lt;/li&gt;
&lt;li&gt;주의사항: JSX에 여러 엘리먼트 요소가 있다면, 반드시 부모 요소 하나로 감싸줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nxqOj/btsblp2PZXE/glKuB90qvJ5T2LeOw7OST1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nxqOj/btsblp2PZXE/glKuB90qvJ5T2LeOw7OST1/img.png&quot; data-alt=&quot;리액트 코드 / 바벨이 변환해 준 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nxqOj/btsblp2PZXE/glKuB90qvJ5T2LeOw7OST1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnxqOj%2Fbtsblp2PZXE%2FglKuB90qvJ5T2LeOw7OST1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;185&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리액트 코드 / 바벨이 변환해 준 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리액트로 개발 시 유용한 vscode 확장 프로그램&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=rodrigovallades.es7-react-js-snippets&quot;&gt;https://marketplace.visualstudio.com/items?itemName=rodrigovallades.es7-react-js-snippets&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1681890707439&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;ES7 React/Redux/GraphQL/React-Native snippets - Visual Studio Marketplace&quot; data-og-description=&quot;Extension for Visual Studio Code - Simple extensions for React, Redux and Graphql in JS/TS with ES7 syntax (forked from dsznajder)&quot; data-og-host=&quot;marketplace.visualstudio.com&quot; data-og-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=rodrigovallades.es7-react-js-snippets&quot; data-og-url=&quot;https://marketplace.visualstudio.com/items?itemName=rodrigovallades.es7-react-js-snippets&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Zpidk/hySkWj4WK0/Nk6qF1WktnmFtpwnop6Kk0/img.png?width=1280&amp;amp;height=905&amp;amp;face=0_0_1280_905,https://scrap.kakaocdn.net/dn/bXdCIj/hySkOsNFfo/eawEPiwzuJDZOHAkNQgNn0/img.png?width=1280&amp;amp;height=905&amp;amp;face=0_0_1280_905&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=rodrigovallades.es7-react-js-snippets&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=rodrigovallades.es7-react-js-snippets&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Zpidk/hySkWj4WK0/Nk6qF1WktnmFtpwnop6Kk0/img.png?width=1280&amp;amp;height=905&amp;amp;face=0_0_1280_905,https://scrap.kakaocdn.net/dn/bXdCIj/hySkOsNFfo/eawEPiwzuJDZOHAkNQgNn0/img.png?width=1280&amp;amp;height=905&amp;amp;face=0_0_1280_905');&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;ES7 React/Redux/GraphQL/React-Native snippets - Visual Studio Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Extension for Visual Studio Code - Simple extensions for React, Redux and Graphql in JS/TS with ES7 syntax (forked from dsznajder)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;marketplace.visualstudio.com&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;p data-ke-size=&quot;size16&quot;&gt;코드는 파일 이름 기반으로 생성된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rcc(react class component) 클래스형 컴포넌트&lt;/li&gt;
&lt;li&gt;rfc(react funtional comonent) 함수형 컴포넌트&lt;/li&gt;
&lt;/ul&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/ca8VmU/btsbgk80ehs/5wOQvBJXTgbHVp7vCU7ujK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca8VmU/btsbgk80ehs/5wOQvBJXTgbHVp7vCU7ujK/img.png&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;198&quot; data-is-animation=&quot;false&quot; width=&quot;212&quot; height=&quot;152&quot; style=&quot;width: 357px; margin-right: 10px;&quot; data-widthpercent=&quot;56.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca8VmU/btsbgk80ehs/5wOQvBJXTgbHVp7vCU7ujK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca8VmU%2Fbtsbgk80ehs%2F5wOQvBJXTgbHVp7vCU7ujK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xz9Mw/btsbn5I2Q3m/ylR6D4FvXN8kHXjkYfxni1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xz9Mw/btsbn5I2Q3m/ylR6D4FvXN8kHXjkYfxni1/img.png&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;498&quot; data-is-animation=&quot;false&quot; width=&quot;447&quot; style=&quot;width: 42.5497%;&quot; data-widthpercent=&quot;43.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xz9Mw/btsbn5I2Q3m/ylR6D4FvXN8kHXjkYfxni1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxz9Mw%2Fbtsbn5I2Q3m%2FylR6D4FvXN8kHXjkYfxni1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;498&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Props(Properties)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상속하는 부모 컴포넌트로부터 자식 컴포넌트에 데이터 등을 전달하는 방법이다.&lt;/li&gt;
&lt;li&gt;읽기 전용(immutable)으로 자식 컴포넌트에서는 변경할 수 없다.&lt;/li&gt;
&lt;li&gt;변경하려면 부모 컴포넌트에서 state를 변경시켜줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;State&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트 안에서 무언가 기억하기 위해 사용한다.&lt;/li&gt;
&lt;li&gt;컴포넌트의 렌더링 결과물에 영향을 주는 데이터를 갖고 있는 객체이다.&lt;/li&gt;
&lt;li&gt;state 값이 변경되면 컴포넌트는 리랜더링 된다.&lt;/li&gt;
&lt;li&gt;클래스형 컴포넌트에는 Constructor를 사용한다.&lt;/li&gt;
&lt;li&gt;Constructor(생성자)를 사용하면, 인스턴스화된 객체에서 다른 메서드를 호출하기 전에 수행해서 초기화할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1681893632147&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import './Square.css';

export default class Square extends React.Component {
  // State 생성
  constructor(props) {
    super(props);
    this.state = {
      value: null,
    };
  }
  render() {
    return (
      &amp;lt;button
        className=&quot;square&quot;
        onClick={() =&amp;gt; {
          this.setState({ value: 'X' }); // State 변경
        }}
      &amp;gt;
        {/* State 이용 */}
        {this.state.value}
      &amp;lt;/button&amp;gt;
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;state의 super 키워드는?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; 자식 클래스 내에서 부모 클래스의 생성자를 호출할 때 사용된다.&lt;/li&gt;
&lt;li&gt;자식 클래스 내에서 부모 클래스의 메소드를 호출할 때 사용된다.&lt;/li&gt;
&lt;li&gt;super 키워드 이후에 this 키워드가 나와야 한다.(부모 클래스의 생성자 호출을 먼저 해야 된다)&lt;/li&gt;
&lt;li&gt;super키워드에 props를 인자로 전달하는 이유는&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React.Componet 객체가 생성될 때 props 속성을 초기화하기 위해 부모 컴포넌트에게 props를 전달&lt;/li&gt;
&lt;li&gt;생성자 내부에서도 this.props를 정상적으로 사용할 수 있도록 보장하기 위해서&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;1308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c92Pcr/btsa9Iie9XV/zOg7PieS2taWDTBMftT6sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c92Pcr/btsa9Iie9XV/zOg7PieS2taWDTBMftT6sK/img.png&quot; data-alt=&quot;강의 중 설명 스크린샷&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c92Pcr/btsa9Iie9XV/zOg7PieS2taWDTBMftT6sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc92Pcr%2Fbtsa9Iie9XV%2FzOg7PieS2taWDTBMftT6sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;494&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;1308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;강의 중 설명 스크린샷&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;State 보관하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 컴포넌트에서 부모 컴포넌트로 옮기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 개의 자식으로부터 데이터를 모으거나, 자식 컴포넌트끼리 서로 통신하려면 부모 컴포넌트에서 공유 state를 정의해야 한다.&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;참조 타입(Array, Object)은 아예 새로운 배열을 반환하는 메소드를 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 배열 반환하는 메소드: spread orerator, map, filter, slice, reduce&lt;/li&gt;
&lt;li&gt;원본데이터 변경하는 메소드: push, splice&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>패스트캠퍼스/React&amp;amp;Redux</category>
      <category>K디지털기초역량훈련</category>
      <category>React</category>
      <category>React&amp;amp;Redux로 시작하는 웹 프로그래밍</category>
      <category>국비지원교육</category>
      <category>내일배움카드</category>
      <category>패스트캠퍼스</category>
      <category>프론트엔드</category>
      <author>Rosie, Lee</author>
      <guid isPermaLink="true">https://rosylee.tistory.com/20</guid>
      <comments>https://rosylee.tistory.com/20#entry20comment</comments>
      <pubDate>Wed, 19 Apr 2023 18:20:18 +0900</pubDate>
    </item>
  </channel>
</rss>