<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>bb1714 님의 블로그</title>
    <link>https://bb1714.tistory.com/</link>
    <description>bb1714 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 27 Jun 2026 15:32:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bb1714</managingEditor>
    <item>
      <title>React_2</title>
      <link>https://bb1714.tistory.com/19</link>
      <description>&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;오늘 첫 번째 실습 문제는 저번 TodoList에 기능을 추가하는 것부터 시작해보겠습니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실습 문제 4. Todo 항목 삭제 기능 추가하기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;697&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bthfQa/btsNra831Yi/dLK8G7hWZxB0NZoJIcsC3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bthfQa/btsNra831Yi/dLK8G7hWZxB0NZoJIcsC3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bthfQa/btsNra831Yi/dLK8G7hWZxB0NZoJIcsC3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbthfQa%2FbtsNra831Yi%2FdLK8G7hWZxB0NZoJIcsC3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;82&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt; 태그 안에 삭제 버튼 추가하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KQhVp/btsNttAk6WD/PXh9aSUW2DLORYXqvsFwV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KQhVp/btsNttAk6WD/PXh9aSUW2DLORYXqvsFwV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KQhVp/btsNttAk6WD/PXh9aSUW2DLORYXqvsFwV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKQhVp%2FbtsNttAk6WD%2FPXh9aSUW2DLORYXqvsFwV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;260&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;darr;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh9J9z/btsNtcZ8pww/782YEFHMeXMVqk7VM9Lu0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh9J9z/btsNtcZ8pww/782YEFHMeXMVqk7VM9Lu0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh9J9z/btsNtcZ8pww/782YEFHMeXMVqk7VM9Lu0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh9J9z%2FbtsNtcZ8pww%2F782YEFHMeXMVqk7VM9Lu0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;197&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;** 코드 설명 **&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- filter()함수로 삭제할 항목을 제외한 나머지만 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- idx !== index : 현재 반복 중인 항목의 번호와 삭제하려는 번호가 다르면 유지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- setTodos(newTodos)로 목록을 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- hsndleDelete(idx) : 해당 항목의 idx값을 넘겨서 삭제 함수 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBDpP0/btsNsUlf3BC/XuUyr44NTeF5xYAKfRuIqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBDpP0/btsNsUlf3BC/XuUyr44NTeF5xYAKfRuIqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBDpP0/btsNsUlf3BC/XuUyr44NTeF5xYAKfRuIqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBDpP0%2FbtsNsUlf3BC%2FXuUyr44NTeF5xYAKfRuIqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;420&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;1020&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실습 문제 5. 할 일 완료 체크 기능 추가&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;622&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ChP7H/btsNt2Jicit/tqD0rtIv90WlgW2r2Ykqg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ChP7H/btsNt2Jicit/tqD0rtIv90WlgW2r2Ykqg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ChP7H/btsNt2Jicit/tqD0rtIv90WlgW2r2Ykqg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FChP7H%2FbtsNt2Jicit%2FtqD0rtIv90WlgW2r2Ykqg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;164&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;257&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; - 토글을 체크하면 줄이 그어지게 만들기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &amp;lt;ul&amp;gt; 기본 스타일 글머리기호 삭제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx431b/btsNt8WD6gR/2LRPC1bE90xooliB98GfM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx431b/btsNt8WD6gR/2LRPC1bE90xooliB98GfM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx431b/btsNt8WD6gR/2LRPC1bE90xooliB98GfM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx431b%2FbtsNt8WD6gR%2F2LRPC1bE90xooliB98GfM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;358&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결과 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KExJu/btsNtNsTrcU/Tvv23bvrgEssTbwfwsbPx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KExJu/btsNtNsTrcU/Tvv23bvrgEssTbwfwsbPx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KExJu/btsNtNsTrcU/Tvv23bvrgEssTbwfwsbPx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKExJu%2FbtsNtNsTrcU%2FTvv23bvrgEssTbwfwsbPx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;420&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;1020&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실습 문제 5. Enter키로 할 일 추가하기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;★실무에서도 필수적으로 사용되기 때문에 알아두기!! ★&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- &amp;lt;input&amp;gt;태그 안에 추가하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EeweL/btsNuvrcn73/HhTeNtuqjvI4kbnhASNpc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EeweL/btsNuvrcn73/HhTeNtuqjvI4kbnhASNpc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EeweL/btsNuvrcn73/HhTeNtuqjvI4kbnhASNpc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEeweL%2FbtsNuvrcn73%2FHhTeNtuqjvI4kbnhASNpc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;193&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 저번 실습과 이번 실습을 통해 사용한 함수를 최종 정리해보겠습니다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;React에서 제공하는 함수&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 78.6047%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.814%;&quot;&gt;&lt;b&gt;함수명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.7907%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.814%;&quot;&gt;useState()&lt;/td&gt;
&lt;td style=&quot;width: 62.7907%;&quot;&gt;상태를 생성하는 React의 기본 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.814%;&quot;&gt;setInput()&lt;/td&gt;
&lt;td style=&quot;width: 62.7907%;&quot;&gt;useState가 자동으로 만들어주는 상태&amp;nbsp; 변경 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.814%;&quot;&gt;setTodos()&lt;/td&gt;
&lt;td style=&quot;width: 62.7907%;&quot;&gt;useState가 자동으로 만들어주는 상태&amp;nbsp; 변경 함수 &amp;nbsp;-&amp;gt; todos 상태를 바꾸는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JavaScript 내장 함수&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 78.9535%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;&lt;b&gt;함수명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;map()&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%;&quot;&gt;배열을 반복해서 원하는 형식으로 바꿔주는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;filter()&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%;&quot;&gt;조건을 만족하는 항목만 골라 새로운 배열을 만드는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;trim()&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%;&quot;&gt;문자열 앞뒤 공백 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일반 함수&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 135px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 14.1474%; height: 21px;&quot;&gt;&lt;b&gt;함수명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.1704%; height: 21px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; height: 21px;&quot;&gt;&lt;b&gt;문법&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 14.1474%; height: 21px;&quot;&gt;handleAdd&lt;/td&gt;
&lt;td style=&quot;width: 42.1704%; height: 21px;&quot;&gt;할 일 추가 : 입렵값을 배열에 추가하고 입력창 초기화&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; height: 21px;&quot;&gt;const handleAdd = () =&amp;gt; {...}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 14.1474%; height: 21px;&quot;&gt;handleDelete&lt;/td&gt;
&lt;td style=&quot;width: 42.1704%; height: 21px;&quot;&gt;특정 인덱스의 할 일 삭제&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; height: 21px;&quot;&gt;const handleDelete = (index) =&amp;gt; {...}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 14.1474%; height: 21px;&quot;&gt;toggleDone&lt;/td&gt;
&lt;td style=&quot;width: 42.1704%; height: 21px;&quot;&gt;체크박스 클릭 시 done 상태를&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; height: 21px;&quot;&gt;const toggleDone = (index) =&amp;gt; {...}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.1474%; height: 17px;&quot;&gt;(e) =&amp;gt; {...}&lt;/td&gt;
&lt;td style=&quot;width: 42.1704%; height: 17px;&quot;&gt;이벤트 핸들러&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; height: 17px;&quot;&gt;on이벤트이름={(e) =&amp;gt; 실행할 코드}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>react</category>
      <category>react기초실습</category>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/19</guid>
      <comments>https://bb1714.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 22 Apr 2025 17:18:06 +0900</pubDate>
    </item>
    <item>
      <title>React_1</title>
      <link>https://bb1714.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;한동안 이것 저것 하면서 정보처리기사 준비하느라 글을 못 올렸어요ㅠㅠ &lt;br /&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;React 소개 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. React란?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 사용자 인터페이스를 만들기 위한 &lt;span style=&quot;color: #f89009;&quot;&gt;JavaScript의&amp;nbsp; 라이브러리&lt;/span&gt; (프레임원크가 아니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 프레임워크 : 개발을 위한 기본 틀, 뼈대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 라이브러리 : 개발에 필요한 도구 또는 그 집합&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; 비슷하지만 라이브러리가 좀 더 큰 범위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;장점&lt;/b&gt; : 1) 화면을 여러 단위로 쪼개고, 재사용하는 식으로 코드 관리가 용이함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2) SPA&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3) 현업에서도 많이 사용되고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, 기존 웹 서비스는 모든 페이지에 대한 네트워크 요청으로 코드가 늘어나는데 반복적으로 다운되는 리소스가 많아지는데 이런 전통적인 웹 서비스의 문제점을 해결하고자 &lt;span style=&quot;color: #f89009;&quot;&gt;SPA(Single Page Application) 방식&lt;/span&gt; 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 대표적인 SPA방식 : React, Vue, Angular 등&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. React의 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;1)&lt;/span&gt; 컴포넌트 기반 설계&lt;/span&gt; : 스스로 상태를 관리하는 캡슐화된 코드 조각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 의미단위로 컴포넌트 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 재사용성과 유지보수성 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &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;347&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OfjKi/btsNrofYffQ/Sc83RdMkgwq5CpBBK8bKN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OfjKi/btsNrofYffQ/Sc83RdMkgwq5CpBBK8bKN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OfjKi/btsNrofYffQ/Sc83RdMkgwq5CpBBK8bKN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOfjKi%2FbtsNrofYffQ%2FSc83RdMkgwq5CpBBK8bKN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;276&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) &lt;span style=&quot;color: #f89009;&quot;&gt;Vitual Dom (가상돔)&lt;/span&gt; : 실제 DOM의 복사본으로 SPA에서의 동적인 변화를 효율적으로 관리하기 위해 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- DOM을 직접 변경하면서 생기는 비효율을 해&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cul9g9/btsNsNyt9uz/3ykV6dVLHCjSLFkAHJqK30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cul9g9/btsNsNyt9uz/3ykV6dVLHCjSLFkAHJqK30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cul9g9/btsNsNyt9uz/3ykV6dVLHCjSLFkAHJqK30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcul9g9%2FbtsNsNyt9uz%2F3ykV6dVLHCjSLFkAHJqK30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;232&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3) CSR(Client Side Rendering) : JS를 통해 서버가 아닌 클라이언트 브라우저에서 랜더링한다는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JSX&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. JSX란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;JSX = HTML + JavaScript&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Java Script를 확장한 문법으로 JavaScript XML이라는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= 모양은 HTML에 가깝지만 JSX임 React는 이 JSX를 이용하여 화면을 그림 (컴포넌트)&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;특징&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) JSX에서 사용되는 태그의 속성 이름이 HTML과 조금 다름&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - class -&amp;gt; className&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - for -&amp;gt; htmlFor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - onclick -&amp;gt; onClick&amp;nbsp; ... 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2) 태그를 명시적으로 닫아줘야 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GsiKr/btsNsbNGB4H/TV51YdpFaRqVCn2LxTRLN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GsiKr/btsNsbNGB4H/TV51YdpFaRqVCn2LxTRLN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GsiKr/btsNsbNGB4H/TV51YdpFaRqVCn2LxTRLN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGsiKr%2FbtsNsbNGB4H%2FTV51YdpFaRqVCn2LxTRLN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;171&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3) 하나의 태그로 감싸져 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실습 문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실습1. React의 기본 사용법 익히기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &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;812&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GXgOO/btsNsTedt8G/o9qtP7SjVlcBMyBjiWSv6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GXgOO/btsNsTedt8G/o9qtP7SjVlcBMyBjiWSv6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GXgOO/btsNsTedt8G/o9qtP7SjVlcBMyBjiWSv6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGXgOO%2FbtsNsTedt8G%2Fo9qtP7SjVlcBMyBjiWSv6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;73&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;150&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;963&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHkvkY/btsNrz9p2NJ/5DGCaOX2CzAT75i7AX46t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHkvkY/btsNrz9p2NJ/5DGCaOX2CzAT75i7AX46t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHkvkY/btsNrz9p2NJ/5DGCaOX2CzAT75i7AX46t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHkvkY%2FbtsNrz9p2NJ%2F5DGCaOX2CzAT75i7AX46t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;120&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 화면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvAkIr/btsNsM7s2Wm/G0zq7WkCHbupoNs4gfgpEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvAkIr/btsNsM7s2Wm/G0zq7WkCHbupoNs4gfgpEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvAkIr/btsNsM7s2Wm/G0zq7WkCHbupoNs4gfgpEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvAkIr%2FbtsNsM7s2Wm%2FG0zq7WkCHbupoNs4gfgpEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;419&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;** App.js **&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만든 컴포넌트들을 여기에서 불러와서 배치하는 곳&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(HTML로 치면 &amp;lt;body&amp;gt; 태그를 생각하면 쉬움)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;브라우저로 랜더링 됨&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** React는 컴포넌트도 태그처럼 쓰기 때문에 닫는 태그가 필요없는 경우에는 /를 붙여서 짧게 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&amp;nbsp;&amp;lt; Hello /&amp;gt; 의 /는 Hello에 자식 요소가 없어서 /를 붙여서 닫는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;lt; Hello /&amp;gt; &amp;lt;Hello&amp;gt; &amp;lt;/Hello&amp;gt; 둘 다 똑같이 작동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실습2. 버튼 클릭 시 숫자 증가시키기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4MkqK/btsNpWwgYCm/j7TlBFt16QTN38GHx0PIXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4MkqK/btsNpWwgYCm/j7TlBFt16QTN38GHx0PIXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4MkqK/btsNpWwgYCm/j7TlBFt16QTN38GHx0PIXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4MkqK%2FbtsNpWwgYCm%2Fj7TlBFt16QTN38GHx0PIXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;164&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;389&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;736&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M4hhJ/btsNtjQ213g/HQFnygx3r6AGAFL1TZDsyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M4hhJ/btsNtjQ213g/HQFnygx3r6AGAFL1TZDsyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M4hhJ/btsNtjQ213g/HQFnygx3r6AGAFL1TZDsyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM4hhJ%2FbtsNtjQ213g%2FHQFnygx3r6AGAFL1TZDsyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;167&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 화면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh9uQg/btsNtcLn8uN/BNcxc1km4zASgdHuhPk9Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh9uQg/btsNtcLn8uN/BNcxc1km4zASgdHuhPk9Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh9uQg/btsNtcLn8uN/BNcxc1km4zASgdHuhPk9Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh9uQg%2FbtsNtcLn8uN%2FBNcxc1km4zASgdHuhPk9Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;444&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; useState&lt;/span&gt;란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; React에서 기본적으로 제공하는 상태관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - React 안에 내장된 Count 라이브러리처럼 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;변하는 데이터를 저장하고&lt;/span&gt;&lt;/b&gt;, 그 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;값이 바뀌면 UI를 자동으로 다시 랜더링&lt;/span&gt;&lt;/b&gt;해주는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 특징&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 60.814%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.72093%;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 52.0931%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.72093%;&quot;&gt;소속&lt;/td&gt;
&lt;td style=&quot;width: 52.0931%;&quot;&gt;React 내장 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.72093%;&quot;&gt;형태&lt;/td&gt;
&lt;td style=&quot;width: 52.0931%;&quot;&gt;const [값, 값을 바꾸는 함수]= useState(초기값);&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.72093%;&quot;&gt;목적&lt;/td&gt;
&lt;td style=&quot;width: 52.0931%;&quot;&gt;컴포넌트 내부에서 바뀌는 값을 기억하고 화면에 반영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.72093%;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 52.0931%;&quot;&gt;상태가 바뀔 때 자도으로 컴포넌트가 다시 랜더링됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.72093%;&quot;&gt;비교&lt;/td&gt;
&lt;td style=&quot;width: 52.0931%;&quot;&gt;일반 JS 변수는 화면에 반영되지 않지만, useState는 자동 반영됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+ Hello.js랑 Counter.js를 한 화면에서 보고 싶다면?&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E41ah/btsNthr98G4/uYp1wnqGKwSho9HnqgGymk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E41ah/btsNthr98G4/uYp1wnqGKwSho9HnqgGymk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E41ah/btsNthr98G4/uYp1wnqGKwSho9HnqgGymk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE41ah%2FbtsNthr98G4%2FuYp1wnqGKwSho9HnqgGymk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;174&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;365&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;960&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJp9EP/btsNslvL4vR/sREdHlzXKw33wGp1FQGBL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJp9EP/btsNslvL4vR/sREdHlzXKw33wGp1FQGBL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJp9EP/btsNslvL4vR/sREdHlzXKw33wGp1FQGBL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJp9EP%2FbtsNslvL4vR%2FsREdHlzXKw33wGp1FQGBL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;421&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1020&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;&lt;b&gt;실습3. 간단한 &quot;Todo List&quot; 만들기&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1Atrp/btsNsjLuHTR/RF8WgS86DRZ8Dr3Fyu9Ke1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1Atrp/btsNsjLuHTR/RF8WgS86DRZ8Dr3Fyu9Ke1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1Atrp/btsNsjLuHTR/RF8WgS86DRZ8Dr3Fyu9Ke1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1Atrp%2FbtsNsjLuHTR%2FRF8WgS86DRZ8Dr3Fyu9Ke1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;260&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;835&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;1003&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6yLnb/btsNrxwWlPN/MCXyPZLTYW0XY1tbAd5zk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6yLnb/btsNrxwWlPN/MCXyPZLTYW0XY1tbAd5zk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6yLnb/btsNrxwWlPN/MCXyPZLTYW0XY1tbAd5zk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6yLnb%2FbtsNrxwWlPN%2FMCXyPZLTYW0XY1tbAd5zk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;162&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;411&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;960&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nfhS1/btsNslbsL0j/0EPVolSTdUGtpQxNa64MbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nfhS1/btsNslbsL0j/0EPVolSTdUGtpQxNa64MbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nfhS1/btsNslbsL0j/0EPVolSTdUGtpQxNa64MbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnfhS1%2FbtsNslbsL0j%2F0EPVolSTdUGtpQxNa64MbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;421&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1020&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;960&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh1j3S/btsNsQ2R6Jp/vHwkvj5ko9kmhsH1lSBTW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh1j3S/btsNsQ2R6Jp/vHwkvj5ko9kmhsH1lSBTW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh1j3S/btsNsQ2R6Jp/vHwkvj5ko9kmhsH1lSBTW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh1j3S%2FbtsNsQ2R6Jp%2FvHwkvj5ko9kmhsH1lSBTW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;421&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1020&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;&lt;b&gt;** 코드 분석 **&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;1) 할 일 목록을 컴포넌트 안에서 기억할 수 있도록 useState 함수 불러오기&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;385&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cggMY6/btsNpUZxyic/OGWKl4mBd4Y0bdWDVfOfKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cggMY6/btsNpUZxyic/OGWKl4mBd4Y0bdWDVfOfKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cggMY6/btsNpUZxyic/OGWKl4mBd4Y0bdWDVfOfKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcggMY6%2FbtsNpUZxyic%2FOGWKl4mBd4Y0bdWDVfOfKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;54&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;54&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;&amp;nbsp;2) 상태 변수 선언&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcUJ3f/btsNthFIj7C/3pPIxFdiRRwRpUsunaySRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcUJ3f/btsNthFIj7C/3pPIxFdiRRwRpUsunaySRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcUJ3f/btsNthFIj7C/3pPIxFdiRRwRpUsunaySRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcUJ3f%2FbtsNthFIj7C%2F3pPIxFdiRRwRpUsunaySRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;70&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&amp;nbsp; &amp;nbsp; 문법 : const [값, 값을 바꾸는 함수]= useState(초기값);&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;&amp;nbsp; - input :&lt;/b&gt; 사용자가 입력하는 텍스트 상태 (초기값: 빈 문자열)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt; - todos&lt;/b&gt; : 할 일 목록 배열 (초기값: 빈 배열)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;- setInupt, setTodos :&lt;/b&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;&amp;nbsp;3) 할 일 추가 함수&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xY0m0/btsNsPXs536/PQbudUCOuJ6zhuUQPD4mj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xY0m0/btsNsPXs536/PQbudUCOuJ6zhuUQPD4mj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xY0m0/btsNsPXs536/PQbudUCOuJ6zhuUQPD4mj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxY0m0%2FbtsNsPXs536%2FPQbudUCOuJ6zhuUQPD4mj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;103&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;nbsp; - input.trim() === ' ':&lt;/b&gt;&lt;span&gt; 입력값이 공백이면 추가 안 함&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*&amp;nbsp; &quot;===&quot; -&amp;gt; 값과 타입이 모두 같은지 확인하는 연산자로 React에서 대부분 '==='를 씀&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- [...todos, input]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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; &amp;nbsp; &amp;nbsp; * &quot;...&quot; -&amp;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; &amp;nbsp; &amp;nbsp; &amp;nbsp;   React는 원본을 직접 수정하지 않고, &lt;b&gt;복사본을 만들어서 갱신&lt;/b&gt;하는 방식(불변성)을 지키기 위함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 예 ) const&amp;nbsp;todos&amp;nbsp;=&amp;nbsp;['밥먹기']; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const input = '공부하기';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const&amp;nbsp;newTodos&amp;nbsp;=&amp;nbsp;[...todos,&amp;nbsp;input]; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&amp;nbsp;결과:&amp;nbsp;['밥먹기',&amp;nbsp;'공부하기']&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;- setInupt(' '):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입력창 초기화&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;4) 입력창&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwzbl/btsNsntiEEP/DKjzQeVrg9TN9pKSjxgq1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwzbl/btsNsntiEEP/DKjzQeVrg9TN9pKSjxgq1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwzbl/btsNsntiEEP/DKjzQeVrg9TN9pKSjxgq1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkwzbl%2FbtsNsntiEEP%2FDKjzQeVrg9TN9pKSjxgq1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;115&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;nbsp; - value={input} :&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입력창에 보여지는 값은 상태값(input)을 따라감&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* value -&amp;gt; 입력창의 현재 값 (상태와 연결)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 이 input 태그의 &lt;b&gt;값은 input 상태 값과 연결&lt;/b&gt;되어 있다는 뜻&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 즉, 상태 값이 바뀌면 입력창에도 반영되고, 반대로 입력창이 바뀌면 상태도 바뀜 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;- onChange={...} : &lt;/b&gt;입력이 바뀌면 setInput()을 통해 상태 업데이트&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;span&gt; onChange{...} -&amp;gt; 입력 내용이 바뀔 때마다 실행되는 함수&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e) =&amp;gt; setInput(e.target.value)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - e: 이벤트 객체 (event)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; e.target.value: 사용자가 입력한 실제 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; setInput(...): 그 값을 input 상태로 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;결과적으로, 입력창에 글자를 쓰면 input 상태가 실시간으로 바뀜&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;5) 할 일 목록 랜더링&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JARX6/btsNthsaZg8/UJBRnRf0I20FALPbQNheg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JARX6/btsNthsaZg8/UJBRnRf0I20FALPbQNheg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JARX6/btsNthsaZg8/UJBRnRf0I20FALPbQNheg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJARX6%2FbtsNthsaZg8%2FUJBRnRf0I20FALPbQNheg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;102&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- todos 배열을 map()으로 돌려서 &amp;lt;li&amp;gt;로 하나씩 출력&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;* map()이란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 배열을 반복하면서, 각 요소를 새로운 형식으로 바꿔주는 함수&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;즉, 배열을 반복하면서 JSX 요소로 바꾸기&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - key={idx}는 React가 요소를 효율적으로 다루기 위해 필요함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;&amp;nbsp;*key란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - React가 항목을 고유하게 구분할 수 있게 해주는 값&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;오늘은 React의 기본적인 개념과 간단한 실습을 통해 사용법을 알아봤습니다~~&lt;/p&gt;</description>
      <category>react</category>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/18</guid>
      <comments>https://bb1714.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 20 Apr 2025 12:58:05 +0900</pubDate>
    </item>
    <item>
      <title>크롤링_5</title>
      <link>https://bb1714.tistory.com/17</link>
      <description>&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;실습1. 네이버지도를 활용해서 맛집 정보 수집 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;0. 필요한 도구 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729049414113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;1. 브라우저 진행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729049434849&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()
driver.get(&quot;https://map.naver.com/p/&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;2. 검색창에 &quot;동명동 맛집&quot; 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;※ 문제 :여기서 바로 선택자(검색할 부분)를 복사해서 가져오고 창을 끈 후 재실행하려하면 실행이 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;원인 : 복사해오면 뒷부분이 난수인데 이건 아이디가 매번 바뀐다는 소리이다. 그러면 아이디 사용 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;해결 : &lt;span style=&quot;background-color: #f6e199;&quot;&gt;다른 선택자를 사용하기 &amp;rarr; class 또는 계층 활용&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHIfYG/btsJ753jd80/kq7tjPf0FZW4A3OHNKWN6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHIfYG/btsJ753jd80/kq7tjPf0FZW4A3OHNKWN6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHIfYG/btsJ753jd80/kq7tjPf0FZW4A3OHNKWN6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHIfYG%2FbtsJ753jd80%2Fkq7tjPf0FZW4A3OHNKWN6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;453&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;nbsp;이러면 재실행이 안되므로 아래 코드 양식에 따라 적어주시면 됩니다~&lt;/p&gt;
&lt;pre id=&quot;code_1729049461873&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search = driver.find_element(By.CSS_SELECTOR, &quot;input.input_search&quot;)
search.send_keys(&quot;동명동 맛집&quot;)
search.send_keys(Keys.ENTER)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;3. 가게를 클릭해서 상세 정보 조회&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; &lt;/b&gt;오류가 뜰 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 오류 이름 : list index out of range &lt;b&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;인덱스 0번이 없다. 즉 데이터가 수집이 안된다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 원인 : iframe 태그의 정보가 존재해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 해결책 : &lt;span style=&quot;background-color: #f6e199;&quot;&gt;iframe태그의 데이터로 전환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;* 가끔 가게 이름이 짧으면 수집이 안된다. (2글자이상)&lt;/p&gt;
&lt;pre id=&quot;code_1729121259062&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title = driver.find_elements(By.CSS_SELECTOR, &quot;#_pcmap_list_scroll_container &amp;gt; ul &amp;gt; li &amp;gt; div.CHC5F &amp;gt; a &amp;gt; div &amp;gt; div &amp;gt; span.place_bluelink.TYaxT&quot;)
title[1].click()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;4. 원하는 iframe으로 화면을 전환&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729121274022&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.switch_to.frame(&quot;searchIframe&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;5. 디테일 정보에서 가게 이름 수집&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 또 오류가 뜰 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 원인 : 디테일 정보는 새로운 iframe에 데이터가 존재해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 해결책 : &lt;span style=&quot;background-color: #f6e199;&quot;&gt;iframe &lt;b&gt;&amp;rarr;&amp;nbsp;&lt;/b&gt;원본 &lt;b&gt;&amp;rarr;&lt;/b&gt; iframe&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729121322318&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;detail = driver.find_element(By.CSS_SELECTOR, &quot;#_title &amp;gt; div &amp;gt; span.GHAhO&quot;)
detail.text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;6. 새로운 iframe으로 전환&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729121337486&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.switch_to.frame(&quot;entryIframe&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 7. iframe에서 원본으로 이동하는 방&lt;/b&gt;법&lt;/p&gt;
&lt;pre id=&quot;code_1729121356110&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.switch_to.default_content()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;위 내용을 한 번 더 정리해보겠습니다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1)&amp;nbsp;선택자가&amp;nbsp;변하는&amp;nbsp;경우가&amp;nbsp;존재&amp;nbsp;-&amp;nbsp;다른&amp;nbsp;선택자를&amp;nbsp;활용하면&amp;nbsp;된다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;2) 데이터를 수집할 때, 선택자가 문제가 없는데 올바르게 수집이 안되면 무저건 iframe을 의심해라&lt;br /&gt;&amp;nbsp; &amp;nbsp;3) selenium에서 ifame을 조작하기 위해서는 화면 전환이 필요하다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 원본에서 ifame으로 이동 -&amp;gt; switch_to.frame (&quot;프레임 아이디&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - iframe에서 다른 iframe으로 이동 -&amp;gt; switch_to.default.content() -&amp;gt; 원본을 이용해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;코드의 순서는 아래와 같이 됩니다!!&lt;/p&gt;
&lt;pre id=&quot;code_1729121080152&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()
driver.get(&quot;https://map.naver.com/p/&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1729121092967&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search = driver.find_element(By.CSS_SELECTOR, &quot;input.input_search&quot;)
search.send_keys(&quot;동명동 맛집&quot;)
search.send_keys(Keys.ENTER)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1729121104095&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.switch_to.frame(&quot;searchIframe&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1729121111311&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title = driver.find_elements(By.CSS_SELECTOR, &quot;#_pcmap_list_scroll_container &amp;gt; ul &amp;gt; li &amp;gt; div.CHC5F &amp;gt; a &amp;gt; div &amp;gt; div &amp;gt; span.place_bluelink.TYaxT&quot;)
title[1].click()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1729121121399&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.switch_to.default_content()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1729121132897&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.switch_to.frame(&quot;entryIframe&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1729121141247&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;detail = driver.find_element(By.CSS_SELECTOR, &quot;#_title &amp;gt; div &amp;gt; span.GHAhO&quot;)
detail.text&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1729121150078&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.switch_to.default_content()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;실습2. 이미지 수집 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;0. 필요한 도구 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729121229110&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 파일시스템을 위한 라이브러리 (폴더, 파일을 생성, 삭제, 수정)
import os
# 이미지의 경로를 실제 파일로 저장하는 라이브러리 
from urllib.request import urlretrieve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;1. 바탕화면에 폴더 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;-&amp;nbsp; 코드 해석 : 바탕화면에 이미지라는 폴더가 없다면, 바탕화면에 이미지라는 폴더를 만들어줘&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1729121985346&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if not os.path.isdir(&quot;C:/Users/smhrd/OneDrive/바탕 화면/이미지&quot;) :
    os.mkdir(&quot;C:/Users/smhrd/OneDrive/바탕 화면/이미지&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;2. 브러우저 접근&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729122024818&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()\
driver.get(&quot;https://search.naver.com/search.naver?ssc=tab.image.all&amp;amp;where=image&amp;amp;sm=tab_jum&amp;amp;query=%EC%9D%B4%EC%8A%B9%EC%9A%B0#imgId=kvs_aqs%3Aweb_5ffe4904df0e983fe797de4bebc69f3f&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;3. 데이터 로딩을 위한 스크롤 작업 &amp;rarr; while문으로 끝까지 수집&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729122172721&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body = driver.find_element(By.CSS_SELECTOR, &quot;body&quot;)
while True :
    # 컴퓨터가 가지고 있는 정보를 변수에 저장
    first = driver.page_source
    body.send_keys(Keys.END)
    time.sleep(0.5)
    # 스크롤 후 변한 데이터를 변수에 저장
    next = driver.page_source
    if first == next :
        break;
    else :
        pass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;4. 이미지 태그 수집&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729122191632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;img = driver.find_elements(By.CSS_SELECTOR,&quot;#main_pack &amp;gt; section &amp;gt; div.api_subject_bx._fe_image_tab_grid_root.ani_fadein &amp;gt; div &amp;gt; div &amp;gt; div.image_tile._fe_image_tab_grid &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; img&quot;)
img&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;5. src 조회&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;&amp;rarr;&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;img태그는 컨텐츠가 없고 src &quot;속성&quot;을 조회해야한다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span style=&quot;background-color: #f6e199;&quot;&gt; get_attrivute(&quot;속성이름&quot;)&lt;/span&gt; &lt;b&gt;&amp;rarr; &lt;/b&gt;img태그 or a태그에서 활용&lt;/p&gt;
&lt;pre id=&quot;code_1729122329761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;img[0].get_attribute(&quot;src&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;6. 비어있는 리스트에 src값만 저장&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729122354576&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;src = []
for i in range(len(img)) :
    src.append(img[i].get_attribute(&quot;src&quot;))

src&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;7. 이미지 url을 실제 파일로 변환&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729122397712&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in range(len(src)) :
    urlretrieve(src[i],&quot;C:/Users/smhrd/Desktop/이미지/&quot;+str(i)+&quot;.jpg&quot;)
    
driver.save_screenshot(&quot;스크린샷.jpg&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위 내용은 스마트인재개발원 수업 내용을 정리한 내용입니다!&lt;/p&gt;</description>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/17</guid>
      <comments>https://bb1714.tistory.com/17#entry17comment</comments>
      <pubDate>Thu, 17 Oct 2024 08:35:20 +0900</pubDate>
    </item>
    <item>
      <title>크롤링_4</title>
      <link>https://bb1714.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 실습 위주로 내용을 정리해보겠습니다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;실습1. 뉴스타이틀자동화&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(프로세스를 따라서 지난 시간 수업 복습 겸해서 코드 같이 봐볼게요~)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;0. 필요한 도구 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728963066998&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time&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;&amp;nbsp;1. 크롬브라우저 실행 -&amp;gt; 네이버 이동&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(Chrome의 첫 글자 대문자!!)&lt;/p&gt;
&lt;pre id=&quot;code_1728962775182&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()
driver.get(&quot;http://www.naver.com&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;2. 검색창에 &quot;뉴스&quot; 검색 -&amp;gt; 엔터를 쳐서 검색 진행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728962799630&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search = driver.find_element(By.CSS_SELECTOR, &quot;#query&quot;)
search.send_keys(&quot;뉴스&quot;)
search.send_keys(Keys.ENTER)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;3. 화면 상단에 뉴스탭을 클릭&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728962816645&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;btn = driver.find_element(By.CSS_SELECTOR, &quot;#lnb &amp;gt; div.lnb_group &amp;gt; div &amp;gt; div.lnb_nav_area._nav_area_root &amp;gt; div &amp;gt; div.api_flicking_wrap._conveyer_root &amp;gt; div:nth-child(1) &amp;gt; a &amp;gt; i&quot;)
btn.click()&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;&amp;nbsp;4. 화면 스크롤을 총 10번 해주기 - time 활용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728962833789&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body = driver.find_element(By.CSS_SELECTOR, &quot;body&quot;)
body.send_keys(Keys.END)

try :
    for i in range(10) :
        body = driver.find_element(By.CSS_SELECTOR, &quot;body&quot;)
        body.send_keys(Keys.END)
        time.sleep(1)
except:
    print(&quot;더보기를 완료했습니다&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;5. 뉴스 타이틀 요소 수집&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728962845173&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title = driver.find_elements(By.CSS_SELECTOR, &quot;div.news_wrap.api_ani_send &amp;gt; div &amp;gt; div.news_contents &amp;gt; a.news_tit&quot;)
title[0].text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;6. 요소 데이터에서 컨텐츠 데이터만 수집&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728962859342&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title_list = []
for i in title :
    title_list.append(i.text)

title_list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;실습2. G마켓 수집&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(난이도를 좀 올려서 프로세스를 따라 작성해볼게요~)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;0. 필요한 도구 가져오기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728963082551&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from selenium import webdriver as wb
from selenium.webdriver.common.by import By
import time&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;&amp;nbsp;1. 크롬브라우저 실행 -&amp;gt; &lt;b&gt;&quot;지마켓&quot;에 접근&lt;/b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(Chrome의 첫 글자 대문자!!)&lt;/p&gt;
&lt;pre id=&quot;code_1728963211325&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()
driver.get(&quot;https://www.gmarket.co.kr/n/best&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&amp;nbsp; undetected_chromedrive 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; wb으로 접근하면 접근이 안됨 그러므로 사람이 쓰는 브라우저 인척 감지가 안되는 브라우저 설치하고 실행!!&lt;/p&gt;
&lt;pre id=&quot;code_1728963082553&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 설치가 필요하므로 설치 (컴퓨터마다 좀 다를 수도 있음)
!pip install undetected-chromedriver&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1728963505293&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 불러오고 
import undetected_chromedriver as uc

# wb이 아닌 uc로 접급
driver = uc.Chrome()
driver.get(&quot;https://www.gmarket.co.kr/n/best&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 베스트 화면에 있는 첫 번째 상품 클릭&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 지마켓은 우클릭이 안되므로 개발자도구를 활용해서 볼 것!&lt;/p&gt;
&lt;pre id=&quot;code_1728963082553&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;item = driver.find_elements(By.CSS_SELECTOR, &quot;#container &amp;gt; div.box__best-list &amp;gt; ul &amp;gt; li &amp;gt; a&quot;)
item[0].click()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 화면 -&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4dgSx/btsJ4Yxwsfm/8cYFnaK5GMH2inFjafBmy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4dgSx/btsJ4Yxwsfm/8cYFnaK5GMH2inFjafBmy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4dgSx/btsJ4Yxwsfm/8cYFnaK5GMH2inFjafBmy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4dgSx%2FbtsJ4Yxwsfm%2F8cYFnaK5GMH2inFjafBmy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;385&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 상품과 가격 요소 수집&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728963082553&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;title = driver.find_element(By.CSS_SELECTOR, &quot;#itemcase_basic &amp;gt; div.box__item-title &amp;gt; div.box__item-info&quot;)
price = driver.find_element(By.CSS_SELECTOR, &quot;#itemcase_basic &amp;gt; div.box__item-title &amp;gt; div.box__price.price &amp;gt; span.price_innerwrap.price_innerwrap-coupon &amp;gt; strong&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;5. 페이지 뒤로가기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728963082553&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;driver.back()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; ※ 파이썬 반복 진행을 체크하는 라이브러리 -&amp;gt; for문만 가능 while문은 불가능 (이유 : while은 끝을 모를 때 사용해서)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 사용 법 : for문 range 앞에 소괄호로 감싸서 range를 매개변수로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 예) for i in tqdm(range(20))&lt;/p&gt;
&lt;pre id=&quot;code_1728963943092&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tqdm import tqdm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;6. 삼품, 가격 정보 20개 수집&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 주의할 점 : 우리가 처음에 모집한 가격은 쿠폰 적용가임으로 쿠폰가가 없는 상품은 정상가로 수집&lt;/p&gt;
&lt;pre id=&quot;code_1728963082554&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 크롤링 반복문 작성할 때 반드시 반복할 코드를 먼저 만들고 for로 감싸주기
# time을 적절히 넣어주기
title_list = []
price_list = []
for i in tqdm(range(20)) :
    # 상품리스트를 매번 수집해야하는 이유는 -&amp;gt; 페이지가 변하면 데이터가 초기화되기 때문에
    # 데이터 접근
    item = driver.find_elements(By.CSS_SELECTOR,&quot;#container &amp;gt; div.box__best-list &amp;gt; ul &amp;gt; li &amp;gt; a&quot;)
    item[i].click()
    time.sleep(1)

    # 데이터 수집
    title = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &amp;gt; div.box__item-title &amp;gt; div.box__item-info &amp;gt; h1&quot;) 
     # 예외처리 
    # 쿠폰가격을 수집하다가 없으면 정상 가격을 수집
    try : 
        price = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &amp;gt; div.box__item-title &amp;gt; div.box__price.price &amp;gt; span.price_innerwrap.price_innerwrap-coupon &amp;gt; strong&quot;)
    except :
        price = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &amp;gt; div.box__item-title &amp;gt; div.box__price.price &amp;gt; span:nth-child(3) &amp;gt; strong&quot;)

    #데이터 가공
    title_list.append(title.text)
    price_list.append(price.text)

    # 화면전환
    driver.back()
    time.sleep(1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;7. 데이터 프레임 제작&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728980018266&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dic = {&quot;상품명&quot; : title_list, &quot;가격 정보&quot; : price_list}
gm = pd.DataFrame(dic)
gm.to_html(&quot;G마켓상품정보.html&quot;)
gm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 실습 문제를 풀어봤구요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 이번 시릇ㅂ을 통해 배운 점 정리하고 마무리하겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) time의 적절한 위치 -&amp;gt; 클라이언트가 서버에게 요청 할 때마자 넣어준다&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 화면의 전환이 일어날 때마다&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 데이터를 받아올 때 로딩이 필요하기 때문에&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 반복이 진행할 때, 코드에 문제가 없는데 중간에 멈추는 경우 -&amp;gt; 시간을 늘려가면서 조절하자&lt;br /&gt;&amp;nbsp; &amp;nbsp;2) 반복문을 작성할 때, 반드시 for문을 먼저 쓰지말고, 완벽한 코드를 작성한 다음에 묶어주자&lt;br /&gt;&amp;nbsp; &amp;nbsp;3) 데이트를 수집할 때, 데이터의 종류가 변하는 경우 try, except문을 활용하자&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- try : 에러가 날 수 있는 코드 작성 (쿠폰 가격)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- except : 에러가 났을 때 (일반 가격)&lt;br /&gt;&amp;nbsp; &amp;nbsp;4) 실습, 코드를 작성할 때 결과위주로 완성을 시킨 후 , 코드를 블록화 시키기 -&amp;gt; 가독성, 유지보수성에 좋음&lt;br /&gt;&amp;nbsp; &amp;nbsp;5) 많은 양의 데이터를 수집할 때는, tqdm 잘 활용하기~!&lt;br /&gt;&amp;nbsp; &amp;nbsp;6) 데이터 (태그)를 접근할 때 화면이 바뀌면, 모든 데이터가 초기화 -&amp;gt; 다시 찾는 코드가 반드시 필수!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용은 스마트인재개발원 수업 내용을 정리한 내용입니다!&lt;/p&gt;</description>
      <category>크롤링</category>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/16</guid>
      <comments>https://bb1714.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 15 Oct 2024 17:16:04 +0900</pubDate>
    </item>
    <item>
      <title>크롤링_3</title>
      <link>https://bb1714.tistory.com/15</link>
      <description>&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;Selenium으로 데이터를 수집할 때 지켜야 하는 프로세스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 사이트 요청&lt;br /&gt;&amp;nbsp; 2) 데이터 로딩 작업 -&amp;gt; 더보기, 스크롤을 통해서 데이터 로딩&lt;br /&gt;&amp;nbsp; 3) 데이터를 수집 (요소)&lt;br /&gt;&amp;nbsp; 4) 데이터 가공 (텍스트, 속성)&lt;br /&gt;&amp;nbsp; 5) 데이터 활용 (DB,)&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;&lt;b&gt;Selenium 라이브러리&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1728921518923&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 브라우저를 담당하는 라이브러리 
from selenium import webdriver as wb
# (신버전) 선택자를 구분해주는 라이브러리
from selenium.webdriver.common.by import By
# 컴퓨터용 키보드 라이브러리 -&amp;gt; 엔터, del 기능 호출
from selenium.webdriver.common.keys import Keys&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 1. 브라우저 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921507631&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 2. 특정 사이트 요청&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921559198&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.get(&quot;http://www.naver.com&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;3. 검색창에 &quot;강아지&quot; 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 해석 : driver에게 요소를 찾아와~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 찾아올 것이 한 개면 element / 복수면 elements&lt;/p&gt;
&lt;pre id=&quot;code_1728921584256&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search = driver.find_element(By.CSS_SELECTOR,&quot;#query&quot;)

# (구버전) 실행안됨 -&amp;gt; 검색해서 보인다면 신버전으로 바꿔서 실핼해야 함
# driver.find_element-by_css_selector(&quot;#query&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;4. 검색창에 검색어 입력&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 해석 : 검색창에 강아지라는 데이터 보내줘&lt;/p&gt;
&lt;pre id=&quot;code_1728921606234&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search.send_keys(&quot;강아지&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;5. 키보드의 엔터기능 전송&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;키 값은 다 대문자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921627377&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search.send_keys(Keys.ENTER)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;6. 화면의 맨 밑으로 스크롤 이동&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 해석 : 키보드의 END값을 보내주기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 스크롤 방법 1) JS를 활용 2) 키보드 활용&lt;/p&gt;
&lt;pre id=&quot;code_1728921647563&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body = driver.find_element(By.CSS_SELECTOR,&quot;body&quot;)
body.send_keys(Keys.END)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;7. 화면 뒤로가기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;nbsp;&lt;/span&gt;뒤로 가기는 HTML태그가 아니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;브라우저가 가지고 있는 기능이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921744637&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.back()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;8. 검색창에 고양이 검색&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 컴퓨터는 화면이 바뀌면 기존의 기억을 다 잊어버린다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;화면이 다른 페이지로 전환 후에는 반드시 기존태그를 다시 찾아와야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921767340&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search = driver.find_element(By.CSS_SELECTOR,&quot;#query&quot;)
search.send_keys(&quot;고양이&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;9. 특정 태그를 클릭&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921782837&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;btn = driver.find_element(By.CSS_SELECTOR,&quot;#sform &amp;gt; fieldset &amp;gt; button&quot;)
btn.click()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;10. 데이터 수집&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 복수개의 데이터가 필요한 경우에는 elements&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 주의점 :&lt;span style=&quot;color: #f89009; background-color: #f6e199;&quot;&gt; 리턴타입은 무조건 리스트 타입으로 변환&lt;/span&gt;&lt;span style=&quot;color: #f89009; background-color: #f6e199;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921807176&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title = driver.find_elements(By.CSS_SELECTOR, &quot;div.news_wrap.api_ani_send &amp;gt; div &amp;gt; div.news_contents &amp;gt; a.news_tit&quot;)
title[0].text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;11. 수집한 요소에서 컨텐츠 추출&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728921831321&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title_list = []
for i in title :
    title_list.append(i.text)
    
title_list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;12. 브라우저 종료&lt;/p&gt;
&lt;pre id=&quot;code_1728921852547&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 12. 브라우저 종료
driver.close()
# 또는
driver.quit()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;위 실습을 통해 중요한 점!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) &lt;span style=&quot;background-color: #f6e199;&quot;&gt;selenium에서 요소를 찾을 때는 find_element(s)로 검색&lt;/span&gt;한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - element로 복수개를 가지고 온 경우에는 인덱스 0번째 데이터만 반환&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - elements로 요청한 경우에는 무조건 리스트 타입이 반환&lt;br /&gt;&amp;nbsp; 2) key의 기능(enter, del, end)을 활용할 때는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;특정 태그에게 send_keys(keys. 기능(대문자))&lt;/span&gt;&lt;br /&gt;&amp;nbsp; 3) 뒤로 가기, 종료 &amp;rarr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&amp;nbsp;HTML태그가 아니기 때문에 바로 명령을 실행한다&lt;/span&gt;&lt;br /&gt;&amp;nbsp; 4) 데이터 수집 후 &amp;rarr; 반드시 사람이 쓰는 텍스트 데이터로 변환&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이번에는 한솥도시락 사이클 이용해서 실습을 진행하겠습니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;b&gt;0. 우선 사용할 라이브러리들을 불러오기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728922650644&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;1. 사이트 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728922701472&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()
driver.get(&quot;https://www.hsd.co.kr/menu/menu_list&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 메뉴이름 수집&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728922715497&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title = driver.find_elements(By.CSS_SELECTOR, &quot;div &amp;gt; div.item-text &amp;gt; h4&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 가격 수정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728922741964&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;price =  driver.find_elements(By.CSS_SELECTOR, &quot;div &amp;gt; div.item-text &amp;gt; div &amp;gt; strong&quot;)

price[0].text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;4. 데이터 검증하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728922821233&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;len(title)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; 여기까지면 한 페이지에 있는 메뉴밖에 나오지가 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;5. &lt;span style=&quot;color: #ee2323;&quot;&gt;더 많은 결과를 보기 위해서 더 보기 클릭&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728922961908&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;btn = driver.find_element(By.CSS_SELECTOR, &quot;#btn_more &amp;gt; span &amp;gt; a&quot;)

btn.click()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;6. &lt;span style=&quot;color: #ee2323;&quot;&gt;시간 부여해 주기&lt;/span&gt; (코드를 반복해서 빠르게 실행할 때는 반드시 필요!)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728923014566&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;7. 예외처리&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 영역이 2가지 구분&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1) 오류가 나기 전까지 시도할 코드&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2) 오류가 났을 때 동작할 코드&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;span style=&quot;color: #f89009;&quot;&gt;try&lt;/span&gt; = 시도할 코드 작성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;-&lt;span style=&quot;color: #f89009;&quot;&gt; except&lt;/span&gt; = 오류가 났을 때 코드&lt;br /&gt;* 데이터를 수집할 때 고려해야 할 점&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;데이터를 수집하다가 없는 경우가 발생하면 넘어가지 말고 없다의 의미를 넣어주자&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;null,&amp;nbsp;0,&amp;nbsp;&quot;없다&quot;,&amp;nbsp;&quot;none&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1728923147703&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try :
    # 시도할 코드
    for i in range(10) :
        btn = driver.find_element(By.CSS_SELECTOR, &quot;#btn_more &amp;gt; span &amp;gt; a&quot;)
        btn.click()
        time.sleep(1)
except :
    # 에러났을 때 코드
    print(&quot;더보기를 완료했습니다.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;8. 데이터 검증하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728923177724&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;len(title)
len(price)
title[0].text
price[0].text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;9. 텍스트만 추출한 리스트 제작&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728923320365&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title_list = []

for i in title :
    title_list.append(i.text)

print(title_list)

price_list = []

for j in price :
    price_list.append(j.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;10. 데이터 프레임 제작&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 컬럼과 데이터구조의 형태가 필요하다. &amp;rarr;&amp;nbsp; dic&lt;/p&gt;
&lt;pre id=&quot;code_1728923335741&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dic = {&quot;메뉴이름&quot;: title_list, &quot;가격정보&quot;:price_list}
han = pd.DataFrame(dic)
han.to_html(&quot;한솥메뉴.html&quot;)
han&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;11. csv파일로 저장 &amp;rarr; 인코딩 작업 필수!!&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728923348265&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;han.to_csv(&quot;한솥메뉴.csv&quot;, encoding = &quot;utf-8&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 자료는 스마트인재개발원 수업내용을 정리한 내용입니다.&lt;/p&gt;</description>
      <category>크롤링</category>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/15</guid>
      <comments>https://bb1714.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 15 Oct 2024 01:32:39 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝</title>
      <link>https://bb1714.tistory.com/14</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기초통계&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;1. 통계학과 인공지능의 관계&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 데이터를 사람이 통계학적으로 분석하는 데서 그치지 않고, 훨씬 방대한 양의 데이터를 기계가 효과적으로 분석하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;이를 바탕으로 미래를 예측하기 위해 인공지능이 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;2. 통계학이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 불확실한 미래를 예측하고 싶어 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 과거 자료에 근거하여 자연 또는 사회 현상에 대한 과학적인 추론과 불확실한 미래를 대비하기 위해 합리벅인&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;의사결정을 하고자 하는 학문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;3. 모집단과 표본&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;모집단&lt;/span&gt;&lt;/b&gt; : 관심의 대상이 되는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;모든 개체&lt;/span&gt;의 관측값이나 측정값의 집합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;표본&lt;/span&gt;&lt;/b&gt; : 모집단에서 추출한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;일부&lt;/span&gt; 관측값이나 측정값의 집합&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;전수조사&lt;/b&gt;&lt;/span&gt; : 모집단 전체를 조사하는 것&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;표본조사&lt;/b&gt;&lt;/span&gt; : 표본만 가지고 조사하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6SeGD/btsJ59yaFOf/lMEIdeY12U8p1cww6aShD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6SeGD/btsJ59yaFOf/lMEIdeY12U8p1cww6aShD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6SeGD/btsJ59yaFOf/lMEIdeY12U8p1cww6aShD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6SeGD%2FbtsJ59yaFOf%2FlMEIdeY12U8p1cww6aShD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;237&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 통계학은 모집단을 대표하는 표본을 어떻게 선정하는지가 중요&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;color: #f89009;&quot;&gt;&lt;b&gt;양적 자료&lt;/b&gt;&lt;/span&gt; : 숫자로 표현할 수 있고 연산할 수 있는 수치형 데이터 ex) 키, 몸무게, 유권자수&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;질적 자료&lt;/b&gt; &lt;/span&gt;: 숫자로 표현할 수 없는 범주형(문자열) 데이터 ex) 성별, 직업&lt;/li&gt;
&lt;li&gt;개체, 요인, 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ex) 우리가 담당자로 가정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 개체 : 연구자 또는 관찰자가 관심을 갖는 대상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 요인 : 개체에 관한 특성 중 연구자가 특별히 관심을 갖는 특성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 변수 : 요인을 구성하고 있는 요소&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;독립 변수&lt;/span&gt;&lt;/b&gt; (Independent variable) : 다른 변수에 영향을 받지 않고, 종속 변수에 영향을 주는 변수&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;종속 변수&lt;/b&gt;&lt;/span&gt; (Dependent variable) : 종속 또는 의존저인 변수, 독립변수에 영향을 받아서 변화하는 변수&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MPJTD/btsJ42M7jSR/FkIOi1paK5FgcBz7FdVs91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MPJTD/btsJ42M7jSR/FkIOi1paK5FgcBz7FdVs91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MPJTD/btsJ42M7jSR/FkIOi1paK5FgcBz7FdVs91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMPJTD%2FbtsJ42M7jSR%2FFkIOi1paK5FgcBz7FdVs91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;115&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;115&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;상대도수 : 도수를 전 테 데이터의 숫자로 나눈 것 (비율), 총도수가 다른 두 데이터를 비교할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vLzMY/btsJ59EWzw4/HK6p6nXBvzfUlEUYjbCl00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vLzMY/btsJ59EWzw4/HK6p6nXBvzfUlEUYjbCl00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vLzMY/btsJ59EWzw4/HK6p6nXBvzfUlEUYjbCl00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLzMY%2FbtsJ59EWzw4%2FHK6p6nXBvzfUlEUYjbCl00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;350&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;350&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;b&gt;3 사분위(3rd Qurtile)&lt;/b&gt; : 75%에 해당하는 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;2 사분위(2rd Qurtile)&lt;/b&gt; : 50%에 해당하는 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1 사분위(1st Qurtile)&lt;/b&gt; : 25%에 해당하는 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사분위수 범위(IQR)&lt;/b&gt; : 3 사분위 - 1 사분위 (box의 크기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;최솟값(Minimum)&lt;/b&gt; : 제일 작은 값 (이상치를 제외한)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최댓값(Maximum)&lt;/b&gt; : 제일 큰 값 (이상치를 제외한)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중앙값(Median)&lt;/b&gt; : 값들을 순서대로 정렬했을 때 중간에 위치한 값&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;이상치(Outlier)&lt;/b&gt;&lt;/span&gt; : 최대, 최소를 벗어난 값&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * 평균의 오류 : 평균에서 각 데이터가 얼마만큼 떨어져 있느냐를 측정하는 측도가 필요&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;편차(Deviation)&lt;/b&gt; : 관측값들이 평균으로부터 떨어진 거리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분산(Varience)&lt;/b&gt; : 편차 제곱의 평균 &amp;rarr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;관측값들이 퍼져 있는 정도&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;표준편차(Standard deviation)&lt;/b&gt; : 분산의 제곱금 &amp;rarr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;제곱된 분산의 스케일을 원래대로 변경&lt;/span&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;337&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rgryZ/btsJ6ZIlRBT/V8Ygc0f4fcoleLtltK3530/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rgryZ/btsJ6ZIlRBT/V8Ygc0f4fcoleLtltK3530/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rgryZ/btsJ6ZIlRBT/V8Ygc0f4fcoleLtltK3530/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrgryZ%2FbtsJ6ZIlRBT%2FV8Ygc0f4fcoleLtltK3530%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;337&quot; height=&quot;205&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;205&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;표준정규분포 : 평균이 0 표준편차가 1인 정규분포 &amp;rarr;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 평균과 표준편차가 다른 정규분포들을 쉽게 비교하기 위해&lt;/span&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;405&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dck4Sa/btsJ5hKeltH/K4WYt9oHj89hWLRWPkzko1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dck4Sa/btsJ5hKeltH/K4WYt9oHj89hWLRWPkzko1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dck4Sa/btsJ5hKeltH/K4WYt9oHj89hWLRWPkzko1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdck4Sa%2FbtsJ5hKeltH%2FK4WYt9oHj89hWLRWPkzko1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;206&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;206&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;428&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MepWq/btsJ4RyiPVF/Ibg7QdxKYFAowjLWi3aML1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MepWq/btsJ4RyiPVF/Ibg7QdxKYFAowjLWi3aML1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MepWq/btsJ4RyiPVF/Ibg7QdxKYFAowjLWi3aML1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMepWq%2FbtsJ4RyiPVF%2FIbg7QdxKYFAowjLWi3aML1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;428&quot; height=&quot;390&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;390&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;250&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW3wYV/btsJ4f7rdxb/4vSgcrL8KEv9CQ16LhmlC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW3wYV/btsJ4f7rdxb/4vSgcrL8KEv9CQ16LhmlC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW3wYV/btsJ4f7rdxb/4vSgcrL8KEv9CQ16LhmlC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW3wYV%2FbtsJ4f7rdxb%2F4vSgcrL8KEv9CQ16LhmlC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;188&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;188&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;b&gt;&amp;nbsp;4. 상관계수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UUwUc/btsJ5flWhXW/AvmuKSujiHDdEZNk80x3S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UUwUc/btsJ5flWhXW/AvmuKSujiHDdEZNk80x3S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UUwUc/btsJ5flWhXW/AvmuKSujiHDdEZNk80x3S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUUwUc%2FbtsJ5flWhXW%2FAvmuKSujiHDdEZNk80x3S1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;104&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공분산/ 표준편차 * 표준편차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 공분산 : 2개의 변수 간의 선형 관계를 나타내는 수치 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;-1 &amp;lt;= r &amp;lt;= 1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 0에 가까울수록 변수의 연관 관계가 없어짐&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;수치의 절대값이 클 수록 두 변수는 서로 관계가 높음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 1 or -1 : 절대적인 상관관계가 있음(한 값이 커지면 똑같은 비율로 커지거나 작아지는 경우)&lt;br /&gt;- 0.7이상 or -0.7이하 : 강한 상관관계가 있음&lt;br /&gt;- 0.3이하 or -0.3이상 : 약한 상관관계가 있음&lt;br /&gt;- 0 : 전혀 상관 없음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;5. 인공지능과 수학&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Q. 왜 우리는 인공지능을 배우기 위해 수락과 미분의 개념을 알아야 할까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A. 데이터 처리부터 AI모델링 전 과정이 수학적으로 표현되며, AI학습 시 미분이 포함된 최적화 기법을 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;but 처음부터 이 모든 것을 알아야만 AI를 배울 수 있는 것은 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 미분 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;움직이라고 변화하는 대상의 &quot;순간적인 변화&quot;를 설명&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;즉, 계속해서 변화해 가는 특정한 값을 구하고자 할 때 미분의 실생활 적용이 가능&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S0h5F/btsJ6sdFSsf/cBCzj6t0C3zu1BjkDHmOB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S0h5F/btsJ6sdFSsf/cBCzj6t0C3zu1BjkDHmOB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S0h5F/btsJ6sdFSsf/cBCzj6t0C3zu1BjkDHmOB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS0h5F%2FbtsJ6sdFSsf%2FcBCzj6t0C3zu1BjkDHmOB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;338&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lrECK/btsJ5DfDy0K/7DsMUJ4bsTYUsk4fjiS0jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lrECK/btsJ5DfDy0K/7DsMUJ4bsTYUsk4fjiS0jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lrECK/btsJ5DfDy0K/7DsMUJ4bsTYUsk4fjiS0jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlrECK%2FbtsJ5DfDy0K%2F7DsMUJ4bsTYUsk4fjiS0jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;255&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 자료는 스마트인재개발원에서 수업한 내용을 정리한 내용입니다!&lt;/p&gt;</description>
      <category>머신러닝</category>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/14</guid>
      <comments>https://bb1714.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 15 Oct 2024 00:52:25 +0900</pubDate>
    </item>
    <item>
      <title>크롤링_2</title>
      <link>https://bb1714.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우선 실습을 통해 복습을 해볼게요~! (저번 글 참고해 주세요!!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;실습 : 국내증시정보수집&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728618023688&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests as req
from bs4 import BeautifulSoup as bs

res = req.get(&quot;https://finance.naver.com/sise/sise_market_sum.naver&quot;)

soup = bs(res.text,&quot;lxml&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 종목이름을 수집 - 선택자를 가져올 때 복사해서 가져오기!&lt;/p&gt;
&lt;pre id=&quot;code_1728652685655&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup.select(&quot;a.tltle&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 현대 가격 수집&lt;/p&gt;
&lt;pre id=&quot;code_1728652717036&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup.select(&quot;#contentarea &amp;gt; div.box_type_l &amp;gt; table.type_2 &amp;gt; tbody &amp;gt; tr &amp;gt; td:nth-child(3)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;이번 실습에서 배워야 할 내용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) 선택자를 복사할 때는 우클릭 &amp;rarr; copy &amp;rarr; copy selector&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;2) 주의점 : 내가 선택한 태그 하나만 가지고 오는 단수개의 선택자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;3) 복수개가 필요한 경우에는 선택자를 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 단수개를 의미하는 선택자를 지우자 (id, nth-dhild)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 선택자는 뒤에서부터 지운다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 테이블태그가 등장하면 무조건 tr태그를 수정해라.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;실습 : 환율정보수집 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 필요한 라이브러리 import 하기&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728652964372&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests as req
from bs4 import BeautifulSoup as bs&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 페이지요청하기&lt;/p&gt;
&lt;pre id=&quot;code_1728653052240&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res = req.get(https://finance.naver.com/marketindex/)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) bs로 변환하기&lt;/p&gt;
&lt;pre id=&quot;code_1728653064782&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup = bs(res.text,&quot;lxml&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 통화명 수집하기 &amp;rarr; copy 기능 활용&lt;/p&gt;
&lt;pre id=&quot;code_1728653665715&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup.select(&quot;body &amp;gt; div &amp;gt; table &amp;gt; tbody &amp;gt; tr:nth-child(1) &amp;gt; td.tit &amp;gt; a&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;rarr;&amp;nbsp; 데이터가 수집이 안되고 빈 리스트[]만 뜬다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 원인 : iframe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 해결책 : 상대경로를 절대경로로 바꿔주는 작업을 하자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) &lt;span style=&quot;color: #f89009;&quot;&gt;iframe&lt;/span&gt;에서 데이터 추출하기()&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 목적 : 화면상에 데이터를 볼 수는 있으나, 원본은 다른 서버에 저장&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) iframe태그 찾기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 개발자도구에서 선택한 태그를 위로 올려보면 iframe태그 존재&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; &amp;nbsp; 2) 원본 주소를 찾기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- src데이터를 확인해 보기 (상대경로 vs 절대경로)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;span style=&quot;background-color: #99cefa;&quot;&gt;상대경로를 절대경로로 변경&lt;/span&gt; : 현재사이트의 url을 복사한 후 상대경로와 비교해서 합치기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 현재 url : &lt;a href=&quot;https://finance.naver.com/marketindex/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://finance.naver.com/marketindex/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;iframe src : &lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;/marketindex/exchangeList.naver&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;절대경로 : &lt;a href=&quot;https://finance.naver.com/marketindex/&quot;&gt;https://finance.naver.com/marketindex&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;/exchangeList.naver&lt;/span&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;* src가 없는 경우는 slelenium으로 처리해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3) 요청할 페이지도 같이 수정해서 재수집하기!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; 그러면 '미국 USD' 출력됨&lt;/p&gt;
&lt;pre id=&quot;code_1728653075057&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res = req.get(&quot;https://finance.naver.com/marketindex/exchangeList.naver&quot;)
name = soup.select(&quot;body &amp;gt; div &amp;gt; table &amp;gt; tbody &amp;gt; tr &amp;gt; td.tit &amp;gt; a&quot;)
name[0].text.strip()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;nbsp;selenium 라이브러리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 파이썬 코드로 실제 브라우저를 조작하는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 사람처럼 프로그래밍을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 설치가 한 번 필요&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728618351814&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!pip install selenium&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1728636263395&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 브라우저를 담당하는 라이브러리 
from selenium import webdriver as wb
# (신버전) 선택자를 구분해주는 라이브러리
from selenium.webdriver.common.by import By
# 컴퓨터용 키보드 라이브러리 -&amp;gt; 엔터, del 기능 호출
from selenium.webdriver.common.keys import Keys&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;rarr; 첫 번째 두 번째는 필수 세 번째는 필요에 따라&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; 1. 브라우저 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 구버전은 크롬 드라이버를 설치해서 경로 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 신버전은 알아서 최신버전의 브라우저를 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (신버전인데 설치하면 충돌 발생 &amp;rarr;&amp;nbsp; 설치한 파일만 삭제하면 문제없음)&lt;/p&gt;
&lt;pre id=&quot;code_1728636607760&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = wb.Chrome()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. 특정 사이트 요청&lt;/p&gt;
&lt;pre id=&quot;code_1728654791655&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.get(&quot;http://www.naver.com&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 수업은 여기까지 한 관계로 다음 수업 때 이어서 작성하겠습니다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 자료는 스마트인재개발원에서 수업한 내용을 정리한 내용입니다.&lt;/p&gt;</description>
      <category>크롤링#크롤링실습#iframe</category>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/13</guid>
      <comments>https://bb1714.tistory.com/13#entry13comment</comments>
      <pubDate>Fri, 11 Oct 2024 22:54:52 +0900</pubDate>
    </item>
    <item>
      <title>오렌지3</title>
      <link>https://bb1714.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;lt; 1일 차 &amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;오렌지 3란&lt;/span&gt;&lt;/b&gt; 텍스트 코딩 없이 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;데이터 과학, 통계, 머신러닝&lt;/span&gt;을 학습할 수 있는 서비스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 인공지능에 대해 짧게 알고 넘어가자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt; &lt;b&gt;인공지능(AI)이란?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&amp;nbsp; 쉽게 정의하면 사람과 같이 생각하거나 행동하는 컴퓨터이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2가지 종류가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1) 강한 인공지능 (모든 면에서 매우 뛰어난 거 아직 발명되지 않았다 ㅎㅎ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2) 약한 인공지능 (하나만 엄청 잘하는 거&amp;nbsp; 알파고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 본격적으로 머신러닝에 대해 알아보자!!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&amp;nbsp;1.&amp;nbsp; 머신러닝(기계학습)이란?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1)&amp;nbsp; 데이터를 기반으로 학습을 시켜서 예측하게 만드는 기법&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2) 인공지능의 한 분야로 컴퓨터가 학습할 수 있도록 하는 알고리즘 기술을 개발하는 분야&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 3) 통계학, 데이터마이닝, 컴퓨터 과학이 아울어진 분야&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;&amp;nbsp;2. 머신러닝의 등장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rarr;&amp;nbsp; &lt;span style=&quot;background-color: #99cefa;&quot;&gt;데이터를 이용하여 스스로 특성과 패턴을 찾아 학습하고 예측을 수행하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 여기서 Question 머신러닝이 나오기 전에도 심심이랑&amp;nbsp; 놀았는데요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;A. &amp;nbsp;심심이는 &lt;span style=&quot;color: #f89009;&quot;&gt;규칙기반전문가시스템(Rule Based System)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;* &lt;span style=&quot;text-align: start;&quot;&gt;규칙기반전문가시스템은 'if'와 'else'로 하드 코딩된 명령을 사용하는 시스템&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr; 제작한 로직이 특정 작업에만 국한되어 조금만 변경되어도 전체 시스템을 다시 만들어야 할 가능성이 크고,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;많은 상황에 대한 규칙을 모두 만들어 낼 수가 없다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;3. 머신러닝의 종류 : 지도학습(Supervised Lesrning), 비지도학습 &lt;b&gt;(Unupervised Lesrning)&lt;/b&gt; , &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;강화학습(Reinforcement Learning)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1) 지도학습 :&amp;nbsp; 데이터에 대한 Label(명시적인 답)이 주어진 상태에서 컴퓨터를 학습시키는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 종류 : 1) &lt;span style=&quot;color: #f89009;&quot;&gt;분류=범주형&lt;/span&gt;(Categorical)데이터&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; &lt;span style=&quot;background-color: #99cefa;&quot;&gt;숫자로 측정하고 표시하는 것이 불가능함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ex) 혈액형, 등급, 스팸메일 분류...&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2) &lt;span style=&quot;color: #f89009;&quot;&gt;회귀=연속형=수치형(Classification) 데이터&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; &lt;span style=&quot;background-color: #99cefa;&quot;&gt;연속적인 숫자를 예측하는 것&lt;/span&gt; (미묘한 차이가 크게 중요하지 않음)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ex) 연봉, 키, 집값...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 비지도학습 :&amp;nbsp; 데이터에 대한 Label(명시적인 답)이 없는 상태에서 컴퓨터를 학습시키는 방법&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 종류 : 1) 클러스터링(군집화)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2) 차원축소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3) 강화학습 :&amp;nbsp; 지도학습과 비슷하지만 완전한 답을 제공하지는 않음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: #99cefa;&quot;&gt;&amp;nbsp; '보상'을 얻을 수 있는 방향으로 행동을 학습한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; ※ &lt;span style=&quot;color: #ee2323;&quot;&gt;지도학습 비지도학습의 차이점으로 쉽게 구분하기!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; 내가 준 데이터에 정답 유무&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;지도학습 : O&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;비지도학습 : X&amp;nbsp; (ex: 음악추천 알고리즘)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;2일 차&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;머신러닝의 과정을 실습을 통해 알아보겠습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 머신러닝의 과정 7단계는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k53d3/btsJ3MXkMys/anKdO8V8bjqQwFHFZbKuEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k53d3/btsJ3MXkMys/anKdO8V8bjqQwFHFZbKuEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k53d3/btsJ3MXkMys/anKdO8V8bjqQwFHFZbKuEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk53d3%2FbtsJ3MXkMys%2FanKdO8V8bjqQwFHFZbKuEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;196&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&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;&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;&amp;nbsp; Ex01_ BMI예측&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. 문제정의 : 키와 몸무게(속성, feature)를 통해서 비만도(라벨, label, target)를 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. 데이터 수집 : CSV File&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3. 데이터 전처리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1) 결측치(No Missing Value) : 없는 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2) 이상치 : 이상한 값&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;gt; 기술통계 EDA로 확인해 본 결과, 중앙값과 평균값이 유사하므로 이상치가 없을 것으로 예상&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WUUxB/btsJ28mASsf/kdJUkONOHiO8OVn5PDOsC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WUUxB/btsJ28mASsf/kdJUkONOHiO8OVn5PDOsC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WUUxB/btsJ28mASsf/kdJUkONOHiO8OVn5PDOsC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWUUxB%2FbtsJ28mASsf%2FkdJUkONOHiO8OVn5PDOsC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;267&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;학습을 하기 이전에 내가 가지고 있는 데이터를 분리하는 과정이 필요 &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;내가&amp;nbsp;가진&amp;nbsp;데이터를&amp;nbsp;100%&amp;nbsp;다&amp;nbsp;주고&amp;nbsp;학습을&amp;nbsp;시키면,&amp;nbsp;이 훈련에서만&amp;nbsp;점수가&amp;nbsp;높을 것 &lt;br /&gt;우리의&amp;nbsp;목표는&amp;nbsp;100점&amp;nbsp;20점&amp;nbsp;40점이&amp;nbsp;나오는&amp;nbsp;모델이&amp;nbsp;아니고,&amp;nbsp;80점&amp;nbsp;80점&amp;nbsp;80점이&amp;nbsp;나오는&amp;nbsp;모델이&amp;nbsp;목표 &lt;br /&gt;&lt;br /&gt;데이터를&amp;nbsp;Trin&amp;nbsp;데이터와&amp;nbsp;Test&amp;nbsp;데이터를&amp;nbsp;분리해서&amp;nbsp;사용 &lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;-&amp;nbsp;train&amp;nbsp;훈련&amp;nbsp;데이터&amp;nbsp;(70%&amp;nbsp;~80%)&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- test 테스트 데이터 (20% ~ 30%)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;nbsp; Ex02_ 닮은 꼴 찾기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCGBxY/btsJ20WlVa2/tmy2dMHIC0MWhk5WQbwC91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCGBxY/btsJ20WlVa2/tmy2dMHIC0MWhk5WQbwC91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCGBxY/btsJ20WlVa2/tmy2dMHIC0MWhk5WQbwC91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCGBxY%2FbtsJ20WlVa2%2Ftmy2dMHIC0MWhk5WQbwC91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;358&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ex03_ 텍스트마이닝&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 자료는 스마트인재개발원 수업 내용을 정리한 내용입니다.&lt;/p&gt;</description>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/12</guid>
      <comments>https://bb1714.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 11 Oct 2024 01:07:29 +0900</pubDate>
    </item>
    <item>
      <title>크롤링</title>
      <link>https://bb1714.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;크롤링&lt;/b&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;lt;크롤링의 개념&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;1. 크롤링을 하기 위해서는 ?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; HTML, CSS, Python을 알아야 함 (JAVA 등 다른 언어도 되지만 Python이 가장 쉬움)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(대규모 데이터는 JAVA가 좀 더 적합)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;2. 언제 쓰일까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr; 디지털 환경에서 생성되는 수치, 문자, 이미지, 영상 데이터를 모두 포함하는 대규모 데이터&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 1) 업무 자동화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 부수입 창출...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;3.&amp;nbsp;신경 써야 할 점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 1)&amp;nbsp; 사람처럼 프로그래밍을 작성하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 기능을 작성할 때는 외우지 말고 대화한다고 생각하자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;4. 활용예시&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 1) 쿠팡 가격 변동 추적 사이트&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp8Cty/btsJZJ7QSKM/qAKV0HTuNKmkrfPegRvFj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp8Cty/btsJZJ7QSKM/qAKV0HTuNKmkrfPegRvFj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp8Cty/btsJZJ7QSKM/qAKV0HTuNKmkrfPegRvFj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp8Cty%2FbtsJZJ7QSKM%2FqAKV0HTuNKmkrfPegRvFj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;259&quot; height=&quot;203&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;5. 이슈&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr; 합법인지 불법인지에 대해 아직 명확하지가 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 데이터를 그대로 수집해서 수익을 창출하는 경우 불법이 될 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;lt;데이터 수집 프로세스 &amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;1. 조회할 사이트 요청 = req.get()&lt;br /&gt;&amp;nbsp; &amp;nbsp;2. text데이터를 html데이터로 변환 = bs라이브러리&lt;br /&gt;&amp;nbsp; &amp;nbsp;3. 변환된 html데이터에서 필요한 요소를 수집 = soup.select(&quot;선택자&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 선택자를 잘 작성하기 (가장 힘든 작업 ㅜㅜ)&lt;br /&gt;&amp;nbsp; &amp;nbsp;4. 수집된 요소에서 (태그 + 컨텐츠) 컨텐츠만 추출 후 저장하는 작업 = 반복문을 통해서 비어있는 리스트 저장&lt;br /&gt;&amp;nbsp; &amp;nbsp;5. 데이터 활용(표, 데이터 학습, 파일제작, 이미지작업...)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;그러면 위를 참고해서 실습을 풀어볼게요!!&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;lt;실습 1 : 뉴스에서 제목이 김도영이 들어간 텍스트 데이터 추출!&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;1. 사이트 조회 == request 이용하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; * request = 요청하기&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728531005184&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests as req
req.get(&quot;url&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;rarr; 실행을 시켜 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;200&lt;/b&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: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그러나 400번대 or 500번대가 뜨면 오류가 난 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그러기에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;변수에 넣기 전에 반드시 실행을 시켜 통신이 성공됐는지 확인하고 변수에 넣기!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;※ 오류 해석&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &lt;b&gt;&amp;nbsp;400번대&lt;/b&gt;: 요청의 오류 (수정이 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;500번대&lt;/b&gt; : 서버의 오류 (수정이 불가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;406 오류&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;rarr;&amp;nbsp; 왜? : 접속한 사이트에서 사용자가 브라우저가 아닌 비정상적인 접근 인지&lt;/span&gt;&lt;span style=&quot;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;&lt;span style=&quot;color: #333333; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;rarr;&amp;nbsp; 해결방법 : - &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;head 작업 시도!!&lt;/b&gt;&lt;/span&gt; (실패할 경우 &amp;rarr;&amp;nbsp; 수집이 불가능 or 다른 라이브러리 ) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (국내인 경우는 오류가 이렇게 해결될 수 있지만 해외는 대부분 ip를 차단하는 경우가 많아 어려움)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728531819531&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 요청을 보낼 때 브라우저인척 속여서 데이터를 보낸다.
head = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}
# head 정보를 동반해서 재요청 (heades라는 키워드는 변경 X)
req.get(&quot;https://www.melon.com/chart/index.htm&quot;, headers = head)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;2. 텍스트 추출하기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr; 위에 사이트를 불러온 코드를 저장한 변수명에. text&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728536962398&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res = req.get(&quot;https://search.naver.com/search.naver?where=nexearch&amp;amp;sm=top_hty&amp;amp;fbm=0&amp;amp;ie=utf8&amp;amp;query=%EA%B9%80%EB%8F%84%EC%98%81&quot;)
res.text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;3. BeautifulSoup 라이브러리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 라이브러리이기 때문에 기능 꺼내오기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728549098760&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from bs4 import BeautifulSoup as bs&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; * Beautifulsoup는 bs4에 담겨 있어 바로 import 해서 사용할 수 없어서 bs4에서 꺼내서 사용(==from)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1) bs를 이용해서 text를 html로 변환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; 이 작업은 왜 하는 걸까? : 명령을 내릴 대상이 컴퓨터이기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728549266416&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup = bs(res.text, &quot;lxml&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2) soup에서 특정 태그만 수집&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728549433790&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title = soup.select(&quot;a.news_tit&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 3) 수집된 요소 (태그 + 컨텐츠)에서 컨텐츠만 추출&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; 이 작업은 왜 하는 걸까? : 사람이 데이터를 사용하기 위해서&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728549546581&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;title[0].text&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 4) for문을 사용해서 모든 데이터 출력&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728549588556&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in title :
    print(i.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;5) 수집된 요소를 텍스트만 추출한 새로운 리스트를 제작&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; 이 작업은 왜 하는걸까? : 우리가 원하고 필요한 데이터는 결국 텍스트 데이터이기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728549682211&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;news_title = []
for i in title :
    news_title.append(i.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;lt;실습 2 : 멜론 차트 top100 노래 제목과 가수 텍스트 데이터 추출하기!&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;1. req로 멜론차트 사이트 요청&amp;nbsp; &lt;span style=&quot;color: #ee2323;&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;pre id=&quot;code_1728550088010&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;head = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}
res = req.get(&quot;https://www.melon.com/chart/index.htm&quot;, headers = head)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;2. bs를 통해서 html 데이터 제작&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728550203811&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup = bs(res.text, &quot;lxml&quot;)
soup&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. ★ 노래제목을 통해서 데이터 수집 ★&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt; (주의해야할 점)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1) 클래스는 여러 개가 부여 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2) 태그에 클래스값 중간에 공백이 들어간다면, 클래스를 복수개를 가졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr; 해결책 : 공백을 지우고 &quot;.&quot;을 통해서 이어주기!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3) 선택자를 분석할 때, 수집하고자하는 태그의 구분자가 없다면&lt;span style=&quot;background-color: #f6e199;&quot;&gt; (id, class) 부모를 검사하자&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;rarr; 정확도가 중요해서 바로 띄어쓰기(자손) 하지 않고 &amp;gt; 를 쓰기!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr; 부모도 구분자가 있을 때까지 작성할 것&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728572900509&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;song = soup.select(&quot;div.ellipsis.rank01 &amp;gt; span &amp;gt; a&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;b&gt; 4. 가수 이름 수집&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;(주의해야할 점)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;span style=&quot;background-color: #f6e199;&quot;&gt;데이터 개수가 중요한 경우레는 반드시 데이터 검증&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728572948885&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;singer = soup.select(&quot;div.ellipsis.rank02 &amp;gt; span.checkEllipsis&quot;)
# 데이터 개수 검증
len(song)
len(singer)

# 데이터 중복여부 검증
for i in singer :
    print(i.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;b&gt; 4-1. 수집된 요소 리스트에서 컨텐츠만 추출 새로운 리스트 제작&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728573126084&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노래 제목
song_list = []
for i in song :
    song_list.append(i.text)

song_list

# 가수 이름
singer_list = []
for j in singer :
    singer_list.append(j.text)

singer_list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; 반복문을 효율적으로 해보자!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 공통점을 찾기 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; 100번을 반복한다는 공통점&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- for문을 작성할 때는 반복 횟수와 유지보수를 고려하기 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr;&amp;nbsp; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;코드의 효율성과 유지보수성을 올릴 수 있다&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 그러나 여기에 너무 집중하지 않기! &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr;&amp;nbsp; 결과를 만들고 코드를 튜닝하자(시간이 남으면)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728573177305&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;song_list = []
singer_list = []
for i in range(len(singer)) :
    song_list.append(song[i].text)
    singer_list.append(singer[i].text)

song_list
singer_list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;b&gt;&lt;span&gt; 5.&lt;/span&gt; 수집된 데이터를 활용해서 데이터 프레임 제작&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; (판다스가 필요하기때문에 맨 위에 import하기)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728616699771&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dic = {&quot;가수이름&quot; : singer_list, &quot;노래제목&quot; : song_list}
melon = pd.DataFrame(dic)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;6. 만들어진 데이터 프레임을 활용해서 엑셀, csv, html 파일로 제작&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp; csv 파일로 저장할 때는 반드시 인코딩 해주기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; utf-8, euc-kr, utf-8-sig&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728616743922&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;melon.to_html(&quot;멜론차트.html&quot;, encoding = &quot;utf-8&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위 자료는 스마트인재개발원 수업 내용을 정리한 내용입니다.&lt;/span&gt;&lt;/p&gt;</description>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/11</guid>
      <comments>https://bb1714.tistory.com/11#entry11comment</comments>
      <pubDate>Fri, 11 Oct 2024 00:19:41 +0900</pubDate>
    </item>
    <item>
      <title>CSS_2</title>
      <link>https://bb1714.tistory.com/10</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1. &lt;b&gt;반응 선택자&lt;/b&gt; : 사용자의 반응으로 생성되는 특정한 상태를 선택&lt;/span&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;:active 마우스로 클릭할 때 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;:hover 마우스를 올린 태그를 선택&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2. &lt;b&gt;공간 분할 태그&lt;/b&gt; : 경계를 분할하거나 영역을 나눌 때 사용하는 태그 (레이아웃)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;lt;div&amp;gt; : 큰 영역 분할&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; &amp;lt;p&amp;gt; : 문단분할&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;lt;span&amp;gt; : 세부적인 스타일&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;3. &lt;b&gt;display&lt;/b&gt; : 요소가 화면에 보이는 방식 지정&lt;/span&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;block - 종류: p, div, table..등 기본값은 block&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;무조건 가로로 한 줄의 영역을 차지하는 속성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width, height 값 설정이 가능&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;inline - 종류: span, a, strong.. 등 기본값은 inline&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;내가 담은 컨텐츠까지만 크기로 삼는 속성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width, height 값 설정이 불가능&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;none - 화면에 보이지 않게 지정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; * alt+l+o 실행 후 F12(개발자 창) 에서 확인 가능&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt; 4. Box Model&lt;/b&gt; : 요소의 부피감을 결정하는 개념 (웹페이지 레이아웃, 디자인 설계 시 ) &lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efwWca/btsJZ68O68w/uT8Mk7k19UbG6fpFY89HCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efwWca/btsJZ68O68w/uT8Mk7k19UbG6fpFY89HCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efwWca/btsJZ68O68w/uT8Mk7k19UbG6fpFY89HCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefwWca%2FbtsJZ68O68w%2FuT8Mk7k19UbG6fpFY89HCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;281&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;281&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;width&lt;/b&gt; : 요소의 너비 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;height&lt;/b&gt; : 요소의 높이 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;background-color&lt;/b&gt; : 박스 모델 색 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;border&lt;/b&gt; : 경계선 스타일 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;margin&lt;/span&gt;&lt;/b&gt; : 경계선 바깥 여백 지정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOH2NA/btsJZMJDvWD/h5uyjAX8sa2u4U6DuLEkGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOH2NA/btsJZMJDvWD/h5uyjAX8sa2u4U6DuLEkGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOH2NA/btsJZMJDvWD/h5uyjAX8sa2u4U6DuLEkGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOH2NA%2FbtsJZMJDvWD%2Fh5uyjAX8sa2u4U6DuLEkGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;134&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWaNzB/btsJ0eevELb/Mz7EuoB725D3F5SCZ2K6q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWaNzB/btsJ0eevELb/Mz7EuoB725D3F5SCZ2K6q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWaNzB/btsJ0eevELb/Mz7EuoB725D3F5SCZ2K6q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWaNzB%2FbtsJ0eevELb%2FMz7EuoB725D3F5SCZ2K6q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;303&quot; height=&quot;115&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;115&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;padding&lt;/span&gt;&lt;/b&gt; : 경계선의 안쪽 여백 지정&lt;/span&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;458&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1d4eR/btsJY5jaMX9/nIhPTlKwV4OxThkjRnpzv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1d4eR/btsJY5jaMX9/nIhPTlKwV4OxThkjRnpzv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1d4eR/btsJY5jaMX9/nIhPTlKwV4OxThkjRnpzv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1d4eR%2FbtsJY5jaMX9%2FnIhPTlKwV4OxThkjRnpzv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;129&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;129&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;346&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CVcO3/btsJ0df2PFz/uBc8d8VVViZETJNGl72Ow1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CVcO3/btsJ0df2PFz/uBc8d8VVViZETJNGl72Ow1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CVcO3/btsJ0df2PFz/uBc8d8VVViZETJNGl72Ow1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCVcO3%2FbtsJ0df2PFz%2FuBc8d8VVViZETJNGl72Ow1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;132&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;132&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;b&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Sans Light';&quot;&gt;Border-style&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Sans Light';&quot;&gt;테두리 속성&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (1)&lt;b&gt; border-width&lt;/b&gt; : 테두리 두께 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; (2) border-colpr : 테두리 색상 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; (3) border-radius : 테두리 모서리를 둥굴게 만드는 속성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* border-radius: 50px; &amp;rarr; 원형&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Box-sizing&lt;/span&gt; : 요소의 크기를 화면에 표시하는 방식&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (1) &lt;b&gt;content-box&lt;/b&gt; :&amp;nbsp; 내가 설정한 너비 &amp;rarr; 컨텐츠의 너비&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;컨텐츠 영역만을 크기로 삼는 속성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;padding, border값이 들어가면 들어간만큼 크기가 커짐&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (2)&lt;b&gt; border-box&lt;/b&gt; : 내가 설정한 너비 &amp;rarr; border 안쪽까지의 너비&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content + padding + border = 내가 설정한 너비&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;padding, border 값이 들어가도 크기가 커지지 않는다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;실습 문제: padding을 이용해 신호등 만들기&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728460851950&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        #black {
            width: 120px;
            height: 360px;
            background-color: black;
            box-sizing: border-box;
            border-radius: 30px;
            padding: 10px;
            /* 경계선 처리 ==&amp;gt; radius */
            /* box-sizing ==&amp;gt; border-box */
            /* 안쪽여백 처리 ==&amp;gt; padding ==&amp;gt; 10px */
        }

        div&amp;gt;div{
            width: 100px;
            height: 100px;
            border-radius: 50px;
            margin-top: 10px;
        }
        /*  각 색상은 경계선을 기준으로 바깥쪽 여백을 가지고 있다. ==&amp;gt; 위쪽
            바깥 여백 ==&amp;gt; margin */

        #red {
            background-color: red;
            
        }
        #yellow {
            background-color: yellow;
         
        }

        #green {
            background-color: green;
        }


    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id = &quot;black&quot;&amp;gt;
        &amp;lt;div id =&quot;red&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id=&quot;yellow&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id = &quot;green&quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;

   
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWxBI/btsJZRdmEtq/IsQNRAFoJEaA2fsfGPhTmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWxBI/btsJZRdmEtq/IsQNRAFoJEaA2fsfGPhTmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWxBI/btsJZRdmEtq/IsQNRAFoJEaA2fsfGPhTmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWxBI%2FbtsJZRdmEtq%2FIsQNRAFoJEaA2fsfGPhTmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;372&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;372&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;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&amp;nbsp;5. Position : &lt;/b&gt;자유자재로 요소의 위치를 배치하는 속성&lt;/span&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;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;static&lt;/b&gt; : 태그가 위에서 아래로 순서대로 배치 (기본값)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;relative&lt;/b&gt; : 초기 위치 상태에서 상하좌우로 위치 이동&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;absolute&lt;/b&gt; : 절대 위치 좌표 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;fixed&lt;/b&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; 1) 위치 속성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1VEmr/btsJZRR0jhJ/q8k02P1ztCkZRxvzkmmZS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1VEmr/btsJZRR0jhJ/q8k02P1ztCkZRxvzkmmZS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1VEmr/btsJZRR0jhJ/q8k02P1ztCkZRxvzkmmZS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1VEmr%2FbtsJZRR0jhJ%2Fq8k02P1ztCkZRxvzkmmZS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;293&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;position : static;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;태그가 순서대로 배치 (기본값)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;position : relative;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;static의 원래 위치부터 계산함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;top, bottom, left, right로 위치를 설정함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;lt;실습&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728461964810&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        div {
            width: 200px;
            height: 200px;
            position: relative;
            /* relative : 요소의 원래위치 (static)를 기준으로 상대적인 위치를 선정 */
        }

        #orange {
            background-color: orange;
            left: 100px;
            z-index: 3;
            /*  z-index : 화면에 요소가 쌓이는 순서
                          숫자가 클수록 요소가 앞으로 나옴
             */
        }

        #tomato {
            background-color: tomato;
            left: 200px;
            bottom: 100px;
            z-index: 2;
        }

        #green {
            background-color: green;
            left: 100px;
            bottom: 200px;
        }


    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;!-- #orange+#tomato+#green =&amp;gt; 이렇게도 div 만들 수 있음 --&amp;gt;
    &amp;lt;div id=&quot;orange&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;tomato&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;green&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8lQJF/btsJZQMjtIj/jVQCijulAn5rjjN5rfxkZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8lQJF/btsJZQMjtIj/jVQCijulAn5rjjN5rfxkZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8lQJF/btsJZQMjtIj/jVQCijulAn5rjjN5rfxkZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8lQJF%2FbtsJZQMjtIj%2FjVQCijulAn5rjjN5rfxkZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;357&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&amp;nbsp;z-index&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;요소의 &lt;span style=&quot;background-color: #99cefa;&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: 'Noto Sans Light';&quot;&gt;&amp;nbsp;* 높은 숫자일수록 화면의 앞에 지정&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;position:absolute;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;static속성을 가지고 있지 않은 부모 기준으로 움직임.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;부모 중 포지션이 relative, absolute, fixed인 태그가 없다면 가장 위 태그(body)가 기준이 됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;position:fixed;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 브라우저 화면의 상대위치를 서정함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;화면이바뀌어도 고정된 위치를 설정할 수 있고, 상대 요소의 영향을 받지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;lt;실습문제 position을 이용해 신호등을 만들어보자&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728462492525&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        #black {
            background-color: black;
            width: 120px;
            height: 360px;
            position: absolute;
            border-radius: 30px ;

        }

        div&amp;gt;div {
            width: 100px;
            height: 100px;
            border-radius: 50px;
            position: relative;
            left: 10px;
            
        }

        #red {
            background-color: red;
            top: 20px; 
        }

        #yellow{
            background-color: yellow;
            top: 30px; 
        }

        #green {
            background-color: green;
            top: 40px;
        }
/* ver2
        #black {
            background-color: black;
            width: 120px;
            height: 360px;
            position: absolute;
            border-radius: 20px ;
        }

        .circle {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            position: absolute;
            left : 10px;
        }

        #red{
            background-color: red;
            top: 20px;
        }

        #yellow{
            background-color: yellow;
            top: 130px;
        }

        #green{
            background-color: green;
            bottom: 20px;

        } */


    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    
    &amp;lt;div id = &quot;black&quot;&amp;gt;
         &amp;lt;div id = &quot;red&quot;&amp;gt;&amp;lt;/div&amp;gt;
         &amp;lt;div id = &quot;yellow&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id = &quot;green&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;!-- &amp;lt;p&amp;gt;ver2&amp;lt;/p&amp;gt;
    &amp;lt;div id = &quot;black&quot;&amp;gt;
        &amp;lt;div id = &quot;red&quot; class=&quot;circle&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id = &quot;yellow&quot; class=&quot;circle&quot;&amp;gt;&amp;lt;/div&amp;gt;
       &amp;lt;div id = &quot;green&quot; class=&quot;circle&quot;&amp;gt;&amp;lt;/div&amp;gt;
   &amp;lt;/div&amp;gt; --&amp;gt;


&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;121&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xLiIJ/btsJZllAecp/WuMzPiWomhsy09XwsufGk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xLiIJ/btsJZllAecp/WuMzPiWomhsy09XwsufGk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xLiIJ/btsJZllAecp/WuMzPiWomhsy09XwsufGk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxLiIJ%2FbtsJZllAecp%2FWuMzPiWomhsy09XwsufGk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;121&quot; height=&quot;275&quot; data-origin-width=&quot;121&quot; data-origin-height=&quot;275&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;6. Flex&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 1) display:flex &lt;/b&gt;:레이아웃을 배치하는 전용 기능&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- Flex Container : flex의 영향을 받는 전체 공간&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- Flex Item : 속성에 따라 배치되는 것&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tIdYM/btsJZvaEIEe/YQ1LzUH3Y6MuqA4vzSOrq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tIdYM/btsJZvaEIEe/YQ1LzUH3Y6MuqA4vzSOrq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tIdYM/btsJZvaEIEe/YQ1LzUH3Y6MuqA4vzSOrq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIdYM%2FbtsJZvaEIEe%2FYQ1LzUH3Y6MuqA4vzSOrq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;226&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &lt;b&gt;&amp;nbsp; 2) flex-direction&lt;/b&gt; : 아이템들이 배치되는 축의 방향을 결정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (1) row : 행 방향(가로) 배치 (기본값)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (2) row-reverse : 역순으로 가로배치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (3) column : 열 방향(세로) 배치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (4) column-reverse : 역순으로 세로배치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;3) flex-wrap&lt;/b&gt; : 아이템이 컨테이너의 한 줄을 넘어설 때 줄 바꿈 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (1) nowrap : 줄 바꿈 하지 않음(기본값)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (2) wrap : 줄 바꿈 진행&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (3) wrap-reverse : 아이템 역순 배치 후 줄 바꿈&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;7. 스타일 선언 방식&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;(1) 인라인 스타일 방식&lt;/b&gt; : 행 방향(가로) 배치 (기본값)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;(2) 내부 스타일 방식&lt;/b&gt; : 역순으로 가로배치&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr; style 태그를 사용해서 css 적용(html과 css의 완전한 분리라고는 보기 어려움)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728464088175&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        /* 2. 내부 스타일 방식 : style태그를 사용해서 css 적용 
        완전한 분리로 보기는 어려움*/
        #no2 {
            color: blue;
            background-color: yellowgreen;

        }
    &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1 id=&quot;no1&quot; style=&quot;color: red; background-color: black;&quot;&amp;gt;1. 인라인 방식&amp;lt;/h1&amp;gt;
    &amp;lt;h1 id=&quot;no2&quot;&amp;gt;2. 내부 스타일 방식&amp;lt;/h1&amp;gt;
    &amp;lt;h1 id=&quot;no3&quot;&amp;gt;3. 외부 스타일 방식&amp;lt;/h1&amp;gt;
    &amp;lt;h1 id=&quot;no4&quot;&amp;gt;4. import 방식&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;(3) 외부 스타일 방식&lt;/b&gt; : 열 방향(세로) 배치&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; link태그를 사용해서 외부 css 적용 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; link태그가 쓰인 순서대로 적용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728464107671&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;./Ex20_외부스타일방식.css&quot;&amp;gt;
&amp;lt;/style&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;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 확장자=CSS&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728464132113&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#no3 {
    color: tomato;
    background-color: aquamarine;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt; (4) import 방식&lt;/b&gt; : 역순으로 세로배치&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; style태그 내에 @import를 사용해서 css 적용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;css적용 순서가 예측 불가능&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728464214079&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
        @import url('./Ex20_import방식.CSS');
        /* ./ 대신 =&amp;gt; ctrl + space도 가능 */
     &amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1728464270830&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#no4 {
    color: orange;
    background-color: violet;
}
@import url('./Ex20_선언방식.CSS');&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;※ 우선 순위 : 인라인 &amp;gt; 내부, 외부, import&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;그러기에 인라인을 가장 나중에 선언!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;위 자료는 스마트인재개발원 수업 내용을 정리한 내용입니다.&lt;/span&gt;&lt;/p&gt;</description>
      <author>bb1714</author>
      <guid isPermaLink="true">https://bb1714.tistory.com/10</guid>
      <comments>https://bb1714.tistory.com/10#entry10comment</comments>
      <pubDate>Wed, 9 Oct 2024 17:59:31 +0900</pubDate>
    </item>
  </channel>
</rss>