<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>언제나 휴일</title>
    <link>https://ehclub.co.kr/</link>
    <description>초중고 교육 및 여행, 프로그래밍에 관한 글을 집필하여 온라인으로 무료 게시합니다.</description>
    <language>ko</language>
    <pubDate>Sat, 11 Apr 2026 14:32:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>언제나휴일</managingEditor>
    <image>
      <title>언제나 휴일</title>
      <url>https://t1.daumcdn.net/cfile/tistory/99DE3A3F5C63875123</url>
      <link>https://ehclub.co.kr</link>
    </image>
    <item>
      <title>쌍둥이 판다 언니 루이바오는 '슬기로운 보물'이예요.</title>
      <link>https://ehclub.co.kr/3573</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2023년&amp;nbsp;7월&amp;nbsp;7일&amp;nbsp;에버랜드에서&amp;nbsp;엄마&amp;nbsp;아이바오와&amp;nbsp;아빠&amp;nbsp;러바오&amp;nbsp;사이에서&amp;nbsp;태어난&amp;nbsp;판다는&amp;nbsp;쌍둥이&amp;nbsp;판다입니다. &lt;br /&gt;루이바오와&amp;nbsp;후이바오가&amp;nbsp;그&amp;nbsp;주인공이죠.&amp;nbsp;푸바오의&amp;nbsp;동생&amp;nbsp;판다들이죠. &lt;br /&gt;&lt;br /&gt;쌍둥이&amp;nbsp;판다&amp;nbsp;중에&amp;nbsp;언니는&amp;nbsp;루이바오에요.&amp;nbsp; &lt;br /&gt;태어날&amp;nbsp;때는&amp;nbsp;180g의&amp;nbsp;아주&amp;nbsp;작은&amp;nbsp;사랑스러운&amp;nbsp;판다였죠.&amp;nbsp; &lt;br /&gt;루이바오라는&amp;nbsp;이름은&amp;nbsp;'슬기로운&amp;nbsp;보물'이라는&amp;nbsp;뜻을&amp;nbsp;가지고&amp;nbsp;있어요. &lt;br /&gt;동생&amp;nbsp;후이바오에&amp;nbsp;비해&amp;nbsp;상대적으로&amp;nbsp;얌전하고&amp;nbsp;차분한&amp;nbsp;성격이예요.&amp;nbsp; &lt;br /&gt;그리고&amp;nbsp;2025년&amp;nbsp;9월부터&amp;nbsp;엄마&amp;nbsp;아이바오와&amp;nbsp;분리하여&amp;nbsp;동생&amp;nbsp;후이바오와&amp;nbsp;함께&amp;nbsp;'판다&amp;nbsp;세컨하우스'에서&amp;nbsp;독립&amp;nbsp;생활을&amp;nbsp;하고&amp;nbsp;있어요. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/WEXFISM690o&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/gudDX/dJMb9aKAJ1t/lb3bZ0yR8Y5ZhKQi0MEG7k/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720,https://scrap.kakaocdn.net/dn/bb3Kjk/dJMb86nTaV1/Uvej7wCaxvrCwx1UQCK6A0/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720,https://scrap.kakaocdn.net/dn/bMON4H/dJMb83SesG9/24Ozy3EqRwSMWrLGDusy7k/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720&quot; data-video-width=&quot;405&quot; data-video-height=&quot;720&quot; data-video-origin-width=&quot;405&quot; data-video-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;슬기로운보물 루이바오 in Everland #판다월드#쌍둥이판다#귀여운동물&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/WEXFISM690o&quot; width=&quot;405&quot; height=&quot;720&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;슬기로운 보물 루이바오&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/에버랜드 판다월드</category>
      <category>귀여운동물</category>
      <category>루이바오</category>
      <category>슬기로운보물</category>
      <category>쌍두이판다</category>
      <category>언니</category>
      <category>에버랜드</category>
      <category>판다가족</category>
      <category>판다월드</category>
      <category>푸바오동생</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3573</guid>
      <comments>https://ehclub.co.kr/3573#entry3573comment</comments>
      <pubDate>Sun, 8 Feb 2026 10:00:11 +0900</pubDate>
    </item>
    <item>
      <title>기쁨을 주는 보물, 아빠 판다 러바오</title>
      <link>https://ehclub.co.kr/3572</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아빠&amp;nbsp;판다&amp;nbsp;러바오(Le&amp;nbsp;Bao)는&amp;nbsp;엄마&amp;nbsp;판다&amp;nbsp;아이바오와&amp;nbsp;함께&amp;nbsp;푸바오를&amp;nbsp;낳았습니다. &lt;br /&gt;그리고&amp;nbsp;쌍둥이&amp;nbsp;자매인&amp;nbsp;루이바오,&amp;nbsp;후이바오를&amp;nbsp;둔&amp;nbsp;든든한&amp;nbsp;아빠&amp;nbsp;판다죠. &lt;br /&gt;&lt;br /&gt;2012년&amp;nbsp;7월&amp;nbsp;28일&amp;nbsp;생이며&amp;nbsp;한중&amp;nbsp;양국&amp;nbsp;간&amp;nbsp;협의에&amp;nbsp;의해&amp;nbsp;2031년까지&amp;nbsp;에버랜드에&amp;nbsp;머물&amp;nbsp;것으로&amp;nbsp;알려져&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;러바오는&amp;nbsp;'기쁨을&amp;nbsp;주는&amp;nbsp;보물'이라는&amp;nbsp;뜻으로&amp;nbsp;밝은&amp;nbsp;성격에&amp;nbsp;장난기가&amp;nbsp;많은&amp;nbsp;자이언트&amp;nbsp;판다입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_OUPy0Sf9Xk&quot; width=&quot;429&quot; height=&quot;763&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/에버랜드 판다월드</category>
      <category>러바오</category>
      <category>아빠판다</category>
      <category>에버랜드</category>
      <category>판다월드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3572</guid>
      <comments>https://ehclub.co.kr/3572#entry3572comment</comments>
      <pubDate>Sun, 4 Jan 2026 03:46:44 +0900</pubDate>
    </item>
    <item>
      <title>사랑스러운 보물, 엄마 판다 아이바오</title>
      <link>https://ehclub.co.kr/3571</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;귀여운&amp;nbsp;엄마&amp;nbsp;판다인&amp;nbsp;아이바오는&amp;nbsp;대한민국&amp;nbsp;에버랜드&amp;nbsp;주토피아의&amp;nbsp;판다월드에&amp;nbsp;살고&amp;nbsp;있어요. &lt;br /&gt;&lt;br /&gt;2013년&amp;nbsp;7월&amp;nbsp;13일에&amp;nbsp;중국&amp;nbsp;야안&amp;nbsp;비펑샤에서&amp;nbsp;태어났으며&amp;nbsp;아빠&amp;nbsp;판다&amp;nbsp;러바오&amp;nbsp;사이에서&amp;nbsp;인기&amp;nbsp;최고인&amp;nbsp;푸바오를&amp;nbsp;낳았습니다. &lt;br /&gt;그리고&amp;nbsp;푸바오&amp;nbsp;동생으로&amp;nbsp;쌍둥이&amp;nbsp;자매인&amp;nbsp;루이바오와&amp;nbsp;후이바오를&amp;nbsp;낳았지요. &lt;br /&gt;&lt;br /&gt;2026년&amp;nbsp;현재&amp;nbsp;푸바오는&amp;nbsp;중국에&amp;nbsp;돌아갔고&amp;nbsp;아빠판다인&amp;nbsp;러바오와&amp;nbsp;쌍두이&amp;nbsp;판다인&amp;nbsp;루이바오와&amp;nbsp;후이바오와&amp;nbsp;함께&amp;nbsp;에버랜드에&amp;nbsp;살고&amp;nbsp;있어요. &lt;br /&gt;&lt;br /&gt;참고로&amp;nbsp;아이바오는&amp;nbsp;'사랑스러운&amp;nbsp;보물'이라는&amp;nbsp;뜻을&amp;nbsp;가지고&amp;nbsp;있어요.&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/cWlfnktgLKA&quot; width=&quot;429&quot; height=&quot;763&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/에버랜드 판다월드</category>
      <category>등장</category>
      <category>먹방</category>
      <category>아이바오</category>
      <category>엄마판다</category>
      <category>에버랜드</category>
      <category>잠자기</category>
      <category>판다월드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3571</guid>
      <comments>https://ehclub.co.kr/3571#entry3571comment</comments>
      <pubDate>Thu, 1 Jan 2026 17:54:15 +0900</pubDate>
    </item>
    <item>
      <title>코타키나발루 요트에서 Sunset 감상[말레이시아 여행]</title>
      <link>https://ehclub.co.kr/3569</link>
      <description>&lt;p id=&quot;SE-866b9388-6242-4389-b162-15899c7c57d5&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;코타키나발루는 말레이시아의 아름다운 도시입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-08946e8f-878c-439a-9678-efa72ab3fdad&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;키나발루 산이 유명하여 코타키나발루라고 하네요. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a27e1e32-e330-4752-b0df-06be9ba2ed66&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;하지만 우리는 대부분 해변에서 일정을 보내죠. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-41235dbd-ee93-452d-bf3f-39eff78b1f3c&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;그 중에 빼 놓을 수 없는 게 Sunset이죠. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8173f3d1-be5e-468b-ad30-b408eea6d727&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;그리고 요트에서 Sunset은 그 중에 일품입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f9a2ebf8-02e8-4fd5-a9c0-f82c9bde59b7&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;같이 한 번 보시죠.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;&lt;a href=&quot;https://youtu.be/jZobaiwjUnE&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/jZobaiwjUnE&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=jZobaiwjUnE&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/OthAZ/hyXSC8Ku1B/r7ILKKrmTW3V0zGBCx6KV1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cCawTh/hyXWx5N8Db/dTYuQpgRYyzMrHo9vvhOSk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;코타키나발루 요트에서 Sunset  감상 [말레이시아 여행]#럭셔리하게&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/jZobaiwjUnE&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/해외여행</category>
      <category>Sunset</category>
      <category>가볼만한곳</category>
      <category>럭셔리</category>
      <category>말레이시아</category>
      <category>여행</category>
      <category>요트</category>
      <category>코타키나발루</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3569</guid>
      <comments>https://ehclub.co.kr/3569#entry3569comment</comments>
      <pubDate>Fri, 10 Jan 2025 13:00:59 +0900</pubDate>
    </item>
    <item>
      <title>Yeonginsan Natural Forest [Asan city]</title>
      <link>https://ehclub.co.kr/3570</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=_K7S6htRfAc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/diGEbJ/hyXWsqqVgk/OWKhA0Rl7Ky0J0Jv1zECn0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/mYrx6/hyXWnbCIS2/TrMrxKuzAkhuLgJRmsUSq0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;When you want to relieve your physical and mental fatigue, go to Younginsan Natural Forest!&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_K7S6htRfAc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;Yeonginsan Natural Forest [Asan city]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Y01.JPG&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwSsGC/btsLCD64Lvs/vuWDqQXOU4m1fF796TuFkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwSsGC/btsLCD64Lvs/vuWDqQXOU4m1fF796TuFkK/img.jpg&quot; data-alt=&quot;Yeonginsan Natural Forest&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwSsGC/btsLCD64Lvs/vuWDqQXOU4m1fF796TuFkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwSsGC%2FbtsLCD64Lvs%2FvuWDqQXOU4m1fF796TuFkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3200&quot; height=&quot;2128&quot; data-filename=&quot;Y01.JPG&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Yeonginsan Natural Forest&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageslideblock alignCenter&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/cVEFeb/btsLCY4ag9U/UY1v8y5OZbMTISpuKDw1FK/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/U4lbJ/btsLDd07ckv/dCUKPXpPNPX0aiaunkt8K0/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/nErH3/btsLDIzyERQ/h62vk05Wxvm3ssqg8Sk9s0/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/PEajB/btsLEotPjXJ/kIhRJKYw3KZKrHACzhZA01/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/lKPk9/btsLE3pcnpA/XyOBMkDwtUW5ftUWWWlkk1/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/b6B6tp/btsLDmDxz7D/fjNKg1VP4iJw5KDYJBidQ0/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/xUgFy/btsLC7zOyfW/OY2huEBVMUHFStT5cXYs6K/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/U0Zl5/btsLE3JuYlL/wYQkQvyk4wH7DqK8wLEffk/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/nfaiy/btsLFd6d89W/Lpur924Zt525uLvTA6YCIK/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/boxA6D/btsLCZ282fF/tXQfL7MNJkaOZ9l4kW669K/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/wHKbQ/btsLDeyRWHM/EvRcwYykcOrBdARzwAbOHK/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/n3i4M/btsLDwF8xST/f9WgDkrPfVvHwZ7YJKng8K/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/cJlq0H/btsLEN7W2y5/J9hIVYGbTbdKXuHIuTYgh1/img.jpg&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/bhFgXf/btsLDeMtw0X/tn7e7ErzvYwiCFACNP6h81/img.jpg&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVEFeb/btsLCY4ag9U/UY1v8y5OZbMTISpuKDw1FK/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/cVEFeb/btsLCY4ag9U/UY1v8y5OZbMTISpuKDw1FK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVEFeb/btsLCY4ag9U/UY1v8y5OZbMTISpuKDw1FK/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVEFeb%2FbtsLCY4ag9U%2FUY1v8y5OZbMTISpuKDw1FK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U4lbJ/btsLDd07ckv/dCUKPXpPNPX0aiaunkt8K0/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/U4lbJ/btsLDd07ckv/dCUKPXpPNPX0aiaunkt8K0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U4lbJ/btsLDd07ckv/dCUKPXpPNPX0aiaunkt8K0/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU4lbJ%2FbtsLDd07ckv%2FdCUKPXpPNPX0aiaunkt8K0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nErH3/btsLDIzyERQ/h62vk05Wxvm3ssqg8Sk9s0/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/nErH3/btsLDIzyERQ/h62vk05Wxvm3ssqg8Sk9s0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nErH3/btsLDIzyERQ/h62vk05Wxvm3ssqg8Sk9s0/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnErH3%2FbtsLDIzyERQ%2Fh62vk05Wxvm3ssqg8Sk9s0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PEajB/btsLEotPjXJ/kIhRJKYw3KZKrHACzhZA01/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/PEajB/btsLEotPjXJ/kIhRJKYw3KZKrHACzhZA01/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PEajB/btsLEotPjXJ/kIhRJKYw3KZKrHACzhZA01/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPEajB%2FbtsLEotPjXJ%2FkIhRJKYw3KZKrHACzhZA01%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lKPk9/btsLE3pcnpA/XyOBMkDwtUW5ftUWWWlkk1/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/lKPk9/btsLE3pcnpA/XyOBMkDwtUW5ftUWWWlkk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lKPk9/btsLE3pcnpA/XyOBMkDwtUW5ftUWWWlkk1/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlKPk9%2FbtsLE3pcnpA%2FXyOBMkDwtUW5ftUWWWlkk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6B6tp/btsLDmDxz7D/fjNKg1VP4iJw5KDYJBidQ0/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/b6B6tp/btsLDmDxz7D/fjNKg1VP4iJw5KDYJBidQ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6B6tp/btsLDmDxz7D/fjNKg1VP4iJw5KDYJBidQ0/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6B6tp%2FbtsLDmDxz7D%2FfjNKg1VP4iJw5KDYJBidQ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUgFy/btsLC7zOyfW/OY2huEBVMUHFStT5cXYs6K/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/xUgFy/btsLC7zOyfW/OY2huEBVMUHFStT5cXYs6K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUgFy/btsLC7zOyfW/OY2huEBVMUHFStT5cXYs6K/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUgFy%2FbtsLC7zOyfW%2FOY2huEBVMUHFStT5cXYs6K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U0Zl5/btsLE3JuYlL/wYQkQvyk4wH7DqK8wLEffk/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/U0Zl5/btsLE3JuYlL/wYQkQvyk4wH7DqK8wLEffk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U0Zl5/btsLE3JuYlL/wYQkQvyk4wH7DqK8wLEffk/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU0Zl5%2FbtsLE3JuYlL%2FwYQkQvyk4wH7DqK8wLEffk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nfaiy/btsLFd6d89W/Lpur924Zt525uLvTA6YCIK/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/nfaiy/btsLFd6d89W/Lpur924Zt525uLvTA6YCIK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nfaiy/btsLFd6d89W/Lpur924Zt525uLvTA6YCIK/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnfaiy%2FbtsLFd6d89W%2FLpur924Zt525uLvTA6YCIK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boxA6D/btsLCZ282fF/tXQfL7MNJkaOZ9l4kW669K/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/boxA6D/btsLCZ282fF/tXQfL7MNJkaOZ9l4kW669K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boxA6D/btsLCZ282fF/tXQfL7MNJkaOZ9l4kW669K/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboxA6D%2FbtsLCZ282fF%2FtXQfL7MNJkaOZ9l4kW669K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wHKbQ/btsLDeyRWHM/EvRcwYykcOrBdARzwAbOHK/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/wHKbQ/btsLDeyRWHM/EvRcwYykcOrBdARzwAbOHK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wHKbQ/btsLDeyRWHM/EvRcwYykcOrBdARzwAbOHK/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwHKbQ%2FbtsLDeyRWHM%2FEvRcwYykcOrBdARzwAbOHK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3i4M/btsLDwF8xST/f9WgDkrPfVvHwZ7YJKng8K/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/n3i4M/btsLDwF8xST/f9WgDkrPfVvHwZ7YJKng8K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3i4M/btsLDwF8xST/f9WgDkrPfVvHwZ7YJKng8K/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3i4M%2FbtsLDwF8xST%2Ff9WgDkrPfVvHwZ7YJKng8K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJlq0H/btsLEN7W2y5/J9hIVYGbTbdKXuHIuTYgh1/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/cJlq0H/btsLEN7W2y5/J9hIVYGbTbdKXuHIuTYgh1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJlq0H/btsLEN7W2y5/J9hIVYGbTbdKXuHIuTYgh1/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJlq0H%2FbtsLEN7W2y5%2FJ9hIVYGbTbdKXuHIuTYgh1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhFgXf/btsLDeMtw0X/tn7e7ErzvYwiCFACNP6h81/img.jpg&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bhFgXf/btsLDeMtw0X/tn7e7ErzvYwiCFACNP6h81/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhFgXf/btsLDeMtw0X/tn7e7ErzvYwiCFACNP6h81/img.jpg&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhFgXf%2FbtsLDeMtw0X%2Ftn7e7ErzvYwiCFACNP6h81%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;2128&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;span data-index=&quot;1&quot;&gt;1&lt;/span&gt;&lt;span data-index=&quot;2&quot;&gt;2&lt;/span&gt;&lt;span data-index=&quot;3&quot;&gt;3&lt;/span&gt;&lt;span data-index=&quot;4&quot;&gt;4&lt;/span&gt;&lt;span data-index=&quot;5&quot;&gt;5&lt;/span&gt;&lt;span data-index=&quot;6&quot;&gt;6&lt;/span&gt;&lt;span data-index=&quot;7&quot;&gt;7&lt;/span&gt;&lt;span data-index=&quot;8&quot;&gt;8&lt;/span&gt;&lt;span data-index=&quot;9&quot;&gt;9&lt;/span&gt;&lt;span data-index=&quot;10&quot;&gt;10&lt;/span&gt;&lt;span data-index=&quot;11&quot;&gt;11&lt;/span&gt;&lt;span data-index=&quot;12&quot;&gt;12&lt;/span&gt;&lt;span data-index=&quot;13&quot;&gt;13&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Gallery&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>여행/Travel in Korea</category>
      <category>asan city</category>
      <category>Republic of Korea</category>
      <category>travel</category>
      <category>yeonginsan natural forest</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3570</guid>
      <comments>https://ehclub.co.kr/3570#entry3570comment</comments>
      <pubDate>Sun, 5 Jan 2025 07:32:24 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 잊지말자. #유관순길#역사문화둘레길 2코스 2.17km #유관순열사기념관#유관순생가지#조병옥생가지</title>
      <link>https://ehclub.co.kr/3568</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=NmL5NNhIY2s&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cLO5iO/hyXWogFO98/vvzapPP6ToSeMvWNaIUTak/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=694_320_738_368,https://scrap.kakaocdn.net/dn/bT6QI4/hyXSwtSO7J/IwEUPB9i37DRIIce691wBK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=694_320_738_368&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 잊지말자. #유관순길#역사문화둘레길 2코스 2.17km #유관순열사기념관#유관순생가지#&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/NmL5NNhIY2s&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;유관순길 동영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;역사문화둘레길 산책 2코스로 유관순길이라 부릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DSC_6280.JPG&quot; data-origin-width=&quot;4928&quot; data-origin-height=&quot;3280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0lt1c/btsLCmJWsjd/Dh9ojBBQlVxEKlckl2lW60/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0lt1c/btsLCmJWsjd/Dh9ojBBQlVxEKlckl2lW60/img.jpg&quot; data-alt=&quot;역사문화둘레길&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0lt1c/btsLCmJWsjd/Dh9ojBBQlVxEKlckl2lW60/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0lt1c%2FbtsLCmJWsjd%2FDh9ojBBQlVxEKlckl2lW60%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4928&quot; height=&quot;3280&quot; data-filename=&quot;DSC_6280.JPG&quot; data-origin-width=&quot;4928&quot; data-origin-height=&quot;3280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;역사문화둘레길&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;유관순사적지에서 출발하여 유관순생가지를 거쳐 조병옥생가지까지 2.17km입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;둘레길에 인도가 좁은 곳이 많은 것이 너무 소홀한 것은 아닌지 독립운동가들에게 미안합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%B3%91%EC%B2%9C%EB%A9%B4%20%ED%83%91%EC%9B%90%EB%A6%AC%20252&amp;amp;addtype=1&amp;amp;confirmid=8036605&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A568845%2C%22mapCenterY%22%3A906023%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A568847%2C%22y%22%3A906025%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%EA%B8%B0%EB%85%90%EA%B4%80%22%2C%22confirmid%22%3A8036605%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=568845&amp;amp;mapY=906023&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413136000&amp;amp;tel=041-564-1223&amp;amp;title=%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%EA%B8%B0%EB%85%90%EA%B4%80&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735771312826&quot; id=&quot;maps_1735771312826&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%B3%91%EC%B2%9C%EB%A9%B4%20%ED%83%91%EC%9B%90%EB%A6%AC%20252&amp;amp;addtype=1&amp;amp;confirmid=8036605&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A568845%2C%22mapCenterY%22%3A906023%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A568847%2C%22y%22%3A906025%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%EA%B8%B0%EB%85%90%EA%B4%80%22%2C%22confirmid%22%3A8036605%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=568845&amp;amp;mapY=906023&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413136000&amp;amp;tel=041-564-1223&amp;amp;title=%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%EA%B8%B0%EB%85%90%EA%B4%80&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=568845%2C906023&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A568847%2C906025&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%B3%91%EC%B2%9C%EB%A9%B4%20%EC%9A%A9%EB%91%90%EB%A6%AC%20338-1&amp;amp;addtype=1&amp;amp;confirmid=8041435&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A570750%2C%22mapCenterY%22%3A905368%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A570750%2C%22y%22%3A905371%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%20%EC%83%9D%EA%B0%80%22%2C%22confirmid%22%3A8041435%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=570750&amp;amp;mapY=905368&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413136000&amp;amp;tel=&amp;amp;title=%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%20%EC%83%9D%EA%B0%80&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735771339160&quot; id=&quot;maps_1735771339160&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%B3%91%EC%B2%9C%EB%A9%B4%20%EC%9A%A9%EB%91%90%EB%A6%AC%20338-1&amp;amp;addtype=1&amp;amp;confirmid=8041435&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A570750%2C%22mapCenterY%22%3A905368%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A570750%2C%22y%22%3A905371%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%20%EC%83%9D%EA%B0%80%22%2C%22confirmid%22%3A8041435%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=570750&amp;amp;mapY=905368&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413136000&amp;amp;tel=&amp;amp;title=%EC%9C%A0%EA%B4%80%EC%88%9C%EC%97%B4%EC%82%AC%20%EC%83%9D%EA%B0%80&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=570750%2C905368&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A570750%2C905371&quot;&gt;&lt;/iframe&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&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%B3%91%EC%B2%9C%EB%A9%B4%20%EC%9A%A9%EB%91%90%EB%A6%AC%20261-6&amp;amp;addtype=1&amp;amp;confirmid=25032309&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A570270%2C%22mapCenterY%22%3A903748%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A570273%2C%22y%22%3A903753%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%A1%B0%EB%B3%91%EC%98%A5%EB%B0%95%EC%82%AC%20%EC%83%9D%EA%B0%80%22%2C%22confirmid%22%3A25032309%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=570270&amp;amp;mapY=903748&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413136000&amp;amp;tel=&amp;amp;title=%EC%A1%B0%EB%B3%91%EC%98%A5%EB%B0%95%EC%82%AC%20%EC%83%9D%EA%B0%80&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735771375788&quot; id=&quot;maps_1735771375788&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%B3%91%EC%B2%9C%EB%A9%B4%20%EC%9A%A9%EB%91%90%EB%A6%AC%20261-6&amp;amp;addtype=1&amp;amp;confirmid=25032309&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A570270%2C%22mapCenterY%22%3A903748%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A570273%2C%22y%22%3A903753%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%A1%B0%EB%B3%91%EC%98%A5%EB%B0%95%EC%82%AC%20%EC%83%9D%EA%B0%80%22%2C%22confirmid%22%3A25032309%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=570270&amp;amp;mapY=903748&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413136000&amp;amp;tel=&amp;amp;title=%EC%A1%B0%EB%B3%91%EC%98%A5%EB%B0%95%EC%82%AC%20%EC%83%9D%EA%B0%80&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=570270%2C903748&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A570273%2C903753&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;배경음악 출처 compose&amp;amp;illust - 50mang &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;MP3 Download - &lt;a href=&quot;https://50mang.bandcamp.com/track/--3&quot;&gt;https://50mang.bandcamp.com/track/--3&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>역사문화둘레길</category>
      <category>유관순생가지</category>
      <category>유관순열사기념관</category>
      <category>조병옥생가지</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3568</guid>
      <comments>https://ehclub.co.kr/3568#entry3568comment</comments>
      <pubDate>Thu, 2 Jan 2025 07:43:14 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 독립기념관 산책</title>
      <link>https://ehclub.co.kr/3567</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;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bFE2F2/hyXWvgpPG0/q7ZHtn3Z2WVRD7FevBjnh1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/hcjkk/hyXWxedK5O/tIQTS51NNOgnNRlUoMh9JK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-0986728f-3db8-4d11-89c3-27dc4e48cc62&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;이용 시간 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;09:30~18:00 (3월~10월) , 17:00시까지 입장 가능합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-97f207d6-03f0-4a23-a2ce-f7aeac3bc74d&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;09:30~17:00 (11월~2월), 16:00시까지 입장 가능합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-f081b2f8-c2ee-464c-b777-f83080e13bb2&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;휴관일&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8c420130-b4b8-4ba1-afb8-91db88d51b6c&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;매주 월요일(공휴일일 때는 개관) 상설전시관 외 야외전시, 쉼터 등은 개방합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-23327eed-26bd-498b-a9da-54f116077e1f&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7c2ff2bf-b318-4eb9-b1e4-ffe46e6c2437&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;입장료 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d5f0934e-301d-4075-9978-1e5e1e5a5e9d&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;무료 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-67488be8-78e0-460d-bd81-cbe4b889b747&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-82f81883-1224-48e5-911b-d196db5e6211&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;주차료 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a8801b49-8d77-4b53-b8c2-e18c210c676a&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;소형(2000원), 대형(3000원), 감면(1000원), 국가 유공자(면재)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b2c7f2f3-2659-4b77-90cb-7bd9c9b529e0&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d8d3bedc-baec-4b09-8882-989283c509b1&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;감면 대상은 장애인, 국가유공자 가족, 경차, 하이브리드카, 저공해차, 병역이행 명문가 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8328614a-2381-45a9-bd50-a8e00a03125e&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d;&quot;&gt;주차료는 1일 기준입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%AA%A9%EC%B2%9C%EC%9D%8D%20%EB%82%A8%ED%99%94%EB%A6%AC%20230-1&amp;amp;addtype=1&amp;amp;confirmid=7834305&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A549720%2C%22mapCenterY%22%3A912568%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A549722%2C%22y%22%3A912572%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80%22%2C%22confirmid%22%3A7834305%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=549720&amp;amp;mapY=912568&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413125000&amp;amp;tel=041-560-0114&amp;amp;title=%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735687951689&quot; id=&quot;maps_1735687951689&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%AA%A9%EC%B2%9C%EC%9D%8D%20%EB%82%A8%ED%99%94%EB%A6%AC%20230-1&amp;amp;addtype=1&amp;amp;confirmid=7834305&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A549720%2C%22mapCenterY%22%3A912568%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A549722%2C%22y%22%3A912572%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80%22%2C%22confirmid%22%3A7834305%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=549720&amp;amp;mapY=912568&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413125000&amp;amp;tel=041-560-0114&amp;amp;title=%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=549720%2C912568&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A549722%2C912572&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>꼭 가봐야 할 곳</category>
      <category>독립기념관</category>
      <category>충남 천안</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3567</guid>
      <comments>https://ehclub.co.kr/3567#entry3567comment</comments>
      <pubDate>Wed, 1 Jan 2025 08:33:38 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 잊지말자. #대한독립만세길 #역사문화둘레길산책 1코스 1.37km#병천사거리#유관순열사기념관</title>
      <link>https://ehclub.co.kr/3566</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/6hCWNYy56qA&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/6hCWNYy56qA&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=6hCWNYy56qA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cKCwkZ/hyXSDM6cSN/uPhs6anTRe7Xue7bkcKo0K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/x3Oeh/hyXSDGnivR/smH5jmHlWqUS5GUeePe5kK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 잊지말자. #대한독립만세길 #역사문화둘레길산책 1코스 1.37km#병천사거리#유관순열사&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/6hCWNYy56qA&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;대한독립만세길&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;br /&gt;안녕하세요. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;이번 산책은 역사문화둘레길 산책입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;총 8코스로 이루어져 있는데 이번 산책은 1코스입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;1코스는 대한독립운동길로 불리며 병천사거리에서 유관순사적지까지입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;병천사거리에서 아우리순대길, 충절로, 탑원교차로, 유관순길을 걸어 유관순사적지까지 총 1.37km입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;유관순길을 제외한 나머지 길은 걷는데 편안한 길은 아닙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;인트로.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJvTh/btsLCF3iVBb/6KmGWPDYBaUisKKNZWAdGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJvTh/btsLCF3iVBb/6KmGWPDYBaUisKKNZWAdGK/img.jpg&quot; data-alt=&quot;대한독립만세길 - 아우내 독립만세운동 기념공원&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJvTh/btsLCF3iVBb/6KmGWPDYBaUisKKNZWAdGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJvTh%2FbtsLCF3iVBb%2F6KmGWPDYBaUisKKNZWAdGK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;인트로.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대한독립만세길 - 아우내 독립만세운동 기념공원&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;배경 음악 출처 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;compose&amp;amp;illust - 50mang MP3 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Download - &lt;a href=&quot;https://50mang.bandcamp.com/track/--3&quot;&gt;https://50mang.bandcamp.com/track/--3&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735647008745&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;song&quot; data-og-title=&quot;삼월의 염원, by 50mang&quot; data-og-description=&quot;track by 50mang&quot; data-og-host=&quot;50mang.bandcamp.com&quot; data-og-source-url=&quot;https://50mang.bandcamp.com/track/--3&quot; data-og-url=&quot;https://50mang.bandcamp.com/track/--3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CATzW/hyXWnBSaLq/1IQPpi2XJfRuPBcqaMDIE1/img.jpg?width=700&amp;amp;height=700&amp;amp;face=0_0_700_700,https://scrap.kakaocdn.net/dn/dh2eUR/hyXSuvUigE/BDztKSa1SfvbmakKNADcB1/img.jpg?width=700&amp;amp;height=700&amp;amp;face=0_0_700_700,https://scrap.kakaocdn.net/dn/bMwpQx/hyXSvIl83F/hRccc3FbD2WUPUdDOxWpE1/img.jpg?width=700&amp;amp;height=700&amp;amp;face=0_0_700_700&quot;&gt;&lt;a href=&quot;https://50mang.bandcamp.com/track/--3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://50mang.bandcamp.com/track/--3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CATzW/hyXWnBSaLq/1IQPpi2XJfRuPBcqaMDIE1/img.jpg?width=700&amp;amp;height=700&amp;amp;face=0_0_700_700,https://scrap.kakaocdn.net/dn/dh2eUR/hyXSuvUigE/BDztKSa1SfvbmakKNADcB1/img.jpg?width=700&amp;amp;height=700&amp;amp;face=0_0_700_700,https://scrap.kakaocdn.net/dn/bMwpQx/hyXSvIl83F/hRccc3FbD2WUPUdDOxWpE1/img.jpg?width=700&amp;amp;height=700&amp;amp;face=0_0_700_700');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;삼월의 염원, by 50mang&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;track by 50mang&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;50mang.bandcamp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>꼭 가봐야 할 곳</category>
      <category>대한독립만세길</category>
      <category>병천사거리</category>
      <category>아우내독립만세운동기념공원</category>
      <category>역사문화둘레길</category>
      <category>유관순열사기념관</category>
      <category>천안</category>
      <category>충남</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3566</guid>
      <comments>https://ehclub.co.kr/3566#entry3566comment</comments>
      <pubDate>Tue, 31 Dec 2024 21:12:02 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 직산삼은체육공원(직산저수지) 산책하기</title>
      <link>https://ehclub.co.kr/3565</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=rFP07CAzq54&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Mf1n2/hyXSuvvgj8/nwEppdQfDO1PR83q7PCfUk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bdYdRR/hyXSELFR4l/RmVVEmsNztOYIaW2cooSQK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 직산삼은체육공원 산책(직산저수지)#직산#저수지#삼은공원#천안#산책&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rFP07CAzq54&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[충남 천안] 직산삼은체육공원(직산저수지) 산책 동영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;안녕하세요. 언제나휴일이예요.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;오늘 산책 코스는 충남 천안에 있는 직산삼은체육공원이예요.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;직산저수지를 한 바퀴도는 산책로가 있으며 거리는 약 1300m(2000보)입니다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;주차 요금: 무료&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EC%84%9C%EB%B6%81%EA%B5%AC%20%EC%A7%81%EC%82%B0%EC%9D%8D%20%EC%82%BC%EC%9D%80%EB%A6%AC%20510&amp;amp;addtype=1&amp;amp;confirmid=1522494905&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A535200%2C%22mapCenterY%22%3A940048%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A535204%2C%22y%22%3A940051%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%82%BC%EC%9D%80%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A1522494905%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=535200&amp;amp;mapY=940048&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413325600&amp;amp;tel=&amp;amp;title=%EC%82%BC%EC%9D%80%EA%B3%B5%EC%9B%90&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735443312420&quot; id=&quot;maps_1735443312420&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EC%84%9C%EB%B6%81%EA%B5%AC%20%EC%A7%81%EC%82%B0%EC%9D%8D%20%EC%82%BC%EC%9D%80%EB%A6%AC%20510&amp;amp;addtype=1&amp;amp;confirmid=1522494905&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A535200%2C%22mapCenterY%22%3A940048%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A535204%2C%22y%22%3A940051%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%82%BC%EC%9D%80%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A1522494905%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=535200&amp;amp;mapY=940048&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413325600&amp;amp;tel=&amp;amp;title=%EC%82%BC%EC%9D%80%EA%B3%B5%EC%9B%90&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=535200%2C940048&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A535204%2C940051&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;직산저수지 주변은 도로와 아파트 단지 및 삼은체육공원이 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20241209_102044.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df8iJ3/btsLB3bCMSf/mFgXTgKx7mhube67fY6P51/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df8iJ3/btsLB3bCMSf/mFgXTgKx7mhube67fY6P51/tfile.dat&quot; data-alt=&quot;직산저수지와 주변 아파트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df8iJ3/btsLB3bCMSf/mFgXTgKx7mhube67fY6P51/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf8iJ3%2FbtsLB3bCMSf%2FmFgXTgKx7mhube67fY6P51%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4080&quot; height=&quot;3060&quot; data-filename=&quot;20241209_102044.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직산저수지와 주변 아파트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;산책로 절반 이상이 나무테크로 산책로를 만들어 놓았네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20241209_102220.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbbZFb/btsLzDTwr1b/GZKKIZr5rLzGzOH0K7Zqf0/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbbZFb/btsLzDTwr1b/GZKKIZr5rLzGzOH0K7Zqf0/tfile.dat&quot; data-alt=&quot;직산저수지 둘레를 나무테크로 만든 산책로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbbZFb/btsLzDTwr1b/GZKKIZr5rLzGzOH0K7Zqf0/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbbZFb%2FbtsLzDTwr1b%2FGZKKIZr5rLzGzOH0K7Zqf0%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4080&quot; height=&quot;3060&quot; data-filename=&quot;20241209_102220.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직산저수지 둘레를 나무테크로 만든 산책로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;중간 중간 쉴 곳도 많이 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20241209_102229.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn6Cdy/btsLBhn9Bra/uW8nMqGjlALfHLIJCkcJT0/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn6Cdy/btsLBhn9Bra/uW8nMqGjlALfHLIJCkcJT0/tfile.dat&quot; data-alt=&quot;직산저수지 산책로에 있는 벤치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn6Cdy/btsLBhn9Bra/uW8nMqGjlALfHLIJCkcJT0/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn6Cdy%2FbtsLBhn9Bra%2FuW8nMqGjlALfHLIJCkcJT0%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4080&quot; height=&quot;3060&quot; data-filename=&quot;20241209_102229.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직산저수지 산책로에 있는 벤치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;직산저수지 산책로에서 보는 뷰는 도시생활에 위로를 주는 것 같아요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20241209_102605.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dysGKA/btsLz2yEWol/wAQmQ4Ox8VlluLoIGCBBzK/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dysGKA/btsLz2yEWol/wAQmQ4Ox8VlluLoIGCBBzK/tfile.dat&quot; data-alt=&quot;직산저수지 뷰&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dysGKA/btsLz2yEWol/wAQmQ4Ox8VlluLoIGCBBzK/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdysGKA%2FbtsLz2yEWol%2FwAQmQ4Ox8VlluLoIGCBBzK%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4080&quot; height=&quot;3060&quot; data-filename=&quot;20241209_102605.jpg&quot; data-origin-width=&quot;4080&quot; data-origin-height=&quot;3060&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직산저수지 뷰&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;삼은체육공원은 여러 운동기구와 경기장 및 공연장, 주차장(무료)으로 구성하고 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[충남 천안] 직산삼은체육공원 인트로.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ADlSB/btsLz3LcnQP/KwHzD8ftibyAKfFQYHQxTK/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ADlSB/btsLz3LcnQP/KwHzD8ftibyAKfFQYHQxTK/tfile.dat&quot; data-alt=&quot;삼은공원&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ADlSB/btsLz3LcnQP/KwHzD8ftibyAKfFQYHQxTK/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FADlSB%2FbtsLz3LcnQP%2FKwHzD8ftibyAKfFQYHQxTK%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[충남 천안] 직산삼은체육공원 인트로.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삼은공원&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>걷기 좋은 곳</category>
      <category>산책하기 좋은 곳</category>
      <category>삼은공원</category>
      <category>직산삼은체육공원</category>
      <category>직산저수지</category>
      <category>충남 천안</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3565</guid>
      <comments>https://ehclub.co.kr/3565#entry3565comment</comments>
      <pubDate>Mon, 30 Dec 2024 17:00:52 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 태조산공원 산책하기</title>
      <link>https://ehclub.co.kr/3563</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=pgLsd5WpDQ4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bmRtMC/hyXSz4D0ZI/M5thQZTu7KUgiUPJBgPJeK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/Hju7l/hyXSyEGxzr/kIRQO8yVaCnwIUTbgLB7k0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 태조산공원 산책#태조산#공원#천안#산책&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/pgLsd5WpDQ4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[충남 천안] 태조산공원 산책하기 동영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;안녕하세요. 언제나휴일입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;오늘 산책은 충남 천안 태조산 공원입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;산책 거리는 약 1Km로 1500보 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;i&gt;&lt;b&gt;* 러닝머신에서 보세요.*&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%9C%A0%EB%9F%89%EB%8F%99%206&amp;amp;addtype=1&amp;amp;confirmid=8571684&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A542665%2C%22mapCenterY%22%3A923658%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A542668%2C%22y%22%3A923662%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%ED%83%9C%EC%A1%B0%EC%82%B0%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A8571684%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=542665&amp;amp;mapY=923658&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413153000&amp;amp;tel=041-529-5117&amp;amp;title=%ED%83%9C%EC%A1%B0%EC%82%B0%EA%B3%B5%EC%9B%90&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735443710357&quot; id=&quot;maps_1735443710357&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%9C%A0%EB%9F%89%EB%8F%99%206&amp;amp;addtype=1&amp;amp;confirmid=8571684&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A542665%2C%22mapCenterY%22%3A923658%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A542668%2C%22y%22%3A923662%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%ED%83%9C%EC%A1%B0%EC%82%B0%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A8571684%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=542665&amp;amp;mapY=923658&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413153000&amp;amp;tel=041-529-5117&amp;amp;title=%ED%83%9C%EC%A1%B0%EC%82%B0%EA%B3%B5%EC%9B%90&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=542665%2C923658&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A542668%2C923662&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;주차장 규모: 소형차 200대&lt;br /&gt;주차 요금(1일 기준)&lt;br /&gt;&amp;nbsp; &amp;nbsp;경차:1000원&lt;br /&gt;&amp;nbsp; &amp;nbsp;승용차/소형화물:3000원&lt;br /&gt;&amp;nbsp; &amp;nbsp;버스/대형화물/캠핑카:5000원&lt;br /&gt;&amp;nbsp; &amp;nbsp;30분 무료&lt;br /&gt;&amp;nbsp; &amp;nbsp;천안시민 4시간 무료&lt;br /&gt;&amp;nbsp; &amp;nbsp;저공해차량, 장애인, 그린카드 제시자 무료&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;충분한 주차장&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;걷기 좋은 산책로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;운동장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01_호수 뷰.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CGTfo/btsLBLvvDno/lKjWo80hzKoNFeT77vrR40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CGTfo/btsLBLvvDno/lKjWo80hzKoNFeT77vrR40/img.jpg&quot; data-alt=&quot;공원 호수와 조형물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CGTfo/btsLBLvvDno/lKjWo80hzKoNFeT77vrR40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGTfo%2FbtsLBLvvDno%2FlKjWo80hzKoNFeT77vrR40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;01_호수 뷰.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공원 호수와 조형물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02_잔디구장.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caHCy6/btsLBKDlhTa/vd03fg0R5FDEViFjJszosK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caHCy6/btsLBKDlhTa/vd03fg0R5FDEViFjJszosK/img.jpg&quot; data-alt=&quot;잔디 구장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caHCy6/btsLBKDlhTa/vd03fg0R5FDEViFjJszosK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaHCy6%2FbtsLBKDlhTa%2Fvd03fg0R5FDEViFjJszosK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;02_잔디구장.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잔디 구장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03_하천과 운동기구.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JpoWv/btsLCmvferu/hlEumO3CiuceZ7IeYKkkK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JpoWv/btsLCmvferu/hlEumO3CiuceZ7IeYKkkK1/img.jpg&quot; data-alt=&quot;운동기구와 하천&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JpoWv/btsLCmvferu/hlEumO3CiuceZ7IeYKkkK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJpoWv%2FbtsLCmvferu%2FhlEumO3CiuceZ7IeYKkkK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;03_하천과 운동기구.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;운동기구와 하천&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>걷기 좋은 곳</category>
      <category>산책하기 좋은 곳</category>
      <category>주차요금</category>
      <category>주차장</category>
      <category>충남 천안</category>
      <category>태조산공원</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3563</guid>
      <comments>https://ehclub.co.kr/3563#entry3563comment</comments>
      <pubDate>Mon, 30 Dec 2024 12:00:47 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 청수호수공원 산책하기</title>
      <link>https://ehclub.co.kr/3562</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=yB2aWRt03m4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/iC8i0/hyXSCNLBcd/BWlkQgm5uF0gEWl0i4FUcK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bhD488/hyXSwz1Cry/iNcDSAXjRzhqghz21bx0p0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 청수호수공원 산책#청수호수공원#천안#산책&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/yB2aWRt03m4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;충남 천안 청수호수공원 산책하기 동영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;안녕하세요. 언제나휴일이예요. 오늘의 산책 코스는 충남 천안 청수 호수공원이예요.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;공원 주차장(무료)에서 한 바퀴 산책합니다.(약 700m, 1000보)&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%B2%AD%EC%88%98%EB%8F%99%20270&amp;amp;addtype=1&amp;amp;confirmid=1456013616&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A533450%2C%22mapCenterY%22%3A913513%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A533450%2C%22y%22%3A913517%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%AD%EC%88%98%ED%98%B8%EC%88%98%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A1456013616%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=533450&amp;amp;mapY=913513&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413158000&amp;amp;tel=&amp;amp;title=%EC%B2%AD%EC%88%98%ED%98%B8%EC%88%98%EA%B3%B5%EC%9B%90&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735423462428&quot; id=&quot;maps_1735423462428&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%B2%AD%EC%88%98%EB%8F%99%20270&amp;amp;addtype=1&amp;amp;confirmid=1456013616&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A533450%2C%22mapCenterY%22%3A913513%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A533450%2C%22y%22%3A913517%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%AD%EC%88%98%ED%98%B8%EC%88%98%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A1456013616%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=533450&amp;amp;mapY=913513&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413158000&amp;amp;tel=&amp;amp;title=%EC%B2%AD%EC%88%98%ED%98%B8%EC%88%98%EA%B3%B5%EC%9B%90&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=533450%2C913513&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A533450%2C913517&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;충남 천안 청수지구에는 청수호수공원이 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;View1.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDVns/btsLBrD0pDk/Jpmook1OHuYhpsi23jk4w1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDVns/btsLBrD0pDk/Jpmook1OHuYhpsi23jk4w1/img.jpg&quot; data-alt=&quot;청수호수공원 View&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDVns/btsLBrD0pDk/Jpmook1OHuYhpsi23jk4w1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDVns%2FbtsLBrD0pDk%2FJpmook1OHuYhpsi23jk4w1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;View1.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;청수호수공원 View&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;산책로와 운동기구들이 있어 주변에 거주하시는 분들이 자주 산책하는 곳이예요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;View2.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGN5j/btsLBKcf0fk/3Gi4tomaaL1M8e8IFDRK31/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGN5j/btsLBKcf0fk/3Gi4tomaaL1M8e8IFDRK31/img.jpg&quot; data-alt=&quot;청수호수공원 운동기구&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGN5j/btsLBKcf0fk/3Gi4tomaaL1M8e8IFDRK31/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGN5j%2FbtsLBKcf0fk%2F3Gi4tomaaL1M8e8IFDRK31%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;View2.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;청수호수공원 운동기구&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;중간 중간에 포토포인트도 있네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;View3.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwmPch/btsLBIrXmXq/HkqLgWloOs6rvVcG5RiEgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwmPch/btsLBIrXmXq/HkqLgWloOs6rvVcG5RiEgK/img.jpg&quot; data-alt=&quot;충남 천안 청수호수공원 포토포인트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwmPch/btsLBIrXmXq/HkqLgWloOs6rvVcG5RiEgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwmPch%2FbtsLBIrXmXq%2FHkqLgWloOs6rvVcG5RiEgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;View3.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;충남 천안 청수호수공원 포토포인트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>걷기 좋은 곳</category>
      <category>무료 주차장</category>
      <category>산책하기 좋은 곳</category>
      <category>청수호수공원</category>
      <category>충남 천안</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3562</guid>
      <comments>https://ehclub.co.kr/3562#entry3562comment</comments>
      <pubDate>Mon, 30 Dec 2024 09:00:13 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 쌍용공원 산책하기</title>
      <link>https://ehclub.co.kr/3561</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=DnOjZkcqF4A&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bQuqG9/hyXSAPWAcp/lanWxBbTQ1NkHzCIQX25eK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/qmFZb/hyXSv2bBrN/jWtQMTsyGLFtiWxVk8AozK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 쌍용공원 산책#천안#쌍용공원#산책&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/DnOjZkcqF4A&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[충남 천안] 쌍용공원 산책하기 동영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나휴일입니다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘 산책은 충남 천안에 있는 쌍용공원입니다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;산책 길이는 약 700m로 1000보 가량입니다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아쉬운 점은 공원 주차장이 없는 거예요.&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EC%84%9C%EB%B6%81%EA%B5%AC%20%EC%8C%8D%EC%9A%A9%EB%8F%99%20%EC%82%B0%2084&amp;amp;addtype=1&amp;amp;confirmid=17385003&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A529055%2C%22mapCenterY%22%3A920068%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A529057%2C%22y%22%3A920072%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%8C%8D%EC%9A%A9%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A17385003%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=529055&amp;amp;mapY=920068&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413355000&amp;amp;tel=&amp;amp;title=%EC%8C%8D%EC%9A%A9%EA%B3%B5%EC%9B%90&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735423117525&quot; id=&quot;maps_1735423117525&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EC%84%9C%EB%B6%81%EA%B5%AC%20%EC%8C%8D%EC%9A%A9%EB%8F%99%20%EC%82%B0%2084&amp;amp;addtype=1&amp;amp;confirmid=17385003&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A529055%2C%22mapCenterY%22%3A920068%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A529057%2C%22y%22%3A920072%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%8C%8D%EC%9A%A9%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A17385003%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=529055&amp;amp;mapY=920068&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413355000&amp;amp;tel=&amp;amp;title=%EC%8C%8D%EC%9A%A9%EA%B3%B5%EC%9B%90&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=529055%2C920068&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A529057%2C920072&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;체육시설을 이용하는 분들도 많네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;V1.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p4HMg/btsLzsYqthK/0mlHXO0Ev35uzDK7ZfMue0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p4HMg/btsLzsYqthK/0mlHXO0Ev35uzDK7ZfMue0/img.jpg&quot; data-alt=&quot;충남 천안 쌍용공원 산책 - 체육시설&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p4HMg/btsLzsYqthK/0mlHXO0Ev35uzDK7ZfMue0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp4HMg%2FbtsLzsYqthK%2F0mlHXO0Ev35uzDK7ZfMue0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;V1.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;충남 천안 쌍용공원 산책 - 체육시설&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;공원을 둘러싼 길로 산책하는 분들도 많아요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;v2.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFOmU/btsLAhWCHi8/qUk67KadmbqKGjktBvJZok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFOmU/btsLAhWCHi8/qUk67KadmbqKGjktBvJZok/img.jpg&quot; data-alt=&quot;쌍용공원 산책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFOmU/btsLAhWCHi8/qUk67KadmbqKGjktBvJZok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFOmU%2FbtsLAhWCHi8%2FqUk67KadmbqKGjktBvJZok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;v2.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쌍용공원 산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;v3.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNIUjB/btsLz1T6Aw3/7MaHtgZTkCNmkz4wPpmWHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNIUjB/btsLz1T6Aw3/7MaHtgZTkCNmkz4wPpmWHk/img.jpg&quot; data-alt=&quot;쌍용공원 산책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNIUjB/btsLz1T6Aw3/7MaHtgZTkCNmkz4wPpmWHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNIUjB%2FbtsLz1T6Aw3%2F7MaHtgZTkCNmkz4wPpmWHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;v3.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쌍용공원 산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유명한 미술작품도 볼 수 있네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;v4.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnjGu3/btsLBkrjXqN/80Ccvl65tLJJKMGY5lTvZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnjGu3/btsLBkrjXqN/80Ccvl65tLJJKMGY5lTvZ0/img.jpg&quot; data-alt=&quot;쌍용공원 산책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnjGu3/btsLBkrjXqN/80Ccvl65tLJJKMGY5lTvZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnjGu3%2FbtsLBkrjXqN%2F80Ccvl65tLJJKMGY5lTvZ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;v4.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쌍용공원 산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;v5.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiv9c9/btsLB2cFtUC/abA204YHEILvqNg42jXzlK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiv9c9/btsLB2cFtUC/abA204YHEILvqNg42jXzlK/img.jpg&quot; data-alt=&quot;쌍용공원 산책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiv9c9/btsLB2cFtUC/abA204YHEILvqNg42jXzlK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feiv9c9%2FbtsLB2cFtUC%2FabA204YHEILvqNg42jXzlK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;v5.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쌍용공원 산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;v6.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b76mmn/btsLyVs0Lr1/i26yLFQOM00NUctjqFWSYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b76mmn/btsLyVs0Lr1/i26yLFQOM00NUctjqFWSYK/img.jpg&quot; data-alt=&quot;쌍용공원산책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b76mmn/btsLyVs0Lr1/i26yLFQOM00NUctjqFWSYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb76mmn%2FbtsLyVs0Lr1%2Fi26yLFQOM00NUctjqFWSYK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;v6.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쌍용공원산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;넓은 잔디밭도 있어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;v7.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FVzVS/btsLAiOTO7q/u4EnZVi02prhqTYHE7k0Sk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FVzVS/btsLAiOTO7q/u4EnZVi02prhqTYHE7k0Sk/img.jpg&quot; data-alt=&quot;쌍용공원 산책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FVzVS/btsLAiOTO7q/u4EnZVi02prhqTYHE7k0Sk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFVzVS%2FbtsLAiOTO7q%2Fu4EnZVi02prhqTYHE7k0Sk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;v7.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쌍용공원 산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;공원에 화장실도 있답니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;v8.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu1V0g/btsLAgQ03SH/pNbt6qBkqHeXaOudKrPwAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu1V0g/btsLAgQ03SH/pNbt6qBkqHeXaOudKrPwAK/img.jpg&quot; data-alt=&quot;쌍용공원 화장실&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu1V0g/btsLAgQ03SH/pNbt6qBkqHeXaOudKrPwAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu1V0g%2FbtsLAgQ03SH%2FpNbt6qBkqHeXaOudKrPwAK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;v8.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쌍용공원 화장실&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>걷기 좋은 곳</category>
      <category>공원</category>
      <category>무료 화장실</category>
      <category>산책하기 좋은 곳</category>
      <category>쌍용공원</category>
      <category>충남 천안</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3561</guid>
      <comments>https://ehclub.co.kr/3561#entry3561comment</comments>
      <pubDate>Sun, 29 Dec 2024 17:00:11 +0900</pubDate>
    </item>
    <item>
      <title>[충남 천안] 천안예술공원 산책하기</title>
      <link>https://ehclub.co.kr/3559</link>
      <description>&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=I5lLXmPLeHw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/eOW2c/hyXSpOql58/c2SxfNeJq7uWONLjKD0070/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/sat70/hyXSD0fsEy/pAKcKlaEY3A84ud79GsE90/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 천안예술공원 산책#천안#예술의전당#공원#산책&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/I5lLXmPLeHw&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;천안예술공원 산책 동영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나휴일이예요.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘 산책은 충남 천안에 있는 천안예술공원입니다.&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EC%B2%AD%EB%82%A8%EB%8F%84%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%84%B1%EB%82%A8%EB%A9%B4&amp;amp;addtype=1&amp;amp;confirmid=&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A550500%2C%22mapCenterY%22%3A905228%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A550500%2C%22y%22%3A905230%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%9C%EC%95%88%EC%98%88%EC%88%A0%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A%22%22%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=550500&amp;amp;mapY=905228&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413134000&amp;amp;tel=&amp;amp;title=%EC%B2%9C%EC%95%88%EC%98%88%EC%88%A0%EA%B3%B5%EC%9B%90&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1735421017146&quot; id=&quot;maps_1735421017146&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EC%B2%AD%EB%82%A8%EB%8F%84%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%84%B1%EB%82%A8%EB%A9%B4&amp;amp;addtype=1&amp;amp;confirmid=&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A550500%2C%22mapCenterY%22%3A905228%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A550500%2C%22y%22%3A905230%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%9C%EC%95%88%EC%98%88%EC%88%A0%EA%B3%B5%EC%9B%90%22%2C%22confirmid%22%3A%22%22%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=550500&amp;amp;mapY=905228&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413134000&amp;amp;tel=&amp;amp;title=%EC%B2%9C%EC%95%88%EC%98%88%EC%88%A0%EA%B3%B5%EC%9B%90&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=550500%2C905228&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A550500%2C905230&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;천안 예술의전당에서 보이는 원형 교차로 내부가 천안예술공원이예요.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 산책은 12분 정도로 약 1Km(1500보 남짓) 정도를 걷습니다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;천안 예술의전당에서 출발합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 0m56s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8VPAm/btsLADrot8O/DkM3xiJ9HbTR2enmaO0eok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8VPAm/btsLADrot8O/DkM3xiJ9HbTR2enmaO0eok/img.jpg&quot; data-alt=&quot;천안예술의전당에서 출발&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8VPAm/btsLADrot8O/DkM3xiJ9HbTR2enmaO0eok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8VPAm%2FbtsLADrot8O%2FDkM3xiJ9HbTR2enmaO0eok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 0m56s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;천안예술의전당에서 출발&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;천안예술의전당에서 횡단보도를 건너면 천안예술공원이 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 1m35s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sd7Ve/btsLzYis5v0/EQKkhiHcEdJwtCNwpV8mUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sd7Ve/btsLzYis5v0/EQKkhiHcEdJwtCNwpV8mUk/img.jpg&quot; data-alt=&quot;천안예술공원 표지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sd7Ve/btsLzYis5v0/EQKkhiHcEdJwtCNwpV8mUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSd7Ve%2FbtsLzYis5v0%2FEQKkhiHcEdJwtCNwpV8mUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 1m35s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;천안예술공원 표지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;천안예술공원 표지를 지나 안내도가 있네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 1m50s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8BRS5/btsLBfKzlxR/zD2gfbaQZjdiXp8Jnytbi1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8BRS5/btsLBfKzlxR/zD2gfbaQZjdiXp8Jnytbi1/img.jpg&quot; data-alt=&quot;천안예술공원 안내도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8BRS5/btsLBfKzlxR/zD2gfbaQZjdiXp8Jnytbi1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8BRS5%2FbtsLBfKzlxR%2FzD2gfbaQZjdiXp8Jnytbi1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 1m50s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;천안예술공원 안내도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 2m16s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNjKoO/btsLAWq1fJd/Kknfg2MFjGvUAimcQKetD0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNjKoO/btsLAWq1fJd/Kknfg2MFjGvUAimcQKetD0/img.jpg&quot; data-alt=&quot;천안예술공원 뷰1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNjKoO/btsLAWq1fJd/Kknfg2MFjGvUAimcQKetD0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNjKoO%2FbtsLAWq1fJd%2FKknfg2MFjGvUAimcQKetD0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 2m16s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;천안예술공원 뷰1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 3m17s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ob72H/btsLzBVw2gt/7kOYNSbJftNzygwVVEzwh1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ob72H/btsLzBVw2gt/7kOYNSbJftNzygwVVEzwh1/img.jpg&quot; data-alt=&quot;천안예술공원 뷰2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ob72H/btsLzBVw2gt/7kOYNSbJftNzygwVVEzwh1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOb72H%2FbtsLzBVw2gt%2F7kOYNSbJftNzygwVVEzwh1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 3m17s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;천안예술공원 뷰2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;우측에 인공호수와&amp;nbsp; 정면에 예술의 전당 및 카페 건물이 보이네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 3m54s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctm5Ak/btsLA8EIgIF/JapvrjVuX9Z8rY0ffody10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctm5Ak/btsLA8EIgIF/JapvrjVuX9Z8rY0ffody10/img.jpg&quot; data-alt=&quot;인공호수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctm5Ak/btsLA8EIgIF/JapvrjVuX9Z8rY0ffody10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctm5Ak%2FbtsLA8EIgIF%2FJapvrjVuX9Z8rY0ffody10%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 3m54s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인공호수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;인공호수 주변으로 인공 길로 걸어봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 4m28s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OqWBK/btsLyTIGAVb/DplW3Wxj5GTKIEh53jbCs0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OqWBK/btsLyTIGAVb/DplW3Wxj5GTKIEh53jbCs0/img.jpg&quot; data-alt=&quot;나무테크 산책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OqWBK/btsLyTIGAVb/DplW3Wxj5GTKIEh53jbCs0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOqWBK%2FbtsLyTIGAVb%2FDplW3Wxj5GTKIEh53jbCs0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 4m28s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;나무테크 산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: center;&quot;&gt;인공호수를 바라보는 카페옆으로 가 보았어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 5m8s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2qoIJ/btsLAfxMDvU/pvTHxjHev3doDnebkzX1r1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2qoIJ/btsLAfxMDvU/pvTHxjHev3doDnebkzX1r1/img.jpg&quot; data-alt=&quot;카페앞&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2qoIJ/btsLAfxMDvU/pvTHxjHev3doDnebkzX1r1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2qoIJ%2FbtsLAfxMDvU%2FpvTHxjHev3doDnebkzX1r1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 5m8s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카페앞&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 8m8s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XG4B2/btsLB06ZqzX/VraJI8uvH3vzRzOmKcY5U0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XG4B2/btsLB06ZqzX/VraJI8uvH3vzRzOmKcY5U0/img.jpg&quot; data-alt=&quot;천안예술공원 뷰&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XG4B2/btsLB06ZqzX/VraJI8uvH3vzRzOmKcY5U0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXG4B2%2FbtsLB06ZqzX%2FVraJI8uvH3vzRzOmKcY5U0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 8m8s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;천안예술공원 뷰&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인공호수의 카페 반대편에 큰 무대가 있네요. 연주회를 할 수 있을 것 같아요.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;큰 무대를 기준으로 뷰를 한 번 볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m38s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZzza/btsLBxRvlUg/XJWSNWKe1YNyXOl4IKGPg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZzza/btsLBxRvlUg/XJWSNWKe1YNyXOl4IKGPg0/img.jpg&quot; data-alt=&quot;무대뷰1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZzza/btsLBxRvlUg/XJWSNWKe1YNyXOl4IKGPg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZzza%2FbtsLBxRvlUg%2FXJWSNWKe1YNyXOl4IKGPg0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m38s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무대뷰1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m43s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baowa0/btsLA0mBsqM/2bbnyM3hKYEqTRrY2iU4iK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baowa0/btsLA0mBsqM/2bbnyM3hKYEqTRrY2iU4iK/img.jpg&quot; data-alt=&quot;무대뷰2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baowa0/btsLA0mBsqM/2bbnyM3hKYEqTRrY2iU4iK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbaowa0%2FbtsLA0mBsqM%2F2bbnyM3hKYEqTRrY2iU4iK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m43s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무대뷰2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m50s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lKBAX/btsLAA9hTI9/UkkxEHiO796lT3RjPHfBM1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lKBAX/btsLAA9hTI9/UkkxEHiO796lT3RjPHfBM1/img.jpg&quot; data-alt=&quot;무대뷰3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lKBAX/btsLAA9hTI9/UkkxEHiO796lT3RjPHfBM1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlKBAX%2FbtsLAA9hTI9%2FUkkxEHiO796lT3RjPHfBM1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m50s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무대뷰3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m59s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwakxi/btsLAU0VwZq/AG9R38Lh9eoKVr4VixGdDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwakxi/btsLAU0VwZq/AG9R38Lh9eoKVr4VixGdDk/img.jpg&quot; data-alt=&quot;무대뷰4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwakxi/btsLAU0VwZq/AG9R38Lh9eoKVr4VixGdDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdwakxi%2FbtsLAU0VwZq%2FAG9R38Lh9eoKVr4VixGdDk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;[언휴의산책] 천안예술공원 - frame at 9m59s.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무대뷰4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>여행/산책</category>
      <category>천안 가 볼만한 곳</category>
      <category>천안 산책하기 좋은 곳</category>
      <category>천안예술공원</category>
      <category>천안예술의전당</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3559</guid>
      <comments>https://ehclub.co.kr/3559#entry3559comment</comments>
      <pubDate>Sun, 29 Dec 2024 06:27:22 +0900</pubDate>
    </item>
    <item>
      <title>제주 애월읍 가 볼 만한 곳 - 고내포구와 남뚜리</title>
      <link>https://ehclub.co.kr/3558</link>
      <description>&lt;p id=&quot;SE-9cf8cfe8-93eb-4af0-8335-0fb853e8ba29&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;제주공항에서 서쪽에 애월이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a3ddd164-8596-4bbd-8a0e-d9ba250d098a&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 애월-고내-신엄-중엄-구엄-하귀를 잇는 해안도로는 바다멍 때리며 차한잔 하기 좋은 곳이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4e6c1ebe-1d2a-49a0-ac5e-5eff8c08df57&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번 설날에는 제 고향 고내를 소개할게요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-43d106cc-c41f-449f-903e-cc5ab307a31c&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;고내포구와 남뚜리 및 고내 마을 전경, 마지막으로 애월에서 바라본 남뚜리를 산책합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a759cb75-9d57-40ce-96b5-0186c79dae1a&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e1f5fc83-7bf6-4940-a215-38884620f5c2&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;촬영은 HOVER AIR X1 드론을 사용하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cb47b226-ee2f-450a-b4ee-6acb5c5628c8&quot; style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;액션 캠으로 녹화한 화면은 수평이 안 맞아서 이번 영상에는 담지 못해 아쉽네요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #7b6d6d; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=1BapZvmxZf4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dnIcqd/hyVm0Ccr5e/z80IyGM3XrMt3KkSBI3dj0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;고내 탐방 - 올레길 16코스 [제주도 애월읍 가 볼 만한 곳, 촬영 HOVER AIR X1]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/1BapZvmxZf4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행/국내여행</category>
      <category>고내포구</category>
      <category>고향</category>
      <category>남두해안</category>
      <category>남뚜리</category>
      <category>멍 때리기</category>
      <category>산책</category>
      <category>애월 가 볼 만한 곳</category>
      <category>제주도</category>
      <category>카페</category>
      <category>힐링</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3558</guid>
      <comments>https://ehclub.co.kr/3558#entry3558comment</comments>
      <pubDate>Thu, 15 Feb 2024 12:13:01 +0900</pubDate>
    </item>
    <item>
      <title>to 20130613 from 20220613 PROOF 9주년 예약 앨범이 도착했어요.</title>
      <link>https://ehclub.co.kr/3556</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;안녕하세요. 언제나휴일의 언휴예요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d81412d1-fa7f-4dbb-aaf1-2b3f9c5a9ea0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1달 전에 예약 구매한 PROOF 앨범이 9주년인 2022년 6월 13일에 도착했네요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8161bc86-041f-4d46-9a3b-b3a142862510&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;작업하는 방 문에 포스터를 붙였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-367de2b4-ff14-416f-868c-7f72ccd8a499&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 행복으로 가는 문이죠. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f5c3aeda-5134-489c-ab48-fcb6c1f04bd5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예전에는 버터 포스터였는데 이제 분위기를 다시 전환하네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;행복으로 가는 문.jpg&quot; data-origin-width=&quot;2252&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VOjqm/btrEHCMcr3Q/W7dQKJKRebnoiqoPdO3q5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VOjqm/btrEHCMcr3Q/W7dQKJKRebnoiqoPdO3q5k/img.jpg&quot; data-alt=&quot;행복으로 가는 문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VOjqm/btrEHCMcr3Q/W7dQKJKRebnoiqoPdO3q5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVOjqm%2FbtrEHCMcr3Q%2FW7dQKJKRebnoiqoPdO3q5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2252&quot; height=&quot;4000&quot; data-filename=&quot;행복으로 가는 문.jpg&quot; data-origin-width=&quot;2252&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;행복으로 가는 문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div id=&quot;SE-d809d1ad-4a86-47f0-afe7-cbf0ede32a14&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0facbc9e-3d73-4abc-9f60-f7d5b5c67d15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;금고에 DECO KIT과 앨범들, Winter Ball 외에 PROOF도 비치할 수 있겠네요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1f67ee90-4d7d-4618-8adb-d55eb9ebb034&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;보물 금고.jpg&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;2252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce1yBP/btrEEZ2uVSL/9DsYX2xbgC6Rkw4E9Pby0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce1yBP/btrEEZ2uVSL/9DsYX2xbgC6Rkw4E9Pby0K/img.jpg&quot; data-alt=&quot;보물 금고와 PROOF&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce1yBP/btrEEZ2uVSL/9DsYX2xbgC6Rkw4E9Pby0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce1yBP%2FbtrEEZ2uVSL%2F9DsYX2xbgC6Rkw4E9Pby0K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;2252&quot; data-filename=&quot;보물 금고.jpg&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;2252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보물 금고와 PROOF&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #252525;&quot;&gt;J-HOPE 사진은 테이블에 Winter-Ball(지민과 슈가)과 비치해야겠어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9주년.jpg&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;2252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cizROe/btrEyuphYjS/JW5a6MKMSFsYyYSmlbCpMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cizROe/btrEyuphYjS/JW5a6MKMSFsYyYSmlbCpMk/img.jpg&quot; data-alt=&quot;보물 금고 테이블&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cizROe/btrEyuphYjS/JW5a6MKMSFsYyYSmlbCpMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcizROe%2FbtrEyuphYjS%2FJW5a6MKMSFsYyYSmlbCpMk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;2252&quot; data-filename=&quot;9주년.jpg&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;2252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보물 금고 테이블&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #252525;&quot;&gt;오늘 도착해서 개봉한 순간입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;사진.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddDUNY/btrECzJVqaJ/OZGkMHIkI6USE6aQd2KXx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddDUNY/btrECzJVqaJ/OZGkMHIkI6USE6aQd2KXx0/img.png&quot; data-alt=&quot;PROOF 앨범 도착&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddDUNY/btrECzJVqaJ/OZGkMHIkI6USE6aQd2KXx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddDUNY%2FbtrECzJVqaJ%2FOZGkMHIkI6USE6aQd2KXx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;748&quot; data-filename=&quot;사진.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PROOF 앨범 도착&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=-Sip9_Uhjmk&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/c9F8uf/hyOK3Moxvr/y8YlqTFMkpiViufXRQfFBK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-Sip9_Uhjmk&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 취미/아이돌 음반 외</category>
      <category>2013년 6월 13일 데뷔</category>
      <category>2022년 6월 13일 PROOF 앨범 도착</category>
      <category>9주년</category>
      <category>9주년 앨범 도착</category>
      <category>bts</category>
      <category>proof</category>
      <category>행복으로 가는 문</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3556</guid>
      <comments>https://ehclub.co.kr/3556#entry3556comment</comments>
      <pubDate>Mon, 13 Jun 2022 13:06:08 +0900</pubDate>
    </item>
    <item>
      <title>제어문 기본 실습 [C#] -  반도체 장비 및 제어시스템 개발자 양성</title>
      <link>https://ehclub.co.kr/3555</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;다음 코드를 참고하세요.&lt;/p&gt;
&lt;pre id=&quot;code_1620807216085&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

namespace 콘솔_키_입력
{
    class Program
    {
        static void Main(string[] args)
        {
            ConsoleKey key = ConsoleKey.NoName;
            while(true)
            {
                key = Console.ReadKey(true).Key;
                switch(key)
                {
                    case ConsoleKey.F1: Console.WriteLine(&quot;F1&quot;); break;
                }
                if(key == ConsoleKey.Escape)
                {
                    break;
                }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 사용자가 선택한 키에 따라 공정을 선택 (15분)&lt;br /&gt;F1:&amp;nbsp;웨이퍼&amp;nbsp;F2:산화&amp;nbsp;F3:포토&amp;nbsp;F4:식각 &lt;br /&gt;F5:패키징&amp;nbsp;F6:&amp;nbsp;EDS&amp;nbsp;F7:&amp;nbsp;금속배선&amp;nbsp;F8:박막 &lt;br /&gt;ESCAPE을&amp;nbsp;누르기&amp;nbsp;전까지&amp;nbsp;반복하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;/* 먼저 작성한 후에 비교해 보세요. */&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620894359408&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//1.사용자가 선택한 키에 따라 공정을 선택
//F1: 웨이퍼 F2:산화 F3:포토 F4:식각
//F5:패키징 F6: EDS F7: 금속배선 F8:박막
//ESCAPE을 누르기 전까지 반복하시오.

using System;

namespace _01.메뉴_선택
{
    class Program
    {
        static void Main(string[] args)
        {
            ConsoleKey key = ConsoleKey.NoName;
            while((key = SelectMenu())!= ConsoleKey.Escape)//반복: 메뉴 선택한 키가 ESC가 아니라면
            {
                //선택한 키에 따라 작업 수행
                switch(key)
                {
                    case ConsoleKey.F1: Console.WriteLine(&quot;웨이퍼&quot;); break;
                    case ConsoleKey.F2: Console.WriteLine(&quot;산화&quot;); break;
                    case ConsoleKey.F3: Console.WriteLine(&quot;포토&quot;); break;
                    case ConsoleKey.F4: Console.WriteLine(&quot;식각&quot;); break;
                    case ConsoleKey.F5: Console.WriteLine(&quot;페키징&quot;); break;
                    case ConsoleKey.F6: Console.WriteLine(&quot;EDS&quot;); break;
                    case ConsoleKey.F7: Console.WriteLine(&quot;금속배선&quot;); break;
                    case ConsoleKey.F8: Console.WriteLine(&quot;박막&quot;); break;
                    default: Console.WriteLine(&quot;잘못 선택하셨군요.&quot;); break;
                }
                Console.WriteLine(&quot;아무 키나 누르세요.&quot;);
                Console.ReadKey(true);
            }
        }

        private static ConsoleKey SelectMenu()
        {
            Console.Clear();
            Console.WriteLine(&quot;F1: 웨이퍼 F2:산화 F3:포토 F4:식각&quot;);
            Console.WriteLine(&quot;F5:패키징 F6: EDS F7: 금속배선 F8:박막&quot;);
            return Console.ReadKey(true).Key;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2.a 10개의 정수를 입력받아 출력하시오.(10분)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;/* 먼저 작성한 후에 비교해 보세요. */&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620894446152&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

namespace _2.a_10개의_정수를_입력받아_출력하시오
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[10];
            for(int i = 0; i&amp;lt;10;i++)
            {
                Console.Write(&quot;{0}번째 정수:&quot;,i+1);
                int.TryParse(Console.ReadLine(), out arr[i]);
            }

            foreach(int elem in arr)
            {
                Console.Write(&quot;{0} &quot;, elem);
            }
            Console.WriteLine();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2.b 10개의 정수를 입력받아 2, 3, 5의 배수가 각각 몇 개인지 출력하시오.(15분)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;/* 먼저 작성한 후에 비교해 보세요. */&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620894501534&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

namespace _2.b_10개의_정수를_입력받아_2__3__5의_배수가_각각_몇_개인지_출력하시오
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[10];
            for (int i = 0; i &amp;lt; 10; i++)
            {
                Console.Write(&quot;{0}번째 정수:&quot;, i + 1);
                int.TryParse(Console.ReadLine(), out arr[i]);
            }
            int n2 = 0, n3 = 0, n5 = 0;
            foreach(int elem in arr)
            {
                if(elem%2==0)
                {
                    n2++;
                }
                if (elem % 3 == 0)
                {
                    n3++;
                }
                if (elem % 5 == 0)
                {
                    n5++;
                }
            }
            Console.WriteLine(&quot;2의 배수:{0}개 3의 배수:{1}개 5의 배수:{2}&quot;, n2, n3, n5);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2.c&amp;nbsp;10개의&amp;nbsp;웨이퍼&amp;nbsp;제품을&amp;nbsp;입력받으시오. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하나의&amp;nbsp;웨이퍼마다&amp;nbsp;직경과&amp;nbsp;제품명을&amp;nbsp;입력받는다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;입력받은 전체 제품을 출력한다.(15분)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;/* 먼저 작성한 후에 비교해 보세요. */&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620894538520&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
/*  2.c 10개의 웨이퍼 제품을 입력받으시오.
    하나의 웨이퍼마다 직경과 제품명을 입력받는다.
    입력받은 전체 제품을 출력한다.(15분, ~15:15)*/
namespace _2.c_10개의_웨이퍼_제품을_입력받으시오
{
    class Wafer
    {
        public double Radius
        {
            get;
        }
        public string Name
        {
            get;
        }
        public Wafer(double radius,string name)
        {
            Radius = radius;
            Name = name;
        }
        public override string ToString()
        {
            return Name;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Wafer[] arr = new Wafer[10];
            for (int i = 0; i &amp;lt; 10; i++)
            {
                arr[i] = MakeWafer(i + 1);
            }
            foreach(Wafer wafer in arr)
            {
                Console.WriteLine(&quot;{0}:{1}&quot;, wafer.Name, wafer.Radius);
            }
        }

        private static Wafer MakeWafer(int n)
        {
            Console.Write(&quot;{0}번째 Wafer&quot;, n);
            double radius = 0;
            Console.Write(&quot;직경:&quot;);
            double.TryParse(Console.ReadLine(), out radius);
            string name;
            Console.Write(&quot;제품명:&quot;);
            name = Console.ReadLine();
            return new Wafer(radius, name);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;3. 새롭게 설계한 웨이퍼의 실제 수율을 계산하는 테스트 공정이다. 다음과 같이 동작하게 구현하시오.&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;단위&amp;nbsp;테스트에서는&amp;nbsp;제조&amp;nbsp;라인(A~F),&amp;nbsp;테스트&amp;nbsp;일련&amp;nbsp;번호,&amp;nbsp;설계&amp;nbsp;최대&amp;nbsp;칩&amp;nbsp;수와&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;실제&amp;nbsp;생산한&amp;nbsp;정상&amp;nbsp;칩&amp;nbsp;수를&amp;nbsp;입력받아&amp;nbsp;실제&amp;nbsp;수율을&amp;nbsp;계산하여&amp;nbsp;결과를&amp;nbsp;출력한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;테스트&amp;nbsp;일련&amp;nbsp;번호는&amp;nbsp;순차적으로&amp;nbsp;부여한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;제조라인,&amp;nbsp;설계&amp;nbsp;최대&amp;nbsp;칩&amp;nbsp;수,&amp;nbsp;실제&amp;nbsp;생산한&amp;nbsp;정상&amp;nbsp;칩&amp;nbsp;수는&amp;nbsp;입력받는다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;실제 수율 = 실제 생산한 정상 칩 수/설계 최대 칩 수&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;모든&amp;nbsp;테스트를&amp;nbsp;완료하면&amp;nbsp;테스트&amp;nbsp;결과를&amp;nbsp;출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;/* 먼저 작성한 후에 비교해 보세요. */&lt;/b&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1620894570520&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
/* 
   3. 새롭게 설계한 웨이퍼의 실제 수율을 계산하는 테스트 공정이다. 
   다음과 같이 동작하게 구현하시오.
   - 단위 테스트 횟수를 입력받아 입력 횟수만큼 반복 수행한다.
   단위 테스트에서는 제조 라인(A~F), 테스트 일련 번호, 설계 최대 칩 수와 
  실제 생산한 정상 칩 수를 입력받아 실제 수율을 계산하여 결과를 출력한다.
   테스트 일련 번호는 순차적으로 부여한다.
   제조라인, 설계 최대 칩 수, 실제 생산한 정상 칩 수는 입력받는다.
   실제 수율 = 실제 생산한 정상 칩 수/설계 최대 칩 수 */
namespace _3.새롭게_설계한_웨이퍼의_실제_수율을_계산하는_테스트_공정이다
{
    class Program
    {
        static void Main(string[] args)
        {
            int tcnt = 0;
            Console.Write(&quot;테스트 횟수:&quot;);
            int.TryParse(Console.ReadLine(), out tcnt);
            for(int t=0;t&amp;lt;tcnt;t++ )
            {
                TestCase(t + 1);
            }
        }
        enum PRO_LINE { PN,PA, PB, PC, PD, PE, PF}
        private static void TestCase(int t)
        {
            PRO_LINE pl = InputProLine();
            if(pl== PRO_LINE.PN)
            {
                Console.WriteLine(&quot;잘못 입력하였습니다.&quot;);
                return;
            }
            Console.Write(&quot;테스트 일련 번호:&quot;);
            string pno = Console.ReadLine();
            Console.Write(&quot;설계 최대 칩 수:&quot;);
            int max_chip = 0;
            int.TryParse(Console.ReadLine(), out max_chip);
            Console.Write(&quot;정상 칩 수:&quot;);
            int good_chip = 0;
            int.TryParse(Console.ReadLine(), out good_chip);
            Console.WriteLine(&quot;실제 수율:{0}&quot;, good_chip / (double)max_chip);
        }

        private static PRO_LINE InputProLine()
        {
            Console.WriteLine(&quot;생산 라인(A~F)&quot;);
            switch(Console.ReadLine())
            {
                case &quot;A&quot;:return PRO_LINE.PA;
                case &quot;B&quot;: return PRO_LINE.PB;
                case &quot;C&quot;: return PRO_LINE.PC;
                case &quot;D&quot;: return PRO_LINE.PD;
                case &quot;E&quot;: return PRO_LINE.PE;
                case &quot;F&quot;: return PRO_LINE.PF;
            }
            return PRO_LINE.PN;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;4.&amp;nbsp;실제&amp;nbsp;수율을&amp;nbsp;제조&amp;nbsp;라인&amp;nbsp;별로&amp;nbsp;출력하시오. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;라인: 평균 실제 수율&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1620894586925&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
//4.실제 수율을 제조 라인 별로 출력하시오.
//    라인: 평균 실제 수율 
namespace _4.실제_수율을_제조_라인_별로_출력하시오
{
    class Score
    {       
        public int MaxChip { get; set; } 
        public int GoodChip { get; set; }
        public Score(int mc, int gc)
        {
            MaxChip = mc;
            GoodChip = gc;
        }
        public double Value
        {
            get
            {
                return GoodChip / (double)MaxChip;
            }
        }
    }
    class Program
    {
        static Score[] scores = new Score[(int)PRO_LINE.PN];
        static void Main(string[] args)
        {
            int tcnt = 0;
            Console.Write(&quot;테스트 횟수:&quot;);
            int.TryParse(Console.ReadLine(), out tcnt);
            for (int t = 0; t &amp;lt; tcnt; t++)
            {
                TestCase(t + 1);
            }
            for(int i = 0; i&amp;lt;scores.Length;i++)
            {
                Console.Write(&quot;{0}:{1}&quot;, (PRO_LINE)i, scores[i].Value);
            }

        }
        enum PRO_LINE { A, B, C, D, E, F,PN }
        private static void TestCase(int t)
        {
            PRO_LINE pl = InputProLine();
            if (pl == PRO_LINE.PN)
            {
                Console.WriteLine(&quot;잘못 입력하였습니다.&quot;);
                return;
            }
            Score score = scores[(int)pl];
            Console.Write(&quot;테스트 일련 번호:&quot;);
            string pno = Console.ReadLine();
            Console.Write(&quot;설계 최대 칩 수:&quot;);
            int max_chip = 0;
            int.TryParse(Console.ReadLine(), out max_chip);
            score.MaxChip += max_chip;
            Console.Write(&quot;정상 칩 수:&quot;);
            int good_chip = 0;
            int.TryParse(Console.ReadLine(), out good_chip);
            score.GoodChip += good_chip;
            
            Console.WriteLine(&quot;실제 수율:{0}&quot;, good_chip / (double)max_chip);
        }

        private static PRO_LINE InputProLine()
        {
            Console.WriteLine(&quot;생산 라인(A~F)&quot;);
            switch (Console.ReadLine())
            {
                case &quot;A&quot;: return PRO_LINE.A;
                case &quot;B&quot;: return PRO_LINE.B;
                case &quot;C&quot;: return PRO_LINE.C;
                case &quot;D&quot;: return PRO_LINE.D;
                case &quot;E&quot;: return PRO_LINE.E;
                case &quot;F&quot;: return PRO_LINE.F;
            }
            return PRO_LINE.PN;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>C#</category>
      <category>문제</category>
      <category>반도체제어</category>
      <category>실습</category>
      <category>제어문</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3555</guid>
      <comments>https://ehclub.co.kr/3555#entry3555comment</comments>
      <pubDate>Wed, 12 May 2021 16:24:43 +0900</pubDate>
    </item>
    <item>
      <title>유튜브 수익 채널 인증 및 첫 2 주간 수익</title>
      <link>https://ehclub.co.kr/3554</link>
      <description>&lt;p&gt;&lt;span&gt;안녕하세요. 언제나휴일입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2021년 3월 3일에 수익 창출 채널 조건을 만족시켰어요. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3월 4일부터 3월 17일까지 2주간 수익이 발생했군요. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;현재 구독자는 약 1500명, 시청 시간은 하루 10~15시간, 조회수는 300~500회 입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2주일간 10달러 정도의 수익이 발생했군요. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;동영상 강의 제작하면서 목이 마르면 음료를 마실 때 사용하겠습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;감사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;20200304-0317.PNG&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv5B9Z/btq0px5VOl5/4GZxSz4MkFrPUZd6bNRGLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv5B9Z/btq0px5VOl5/4GZxSz4MkFrPUZd6bNRGLK/img.png&quot; data-alt=&quot;2021년 3월 4일~3월 17일 유튜브 수익&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv5B9Z/btq0px5VOl5/4GZxSz4MkFrPUZd6bNRGLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv5B9Z%2Fbtq0px5VOl5%2F4GZxSz4MkFrPUZd6bNRGLK%2Fimg.png&quot; data-filename=&quot;20200304-0317.PNG&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2021년 3월 4일~3월 17일 유튜브 수익&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=LdlHrBDe6YI&amp;amp;list=PL_fV1knZRgi6qygojzb_e8YOMne4vzOmm&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/S0o2a/hyJCgXoSUk/KaiK8tUNCYDEPVvHeFCWc0/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/LdlHrBDe6YI&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;언제나휴일 소개 및 Q&amp;amp;A 재생 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=3yuaoHV3dsc&amp;amp;list=PL_fV1knZRgi5qtacL-rsJl3jcyI0KOf4i&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cN3f0T/hyJBsLVM9n/CT2qW2ZzoOXQsTp6aUfLWk/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/3yuaoHV3dsc&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;원격 제어 프로그램 재생 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=JKla14TxV58&amp;amp;list=PL_fV1knZRgi476LWwZJOBvLaJOjGtpEwR&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/d5QarD/hyJCvAfXfF/e9jwLdzxMAmYxKM7clvEe1/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/JKla14TxV58&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;언제나 C언어 예제 Center 재생 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=lFOVxF_ae6I&amp;amp;list=PL_fV1knZRgi6Llqn3UF21sR97VuTDjVY_&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/7mKOu/hyJCinnB3S/qsHhTI4pF3KBtpLmLsfFT0/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/lFOVxF_ae6I&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;미래 실험실 pYTHON 재생 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=ewsh61FVZgo&amp;amp;list=PL_fV1knZRgi5CC62PQnv_pxzEItXWH-fn&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bU9uf6/hyJClxDHuo/VkBJS6NuHXJd6ENSnxkuJK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ewsh61FVZgo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;실습으로 다지는 C# 재생 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;이 외에도 다수의 프로그래밍 언어 및 기술, 프로젝트 동영상 강의를 제작하여 배포하고 있습니다.&lt;/p&gt;
&lt;p&gt;주말에는 프로그래밍 외에 취미 관련 영상을 제작하여 올릴 예정이며 현재 &quot;언제나음악&quot;을 올리고 있습니다.&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=dmBgLsJR5ow&amp;amp;list=PL_fV1knZRgi6moVLd8hYuzjnUjL6nNooS&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cCuPmP/hyJBkNTped/Xk3gjFUskPOj3Q1NfcaE31/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/dmBgLsJR5ow&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>유튜브 - 언제나 휴일 이야기</category>
      <category>1000명</category>
      <category>언제나휴일</category>
      <category>유튜브</category>
      <category>음악</category>
      <category>채널 수익</category>
      <category>첫 2주</category>
      <category>프로그래밍</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3554</guid>
      <comments>https://ehclub.co.kr/3554#entry3554comment</comments>
      <pubDate>Fri, 19 Mar 2021 09:30:16 +0900</pubDate>
    </item>
    <item>
      <title>계정 정지 위협, 포털 운영자인 것처럼 위장 바이러스 배포</title>
      <link>https://ehclub.co.kr/3553</link>
      <description>&lt;p&gt;안녕하세요. 언제나휴일입니다.&lt;/p&gt;
&lt;p&gt;어제는 대기업 중요 발주 문서인 것처럼 트로이목마 메일을 받았습니다.&lt;/p&gt;
&lt;p&gt;오늘 아침에 메일을 확인하는 중 다음 계정 정지를 시킨다는 메일을 받았습니다.&lt;/p&gt;
&lt;p&gt;하지만 전체 메일 구성이 너무나 엉성하였고 보낸 이 주소를 보니 엉뚱하다는 것을 알 수 있었습니다.&lt;/p&gt;
&lt;p&gt;갑자기 어제부터 누군가 저를 공격하고 싶은지 계속 메일로 이상한 것을 보내는 군요.&lt;/p&gt;
&lt;p&gt;여러분들도 수상한 메일이 오면 첨부 파일이나 링크 등을 누르지 마시고 바로 폐기하세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;포털 운영자인것 처럼 위장 바이러스 배포.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmgdyv/btqPC2blkf4/BQ2ijbpcn2n8TajinUvBH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmgdyv/btqPC2blkf4/BQ2ijbpcn2n8TajinUvBH1/img.png&quot; data-alt=&quot;포털 운영자인 것처럼 위장 바이러스 배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmgdyv/btqPC2blkf4/BQ2ijbpcn2n8TajinUvBH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmgdyv%2FbtqPC2blkf4%2FBQ2ijbpcn2n8TajinUvBH1%2Fimg.png&quot; data-filename=&quot;포털 운영자인것 처럼 위장 바이러스 배포.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포털 운영자인 것처럼 위장 바이러스 배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>계정 정지</category>
      <category>메일</category>
      <category>위장 바이러스</category>
      <category>포털 운영자</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3553</guid>
      <comments>https://ehclub.co.kr/3553#entry3553comment</comments>
      <pubDate>Thu, 10 Dec 2020 09:29:15 +0900</pubDate>
    </item>
    <item>
      <title>이메일로 모르는 발주서가 오면 트로이 목마를 의심하세요.</title>
      <link>https://ehclub.co.kr/3552</link>
      <description>&lt;p&gt;안녕하세요. 언제나휴일입니다.&lt;/p&gt;
&lt;p&gt;방금 메일을 확인하였는데 모르는 곳에서 발주서가 와 있네요.&lt;/p&gt;
&lt;p&gt;혹시 중요한 것일 수 있어서 잘못 보낸 것 같다고 답장을 보냈습니다.&lt;/p&gt;
&lt;p&gt;물론 첨부 파일을 확인하지 않았습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 혹시 중요한 것이면 연락해 주는 것이 좋겠다고 전화번호를 보는 순간,&lt;/p&gt;
&lt;p&gt;&quot;아~ &lt;b&gt;트로이 목마&lt;/b&gt;로구나!&quot;&lt;/p&gt;
&lt;p&gt;주소는 서울인데 전화번호는 제주(064)이고 모바일은 012로 시작하네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;구글에서 검색해 보니 2020년 들어 이메일로 주요한 계약인 것처럼 위장하여 첨부 파일로 바이러스를 심는 것이 많아졌다고 하네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다들 모르는 곳에서 메일이 왔을 때 절대 첨부파일은 접근하지 마세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;이메일을 이용한 트로이목마.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdKd9t/btqPyq3Qys7/p8RTk3BN04EsLxR4TiND71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdKd9t/btqPyq3Qys7/p8RTk3BN04EsLxR4TiND71/img.png&quot; data-alt=&quot;이메일 캡쳐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdKd9t/btqPyq3Qys7/p8RTk3BN04EsLxR4TiND71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdKd9t%2FbtqPyq3Qys7%2Fp8RTk3BN04EsLxR4TiND71%2Fimg.png&quot; data-filename=&quot;이메일을 이용한 트로이목마.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이메일 캡쳐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>바이러스</category>
      <category>발주서</category>
      <category>이메일</category>
      <category>트로이목마</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3552</guid>
      <comments>https://ehclub.co.kr/3552#entry3552comment</comments>
      <pubDate>Wed, 9 Dec 2020 12:51:52 +0900</pubDate>
    </item>
    <item>
      <title>3. 행복한 실패</title>
      <link>https://ehclub.co.kr/3551</link>
      <description>&lt;p&gt;&amp;nbsp;안녕하세요. 언제나휴일입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저에게는 고등학교 2학년이 아들이 있어요.&lt;/p&gt;
&lt;p&gt;아들이 중학생으로 올라가면서 자기 주도식 학습을 할 수 있게 계획을 세웠어요.&lt;/p&gt;
&lt;p&gt;그리고 실제 실험해 보았죠.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 실험 시작부터 문제가 있었네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아들은 아버지의 의견을 따라 자기 주도식 학습을 하는 것에 스트레스를 받더군요.&lt;/p&gt;
&lt;p&gt;제 입장에서 자기 주도식이라고 생각했던 것이 자기 주도식이 아닌 것이었죠.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;저의 생각과 차이로 인해 아들과 관계가 나빠지는 것을 느꼈어요. 바로 실험을 멈추었죠.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;이 후 우리 가족은 모든 것을 &quot;행복한 삶&quot;에 기준을 두기로 했어요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;저와 아내는 아들을 믿고 아들의 모든 활동을 적극적으로 격려해 주기로 했어요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;자기 주도식 학습은 실패했지만 행복합니다.&lt;/p&gt;</description>
      <category>교육/자기 주도식 학습</category>
      <category>행복한 실패</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3551</guid>
      <comments>https://ehclub.co.kr/3551#entry3551comment</comments>
      <pubDate>Sat, 5 Dec 2020 16:37:45 +0900</pubDate>
    </item>
    <item>
      <title>[C#, Windows Forms, 소켓 통신] 부재 입출고 자동 관리 창고 시스템 시뮬레이션 - Smart Factory 실습</title>
      <link>https://ehclub.co.kr/3550</link>
      <description>&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/u1uoK/btqOtg8kRRQ/mwTlNAkjdHzIfqdvoEulak/%5B%EA%B8%B0%EC%88%A0%20%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4%5D%20%EB%B6%80%EC%9E%AC%20%EC%B0%BD%EA%B3%A0%20%EC%9E%90%EB%8F%99%ED%99%94%20-%20WIndows%20Forms%2C%20%EC%86%8C%EC%BC%93%20%ED%86%B5%EC%8B%A0.docx?attach=1&amp;amp;knm=tfile.docx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;[기술 포트폴리오] 부재 창고 자동화 - WIndows Forms, 소켓 통신.docx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.11MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 부재 입출고 자동 관리 창고 시스템 시뮬레이션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음&amp;nbsp;시나리오처럼&amp;nbsp;동작하는&amp;nbsp;시뮬레이션&amp;nbsp;솔루션을&amp;nbsp;구현하시오. &lt;br /&gt;-&amp;nbsp;자동&amp;nbsp;관리&amp;nbsp;창고&amp;nbsp;시스템&amp;nbsp;:&amp;nbsp;GUI&amp;nbsp;프로그램(Windows&amp;nbsp;Forms&amp;nbsp;앱)+서버 &lt;br /&gt;-&amp;nbsp;중앙&amp;nbsp;관재&amp;nbsp;:&amp;nbsp;GUI&amp;nbsp;프로그램(Windows&amp;nbsp;Forms&amp;nbsp;앱)&amp;nbsp;+&amp;nbsp;클라이언트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 공통으로 사용할 라이브러리: 클래스 라이브러리&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 시나리오&lt;/h3&gt;
&lt;p&gt;부재를&amp;nbsp;입고&amp;nbsp;및&amp;nbsp;출고하면&amp;nbsp;RFID에&amp;nbsp;의해&amp;nbsp;자동으로&amp;nbsp;관리해&amp;nbsp;주는&amp;nbsp;창고&amp;nbsp;시스템이다. &lt;br /&gt;부재&amp;nbsp;입고&amp;nbsp;시에&amp;nbsp;RFID를&amp;nbsp;통해&amp;nbsp;부재명과&amp;nbsp;개수를&amp;nbsp;파악할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;처음으로&amp;nbsp;입력하는&amp;nbsp;부재일&amp;nbsp;때는&amp;nbsp;부재&amp;nbsp;ID(1부터&amp;nbsp;순차&amp;nbsp;주여)를&amp;nbsp;부여한다. &lt;br /&gt;창고&amp;nbsp;제어창에는&amp;nbsp;전체&amp;nbsp;부재&amp;nbsp;목록을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;원하는&amp;nbsp;부재와&amp;nbsp;출고&amp;nbsp;개수를&amp;nbsp;지정하면&amp;nbsp;자동&amp;nbsp;출고한다. &lt;br /&gt;&lt;br /&gt;중앙&amp;nbsp;관재를&amp;nbsp;통해&amp;nbsp;부재&amp;nbsp;입고,&amp;nbsp;부재&amp;nbsp;출고,&amp;nbsp;현황&amp;nbsp;파악이&amp;nbsp;가능하다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 공통으로 사용할 라이브러리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1 Material 클래스 정의&lt;/h4&gt;
&lt;p&gt;부재 ID, 부재 이름, 보유 개수를 멤버로 갖는 Material 클래스 정의&lt;/p&gt;
&lt;pre id=&quot;code_1606441239429&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace SF_CoreLib
{
    /// &amp;lt;summary&amp;gt;
    /// 재료 클래스
    /// &amp;lt;/summary&amp;gt;
    public class Material
    {
        /// &amp;lt;summary&amp;gt;
        /// 부재 ID - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public int ID { get; }
        /// &amp;lt;summary&amp;gt;
        /// 부재 이름 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Name { get; }
        /// &amp;lt;summary&amp;gt;
        /// 보유 개수 - 가져오기 및 설정하기
        /// &amp;lt;/summary&amp;gt;
        public int Count { get; set; }
        /// &amp;lt;summary&amp;gt;
        /// 생성자
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;id&quot;&amp;gt;부재 ID&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;name&quot;&amp;gt;부재 이름&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;count&quot;&amp;gt;보유 개수&amp;lt;/param&amp;gt;
        public Material(int id, string name,int count)
        {
            ID = id;
            Name = name;
            Count = count;
        }
        /// &amp;lt;summary&amp;gt;
        /// ToString 재정의
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;returns&amp;gt;부재 이름&amp;lt;/returns&amp;gt;
        public override string ToString()
        {
            return Name;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 자동 관리 창고 시스템 구현&lt;/h3&gt;
&lt;p&gt;3.에서 만든 라이브러리를 참조 추가합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1 컨트롤 배치&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;자식 컨트롤 배치.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;386&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c87UDm/btqOiA1ikyG/w7JFs71UIzjSSkmCkllB61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c87UDm/btqOiA1ikyG/w7JFs71UIzjSSkmCkllB61/img.png&quot; data-alt=&quot;창고 자식 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c87UDm/btqOiA1ikyG/w7JFs71UIzjSSkmCkllB61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc87UDm%2FbtqOiA1ikyG%2Fw7JFs71UIzjSSkmCkllB61%2Fimg.png&quot; data-filename=&quot;자식 컨트롤 배치.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;386&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;창고 자식 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2 이벤트 핸들러 등록&lt;/h4&gt;
&lt;p&gt;다음 이벤트 핸들러를 등록한다.&lt;/p&gt;
&lt;p&gt;Form1의 Load 이벤트 핸들러&lt;/p&gt;
&lt;p&gt;tbar_count의 Scroll 이벤트 핸들러&lt;/p&gt;
&lt;p&gt;btn_in과 btn_out의 Click 이벤트 핸들러&lt;/p&gt;
&lt;p&gt;lv_material의 SelectedIndexChanged 이벤트 핸들러&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.3 Form1.cs 구현&lt;/h4&gt;
&lt;pre id=&quot;code_1606447295587&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using SF_CoreLib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 창고
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void lv_material_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(lv_material.SelectedItems.Count==0)
            {
                btn_out.Enabled = false;
                nud_count.Maximum = 0;
                return;
            }
            ListViewItem lvi = lv_material.SelectedItems[0];
            string name = lvi.SubItems[1].Text;
            Material material = mdic[name];
            nud_count.Maximum = material.Count;
            btn_out.Enabled = true;
        }

        private void tbar_count_Scroll(object sender, EventArgs e)
        {
            int count = tbar_count.Value;
            lb_count.Text = count.ToString();
        }

        private void btn_in_Click(object sender, EventArgs e)
        {
            string name = tbox_name.Text;
            if(name == string.Empty)
            {
                MessageBox.Show(&quot;부재 이름을 먼저 입력하세요.&quot;);
                return;
            }
            int cnt = tbar_count.Value;
            if(mdic.ContainsKey(name) == false)
            {
                sn++;
                Material material = new Material(sn, name, cnt);
                mdic[name] = material;
                string[] sitems = new string[] { sn.ToString(), name, cnt.ToString() };
                ListViewItem lvi = new ListViewItem(sitems);
                lv_material.Items.Add(lvi);
            }
            else
            {
                Material material = mdic[name];
                material.Count += cnt;
                foreach(ListViewItem lvi in lv_material.Items)
                {
                    if(lvi.SubItems[0].Text == material.ID.ToString())
                    {
                        lvi.SubItems[2].Text = material.Count.ToString();
                        break;
                    }
                }
            }
        }

        private void btn_out_Click(object sender, EventArgs e)
        {
            ListViewItem lvi = lv_material.SelectedItems[0];
            string name = lvi.SubItems[1].Text;
            Material material = mdic[name];
            int count = (int)nud_count.Value;
            material.Count -= count;
            lvi.SubItems[2].Text = material.Count.ToString();
            nud_count.Maximum = material.Count;
        }

        Dictionary&amp;lt;string, Material&amp;gt; mdic;
        int sn;
        SFServer sfs = new SFServer(&quot;192.168.10.102&quot;, 19202);
        private void Form1_Load(object sender, EventArgs e)
        {
            mdic = new Dictionary&amp;lt;string, Material&amp;gt;();
            sfs.Start();
            sfs.OnOut += Sfs_OnOut;
            sfs.OnIn += Sfs_OnIn;
        }

        private void Sfs_OnIn(object sender, InEventArgs e)
        {
            tbox_name.Text = e.Name;
            tbar_count.Value = e.Count;
            lb_count.Text = e.Count.ToString();
            btn_in_Click(null, null);
        }

        private void Sfs_OnOut(object sender, OutEventArgs e)
        {
            string name = e.Name;
            foreach(ListViewItem lvi in lv_material.Items)
            {
                if(lvi.SubItems[1].Text == name)
                {
                    lvi.Selected = true;
                    decimal cnt = e.Count;
                    if(nud_count.Maximum&amp;lt;cnt)
                    {
                        cnt = nud_count.Maximum;
                    }
                    nud_count.Value = cnt;
                    btn_out_Click(null, null);
                    break;
                }
            }
            
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4 SFServer.cs&lt;/h3&gt;
&lt;p&gt;SFServer(스마트 팩토리 클라이언트) 클래스를 추가하고 구현합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1606462626174&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.IO;
using System.Net;
using System.Net.Sockets;

namespace 창고
{
    public class SFServer
    {
        public event OutEventHandler OnOut;
        public event InEventHandler OnIn;
        public string IP{get;}
        public int Port { get; }

        public SFServer(string ip, int port)
        {
            IP= ip;
            Port = port;
        }

        Socket sock;
        public void Start()
        {
            //소켓 생성
            sock = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);
            //소켓과 네트워크 인터페이스 결합
            IPAddress addr = IPAddress.Parse(IP);
            IPEndPoint end = new IPEndPoint(addr, Port);
            sock.Bind(end);
            //백 로그 큐 크기 결정
            sock.Listen(5);
            //클라이언트 연결 요청 대기 및 수락 Loop
            AcceptAsync();
        }

        delegate void AcceptDele();
        private void AcceptAsync()
        {
            AcceptDele dele = AcceptLoop;
            dele.BeginInvoke(null, null);
        }
        void AcceptLoop()
        {
            while(true)
            {
                Socket dosock = sock.Accept();
                DoIt(dosock);
            }

        }
        enum MsgType
        {
            MT_IN, MT_OUT
        }
        private void DoIt(Socket dosock)
        {
            byte[] packet = new byte[1024];
            dosock.Receive(packet);
            MemoryStream ms = new MemoryStream(packet);
            BinaryReader br = new BinaryReader(ms);
            MsgType mt = (MsgType)br.ReadInt32();
            string name = br.ReadString();
            int count = br.ReadInt32();
            br.Close();
            ms.Close();
            if(mt== MsgType.MT_IN)
            {
                if(OnIn!=null)
                {
                    OnIn(this, new InEventArgs(name, count));
                }
            }
            if(mt == MsgType.MT_OUT)
            {
                if(OnOut != null)
                {
                    OnOut(this, new OutEventArgs(name, count));
                }
            }
            dosock.Close();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.5 InEventArgs.cs - 입고 패킷 수신 이벤트 인자 및 대리자&lt;/h4&gt;
&lt;pre id=&quot;code_1606713974636&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

namespace 창고
{
    public delegate void InEventHandler(object sender, InEventArgs e);
    public class InEventArgs:EventArgs
    {
        public string Name { get;  }
        public int Count { get; }
        public InEventArgs(string name,int count)
        {
            Name = name;
            Count = count;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.6 OutEventArgs.cs&amp;nbsp; - 출고 패킷 수신 이벤트 인자 및 대리자&lt;/h3&gt;
&lt;pre id=&quot;code_1606713995258&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

namespace 창고
{
    public delegate void OutEventHandler(object sender, OutEventArgs e);
    public class OutEventArgs:EventArgs
    {
        public string Name { get; }
        public int Count { get; }
        public OutEventArgs(string name,int count)
        {
            Name = name;
            Count = count;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 중앙 관재 구현&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.1 자식 컨트롤 배치&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;자식 컨트롤 배치.png&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;448&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWk8Vp/btqOtgNHDUL/Dw50V1dpyKnihYDn1nUJDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWk8Vp/btqOtgNHDUL/Dw50V1dpyKnihYDn1nUJDk/img.png&quot; data-alt=&quot;중앙 관재 자식 컨트롤 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWk8Vp/btqOtgNHDUL/Dw50V1dpyKnihYDn1nUJDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWk8Vp%2FbtqOtgNHDUL%2FDw50V1dpyKnihYDn1nUJDk%2Fimg.png&quot; data-filename=&quot;자식 컨트롤 배치.png&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;448&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중앙 관재 자식 컨트롤 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 이벤트 핸들러 등록&lt;/h3&gt;
&lt;p&gt;세 개의 버튼의 Click 이벤트 핸들러를 등록합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.3 구현&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.3.1 Form1.cs&lt;/h4&gt;
&lt;pre id=&quot;code_1606457928965&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Windows.Forms;

namespace 창고_제어
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        
        string ip;
        int port;
        private void btn_set_Click(object sender, EventArgs e)
        {
            ip = tbox_ip.Text;
            port = int.Parse(tbox_port.Text);
            btn_in.Enabled = true;
            btn_out.Enabled = true;
        }

        private void btn_in_Click(object sender, EventArgs e)
        {
            string pname = tbox_name.Text;
            int cnt = tbar_count.Value;
            SFClient.SendIn(ip,port,pname, cnt);
        }

        private void btn_out_Click(object sender, EventArgs e)
        {
            string pname = tbox_name.Text;
            int cnt = (int)nud_count.Value;
            cnt = SFClient.SendOut(ip, port, pname, cnt);
        }

        private void tbar_count_Scroll(object sender, EventArgs e)
        {
            lb_count.Text = tbar_count.Value.ToString();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.3.2 SFCient 구현&lt;/h4&gt;
&lt;p&gt;SFClient 클래스를 추가하고 다음처럼 구현합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1606457997083&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.IO;
using System.Net;
using System.Net.Sockets;

namespace 창고_제어
{
    internal class SFClient
    {
        enum MsgType
        {
            MT_IN, MT_OUT
        }
        internal static void SendIn(string ip, int port, string pname, int cnt)
        {
            Socket sock = Connect(ip, port);
            byte[] packet = MakePacket(MsgType.MT_IN,pname, cnt);
            sock.Send(packet);
            sock.Close();
        }
        internal static int SendOut(string ip, int port, string pname, int cnt)
        {
            Socket sock = Connect(ip, port);
            byte[] packet = MakePacket(MsgType.MT_OUT, pname, cnt);
            sock.Send(packet);
            byte[] p2 = new byte[1024];
            sock.Close();
            return 0;
        }
        private static byte[] MakePacket(MsgType mt,string pname, int cnt)
        {
            //전송 메시지 ID, 전송메시지 
            byte[] packet = new byte[1024];
            MemoryStream ms = new MemoryStream(packet);
            BinaryWriter bw = new BinaryWriter(ms);
            bw.Write((int)mt);
            bw.Write(pname);
            bw.Write(cnt);
            bw.Close();
            ms.Close();
            return packet;
        }

        private static Socket Connect(string ip, int port)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);
            IPAddress addr = IPAddress.Parse(ip);
            IPEndPoint end = new IPEndPoint(addr, port);
            sock.Connect(end);
            return sock;
        }



        private static int UnPackInt(byte[] p2)
        {
            MemoryStream ms = new MemoryStream(p2);
            BinaryReader br = new BinaryReader(ms);
            int value = br.ReadInt32();
            br.Close();
            ms.Close();
            return value;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>C#</category>
      <category>Windows Forms</category>
      <category>부재 관리</category>
      <category>소켓 통신</category>
      <category>스마트 팩토리</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3550</guid>
      <comments>https://ehclub.co.kr/3550#entry3550comment</comments>
      <pubDate>Fri, 27 Nov 2020 09:39:04 +0900</pubDate>
    </item>
    <item>
      <title>[C#, Widows Form 실습] Wafer 등록기 - 반도체 제어시스템 시뮬</title>
      <link>https://ehclub.co.kr/3549</link>
      <description>&lt;p&gt;Wafer 등록기를 만들어보자.&lt;/p&gt;
&lt;p&gt;Wafer에는 제조회사, 제품명, 방향(100,110,111), 반경, 타입(P타입, N타입)을 속성으로 갖는다.&lt;/p&gt;
&lt;p&gt;다음과 같은 폼에 의해 사용자와 상호작용하는 Wafer 등록기를 작성하자.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bdhnO8/btqOeBLqd5E/4MDfg86xAW7B4soS1XTlgK/%5B%EA%B8%B0%EC%88%A0%20%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4%5DWafer%20%EC%9E%85%EB%A0%A5%EA%B8%B0-%20Windows%20Forms%20%EA%B8%B0%EB%B3%B8%20%EC%BB%A8%ED%8A%B8%EB%A1%A4.docx?attach=1&amp;amp;knm=tfile.docx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;[기술 포트폴리오]Wafer 입력기- Windows Forms 기본 컨트롤.docx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.03MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;컨트롤 배치.PNG&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;458&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LUsy6/btqN6U6AHjs/8RjPb0TY0QAHpGm097f2yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LUsy6/btqN6U6AHjs/8RjPb0TY0QAHpGm097f2yK/img.png&quot; data-alt=&quot;[그림] 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LUsy6/btqN6U6AHjs/8RjPb0TY0QAHpGm097f2yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLUsy6%2FbtqN6U6AHjs%2F8RjPb0TY0QAHpGm097f2yK%2Fimg.png&quot; data-filename=&quot;컨트롤 배치.PNG&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;458&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림] 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 프로젝트 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Wafer Manager 프로젝트를 생성하자.&lt;/p&gt;
&lt;p&gt;프로젝트 유형:&amp;nbsp; Windows Forms 앱(.NET Framework)&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Wafer 클래스 추가&lt;/h3&gt;
&lt;p&gt;프로젝트 컨텍스트 메뉴(오른쪽 마우스 클릭 시 나오는 메뉴)에서 새 항목을 선택한 후 Wafer 클래스를 추가하자.&lt;/p&gt;
&lt;p&gt;그리고 다음과 같이 클래스를 정의한다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/buEZgb/btqN8eQ3n0W/7PAgyBHAUp8sjb7TPovKO1/Wafer.cs?attach=1&amp;amp;knm=tfile.cs&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Wafer.cs&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1606199502235&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace Wafer_Manager
{
    public class Wafer
    {
        public string Company
        {
            get;//가져오기
            set;//설정하기
            //private set; //외부에서 설정하기를 막고자 할 때
        }
        public string Name
        {
            get;
            set;
        }
        public WDirection WDir
        {
            get;
            set;
        }
        public double Radius
        {
            get;
            set;
        }
        public bool PType
        {
            get;
            set;
        }
        public Wafer(string company, string name,
            WDirection wdir, double radius, bool ptype)
        {
            Company = company;
            Name = name;
            WDir = wdir;
            Radius = radius;
            PType = ptype;
        }
    }
    public enum WDirection
    {
        WD_111,WD_100, WD_110
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 컨트롤 배치&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;[그림] 컨트롤 배치&quot;&lt;/b&gt;처럼 자식 컨트롤을 배치합니다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;btn_remove의 Enable 속성은 False로 설정하세요.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4. 이벤트 핸들러 등록&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;세 개의 버튼의 Click 이벤트 핸들러와 lbox_wafer의 선택 항목 변경 이벤트 핸들러를 등록하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;현재까지의 Fom1.Designer.cs 코드는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/k3AWC/btqN8ZsCioS/KTcw2TFLq3SYkP3J2EkjY1/Form1.Designer.cs?attach=1&amp;amp;knm=tfile.cs&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Form1.Designer.cs&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1606202443985&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace Wafer_Manager
{
    partial class Form1
    {
        /// &amp;lt;summary&amp;gt;
        /// 필수 디자이너 변수입니다.
        /// &amp;lt;/summary&amp;gt;
        private System.ComponentModel.IContainer components = null;

        /// &amp;lt;summary&amp;gt;
        /// 사용 중인 모든 리소스를 정리합니다.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;disposing&quot;&amp;gt;관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.&amp;lt;/param&amp;gt;
        protected override void Dispose(bool disposing)
        {
            if (disposing &amp;amp;&amp;amp; (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form 디자이너에서 생성한 코드

        /// &amp;lt;summary&amp;gt;
        /// 디자이너 지원에 필요한 메서드입니다. 
        /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
        /// &amp;lt;/summary&amp;gt;
        private void InitializeComponent()
        {
            this.lbox_wafer = new System.Windows.Forms.ListBox();
            this.label1 = new System.Windows.Forms.Label();
            this.cbox_company = new System.Windows.Forms.ComboBox();
            this.btn_com_add = new System.Windows.Forms.Button();
            this.label2 = new System.Windows.Forms.Label();
            this.tbox_name = new System.Windows.Forms.TextBox();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.rb_111 = new System.Windows.Forms.RadioButton();
            this.rb_110 = new System.Windows.Forms.RadioButton();
            this.rb_100 = new System.Windows.Forms.RadioButton();
            this.label3 = new System.Windows.Forms.Label();
            this.nud_radius = new System.Windows.Forms.NumericUpDown();
            this.groupBox2 = new System.Windows.Forms.GroupBox();
            this.rb_n = new System.Windows.Forms.RadioButton();
            this.rb_p = new System.Windows.Forms.RadioButton();
            this.btn_add = new System.Windows.Forms.Button();
            this.btn_remove = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.nud_radius)).BeginInit();
            this.groupBox2.SuspendLayout();
            this.SuspendLayout();
            // 
            // lbox_wafer
            // 
            this.lbox_wafer.FormattingEnabled = true;
            this.lbox_wafer.ItemHeight = 24;
            this.lbox_wafer.Location = new System.Drawing.Point(13, 24);
            this.lbox_wafer.Name = &quot;lbox_wafer&quot;;
            this.lbox_wafer.Size = new System.Drawing.Size(199, 388);
            this.lbox_wafer.TabIndex = 0;
            this.lbox_wafer.SelectedIndexChanged += new System.EventHandler(this.lbox_wafer_SelectedIndexChanged);
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(231, 36);
            this.label1.Name = &quot;label1&quot;;
            this.label1.Size = new System.Drawing.Size(90, 24);
            this.label1.TabIndex = 1;
            this.label1.Text = &quot;제조사:&quot;;
            this.label1.Click += new System.EventHandler(this.label1_Click);
            // 
            // cbox_company
            // 
            this.cbox_company.FormattingEnabled = true;
            this.cbox_company.Location = new System.Drawing.Point(315, 33);
            this.cbox_company.Name = &quot;cbox_company&quot;;
            this.cbox_company.Size = new System.Drawing.Size(192, 32);
            this.cbox_company.TabIndex = 2;
            // 
            // btn_com_add
            // 
            this.btn_com_add.Location = new System.Drawing.Point(514, 33);
            this.btn_com_add.Name = &quot;btn_com_add&quot;;
            this.btn_com_add.Size = new System.Drawing.Size(119, 32);
            this.btn_com_add.TabIndex = 3;
            this.btn_com_add.Text = &quot;추가&quot;;
            this.btn_com_add.UseVisualStyleBackColor = true;
            this.btn_com_add.Click += new System.EventHandler(this.btn_com_add_Click);
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(231, 89);
            this.label2.Name = &quot;label2&quot;;
            this.label2.Size = new System.Drawing.Size(90, 24);
            this.label2.TabIndex = 4;
            this.label2.Text = &quot;제품명:&quot;;
            // 
            // tbox_name
            // 
            this.tbox_name.Location = new System.Drawing.Point(315, 86);
            this.tbox_name.Name = &quot;tbox_name&quot;;
            this.tbox_name.Size = new System.Drawing.Size(192, 35);
            this.tbox_name.TabIndex = 5;
            // 
            // groupBox1
            // 
            this.groupBox1.Controls.Add(this.rb_111);
            this.groupBox1.Controls.Add(this.rb_110);
            this.groupBox1.Controls.Add(this.rb_100);
            this.groupBox1.Location = new System.Drawing.Point(235, 149);
            this.groupBox1.Name = &quot;groupBox1&quot;;
            this.groupBox1.Size = new System.Drawing.Size(398, 66);
            this.groupBox1.TabIndex = 6;
            this.groupBox1.TabStop = false;
            // 
            // rb_111
            // 
            this.rb_111.AutoSize = true;
            this.rb_111.Location = new System.Drawing.Point(233, 32);
            this.rb_111.Name = &quot;rb_111&quot;;
            this.rb_111.Size = new System.Drawing.Size(67, 28);
            this.rb_111.TabIndex = 2;
            this.rb_111.TabStop = true;
            this.rb_111.Text = &quot;111&quot;;
            this.rb_111.UseVisualStyleBackColor = true;
            // 
            // rb_110
            // 
            this.rb_110.AutoSize = true;
            this.rb_110.Location = new System.Drawing.Point(134, 32);
            this.rb_110.Name = &quot;rb_110&quot;;
            this.rb_110.Size = new System.Drawing.Size(67, 28);
            this.rb_110.TabIndex = 1;
            this.rb_110.TabStop = true;
            this.rb_110.Text = &quot;110&quot;;
            this.rb_110.UseVisualStyleBackColor = true;
            // 
            // rb_100
            // 
            this.rb_100.AutoSize = true;
            this.rb_100.Location = new System.Drawing.Point(26, 35);
            this.rb_100.Name = &quot;rb_100&quot;;
            this.rb_100.Size = new System.Drawing.Size(67, 28);
            this.rb_100.TabIndex = 0;
            this.rb_100.TabStop = true;
            this.rb_100.Text = &quot;100&quot;;
            this.rb_100.UseVisualStyleBackColor = true;
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(235, 244);
            this.label3.Name = &quot;label3&quot;;
            this.label3.Size = new System.Drawing.Size(66, 24);
            this.label3.TabIndex = 7;
            this.label3.Text = &quot;반경:&quot;;
            // 
            // nud_radius
            // 
            this.nud_radius.Location = new System.Drawing.Point(327, 242);
            this.nud_radius.Name = &quot;nud_radius&quot;;
            this.nud_radius.Size = new System.Drawing.Size(201, 35);
            this.nud_radius.TabIndex = 8;
            // 
            // groupBox2
            // 
            this.groupBox2.Controls.Add(this.rb_n);
            this.groupBox2.Controls.Add(this.rb_p);
            this.groupBox2.Location = new System.Drawing.Point(235, 291);
            this.groupBox2.Name = &quot;groupBox2&quot;;
            this.groupBox2.Size = new System.Drawing.Size(398, 73);
            this.groupBox2.TabIndex = 9;
            this.groupBox2.TabStop = false;
            // 
            // rb_n
            // 
            this.rb_n.AutoSize = true;
            this.rb_n.Location = new System.Drawing.Point(192, 35);
            this.rb_n.Name = &quot;rb_n&quot;;
            this.rb_n.Size = new System.Drawing.Size(90, 28);
            this.rb_n.TabIndex = 1;
            this.rb_n.TabStop = true;
            this.rb_n.Text = &quot;N타입&quot;;
            this.rb_n.UseVisualStyleBackColor = true;
            // 
            // rb_p
            // 
            this.rb_p.AutoSize = true;
            this.rb_p.Location = new System.Drawing.Point(7, 35);
            this.rb_p.Name = &quot;rb_p&quot;;
            this.rb_p.Size = new System.Drawing.Size(91, 28);
            this.rb_p.TabIndex = 0;
            this.rb_p.TabStop = true;
            this.rb_p.Text = &quot;P타입&quot;;
            this.rb_p.UseVisualStyleBackColor = true;
            // 
            // btn_add
            // 
            this.btn_add.Location = new System.Drawing.Point(235, 370);
            this.btn_add.Name = &quot;btn_add&quot;;
            this.btn_add.Size = new System.Drawing.Size(166, 35);
            this.btn_add.TabIndex = 10;
            this.btn_add.Text = &quot;추가&quot;;
            this.btn_add.UseVisualStyleBackColor = true;
            this.btn_add.Click += new System.EventHandler(this.btn_add_Click);
            // 
            // btn_remove
            // 
            this.btn_remove.Enabled = false;
            this.btn_remove.Location = new System.Drawing.Point(407, 370);
            this.btn_remove.Name = &quot;btn_remove&quot;;
            this.btn_remove.Size = new System.Drawing.Size(166, 35);
            this.btn_remove.TabIndex = 11;
            this.btn_remove.Text = &quot;삭제&quot;;
            this.btn_remove.UseVisualStyleBackColor = true;
            this.btn_remove.Click += new System.EventHandler(this.btn_remove_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(13F, 24F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(655, 426);
            this.Controls.Add(this.btn_remove);
            this.Controls.Add(this.btn_add);
            this.Controls.Add(this.groupBox2);
            this.Controls.Add(this.nud_radius);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.groupBox1);
            this.Controls.Add(this.tbox_name);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.btn_com_add);
            this.Controls.Add(this.cbox_company);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.lbox_wafer);
            this.Font = new System.Drawing.Font(&quot;굴림&quot;, 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
            this.Margin = new System.Windows.Forms.Padding(6);
            this.Name = &quot;Form1&quot;;
            this.Text = &quot;Wafer 등록기&quot;;
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            ((System.ComponentModel.ISupportInitialize)(this.nud_radius)).EndInit();
            this.groupBox2.ResumeLayout(false);
            this.groupBox2.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.ListBox lbox_wafer;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.ComboBox cbox_company;
        private System.Windows.Forms.Button btn_com_add;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.TextBox tbox_name;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.RadioButton rb_111;
        private System.Windows.Forms.RadioButton rb_110;
        private System.Windows.Forms.RadioButton rb_100;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.NumericUpDown nud_radius;
        private System.Windows.Forms.GroupBox groupBox2;
        private System.Windows.Forms.RadioButton rb_n;
        private System.Windows.Forms.RadioButton rb_p;
        private System.Windows.Forms.Button btn_add;
        private System.Windows.Forms.Button btn_remove;
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 이벤트 핸들러 구현&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.1 btn_com_add의 Click 이벤트 핸들러&lt;/h4&gt;
&lt;p&gt;콤보 박스에 입력한 내용 혹은 현재 보이는 내용은 Text 속성을 통해 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;콤보 박스에 항목을 추가할 때는 Items 컬렉션에 Add 메서드를 호출합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1606205997277&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void btn_com_add_Click(object sender, EventArgs e)
        {
            string company = cbox_company.Text;
            cbox_company.Items.Add(company);
            cbox_company.Text = &quot;&quot;;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.2 btn_add의 Click 이벤트 핸들러&lt;/h4&gt;
&lt;p&gt;생성할 Wafer 개체의 속성 값을 얻어옵니다.&lt;/p&gt;
&lt;p&gt;회사 이름은 cbox_company의 Text 속성으로 얻어옵니다.&lt;/p&gt;
&lt;p&gt;제품 이름은 tbox_name의 Text 속성으로 얻어옵니다.&lt;/p&gt;
&lt;p&gt;방향은 관련 RadioButton의 체크 상태에 따라 다릅니다. 이를 얻어오는 메서드(GetWDirection)를 별도로 만들어서 얻어옵시다.&lt;/p&gt;
&lt;p&gt;반경은 nud_radius의 Value 속성으로 얻어옵니다. 주의할 점은 Value 속성의 타입은 decimal인데 Wafer의 radius는 double 형식이므로 형식 변환을 요구합니다.&lt;/p&gt;
&lt;p&gt;타입은 두 가지 중에 하나이므로 rb_p의 Checked 상태로 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이렇게 얻어온 값으로 Wafer 개체를 생성하여 lbox_wafer의 Items 컬렉션에 추가합니다.&lt;/p&gt;
&lt;p&gt;컨트롤의 상태를 다음 Wafer를 입력하기 쉽게 리셋합니다. 이 부분도 별도의 메서드(ResetControl)로 만들어서 수행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1606206048469&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void btn_add_Click(object sender, EventArgs e)
        {
            string company = cbox_company.Text;
            string pname = tbox_name.Text;
            WDirection wd = GetWDirection();
            double radius = (double)nud_radius.Value;
            bool ptype = rb_p.Checked;
            Wafer wafer = new Wafer(company, pname, wd, radius, ptype);
            lbox_wafer.Items.Add(wafer);
            ResetControl();
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GetWDirection 메서드는 방향 관련 RadioButton의 Checked 속성 값에 따라 반환 값을 결정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1606206381565&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private WDirection GetWDirection()
        {
            if(rb_100.Checked)
            {
                return WDirection.WD_100;
            }
            if(rb_110.Checked)
            {
                return WDirection.WD_110;
            }
            return WDirection.WD_111;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ResetControl 메서드 각 컨트롤의 상태를 적절할 값으로 설정합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1606206623525&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void ResetControl()
        {
            cbox_company.Text = &quot;&quot;;
            tbox_name.Text = &quot;&quot;;
            rb_100.Checked = true;
            nud_radius.Value = 0;
            rb_p.Checked = true;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.3 btn_remove의 Click 이벤트 핸들러&lt;/h4&gt;
&lt;p&gt;lbox_wafer의 선택 항목 인덱스를 얻어옵니다.&lt;/p&gt;
&lt;p&gt;lbox_wafer의 Items 컨트롤에서 해당 인덱스 요소를 제거합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1606206742206&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void btn_remove_Click(object sender, EventArgs e)
        {
            int index = lbox_wafer.SelectedIndex;
            lbox_wafer.Items.RemoveAt(index);
        }  &lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.4 lbox_wafer의 선택 항목 변경 이벤트 핸들러&lt;/h4&gt;
&lt;p&gt;선택 항목이 없다면 btn_remove를 비활성화 상태로 설정하고 각 컨트롤 상태를 리셋합니다.&lt;/p&gt;
&lt;p&gt;선택 항목이 있다면 btn_remove를 활성화 상태로 설정하고 선택 항목의 아이템을 Wafer 형식 개체로 참조합니다.&lt;/p&gt;
&lt;p&gt;wafer 개체의 값으로 컨트롤의 상태를 설정합니다. 이 부분은 별도의 메서드로 정의합시다.&lt;/p&gt;
&lt;pre id=&quot;code_1606206787133&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void lbox_wafer_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(lbox_wafer.SelectedIndex == -1)//선택 항목이 없다면
            {
                btn_remove.Enabled = false;
                ResetControl();
                return;
            }
            btn_remove.Enabled = true;
            Wafer wafer = lbox_wafer.SelectedItem as Wafer;
            SetControlWafer(wafer);
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;회사 이름으로 cbot_company의 Text 속성을 설정합니다.&lt;/p&gt;
&lt;p&gt;제품 이름으로 tbox_name의 Text 속성을 설정합니다.&lt;/p&gt;
&lt;p&gt;wafer의 방향을 설정하는 부분은 별도의 메서드를 만들어서 사용할게요.&lt;/p&gt;
&lt;p&gt;반경으로 nud_radius의 Value 속성을 설정합니다. 형식이 다르므로 decimal로 명시적 형변환합니다.&lt;/p&gt;
&lt;p&gt;wafer 타입 설정도 별도의 메서드를 만들어서 사용할게요.&lt;/p&gt;
&lt;pre id=&quot;code_1606206947861&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void SetControlWafer(Wafer wafer)
        {
            cbox_company.Text = wafer.Company;
            tbox_name.Text = wafer.Name;
            SetWDir(wafer.WDir);
            nud_radius.Value = (decimal)wafer.Radius;
            SetType(wafer.PType);
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;방향과 타입을 결정하는 메서드를 정의합시다.&lt;/p&gt;
&lt;pre id=&quot;code_1606207096566&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void SetType(bool pt)
        {
            if(pt)
            {
                rb_p.Checked = true;
            }
            else
            {
                rb_n.Checked = true;
            }
        }

        private void SetWDir(WDirection wd)
        {
            switch (wd)
            {
                case WDirection.WD_100: rb_100.Checked = true; break;
                case WDirection.WD_110: rb_110.Checked = true; break;
                case WDirection.WD_111: rb_111.Checked = true; break;
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. Form1.cs 코드&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/HBvJY/btqOda7SFSl/2rKIStJ5y6DbHMLqvHeLvK/Form1.cs?attach=1&amp;amp;knm=tfile.cs&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Form1.cs&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1606205804622&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Windows.Forms;

namespace Wafer_Manager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }



        private void btn_com_add_Click(object sender, EventArgs e)
        {
            string company = cbox_company.Text;
            cbox_company.Items.Add(company);
            cbox_company.Text = &quot;&quot;;
        }

        private void btn_add_Click(object sender, EventArgs e)
        {
            string company = cbox_company.Text;
            string pname = tbox_name.Text;
            WDirection wd = GetWDirection();
            double radius = (double)nud_radius.Value;
            bool ptype = rb_p.Checked;
            Wafer wafer = new Wafer(company, pname, wd, radius, ptype);
            lbox_wafer.Items.Add(wafer);
            ResetControl();
        }

        private void ResetControl()
        {
            cbox_company.Text = &quot;&quot;;
            tbox_name.Text = &quot;&quot;;
            rb_100.Checked = true;
            nud_radius.Value = 0;
            rb_p.Checked = true;
        }

        private WDirection GetWDirection()
        {
            if(rb_100.Checked)
            {
                return WDirection.WD_100;
            }
            if(rb_110.Checked)
            {
                return WDirection.WD_110;
            }
            return WDirection.WD_111;
        }

        private void btn_remove_Click(object sender, EventArgs e)
        {
            int index = lbox_wafer.SelectedIndex;
            lbox_wafer.Items.RemoveAt(index);
        }

        private void lbox_wafer_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(lbox_wafer.SelectedIndex == -1)//선택 항목이 없다면
            {
                btn_remove.Enabled = false;
                ResetControl();
                return;
            }
            btn_remove.Enabled = true;
            Wafer wafer = lbox_wafer.SelectedItem as Wafer;
            SetControlWafer(wafer);
        }

        private void SetControlWafer(Wafer wafer)
        {
            cbox_company.Text = wafer.Company;
            tbox_name.Text = wafer.Name;
            SetWDir(wafer.WDir);
            nud_radius.Value = (decimal)wafer.Radius;
            SetType(wafer.PType);
        }

        private void SetType(bool pt)
        {
            if(pt)
            {
                rb_p.Checked = true;
            }
            else
            {
                rb_n.Checked = true;
            }
        }

        private void SetWDir(WDirection wd)
        {
            switch(wd)
            {
                case WDirection.WD_100: rb_100.Checked = true; break;
                case WDirection.WD_110: rb_110.Checked = true; break;
                case WDirection.WD_111: rb_111.Checked = true; break;
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>C#</category>
      <category>Wafer 관리 응용</category>
      <category>Windows Forms 앱</category>
      <category>반도체 제어시스템</category>
      <category>실습</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3549</guid>
      <comments>https://ehclub.co.kr/3549#entry3549comment</comments>
      <pubDate>Tue, 24 Nov 2020 15:33:22 +0900</pubDate>
    </item>
    <item>
      <title>[python] 뉴스 검색기V04 feat.네이버 개발자센터</title>
      <link>https://ehclub.co.kr/3548</link>
      <description>&lt;p&gt;&lt;b&gt;DB 설계&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605169309418&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE [dbo].News
(
    [nid] INT NOT NULL PRIMARY KEY IDENTITY, 
    [title] VARCHAR(200) NOT NULL, 
    [link] VARCHAR(200) NOT NULL, 
    [description] VARCHAR(MAX) NOT NULL, 
    [pubdate] DATETIME NOT NULL,
    [mcnt] int NOT NULL
    CONSTRAINT TU UNIQUE(link)
)
===================================================
CREATE TABLE [dbo].Morpheme
(
    [mid] INT NOT NULL PRIMARY KEY IDENTITY, 
    [word] VARCHAR(50) NOT NULL, 
    [rcnt] INT NOT NULL,
    CONSTRAINT WU UNIQUE(word)
)
===================================================
CREATE TABLE [dbo].Inverse
(
    [nid] INT NOT NULL, 
    [mid] INT NOT NULL, 
    [rcnt] INT NOT NULL 
)

관계 추가
News(nid) - Inverse(nid)
Morpheme(mid) - Inverse(mid)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;관계 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;관계1.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tK9sZ/btqNgsW2WoT/pjYYpAzcgoF2Q3J3Vkbwlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tK9sZ/btqNgsW2WoT/pjYYpAzcgoF2Q3J3Vkbwlk/img.png&quot; data-alt=&quot;News 테이블의 nid와 Inverse 테이블의 nid&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tK9sZ/btqNgsW2WoT/pjYYpAzcgoF2Q3J3Vkbwlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtK9sZ%2FbtqNgsW2WoT%2FpjYYpAzcgoF2Q3J3Vkbwlk%2Fimg.png&quot; data-filename=&quot;관계1.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;News 테이블의 nid와 Inverse 테이블의 nid&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;관곚.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKDoOz/btqNe6Haoqz/tkiFPAK0cfKOqQLUhJG440/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKDoOz/btqNe6Haoqz/tkiFPAK0cfKOqQLUhJG440/img.png&quot; data-alt=&quot;Morpheme 테이블의 mid 와 Inverse 테이블의 mid&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKDoOz/btqNe6Haoqz/tkiFPAK0cfKOqQLUhJG440/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKDoOz%2FbtqNe6Haoqz%2FtkiFPAK0cfKOqQLUhJG440%2Fimg.png&quot; data-filename=&quot;관곚.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Morpheme 테이블의 mid 와 Inverse 테이블의 mid&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;EHHelper.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/VAxGJ/btqNf8xLyCa/0SjOYKNDYtC4trTJIOEpy1/EHHelper.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;EHHelper.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169429339&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#EHHelper.py
class EHHelper:
    #src:&quot;&amp;lt;b&amp;gt;음냐뤼, quot; 가나다quot;&amp;lt;/b&amp;gt;
    #RemoveTag
    #src:&quot;음냐뤼, quot; 가나다quot;&quot;
    #RemoveHtmlSpecialCh
    #src:&quot;음냐뤼, 가나다&quot;
    #RemoveSymbol
    #src:&quot;음냐뤼 가나다&quot;
    @staticmethod
    def EmitTagAndSpecialCh(str):
        str = EHHelper.RemoveTag(str)
        str = EHHelper.RemoveHtmlSpecialCh(str)
        str = EHHelper.RemoveSymbol(str)
        return str
    #태그를 제거
    @staticmethod
    def RemoveTag(src):
        try:
            while True:
                s,e = EHHelper.FindTag(src)
                if s&amp;lt;e:
                    src = src[:s]+src[e+1:] #태그를 제거하는 구문
                else:#'&amp;gt;'가 '&amp;lt;'보다 앞에 있을 때
                    src = src[:e]+src[e+1:]#'&amp;gt;'만 제거하는 구문
        except:# 더 이상 태그가 없음
            return src
    @staticmethod
    def FindTag(src):
        s = src.index('&amp;lt;')
        e = src.index('&amp;gt;')
        return s,e
    @staticmethod
    def RemoveSymbol(src):
        dest=&quot;&quot;
        for elem in src:
            if str.isalpha(elem) or str.isspace(elem):
                dest += elem
        return dest
    @staticmethod
    def RemoveHtmlSpecialCh(src):
        try:
            while True:
                s,e = EHHelper.FindHtmlSpecialCh(src)
                if s&amp;lt;e:
                    src = src[:s]+src[e+1:] #특수 문자를 제거
                else:
                    src = src[:e]+src[e+1:]#';'만 제거
        except:# 더 이상 특수 문자 없음
            return src
    @staticmethod
    def FindHtmlSpecialCh(src):
        s = src.index('&amp;amp;')
        e = src.index(';')
        return s,e
    #mssql에 한글 문자열을 파이썬에 한글 문자열로 변환
    @staticmethod
    def MssqlstrToStrKor(src):
        src = src.encode('ISO-8859-1')
        src = src.decode('euc-kr')
        return src&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;InverseSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ceyRHS/btqNjULZ4Ws/2kb3L6KsoeDILZjeKMcCS0/InverseSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;InverseSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169457627&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#InverseSql.py
import pymssql
class InverseSql:
    @staticmethod
    def AddInverseItem(nid,mid,rcnt):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        s_pre = &quot;Insert into Inverse(nid,mid,rcnt) values&quot;
        s_post = str.format(&quot;({0},{1},{2})&quot;,nid,mid,rcnt)
        query = s_pre+s_post
        try:
            cursor.execute(query)
            conn.commit()
        except:
            temp=&quot;&quot;
        conn.close()
    @staticmethod
    def FindInv(mid):
        inv_col = list()
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;Select nid,rcnt from Inverse where mid={0}&quot;,mid)
        cursor.execute(query)
        row = cursor.fetchone()  
        while row:
            inv_col.append(row)
            row = cursor.fetchone()
        conn.close()
        return inv_col&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Morpheme.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605169483922&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Morpheme.py  - 형태소 클래스
class Morpheme:
    def __init__(self,word):
        self.word = word #단어 
        self.ref = 1           #참조 개수
    def Merge(self,other): # 병합하기
        if self.IsEqual(other):
            self.ref = self.ref + other.ref
    def IsEqual(self,other): #같은 단어를 갖는 형태소인지 판별
        return self.word ==  other.word
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;MorphemeParser.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bAN8eD/btqNe6UGjMh/AJyogbeJYKZxcvMoQCp3lk/MorphemeParser.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MorphemeParser.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169504594&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MorphemeParser.py - 형태소 분석기
from Morpheme import Morpheme
from EHHelper import EHHelper
class MorphemeParser:
    @staticmethod
    def Parse(src):
        morphes = list() 
        #원본 문자열에 특수 기호를 제거 및 공백 기준으로 분리
        src = EHHelper.EmitTagAndSpecialCh(src)
        msrc = src.split(' ')
        #각 단어를 형태소 컬렉션에 추가
        for elem in msrc:
            if str.isalpha(elem):
                morphes.append(Morpheme(elem))
        #중복 형태소를 합치는 공정
        morphes = MorphemeParser.Merge(morphes)
        return morphes

    @staticmethod
    def Merge(morphes):
        remoes = list()#병합한 형태소를 보관할 컬렉션
        for morph in morphes:#원본 컬렉션에 있는 각각의 형태소를
            rcnt = len(remoes)#병합한 컬렉션에 형태소 개수 구하기
            flag = False #morph와 같은 단어가 remoes에 없다고 가정
            #morph가 remoes컬렉션에 있다면 병합
            for index in range(0,rcnt):
                if remoes[index].word == morph.word:
                    remoes[index].Merge(morph)
                    flag = True#병합하였음을 마킹
                    break            
            if flag == False:#morph와 같은 단어는 remoes에 없음
                remoes.append(morph)
        return remoes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;MorphemeSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/FRigH/btqNfr5lUc8/eLCX8bTviNGLaTSIAFgLx0/MorphemeSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MorphemeSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169533514&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MorphemeSql.py
import pymssql
class MorphemeSql:
    @staticmethod
    def AddMorpheme(mo):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;Insert into Morpheme(word) values('{0}')&quot;,mo.word)
        try:
            cursor.execute(query)
            conn.commit()
        except:
            temp=&quot;&quot;
        conn.close()
    @staticmethod
    def FindMid(word):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;select mid from Morpheme where (word='{0}')&quot;,word)
        cursor.execute(query)
        row = cursor.fetchone()
        conn.commit()
        conn.close()
        if row:
            return row[0]
        return 0
    @staticmethod
    def ListMorpheme():
        moes = list()
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;select word from Morpheme&quot;)
        cursor.execute(query)
        row = cursor.fetchone()  
        while row:
            moes.append(row[0]) 
            row = cursor.fetchone()
        conn.close()
        return moes

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NAWidget.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cUOABI/btqNhaWbVhc/PKsk1fVlKOpcP8btYaJ6y0/NAWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NAWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169572346&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NAWidget.py - 뉴스 분석 Widget
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from NewsSql import NewsSql
from MorphemeSql import MorphemeSql
from InverseSql import InverseSql
from EHHelper import EHHelper
class NAWidget(QDialog):
    def __init__(self,pa):
        super().__init__(pa)
        self.resize(2000,1000)
        lb_mo = QLabel(&quot;형태소 목록&quot;,self)
        lb_mo.move(20,20)
        self.lbox_mo = QListWidget(self)
        self.lbox_mo.move(20,100)
        self.lbox_mo.resize(400,880)
        lb_news = QLabel(&quot;포함 뉴스 목록&quot;,self)
        lb_news.move(440,20)
        self.tb_news = QTableWidget(self)
        self.tb_news.move(440,100)
        self.tb_news.resize(1540,880)
        self.tb_news.setColumnCount(4)
        self.tb_news.setColumnWidth(0,self.tb_news.width()/5)
        self.tb_news.setColumnWidth(1,self.tb_news.width()*2/5)
        self.tb_news.setColumnWidth(2,self.tb_news.width()/6)
        self.tb_news.setColumnWidth(3,self.tb_news.width()/6)
        self.tb_news.setHorizontalHeaderLabels\
            ([&quot;제목&quot;,&quot;링크&quot;,&quot;전체 개수&quot;,&quot;참조 개수&quot;])
        self.lbox_mo.currentRowChanged.connect(self.OnSelectNews)
        self.ListMorpheme()
    def ListMorpheme(self):
        temp = &quot;지금 합시다.&quot;
        moes = MorphemeSql.ListMorpheme()
        for mo in moes:
            mo = EHHelper.MssqlstrToStrKor(mo)
            self.lbox_mo.addItem(mo)
    def OnSelectNews(self):
        item = self.lbox_mo.currentItem()
        word = item.text()
        self.tb_news.setRowCount(0)#테이블 내용 모두 삭제
        mid = MorphemeSql.FindMid(word)
        ins = InverseSql.FindInv(mid)
        self.tb_news.setRowCount(len(ins))
        for ri in range(0,len(ins)):
            nid,rcnt = ins[ri]
            news = NewsSql.FindNewsByNid(nid)
            title,link,description,pubdate,mcnt = news
            title = EHHelper.MssqlstrToStrKor(title)
            self.tb_news.setCellWidget(ri,0,QLabel(title))
            self.tb_news.setCellWidget(ri,1,QLabel(link))
            self.tb_news.setCellWidget(ri,2,QLabel(str(mcnt)))
            self.tb_news.setCellWidget(ri,3,QLabel(str(rcnt)))
            self.tb_news.setRowHeight(ri,70)


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NCWindow.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/lieoy/btqNjVKVMn9/huTNp7a4TnVGZqZ3LBQSX0/NCWindow.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NCWindow.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169604042&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NCWindow.py
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from NewsAnaylizer import NewsAnaylizer
from NewsSql import NewsSql
from MorphemeSql import MorphemeSql
from InverseSql import InverseSql
import _thread
from NAWidget import NAWidget
from NSDialog import NSDialog
def Analyze(datas):
    for data in datas:
        news,m1,m2 = data
        news.PreProcess()
        NewsSql.AddNews(news)
        NewsSql.UpdateMCnt(news.link,len(m1)+len(m2))
        nid = NewsSql.FindNid(news.link)
        for mo in m1:
            MorphemeSql.AddMorpheme(mo)
            mid = MorphemeSql.FindMid(mo.word)
            InverseSql.AddInverseItem(nid,mid,mo.ref)
        for mo in m2:
            MorphemeSql.AddMorpheme(mo)
            mid = MorphemeSql.FindMid(mo.word)
            InverseSql.AddInverseItem(nid,mid,mo.ref)

class NCWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;수집기(feat.네이버 개발자 센터)&quot;)
        self.na = NewsAnaylizer()
        self.resize(2000,1000)
        self.te_query = QTextEdit(self)
        self.te_query.move(20,20)
        self.te_query.resize(800,60)
        self.btn_search = QPushButton(&quot;검색&quot;,self)
        self.btn_search.move(840,20)
        self.btn_search.resize(200,60)
        self.tb_news = QTableWidget(self)
        self.tb_news.move(20,100)
        self.tb_news.resize(1960,880)
        self.tb_news.setColumnCount(3)
        self.tb_news.setColumnWidth(0,self.tb_news.width()*2/10)
        self.tb_news.setColumnWidth(1,self.tb_news.width()*6/10)
        self.tb_news.setColumnWidth(2,self.tb_news.width()*2/10-10)
        self.tb_news.setHorizontalHeaderLabels([&quot;제목&quot;,&quot;주소&quot;,&quot;단어 개수&quot;])
        self.btn_search.clicked.connect(self.OnSearch)
        self.btn_analyze = QPushButton(&quot;분석&quot;, self)
        self.btn_analyze.move(1760,20)
        self.btn_analyze.resize(200,60)
        self.btn_analyze.clicked.connect(self.OnAnalyze)
        self.btn_view_sdlg = QPushButton(&quot;검색기 띄우기&quot;,self)
        self.btn_view_sdlg.move(1400,20)
        self.btn_view_sdlg.resize(300,60)
        self.btn_view_sdlg.clicked.connect(self.OnShowSearchDlg)
    def OnShowSearchDlg(self):
        nsd = NSDialog(self)
        nsd.show()
    def OnAnalyze(self):
        naw = NAWidget(self)
        naw.show()
    def OnSearch(self):
        self.tb_news.setRowCount(0)
        query = self.te_query.toPlainText()
        datas =  self.na.Analize(query)
        self.tb_news.setRowCount(len(datas))
        for ri in range(0,len(datas)):
            news ,mo1, mo2 = datas[ri]
            mcnt = len(mo1)+len(mo2)
            self.tb_news.setCellWidget(ri,0,QLabel(news.title))
            self.tb_news.setCellWidget(ri,1,QLabel(news.link))
            self.tb_news.setCellWidget(ri,2,QLabel(str(mcnt)))
            self.tb_news.setRowHeight(ri,60)
        _thread.start_new_thread(Analyze,(datas,))
        #Analyze(datas)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;News.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/WmNZG/btqNkd5D2Zl/2oaBke6i9L9vVgdDdaDq61/News.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;News.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169634986&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#News.py
from MorphemeParser import MorphemeParser
from EHHelper import EHHelper
import datetime
class News:
    def __init__(self,title,link,description,pubdate):
        self.title = title
        self.link = link
        self.description = description
        self.pubdate = pubdate
    def PreProcess(self):
        self.title = EHHelper.EmitTagAndSpecialCh(self.title)
        self.description = EHHelper.EmitTagAndSpecialCh(self.description)
    @staticmethod
    def MakeNews(jnews):
        title = jnews['title']
        link = jnews['link']
        description = jnews['description']
        pubdate = jnews['pubDate']
        try:
            index = pubdate.rfind('+')
            pubdate = pubdate[:index]
            dt = datetime.datetime.strptime(src,&quot;%a, %d %b %Y %H:%M:%S &quot;)
        except:
            pubdate = datetime.datetime.now()
        else:
            pubdate = dt
        return News(title,link,description,pubdate)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsAnaylizer.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bXJw1V/btqNe68chti/6utoPpPCJf3JstZcqxWVmK/NewsAnaylizer.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsAnaylizer.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169672763&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsAnaylizer.py - 뉴스 분석기
from NewsSearcher import NewsSearcher
from MorphemeParser import MorphemeParser
from Morpheme import Morpheme
from News import News
class NewsAnaylizer:
    def __init__(self):
        self.ns = NewsSearcher()
    def Analize(self, query):
        redata = list()
        self.ns.SetQuery(query)
        news_col = self.ns.RequestAll()
        #news_col,total = self.ns.Request(1,10)
        for jnews in news_col:
            news = News.MakeNews(jnews)
            morphes1 = MorphemeParser.Parse(news.title)
            morphes2 = MorphemeParser.Parse(news.description)
            redata.append([news,morphes1,morphes2])
        return redata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsSearcher.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bbeNxT/btqNgtuUihq/KOQ0f31kV5OWfWH7wyV0Qk/NewsSearcher.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsSearcher.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169710621&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsSearcher.py - 뉴스 검색기
from MorphemeParser import MorphemeParser
from Morpheme import Morpheme
import urllib.request
import json
class NewsSearcher:
    def __init__(self):
        self.client_id =&quot;N3yLQ95_i8KdsL3tJAJ3&quot;
        self.client_secret=&quot;99b7XrrXp3&quot;
        self.url = &quot;https://openapi.naver.com/v1/search/news.json&quot;
    def SetQuery(self,query):
        query = urllib.parse.quote(query)
        self.qp = &quot;query=&quot;+query
    def Request(self,start,display):
        sp = &quot;start=&quot;+str(start)
        dp = &quot;display=&quot;+str(display)
        query_str = self.url+&quot;?&quot;+self.qp+&quot;&amp;amp;&quot;+sp+&quot;&amp;amp;&quot;+dp
        request = urllib.request.Request(query_str)
        request.add_header(&quot;X-Naver-Client-Id&quot;,self.client_id)
        request.add_header(&quot;X-Naver-Client-Secret&quot;,self.client_secret)
        try:
            response = urllib.request.urlopen(request)
        except: #예외 발생하였을 때
            return list(),0
        if response.getcode()!=200:#실패일 때
            return list(),0
        content = response.read()
        content = content.decode('utf-8')
        jdata = json.loads(content)
        total = int(jdata['total'])
        return jdata['items'],total
    def RequestAll(self):
        start = 1
        display = 100
        redatas = list()
        datas, total = self.Request(start,display)
        redatas.extend(datas)
        start = start + display
        while start&amp;lt;total and start&amp;lt;1000:
            datas, total = self.Request(start,display)
            redatas.extend(datas)
            start = start + display
        return redatas&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cY1CML/btqNgugcUHV/3HiCXfHlPpQNGjrhSkKLP0/NewsSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169738122&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsSql.py
from News import News
import pymssql
class NewsSql:
    @staticmethod
    def AddNews(news):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        dstr = news.pubdate.strftime('%Y-%m-%d %H:%M:%S')
        q_pre = &quot;insert into News (title,description,link,pubdate,mcnt)&quot;
        q_post = str.format(&quot;values('{0}','{1}','{2}','{3}',{4})&quot;,\
            news.title, news.description,news.link,dstr,0)
        query = str.format(&quot;{0}      {1}&quot;,q_pre,q_post)
        try:
            cursor.execute(query)
            conn.commit()
        except:
            temp=&quot;&quot;
        conn.close()
    @staticmethod
    def UpdateMCnt(link,mcnt):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;update News set mcnt={0} where (link='{1}')&quot;,mcnt,link)
        cursor.execute(query)
        conn.commit()
        conn.close()
    @staticmethod
    def FindNid(link):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;select nid from News where (link='{0}')&quot;,link)
        cursor.execute(query)
        row = cursor.fetchone()
        conn.commit()
        conn.close()
        return row[0]
    @staticmethod
    def FindNewsByNid(nid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        q_pre = &quot;select title,link,description,pubdate,mcnt from News &quot;
        q_post = str.format(&quot;   where (nid={0})&quot;,nid)
        query = q_pre + q_post
        cursor.execute(query)
        row = cursor.fetchone()
        conn.close()
        return row
    @staticmethod
    def TotalDocumentCount():
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = &quot;select count(*) from News&quot;
        cursor.execute(query)
        row = cursor.fetchone()
        conn.close()
        return row[0]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NSDialog.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/wiEsF/btqNiWJ5Ssp/uIKE2Pc6ZZV6F6lPuqbEqk/NSDialog.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NSDialog.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169769042&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NSDialog.py - 뉴스 검색 대화상자
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from NewsSql import NewsSql
from MorphemeSql import MorphemeSql
from InverseSql import InverseSql
from EHHelper import EHHelper
from MorphemeParser import MorphemeParser
from ScoredNews import ScoredNews
from News import News
import math
class NSDialog(QDialog):
    def __init__(self,pa):
        super().__init__(pa)
        self.resize(2000,1000)
        self.setWindowTitle(&quot;뉴스 검색기&quot;)
        self.te_query = QTextEdit(self)
        self.te_query.move(20,20)
        self.te_query.resize(800,60)
        self.btn_search = QPushButton(&quot;검색&quot;,self)
        self.btn_search.move(840,20)
        self.btn_search.resize(200,60)
        self.lbox_news = QListWidget(self)
        self.lbox_news.move(20,90)
        self.lbox_news.resize(600,900)
        lb_d1 = QLabel(&quot;제목:&quot;,self)
        lb_d1.move(640,100)
        lb_d2 = QLabel(&quot;링크&quot;,self)
        lb_d2.move(640,180)
        lb_d3 = QLabel(&quot;점수:&quot;,self)
        lb_d3.move(640,260)
        self.te_title = QTextEdit(&quot;&quot;,self)
        self.te_title.setReadOnly(True)
        self.te_title.move(740,100)
        self.te_title.resize(1240,60)
        self.te_link = QTextEdit(&quot;&quot;,self)
        self.te_link.setReadOnly(True)
        self.te_link.move(740,180)
        self.te_link.resize(1240,60)
        self.te_score = QTextEdit(&quot;&quot;,self)
        self.te_score.setReadOnly(True)
        self.te_score.move(740,260)
        self.te_score.resize(1240,60)
        self.te_description = QTextEdit(&quot;&quot;,self)
        self.te_description.setReadOnly(True)
        self.te_description.move(640,340)
        self.te_description.resize(1340,650)
        self.btn_search.clicked.connect(self.OnSearch)
        self.lbox_news.currentRowChanged.connect(self.OnSelectChange)
        self.sns = list()
    def OnSearch(self):
        self.sns.clear()
        query = self.te_query.toPlainText()
        tdcnt = NewsSql.TotalDocumentCount()
        moes = MorphemeParser.Parse(query)
        for mo in moes:
            mid = MorphemeSql.FindMid(mo.word)
            ins = InverseSql.FindInv(mid)
            idf = tdcnt/(len(ins)+1)
            for ri in range(0,len(ins)):
                nid,rcnt = ins[ri]
                news = NewsSql.FindNewsByNid(nid)
                title,link,description,pubdate,mcnt = news
                title = EHHelper.MssqlstrToStrKor(title)
                description = EHHelper.MssqlstrToStrKor(description)
                tf = rcnt/mcnt
                score = tf*math.log(idf)
                sn = ScoredNews(News(title,link,description,pubdate),score)
                self.sns.append(sn)
        self.sns = NSDialog.MergeDupSns(self.sns)
        for sn in self.sns:
            self.lbox_news.addItem(sn.news.title)
    def OnSelectChange(self):
        if len(self.sns) == 0:
            return
        index = self.lbox_news.currentRow()        
        sn = self.sns[index]
        self.te_title.setText(sn.news.title)
        self.te_link.setText(sn.news.link)
        self.te_description.setText(sn.news.description)
        self.te_score.setText(str(sn.score))
    @staticmethod 
    def MergeDupSns(sns):
        res = list()
        for sn in sns:
            flag = False
            for i in range(0,len(res)):
                rsn = res[i]
                if(rsn.news.link == sn.news.link):
                    rsn.score += sn.score
                    flag = True
                    break
            if flag == False:
                res.append(sn)
        res = sorted(res)
        return res
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;ScoredNews.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/uonfl/btqNkPQYIiX/QxhvNQkqDXc4UvvoYttatK/ScoredNews.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ScoredNews.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605169796995&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ScoredNews.py
from News import News
class ScoredNews:
    def __init__(self,news,score):
        self.news = news
        self.score = score
    def __lt__(self,other):
        return self.score&amp;gt;other.score&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605083344457&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from NCWindow import NCWindow
app = QApplication(sys.argv)
ncw = NCWindow()
ncw.show()
sys.exit(app.exec_())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어 자료구조 알고리즘/파이썬(Python)</category>
      <category>open api</category>
      <category>Python</category>
      <category>QTableWidget</category>
      <category>text mining</category>
      <category>검색 엔진</category>
      <category>뉴스 검색기</category>
      <category>빅데이터</category>
      <category>소스 코드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3548</guid>
      <comments>https://ehclub.co.kr/3548#entry3548comment</comments>
      <pubDate>Wed, 11 Nov 2020 16:37:23 +0900</pubDate>
    </item>
    <item>
      <title>[python] 뉴스 검색기V03 feat. 네이버 개발자센터, 형태소 분석, MSSQL</title>
      <link>https://ehclub.co.kr/3547</link>
      <description>&lt;p&gt;&lt;b&gt;뉴스 테이블&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;[dbo].News &lt;br /&gt;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[nid]&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;IDENTITY,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[title]&amp;nbsp;VARCHAR(200)&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[link]&amp;nbsp;VARCHAR(200)&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[description]&amp;nbsp;VARCHAR(MAX)&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[pubdate]&amp;nbsp;DATETIME&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[mcnt]&amp;nbsp;int&amp;nbsp;NOT&amp;nbsp;NULL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONSTRAINT&amp;nbsp;TU&amp;nbsp;UNIQUE(link) &lt;br /&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;형태소 테이블&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;[dbo].Morpheme &lt;br /&gt;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[mid]&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;IDENTITY,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[word] VARCHAR(50) NOT NULL,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONSTRAINT&amp;nbsp;WU&amp;nbsp;UNIQUE(word) &lt;br /&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;역참조 테이블(역파일)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;[dbo].Inverse &lt;br /&gt;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[nid]&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[mid]&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[rcnt]&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp; &lt;br /&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;관계 추가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;관계1.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RFqsm/btqM9OMdd0e/hJYL3b88X1Tlvw76fZnkr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RFqsm/btqM9OMdd0e/hJYL3b88X1Tlvw76fZnkr1/img.png&quot; data-alt=&quot;News 테이블의 nid컬럼과 Inverse 테이블의 nid 컬럼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RFqsm/btqM9OMdd0e/hJYL3b88X1Tlvw76fZnkr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRFqsm%2FbtqM9OMdd0e%2FhJYL3b88X1Tlvw76fZnkr1%2Fimg.png&quot; data-filename=&quot;관계1.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;News 테이블의 nid컬럼과 Inverse 테이블의 nid 컬럼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;관곚.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7dgg9/btqM5fqG00x/DKK0DJH5qVkE1QW0J6nOiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7dgg9/btqM5fqG00x/DKK0DJH5qVkE1QW0J6nOiK/img.png&quot; data-alt=&quot;Morpheme 테이블의 mid 컬럼과 Inverse 테이블의 mid 컬럼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7dgg9/btqM5fqG00x/DKK0DJH5qVkE1QW0J6nOiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7dgg9%2FbtqM5fqG00x%2FDKK0DJH5qVkE1QW0J6nOiK%2Fimg.png&quot; data-filename=&quot;관곚.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Morpheme 테이블의 mid 컬럼과 Inverse 테이블의 mid 컬럼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;News.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/pIABU/btqNkfPJwxg/w6BdhMQpq5dYiiGWwmE0ZK/News.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;News.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605075854534&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#News.py
from MorphemeParser import MorphemeParser
from EHHelper import EHHelper
import datetime
class News:
    def __init__(self,title,link,description,pubdate):
        self.title = title
        self.link = link
        self.description = description
        self.pubdate = pubdate
    def PreProcess(self):
        self.title = EHHelper.EmitTagAndSpecialCh(self.title)
        self.description = EHHelper.EmitTagAndSpecialCh(self.description)
    @staticmethod
    def MakeNews(jnews):
        title = jnews['title']
        link = jnews['link']
        description = jnews['description']
        pubdate = jnews['pubDate']
        try:
            index = pubdate.rfind('+')
            pubdate = pubdate[:index]
            dt = datetime.datetime.strptime(src,&quot;%a, %d %b %Y %H:%M:%S &quot;)
        except:
            pubdate = datetime.datetime.now()
        else:
            pubdate = dt
        return News(title,link,description,pubdate)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Morpheme.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bOEtNc/btqNaFa3VBl/nsdMuALWaPayDUBXQEKPtk/Morpheme.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Morpheme.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1605075892022&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Morpheme.py  - 형태소 클래스
class Morpheme:
    def __init__(self,word):
        self.word = word #단어 
        self.ref = 1           #참조 개수
    def Merge(self,other): # 병합하기
        if self.IsEqual(other):
            self.ref = self.ref + other.ref
    def IsEqual(self,other): #같은 단어를 갖는 형태소인지 판별
        return self.word ==  other.word
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/m9V6G/btqNiWpzqhE/VYbn66FApwcrMAwY6kuekK/NewsSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605075927678&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsSql.py
from News import News
import pymssql
class NewsSql:
    @staticmethod
    def AddNews(news):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        dstr = news.pubdate.strftime('%Y-%m-%d %H:%M:%S')
        q_pre = &quot;insert into News (title,description,link,pubdate,mcnt)&quot;
        q_post = str.format(&quot;values('{0}','{1}','{2}','{3}',{4})&quot;,\
            news.title, news.description,news.link,dstr,0)
        query = str.format(&quot;{0}      {1}&quot;,q_pre,q_post)
        try:
            cursor.execute(query)
            conn.commit()
        except:
            temp=&quot;&quot;
        conn.close()
    @staticmethod
    def UpdateMCnt(link,mcnt):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;update News set mcnt={0} where (link='{1}')&quot;,mcnt,link)
        cursor.execute(query)
        conn.commit()
        conn.close()
    @staticmethod
    def FindNid(link):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;select nid from News where (link='{0}')&quot;,link)
        cursor.execute(query)
        row = cursor.fetchone()
        conn.commit()
        conn.close()
        return row[0]
    @staticmethod
    def FindNewsByNid(nid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        q_pre = &quot;select title,link,description,pubdate,mcnt from News &quot;
        q_post = str.format(&quot;   where (nid={0})&quot;,nid)
        query = q_pre + q_post
        cursor.execute(query)
        row = cursor.fetchone()
        conn.close()
        return row
    @staticmethod
    def TotalDocumentCount():
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = &quot;select count(*) from News&quot;
        cursor.execute(query)
        row = cursor.fetchone()
        conn.close()
        return row[0]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;MorphemeSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cGlTzv/btqNiVEjt94/dQI0TvoyLnd1DwX61HWgyK/MorphemeSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MorphemeSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605075967589&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MorphemeSql.py
import pymssql
class MorphemeSql:
    @staticmethod
    def AddMorpheme(mo):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;Insert into Morpheme(word) values('{0}')&quot;,mo.word)
        try:
            cursor.execute(query)
            conn.commit()
        except:
            temp=&quot;&quot;
        conn.close()
    @staticmethod
    def FindMid(word):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;select mid from Morpheme where (word='{0}')&quot;,word)
        cursor.execute(query)
        row = cursor.fetchone()
        conn.commit()
        conn.close()
        if row:
            return row[0]
        return 0
    @staticmethod
    def ListMorpheme():
        moes = list()
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()        
        query = str.format(&quot;select word from Morpheme&quot;)
        cursor.execute(query)
        row = cursor.fetchone()  
        while row:
            moes.append(row[0]) 
            row = cursor.fetchone()
        conn.close()
        return moes

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;InverseSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bx7P7a/btqNeHteLbs/fkeGkOqp4BnKreTc9KmvaK/InverseSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;InverseSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1605075999532&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#InverseSql.py
import pymssql
class InverseSql:
    @staticmethod
    def AddInverseItem(nid,mid,rcnt):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        s_pre = &quot;Insert into Inverse(nid,mid,rcnt) values&quot;
        s_post = str.format(&quot;({0},{1},{2})&quot;,nid,mid,rcnt)
        query = s_pre+s_post
        try:
            cursor.execute(query)
            conn.commit()
        except:
            temp=&quot;&quot;
        conn.close()
    @staticmethod
    def FindInv(mid):
        inv_col = list()
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;, &quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;Select nid,rcnt from Inverse where mid={0}&quot;,mid)
        cursor.execute(query)
        row = cursor.fetchone()  
        while row:
            inv_col.append(row)
            row = cursor.fetchone()
        conn.close()
        return inv_col&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsSearcher.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bfbd0B/btqNaF9Unfj/OgBV2ktUZQdbbAxglzVNGK/NewsSearcher.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsSearcher.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1605076159895&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsSearcher.py - 뉴스 검색기
from MorphemeParser import MorphemeParser
from Morpheme import Morpheme
import urllib.request
import json
class NewsSearcher:
    def __init__(self):
        self.client_id =&quot;네이버에서 제공한 클라이언트 ID&quot;
        self.client_secret=&quot;네이버에서 제공한 클라이언트 Secret&quot;
        self.url = &quot;https://openapi.naver.com/v1/search/news.json&quot;
    def SetQuery(self,query):
        query = urllib.parse.quote(query)
        self.qp = &quot;query=&quot;+query
    def Request(self,start,display):
        sp = &quot;start=&quot;+str(start)
        dp = &quot;display=&quot;+str(display)
        query_str = self.url+&quot;?&quot;+self.qp+&quot;&amp;amp;&quot;+sp+&quot;&amp;amp;&quot;+dp
        request = urllib.request.Request(query_str)
        request.add_header(&quot;X-Naver-Client-Id&quot;,self.client_id)
        request.add_header(&quot;X-Naver-Client-Secret&quot;,self.client_secret)
        try:
            response = urllib.request.urlopen(request)
        except: #예외 발생하였을 때
            return list(),0
        if response.getcode()!=200:#실패일 때
            return list(),0
        content = response.read()
        content = content.decode('utf-8')
        jdata = json.loads(content)
        total = int(jdata['total'])
        return jdata['items'],total
    def RequestAll(self):
        start = 1
        display = 100
        redatas = list()
        datas, total = self.Request(start,display)
        redatas.extend(datas)
        start = start + display
        while start&amp;lt;total and start&amp;lt;1000:
            datas, total = self.Request(start,display)
            redatas.extend(datas)
            start = start + display
        return redatas&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;MorphemeParser.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b1hNDr/btqNeI6OG4Z/3AlTOEUmB9CnYW9zKZl9G1/MorphemeParser.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MorphemeParser.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1605076205878&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MorphemeParser.py - 형태소 분석기
from Morpheme import Morpheme
from EHHelper import EHHelper
class MorphemeParser:
    @staticmethod
    def Parse(src):
        morphes = list() 
        #원본 문자열에 특수 기호를 제거 및 공백 기준으로 분리
        src = EHHelper.EmitTagAndSpecialCh(src)
        msrc = src.split(' ')
        #각 단어를 형태소 컬렉션에 추가
        for elem in msrc:
            if str.isalpha(elem):
                morphes.append(Morpheme(elem))
        #중복 형태소를 합치는 공정
        morphes = MorphemeParser.Merge(morphes)
        return morphes

    @staticmethod
    def Merge(morphes):
        remoes = list()#병합한 형태소를 보관할 컬렉션
        for morph in morphes:#원본 컬렉션에 있는 각각의 형태소를
            rcnt = len(remoes)#병합한 컬렉션에 형태소 개수 구하기
            flag = False #morph와 같은 단어가 remoes에 없다고 가정
            #morph가 remoes컬렉션에 있다면 병합
            for index in range(0,rcnt):
                if remoes[index].word == morph.word:
                    remoes[index].Merge(morph)
                    flag = True#병합하였음을 마킹
                    break            
            if flag == False:#morph와 같은 단어는 remoes에 없음
                remoes.append(morph)
        return remoes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsAnalyser.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ckEOUc/btqM8OT6oDu/Vsyqj9sF4MW1Smyt06k7ZK/NewsAnaylizer.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsAnaylizer.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1605076245137&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsAnaylizer.py - 뉴스 분석기
from NewsSearcher import NewsSearcher
from MorphemeParser import MorphemeParser
from Morpheme import Morpheme
from News import News
class NewsAnaylizer:
    def __init__(self):
        self.ns = NewsSearcher()
    def Analize(self, query):
        redata = list()
        self.ns.SetQuery(query)
        #news_col = self.ns.RequestAll()
        news_col,total = self.ns.Request(1,10)
        for jnews in news_col:
            news = News.MakeNews(jnews)
            morphes1 = MorphemeParser.Parse(news.title)
            morphes2 = MorphemeParser.Parse(news.description)
            redata.append([news,morphes1,morphes2])
        return redata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605076271497&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from NewsAnaylizer import NewsAnaylizer
from NewsSql import NewsSql
from MorphemeParser import MorphemeParser
from News import News
from MorphemeSql import MorphemeSql
from InverseSql import InverseSql
na = NewsAnaylizer()
q = input('질의:')
adatas = na.Analize(q)
for adata in adatas:
    news,m1,m2 = adata
    news.PreProcess()
    NewsSql.AddNews(news)
    NewsSql.UpdateMCnt(news.link,len(m1)+len(m2))
    nid = NewsSql.FindNid(news.link)
    for mo in m1:
        MorphemeSql.AddMorpheme(mo)
        mid = MorphemeSql.FindMid(mo.word)
        InverseSql.AddInverseItem(nid,mid,mo.ref)
    for mo in m2:
        MorphemeSql.AddMorpheme(mo)
        mid = MorphemeSql.FindMid(mo.word)
        InverseSql.AddInverseItem(nid,mid,mo.ref)
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/파이썬(Python)</category>
      <category>MSSQL</category>
      <category>Python</category>
      <category>네이버 개발자센터</category>
      <category>뉴스검색기</category>
      <category>형태소분석</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3547</guid>
      <comments>https://ehclub.co.kr/3547#entry3547comment</comments>
      <pubDate>Wed, 11 Nov 2020 09:23:40 +0900</pubDate>
    </item>
    <item>
      <title>[ python] 뉴스 분석기 feat.네이버 개발자센터 , 형태소 분석</title>
      <link>https://ehclub.co.kr/3546</link>
      <description>&lt;p&gt;&lt;b&gt;News.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/uXQSn/btqM9PKu85z/0TF8kox3wSVy3kOIWw1rO1/News.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;News.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604996482611&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#News.py
class News:
    def __init__(self,title,link,description,pubdate):
        self.title = title
        self.link = link
        self.description = description
        self.pubdate = pubdate
    @staticmethod
    def MakeNews(jnews):
        title = jnews['title']
        link = jnews['link']
        description = jnews['description']
        pubdate = jnews['pubDate']
        return News(title,link,description,pubdate)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Morpheme.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ocxT5/btqM5fcEBF5/KDJ2oY3drgCejRw5CokM10/Morpheme.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Morpheme.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604996531714&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Morpheme.py  - 형태소 클래스
class Morpheme:
    def __init__(self,word):
        self.word = word #단어 
        self.ref = 1           #참조 개수
    def Merge(self,other): # 병합하기
        if self.IsEqual(other):
            self.ref = self.ref + other.ref
    def IsEqual(self,other): #같은 단어를 갖는 형태소인지 판별
        return self.word ==  other.word
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;MorphemeParser.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/AMxPq/btqM9PKvaBm/1HyXDGWqh3mAymF0QG1Lw0/MorphemeParser.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MorphemeParser.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604996554059&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MorphemeParser.py - 형태소 분석기
from Morpheme import Morpheme
class MorphemeParser:
    @staticmethod
    def Parse(src):
        morphes = list() 
        #원본 문자열에 특수 기호를 제거 및 공백 기준으로 분리
        src = MorphemeParser.RemoveTag(src)
        src = MorphemeParser.RemoveNonAlpha(src)
        msrc = src.split(' ')
        #각 단어를 형태소 컬렉션에 추가
        for elem in msrc:
            if str.isalpha(elem):
                morphes.append(Morpheme(elem))
        #중복 형태소를 합치는 공정
        morphes = MorphemeParser.Merge(morphes)
        return morphes

    @staticmethod
    def Merge(morphes):
        remoes = list()#병합한 형태소를 보관할 컬렉션
        for morph in morphes:#원본 컬렉션에 있는 각각의 형태소를
            rcnt = len(remoes)#병합한 컬렉션에 형태소 개수 구하기
            flag = False #morph와 같은 단어가 remoes에 없다고 가정
            #morph가 remoes컬렉션에 있다면 병합
            for index in range(0,rcnt):
                if remoes[index].word == morph.word:
                    remoes[index].Merge(morph)
                    flag = True#병합하였음을 마킹
                    break            
            if flag == False:#morph와 같은 단어는 remoes에 없음
                remoes.append(morph)
        return remoes
    @staticmethod
    def RemoveNonAlpha(src):
        dest=&quot;&quot;
        for elem in src:
            if str.isalpha(elem) or str.isspace(elem):
                dest += elem
        return dest
    @staticmethod
    def FindTag(src):
        s = src.index('&amp;lt;')
        e = src.index('&amp;gt;')
        return s,e
    @staticmethod
    def RemoveTag(src):
        try:
            while True:
                s,e = MorphemeParser.FindTag(src)
                src = src[0:s]+src[e+1:] #태그를 제거하는 구문
        except:# 더 이상 태그가 없음
            return src
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsSearcher.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/birJo4/btqM4yXJPXt/c7N7BgMExrxkjIggbp6luK/NewsSearcher.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsSearcher.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604996612636&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsSearcher.py - 뉴스 검색기
from MorphemeParser import MorphemeParser
from Morpheme import Morpheme
import urllib.request
import json
class NewsSearcher:
    def __init__(self):
        self.client_id =&quot;네이버에서 발급한 클라이언트 id&quot;
        self.client_secret=&quot;네이버에서 발급한 클라이언트 secret&quot;
        self.url = &quot;https://openapi.naver.com/v1/search/news.json&quot;
    def SetQuery(self,query):
        query = urllib.parse.quote(query)
        self.qp = &quot;query=&quot;+query
    def Request(self,start,display):
        sp = &quot;start=&quot;+str(start)
        dp = &quot;display=&quot;+str(display)
        query_str = self.url+&quot;?&quot;+self.qp+&quot;&amp;amp;&quot;+sp+&quot;&amp;amp;&quot;+dp
        request = urllib.request.Request(query_str)
        request.add_header(&quot;X-Naver-Client-Id&quot;,self.client_id)
        request.add_header(&quot;X-Naver-Client-Secret&quot;,self.client_secret)
        try:
            response = urllib.request.urlopen(request)
        except: #예외 발생하였을 때
            return list(),0
        if response.getcode()!=200:#실패일 때
            return list(),0
        content = response.read()
        content = content.decode('utf-8')
        jdata = json.loads(content)
        total = int(jdata['total'])
        return jdata['items'],total
    def RequestAll(self):
        start = 1
        display = 100
        redatas = list()
        datas, total = self.Request(start,display)
        redatas.extend(datas)
        start = start + display
        while start&amp;lt;total and start&amp;lt;1000:
            datas, total = self.Request(start,display)
            redatas.extend(datas)
            start = start + display
        return redatas&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NewsAnaylizer.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Pw3In/btqM8OSTuPA/h1Kk3yX1q9BhiLckmzKhV1/NewsAnaylizer.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NewsAnaylizer.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604996635506&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NewsAnaylizer.py - 뉴스 분석기
from NewsSearcher import NewsSearcher
from MorphemeParser import MorphemeParser
from Morpheme import Morpheme
from News import News
class NewsAnaylizer:
    def __init__(self):
        self.ns = NewsSearcher()
    def Analize(self, query):
        redata = list()
        self.ns.SetQuery(query)
        news_col = self.ns.RequestAll()
        for jnews in news_col:
            news = News.MakeNews(jnews)
            morphes1 = MorphemeParser.Parse(news.title)
            morphes2 = MorphemeParser.Parse(news.description)
            redata.append([news,morphes1,morphes2])
        return redata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604996660234&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from NewsAnaylizer import NewsAnaylizer
from MorphemeParser import MorphemeParser
import matplotlib.pyplot as plt
import matplotlib
na = NewsAnaylizer()
q = input('질의:')
moes = list()
adatas = na.Analize(q)
for adata in adatas:
    news,m1,m2 = adata
    moes.extend(m1)
    moes.extend(m2)
    print(news.title)
    print(news.description)
    print(&quot;=======&quot;)
input(&quot;엔터 키를 누르세요.&quot;)
moes = MorphemeParser.Merge(moes)

reflist = list()
for mo in moes:
    print(&quot;{0},{1}&quot;.format(mo.word,mo.ref))
    reflist.append(mo.ref)
plt.plot(reflist)
plt.show()


&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/파이썬(Python)</category>
      <category>open api</category>
      <category>Python</category>
      <category>text mining</category>
      <category>네이버 개발자 센터</category>
      <category>뉴스 분석기</category>
      <category>소스 코드</category>
      <category>형태소 분석</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3546</guid>
      <comments>https://ehclub.co.kr/3546#entry3546comment</comments>
      <pubDate>Tue, 10 Nov 2020 17:27:39 +0900</pubDate>
    </item>
    <item>
      <title>[python] 뉴스 검색 - 형태소 분석 (feat. 네이버 개발자센터)</title>
      <link>https://ehclub.co.kr/3545</link>
      <description>&lt;p&gt;Main.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/8TmL9/btqMVB8zRpP/RzB9VR3kJebipV5ka5ZjDK/Main.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Main.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604975996081&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import urllib.request
import json

class Morpheme:
    def __init__(self,word):
        self.word = word
        self.ref = 1
    def Merge(self,other):
        if self.IsEqual(other):
            self.ref = self.ref + other.ref
    def IsEqual(self,other):
        return self.word ==  other.word

class MorphemeParser:
    @staticmethod
    def Parse(src):
        morphes = list() #반환할 형태소 컬렉션
        src = MorphemeParser.RemoveNonAlpha(src)
        msrc = src.split(' ')
        for elem in msrc:
            if str.isalpha(elem):
                morphes.append(Morpheme(elem))
        morphes = MorphemeParser.Merge(morphes)
        return morphes
    @staticmethod
    def Merge(morphes):
        remoes = list()
        for morph in morphes:
            rcnt = len(remoes)
            flag = False
            for index in range(0,rcnt):
                if remoes[index].word == morph.word:
                    remoes[index].Merge(morph)
                    flag = True
                    break
            if flag == False:
                remoes.append(morph)
        return remoes
    @staticmethod
    def RemoveNonAlpha(src):
        dest=&quot;&quot;
        for elem in src:
            if str.isalpha(elem) or str.isspace(elem):
                dest += elem
        return dest
    @staticmethod
    def FindTag(src):
        s = src.index('&amp;lt;')
        e = src.index('&amp;gt;')
        return s,e
    @staticmethod
    def RemoveTag(src):
        try:
            while True:
                s,e = MorphemeParser.FindTag(src)
                src = src[0:s]+src[e+1:]
        except:
            return src    

client_id =&quot;네이버 개발자센터에서 발급한 Client ID&quot;
client_secret=&quot;네이버 개발자센터에서 발급한 Client Secret&quot;
url = &quot;https://openapi.naver.com/v1/search/news.json&quot;
query = input(&quot;질의:&quot;)
query_param = &quot;query=&quot;+urllib.parse.quote(query)

#쿼리문자열 구조
#사이트 주소?인자=값&amp;amp;인자=값
query_str = url+&quot;?&quot;+query_param

request = urllib.request.Request(query_str)
request.add_header(&quot;X-Naver-Client-Id&quot;,client_id)
request.add_header(&quot;X-Naver-Client-Secret&quot;,client_secret)

response = urllib.request.urlopen(request)
if response.getcode() != 200:
    print(&quot;실패!!!&quot;)
else:
    content = response.read()
    data = content.decode('utf-8')
    jdata = json.loads(data)
    total = jdata['total']
    print(&quot;검색 결과 개수:&quot;,total)

    i=0
    for item in jdata['items']:
        print(&quot;제목:&quot;,MorphemeParser.RemoveTag(item['title']))
        des = MorphemeParser.RemoveTag(item['description'])
        print(des)
        print(&quot;==============&quot;)
        res = MorphemeParser.Parse(des)
        fs = open(&quot;data&quot;+str(i)+&quot;.txt&quot;,&quot;w&quot;)
        for morph in res:
            s = morph.word + &quot;,&quot;+str(morph.ref)+&quot;\n&quot;
            fs.writelines(s)
        fs.close()
        i=i+1&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/파이썬(Python)</category>
      <category>open api</category>
      <category>Python</category>
      <category>네이버 개발자센터</category>
      <category>뉴스 검색</category>
      <category>소스 코드</category>
      <category>형태소 분석</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3545</guid>
      <comments>https://ehclub.co.kr/3545#entry3545comment</comments>
      <pubDate>Tue, 10 Nov 2020 11:41:10 +0900</pubDate>
    </item>
    <item>
      <title>[python] 도서 검색기 feat. 네이버 개발자센터</title>
      <link>https://ehclub.co.kr/3544</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;실행 화면.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;541&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIpUS/btqMTgvZ89O/v0v7IJ3zuAS1UVf3bKNKbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIpUS/btqMTgvZ89O/v0v7IJ3zuAS1UVf3bKNKbK/img.png&quot; data-alt=&quot;실행화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIpUS/btqMTgvZ89O/v0v7IJ3zuAS1UVf3bKNKbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIpUS%2FbtqMTgvZ89O%2Fv0v7IJ3zuAS1UVf3bKNKbK%2Fimg.png&quot; data-filename=&quot;실행 화면.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;541&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Book.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/baiDSK/btqMX9b2cU0/WY6u0ym9Ue5wDemDkQ1J9K/Book.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Book.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604900327812&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Book.py
class Book:
    def __init__(self,title,author,price,content=&quot;&quot;,publisher=&quot;&quot;,link=&quot;&quot;,imglink=&quot;&quot;):
        self.title = title
        self.author = author
        self.price = price
        self.content = content
        self.publisher = publisher
        self.link = link
        self.imglink=imglink


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;NaverBookSearcher.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/1GYBN/btqM2He427Q/X3UcDxJJlxGIZX1ZR4hIt1/NaverBookSearcher.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NaverBookSearcher.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604900357956&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NaverBookSearcher.py
import urllib.request
import json
from Book import Book
class NaverBookSearcher:
    @staticmethod
    def MakeBook(jsbook):
        title = jsbook[&quot;title&quot;]
        author = jsbook[&quot;author&quot;]
        price = jsbook[&quot;price&quot;]
        content = jsbook[&quot;description&quot;]
        publisher = jsbook[&quot;publisher&quot;]
        link = jsbook[&quot;link&quot;]
        imglink=jsbook[&quot;image&quot;]
        return Book(title,author,price,content,publisher,link,imglink)
    def __init__(self):
        self.client_id = &quot;네이버 개발자센터에서 발급받은 자신의 Client ID&quot;
        self.client_secret =  &quot;네이버 개발자센터에서 발급받은 자신의 Client Secret&quot;
        self.url = &quot;https://openapi.naver.com/v1/search/book.json&quot;
        self.query=&quot;&quot;
        self.query_str=&quot;&quot;
    def SetQuery(self,qstr):
        self.query = &quot;query=&quot;+urllib.parse.quote(qstr)
        self.query_str = self.url+&quot;?&quot;+self.query
    def Request(self,start,display):
        start_str = &quot;start=&quot;+str(start)
        display_str = &quot;display=&quot;+str(display)
        fquery_str = self.query_str +&quot;&amp;amp;&quot;+start_str+&quot;&amp;amp;&quot;+display_str
        request = urllib.request.Request(fquery_str)
        request.add_header(&quot;X-Naver-Client-Id&quot;,self.client_id)
        request.add_header(&quot;X-Naver-Client-Secret&quot;,self.client_secret)
        try:
            response = urllib.request.urlopen(request)
        except:
            return None
        rescode = response.getcode()
        if rescode != 200:
            return None
        content = response.read()
        data = content.decode('utf-8')
        jdata = json.loads(data)
        total = jdata['total']  
        return jdata['items'],total
    def RequestAll(self):
        redatas=list()
        start = 1
        display=10
        datas,total = self.Request(start,display)
        redatas.extend(datas)
        start = start+display
        while (start&amp;lt;total)and(start&amp;lt;1000):
            datas,total = self.Request(start,display)
            redatas.extend(datas)
            start = start+display
        return redatas&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;BookSearcherWidget.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/1NhHo/btqM38i8UPP/Q7QkbIuwTFtjT2Vw1Mj1z0/BookSearcherWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;BookSearcherWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604900400212&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#BookSearcherWidget.py
from NaverBookSearcher import NaverBookSearcher
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class BookSearcherWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.books = list()
        self.setWindowTitle(&quot;도서 검색기(feat.네이버 개발자 센터)&quot;)
        self.resize(1000,1000)
        lb_query = QLabel(&quot;질의:&quot;,self)
        lb_query.move(20,20)
        self.te_query = QTextEdit(&quot;&quot;,self)
        self.te_query.move(120,15)
        self.te_query.resize(600,70)
        self.btn_search = QPushButton(&quot;검색&quot;,self)
        self.btn_search.move(740,15)
        lb_blist = QLabel(&quot;도서 목록&quot;,self)
        lb_blist.move(20,110)
        self.lbox_book = QListWidget(self)
        self.lbox_book.move(20,180)
        self.lbox_book.resize(300,800)
        self.btn_search.clicked.connect(self.SearchBook)
        self.lb_title = QLabel(&quot;[제목]&quot;,self)
        self.lb_title.move(340,200)
        self.lb_title.resize(650,60)
        self.lb_author = QLabel(&quot;[저자]&quot;,self)
        self.lb_author.move(340,280)
        self.lb_author.resize(650,60)
        self.lb_price = QLabel(&quot;[가격]&quot;,self)
        self.lb_price.move(340,360)
        self.lb_price.resize(650,60)
        self.te_content = QTextEdit(&quot;[내용]&quot;,self)
        self.te_content.setReadOnly(True)
        self.te_content.move(340,440)
        self.te_content.resize(650,550)
        self.lbox_book.currentItemChanged.connect(self.OnSelectChange)
    def OnSelectChange(self):
        index = self.lbox_book.currentRow()
        try:
            book = self.books[index]
        except:
            return
        self.lb_title.setText(book.title)
        self.lb_author.setText(book.author)
        self.lb_price.setText(str(book.price))
        self.te_content.setText(book.content)
    def SearchBook(self):
        self.books.clear()
        self.lbox_book.clear()
        q = self.te_query.toPlainText()
        ns = NaverBookSearcher()
        ns.SetQuery(q)
        books = ns.RequestAll()
        for bookjs in books:
            book = NaverBookSearcher.MakeBook(bookjs)
            self.books.append(book)
            self.lbox_book.addItem(book.title)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604900570302&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from BookSearcherWidget import BookSearcherWidget
app = QApplication(sys.argv)
bsw = BookSearcherWidget()
bsw.show()
sys.exit(app.exec_())
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/파이썬(Python)</category>
      <category>open api</category>
      <category>Python</category>
      <category>Qt</category>
      <category>네이버 개발자센터</category>
      <category>도서 검색</category>
      <category>소스 코드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3544</guid>
      <comments>https://ehclub.co.kr/3544#entry3544comment</comments>
      <pubDate>Mon, 9 Nov 2020 14:43:20 +0900</pubDate>
    </item>
    <item>
      <title>[python] 네이버 도서 검색 API 활용 - Json</title>
      <link>https://ehclub.co.kr/3543</link>
      <description>&lt;p&gt;&lt;b&gt;Book.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bKynhX/btqMNxZGhy1/F06fSVmKab2123HHI4mlwk/Book.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Book.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604890383611&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Book.py
class Book:
    def __init__(self,title,author,price,content=&quot;&quot;,publisher=&quot;&quot;,link=&quot;&quot;,imglink=&quot;&quot;):
        self.title = title
        self.author = author
        self.price = price
        self.content = content
        self.publisher = publisher
        self.link = link
        self.imglink=imglink


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NaverBookSearcher.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/HQzYY/btqM4yIGWIA/wXEZDDEDHp7GExkH3UvuDK/NaverBookSearcher.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NaverBookSearcher.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1604890526415&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#NaverBookSearcher.py
import urllib.request
import json
from Book import Book
class NaverBookSearcher:
    @staticmethod
    def MakeBook(jsbook):
        title = jsbook[&quot;title&quot;]
        author = jsbook[&quot;author&quot;]
        price = jsbook[&quot;price&quot;]
        content = jsbook[&quot;description&quot;]
        publisher = jsbook[&quot;publisher&quot;]
        link = jsbook[&quot;link&quot;]
        imglink=jsbook[&quot;image&quot;]
        return Book(title,author,price,content,publisher,link,imglink)
    def __init__(self):
        self.client_id =&quot;네이버에서 발급받은 자신의 client id&quot;
        self.client_secret = &quot;네이버에서 발급받은 자신의 client secret&quot;
        self.url = &quot;https://openapi.naver.com/v1/search/book.json&quot;
        self.query=&quot;&quot;
        self.query_str=&quot;&quot;
    def SetQuery(self,qstr):
        self.query = &quot;query=&quot;+urllib.parse.quote(qstr)
        self.query_str = self.url+&quot;?&quot;+self.query
    def Request(self,start,display):
        start_str = &quot;start=&quot;+str(start)
        display_str = &quot;display=&quot;+str(display)
        fquery_str = self.query_str +&quot;&amp;amp;&quot;+start_str+&quot;&amp;amp;&quot;+display_str
        request = urllib.request.Request(fquery_str)
        request.add_header(&quot;X-Naver-Client-Id&quot;,self.client_id)
        request.add_header(&quot;X-Naver-Client-Secret&quot;,self.client_secret)
        response = urllib.request.urlopen(request)
        rescode = response.getcode()
        if rescode != 200:
            return None
        content = response.read()
        data = content.decode('utf-8')
        jdata = json.loads(data)
        total = jdata['total']  
        return jdata['items'],total
    def RequestAll(self):
        redatas=list()
        start = 1
        display=10
        datas,total = self.Request(start,display)
        redatas.extend(datas)
        start = start+display
        while (start&amp;lt;total)and(start&amp;lt;1000):
            datas,total = self.Request(start,display)
            redatas.extend(datas)
            start = start+display
        return redatas&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604890556892&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from NaverBookSearcher import NaverBookSearcher
q = input(&quot;질의:&quot;)

ns = NaverBookSearcher()
ns.SetQuery(q)
books = ns.RequestAll()
for bookjs in books:
    book = NaverBookSearcher.MakeBook(bookjs)
    print(&quot;제목:&quot;,book.title)
    print(&quot;저자:&quot;,book.author)
    print(&quot;가격:&quot;,book.price)
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/파이썬(Python)</category>
      <category>open api</category>
      <category>Python</category>
      <category>네이버 개발자센터</category>
      <category>도서 검색</category>
      <category>소스 코드</category>
      <category>웹 스크래핑</category>
      <category>웹 크롤링</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3543</guid>
      <comments>https://ehclub.co.kr/3543#entry3543comment</comments>
      <pubDate>Mon, 9 Nov 2020 11:56:41 +0900</pubDate>
    </item>
    <item>
      <title>[python] EH 쇼핑몰 - 고객 관리, 상품 관리 - MSSQL, QT</title>
      <link>https://ehclub.co.kr/3542</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzUFiY/btqMG68wl12/n3rvdbvDqfFhPIDN8QmBUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzUFiY/btqMG68wl12/n3rvdbvDqfFhPIDN8QmBUk/img.png&quot; data-alt=&quot;데이터 베이스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzUFiY/btqMG68wl12/n3rvdbvDqfFhPIDN8QmBUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzUFiY%2FbtqMG68wl12%2Fn3rvdbvDqfFhPIDN8QmBUk%2Fimg.png&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 베이스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;CustomSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cUiQ3U/btqMLSBu6mW/KoR2M1UkjAHijqLUeuwel1/CustomSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CustomSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604647531562&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CustomSql.py
import pymssql
class CustomSql:
    def AddCustom(self, cid, cname):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Custom (CID, CNAME) values('{0}','{1}')&quot;, cid,cname)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def RemoveCustom(self, ckey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Custom where Ckey={0}&quot;,ckey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindCustom(self,ckey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID,CNAME from Custom where Ckey={0}&quot;,ckey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:            
            return row[0], row[1]
        conn.close()
        return &quot;&quot;,&quot;&quot;
    def FindKeyByName(self, cname):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CKey from Custom where CName='{0}'&quot;,cname)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ViewCustomList(self):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID,CNAME from Custom&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;고객 ID:{0}, 고객 이름:{1}&quot;.format(row[0],row[1]))
            row = cursor.fetchone()
        conn.close()
    def FindKeyByID(self,cid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CKey from Custom where CID='{0}'&quot;,cid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return 0
    def FindCustomId(self,ckey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID from Custom where CKey={0}&quot;,ckey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def CustomList(self):
        customs = list()
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID, CNAME, CKEY from Custom&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            customs.append(row)
            row = cursor.fetchone()
        conn.close()
        return customs
    def RemoveCustomByID(self,cid):
        ckey = self.FindKeyByID(cid)
        self.RemoveCustom(ckey)
    def FindCustomName(self,cid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CNAME from Custom where cid='{0}' &quot;,cid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return &quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;CMainWidget.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/7AJKf/btqMGMWOLWJ/MTzyMDkitYK6TT6110tJi0/CMainWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CMainWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604647576569&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CMainWidget.py
from CAddDlg import CAddDlg
from CustomSql import CustomSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class CMainWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.csql = CustomSql()
        self.setWindowTitle(&quot;고객 관리 창&quot;)
        self.resize(760,400)
        lb_cl = QLabel(&quot;고객 목록&quot;, self)
        lb_cl.move(20,20)
        self.lbox_custom = QListWidget(self)
        self.lbox_custom.move(20,60)
        self.lbox_custom.resize(300,330)
        self.btn_add = QPushButton(&quot;고객 추가&quot;,self)
        self.btn_add.move(340,60)
        self.btn_add.resize(400,80)
        self.btn_del = QPushButton(&quot;고객 삭제&quot;,self)
        self.btn_del.move(340,180)
        self.btn_del.resize(400,80)
        lb_name = QLabel(&quot;이름:&quot;,self)
        lb_name.move(340,280)
        self.lb_cname = QLabel(&quot;[홍길동]&quot;,self)
        self.lb_cname.move(460,280)
        self.btn_add.clicked.connect(self.AddCustom)
        self.btn_del.clicked.connect(self.DelCustom)
        self.lbox_custom.currentItemChanged.connect(self.OnSelectChange)
        self.ListCustom()
    def ListCustom(self):
        self.lbox_custom.clear()
        customs = self.csql.CustomList()
        for custom in customs:
            self.lbox_custom.addItem(custom[0])
    def AddCustom(self):
        caw = CAddDlg(self)
        caw.show()
    def SAddCustom(self, cid):
        self.lbox_custom.addItem(cid)
    def DelCustom(self):
         item = self.lbox_custom.currentItem()
         index = self.lbox_custom.currentRow()
         self.lbox_custom.takeItem(index)
         self.csql.RemoveCustomByID(item.text())
    def OnSelectChange(self):
        try:
             item = self.lbox_custom.currentItem()
             cname = self.csql.FindCustomName(item.text())
             self.lb_cname.setText(cname)
        except:
            self.lb_cname.setText(&quot;[홍길동]&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;CAddDlg.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/brRQCG/btqMG6AIKGM/GtZASzF8ABzCBh3NiG8tOK/CAddDlg.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CAddDlg.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604647597960&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CAddDlg.py
from CustomSql import CustomSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class CAddDlg(QDialog):
    def __init__(self,pa):
        super().__init__(pa)        
        self.csql = CustomSql()
        self.setWindowTitle(&quot;고객 등록 창&quot;)
        lb_id = QLabel(&quot;고객 ID:&quot;,self)
        lb_id.move(20,20)
        lb_name = QLabel(&quot;고객 이름:&quot;,self)
        lb_name.move(20,100)
        self.te_id = QTextEdit(self)
        self.te_id.move(200,20)
        self.te_id.resize(200,40)
        self.te_name =QTextEdit(self)
        self.te_name.move(200,100)
        self.te_name.resize(200,40)
        self.btn_add = QPushButton(&quot;추가&quot;,self)
        self.btn_add.move(20,180)
        self.btn_add.resize(160,40)
        self.btn_del = QPushButton(&quot;취소&quot;,self)
        self.btn_del.move(200,180)
        self.btn_del.resize(160,40)
        self.btn_add.clicked.connect(self.AddCustom)
        self.btn_del.clicked.connect(self.Cancel)
    def AddCustom(self):
        cid = self.te_id.toPlainText()
        cname = self.te_name.toPlainText()
        try:
            self.csql.AddCustom(cid,cname)
        except:
             mbox = QMessageBox()
             mbox.setText(&quot;이미 존재하는 고객 ID입니다.&quot;)
             mbox.exec_()
        else:
            pa = self.parent()
            pa.SAddCustom(cid)
       #    mbox = QMessageBox()
       #    mbox.setText(&quot;추가하였습니다.&quot;)
       #    mbox.exec_()
        self.Cancel()
    def Cancel(self):
        self.te_id.setText(&quot;&quot;)
        self.te_name.setText(&quot;&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;ProductSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bEuCLk/btqMGNnQyRc/x6kBt6DkVOuIsGI77uSAz0/ProductSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ProductSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604647672199&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ProductSql.py
import  pymssql
class ProductSql:
    def AddProduct(self, pid,pname,price):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Product (PID, PNAME, Price) values('{0}','{1}',{2})&quot;, pid,pname,price)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def RemoveProduct(self,pkey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Product where Pkey={0}&quot;,pkey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindProduct(self,key):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select * from Product where Pkey={0}&quot;,key)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품이름:{1} 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row =cursor.fetchone()
        conn.commit()
        conn.close()
    def FindKeyByName(self,pname):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PName='{0}'&quot;,pname)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ViewProductList(self):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID,PNAME,PRICE from Product&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품명:{1} 상품 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row = cursor.fetchone()
        conn.close()
    def FindKeyByID(self,pid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PID='{0}'&quot;,pid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return 0
    def FindProductID(self,pkey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID from Product where PKey={0}&quot;,pkey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ProductList(self):
        products = list()
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID,PName,Price, Pkey from Product&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            products.append(row)
            row = cursor.fetchone()
        conn.close()
        return products
    def RemoveProducByID(self,pid):
        try:
           pkey = self.FindKeyByID(pid)
           self.RemoveProduct(pkey)
        except:
            return False
        return True
    def FindProductByID(self,pid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PName,Price from Product where Pid='{0}' &quot;,pid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0],row[1]
        conn.close()
        return &quot;&quot;,0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;PMainWidget.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bS1OHH/btqMMhHK45t/dItkFxCbO238haZ02KscI0/PMainWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;PMainWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604647746337&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#PMainWidget.py
from PAddDlg import PAddDlg
from ProductSql import ProductSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class PMainWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.psql = ProductSql()
        self.setWindowTitle(&quot;상품 관리 창&quot;)
        self.resize(760,500)
        lb_pl = QLabel(&quot;상품 목록&quot;, self)
        lb_pl.move(20,20)
        self.lbox_product = QListWidget(self)
        self.lbox_product.move(20,60)
        self.lbox_product.resize(300,430)
        self.btn_add = QPushButton(&quot;상품 추가&quot;,self)
        self.btn_add.move(340,60)
        self.btn_add.resize(400,80)
        self.btn_del = QPushButton(&quot;상품 삭제&quot;,self)
        self.btn_del.move(340,180)
        self.btn_del.resize(400,80)
        lb_name = QLabel(&quot;상품명:&quot;,self)
        lb_name.move(340,280)
        self.lb_pname = QLabel(&quot;[고구마]&quot;,self)
        self.lb_pname.move(460,280)
        self.lb_pname.resize(300,80)
        lb_price = QLabel(&quot;가격:&quot;,self)
        lb_price.move(340,360)
        self.lb_price2 = QLabel(&quot;0&quot;,self) 
        self.lb_price2.move(460,360)
        self.lb_price2.resize(300,80)
        self.btn_add.clicked.connect(self.AddProduct)
        self.btn_del.clicked.connect(self.DelProduct)
        self.lbox_product.currentItemChanged.connect(self.OnSelectChange)
        self.ListProduct()
    def ListProduct(self):
        self.lbox_product.clear()
        products = self.psql.ProductList()
        for product in products:
            self.lbox_product.addItem(product[0])
    def SAddProduct(self,pid):
        self.lbox_product.addItem(pid)
    def AddProduct(self):
        pad = PAddDlg(self)
        pad.show()
    def DelProduct(self):
         item = self.lbox_product.currentItem()
         re = self.psql.RemoveProducByID(item.text())#테이블에서 삭제
         if re:
             index = self.lbox_product.currentRow()
             self.lbox_product.takeItem(index)
         else:
             mbox = QMessageBox()
             mbox.setText(&quot;판매 기록을 먼저 삭제해야 합니다.&quot;)
             mbox.exec_()
    def OnSelectChange(self):
        item = self.lbox_product.currentItem()
        pid = item.text()
        try:
            product = self.psql.FindProductByID(pid)
        except:
            self.lb_pname.setText(&quot;&quot;)
            self.lb_price2.setText(&quot;&quot;)
        else:
            self.lb_pname.setText(product[0])
            self.lb_price2.setText(str(product[1]))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;PAddDlg.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/n72PA/btqMLTf5XeK/IRL8EmXvqTkAYcv9TzqbH0/PAddDlg.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;PAddDlg.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604647781655&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#PAddDlg.py
from ProductSql import ProductSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class PAddDlg(QDialog):
    def __init__(self,pa):
        super().__init__(pa)        
        self.psql = ProductSql()
        self.setWindowTitle(&quot;상품 등록 창&quot;)
        lb_id = QLabel(&quot;상품 ID:&quot;,self)
        lb_id.move(20,20)
        lb_name = QLabel(&quot;상품 이름:&quot;,self)
        lb_name.move(20,100)
        self.te_id = QTextEdit(self)
        self.te_id.move(200,20)
        self.te_id.resize(200,40)
        self.te_name =QTextEdit(self)
        self.te_name.move(200,100)
        self.te_name.resize(200,40)
        lb_price = QLabel(&quot;가격:&quot;,  self)
        lb_price.move(20,180)
        self.te_price = QTextEdit(self)
        self.te_price.move(200,180)
        self.te_price.resize(200,40)
        self.btn_add = QPushButton(&quot;추가&quot;,self)
        self.btn_add.move(20,260)
        self.btn_add.resize(160,40)
        self.btn_del = QPushButton(&quot;취소&quot;,self)
        self.btn_del.move(200,260)
        self.btn_del.resize(160,40)
        self.btn_add.clicked.connect(self.AddProduct)
        self.btn_del.clicked.connect(self.Cancel)
    def AddProduct(self):
        pid = self.te_id.toPlainText()
        pname = self.te_name.toPlainText()
        price = 0
        try:
            price = int(self.te_price.toPlainText())
        except:
            mbox = QMessageBox()
            mbox.setText(&quot;가격은 0으로 설정합니다.&quot;)
            mbox.exec_()
        try:
            self.psql.AddProduct(pid,pname,price)
        except:
             mbox = QMessageBox()
             mbox.setText(&quot;이미 존재하는 상품 ID입니다.&quot;)
             mbox.exec_()
        else:
            pa = self.parent()
            pa.SAddProduct(pid)
        self.Cancel()
    def Cancel(self):
        self.te_id.setText(&quot;&quot;)
        self.te_name.setText(&quot;&quot;)
        self.te_price.setText(&quot;&quot;)


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604647820504&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from CMainWidget import CMainWidget
from PMainWidget import PMainWidget
app = QApplication(sys.argv)
cmw = CMainWidget()
cmw.show()
pmw = PMainWidget()
pmw.show()
sys.exit(app.exec_())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>MSSQL</category>
      <category>Python</category>
      <category>Qt</category>
      <category>고객 추가</category>
      <category>상품 추가</category>
      <category>소스 코드</category>
      <category>쇼핑몰</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3542</guid>
      <comments>https://ehclub.co.kr/3542#entry3542comment</comments>
      <pubDate>Fri, 6 Nov 2020 16:30:47 +0900</pubDate>
    </item>
    <item>
      <title>[python] 고객 관리 - QT, MSSQL</title>
      <link>https://ehclub.co.kr/3541</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAYPZp/btqMLS8oxSt/V3JZeKgTNyLaUS78icOEoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAYPZp/btqMLS8oxSt/V3JZeKgTNyLaUS78icOEoK/img.png&quot; data-alt=&quot;Database 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAYPZp/btqMLS8oxSt/V3JZeKgTNyLaUS78icOEoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAYPZp%2FbtqMLS8oxSt%2FV3JZeKgTNyLaUS78icOEoK%2Fimg.png&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Database 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;CustomSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bO0dcb/btqMGeFDArN/45JdtDVcRoCoxZvV0gsYWK/CustomSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CustomSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604633255633&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CustomSql.py
import pymssql
class CustomSql:
    def AddCustom(self, cid, cname):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Custom (CID, CNAME) values('{0}','{1}')&quot;, cid,cname)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def RemoveCustom(self, ckey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Custom where Ckey={0}&quot;,ckey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindCustom(self,ckey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID,CNAME from Custom where Ckey={0}&quot;,ckey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:            
            return row[0], row[1]
        conn.close()
        return &quot;&quot;,&quot;&quot;
    def FindKeyByName(self, cname):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CKey from Custom where CName='{0}'&quot;,cname)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ViewCustomList(self):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID,CNAME from Custom&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;고객 ID:{0}, 고객 이름:{1}&quot;.format(row[0],row[1]))
            row = cursor.fetchone()
        conn.close()
    def FindKeyByID(self,cid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CKey from Custom where CID='{0}'&quot;,cid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return 0
    def FindCustomId(self,ckey):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID from Custom where CKey={0}&quot;,ckey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def CustomList(self):
        customs = list()
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID, CNAME, CKEY from Custom&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            customs.append(row)
            row = cursor.fetchone()
        conn.close()
        return customs
    def RemoveCustomByID(self,cid):
        ckey = self.FindKeyByID(cid)
        self.RemoveCustom(ckey)
    def FindCustomName(self,cid):
        conn = pymssql.connect(&quot;127.0.0.1:1433&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CNAME from Custom where cid='{0}' &quot;,cid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return &quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CMainWidget.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Z9qi5/btqMMG7Zy55/oKH87W8kTxE64pDOQSDtnK/CMainWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CMainWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604633326750&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CMainWidget.py
from CAddDlg import CAddDlg
from CustomSql import CustomSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class CMainWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.csql = CustomSql()
        self.setWindowTitle(&quot;고객 관리 창&quot;)
        self.resize(760,400)
        lb_cl = QLabel(&quot;고객 목록&quot;, self)
        lb_cl.move(20,20)
        self.lbox_custom = QListWidget(self)
        self.lbox_custom.move(20,60)
        self.lbox_custom.resize(300,330)
        self.btn_add = QPushButton(&quot;고객 추가&quot;,self)
        self.btn_add.move(340,60)
        self.btn_add.resize(400,80)
        self.btn_del = QPushButton(&quot;고객 삭제&quot;,self)
        self.btn_del.move(340,180)
        self.btn_del.resize(400,80)
        lb_name = QLabel(&quot;이름:&quot;,self)
        lb_name.move(340,280)
        self.lb_cname = QLabel(&quot;[홍길동]&quot;,self)
        self.lb_cname.move(460,280)
        self.btn_add.clicked.connect(self.AddCustom)
        self.btn_del.clicked.connect(self.DelCustom)
        self.lbox_custom.currentItemChanged.connect(self.OnSelectChange)
        self.ListCustom()
    def ListCustom(self):
        self.lbox_custom.clear()
        customs = self.csql.CustomList()
        for custom in customs:
            self.lbox_custom.addItem(custom[0])
    def AddCustom(self):
        caw = CAddDlg(self)
        caw.show()
    def SAddCustom(self, cid):
        self.lbox_custom.addItem(cid)
    def DelCustom(self):
         item = self.lbox_custom.currentItem()
         index = self.lbox_custom.currentRow()
         self.lbox_custom.takeItem(index)
         self.csql.RemoveCustomByID(item.text())
    def OnSelectChange(self):
        try:
             item = self.lbox_custom.currentItem()
             cname = self.csql.FindCustomName(item.text())
             self.lb_cname.setText(cname)
        except:
            self.lb_cname.setText(&quot;[홍길동]&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CAddDlg.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/coLFiP/btqMChh4por/HOu0EWUJ6p46rbtuDbVDyK/CAddDlg.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CAddDlg.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604633348430&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CAddDlg.py
from CustomSql import CustomSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class CAddDlg(QDialog):
    def __init__(self,pa):
        super().__init__(pa)        
        self.csql = CustomSql()
        self.setWindowTitle(&quot;고객 등록 창&quot;)
        lb_id = QLabel(&quot;고객 ID:&quot;,self)
        lb_id.move(20,20)
        lb_name = QLabel(&quot;고객 이름:&quot;,self)
        lb_name.move(20,100)
        self.te_id = QTextEdit(self)
        self.te_id.move(200,20)
        self.te_id.resize(200,40)
        self.te_name =QTextEdit(self)
        self.te_name.move(200,100)
        self.te_name.resize(200,40)
        self.btn_add = QPushButton(&quot;추가&quot;,self)
        self.btn_add.move(20,180)
        self.btn_add.resize(160,40)
        self.btn_del = QPushButton(&quot;취소&quot;,self)
        self.btn_del.move(200,180)
        self.btn_del.resize(160,40)
        self.btn_add.clicked.connect(self.AddCustom)
        self.btn_del.clicked.connect(self.Cancel)
    def AddCustom(self):
        cid = self.te_id.toPlainText()
        cname = self.te_name.toPlainText()
        try:
            self.csql.AddCustom(cid,cname)
        except:
             mbox = QMessageBox()
             mbox.setText(&quot;이미 존재하는 고객 ID입니다.&quot;)
             mbox.exec_()
        else:
            pa = self.parent()
            pa.SAddCustom(cid)
       #    mbox = QMessageBox()
       #    mbox.setText(&quot;추가하였습니다.&quot;)
       #    mbox.exec_()
        self.Cancel()
    def Cancel(self):
        self.te_id.setText(&quot;&quot;)
        self.te_name.setText(&quot;&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604633372606&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from CMainWidget import CMainWidget
app = QApplication(sys.argv)
myw = CMainWidget()
myw.show()
sys.exit(app.exec_())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>MSSQL</category>
      <category>Python</category>
      <category>Qt</category>
      <category>고객 등록</category>
      <category>소스 코드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3541</guid>
      <comments>https://ehclub.co.kr/3541#entry3541comment</comments>
      <pubDate>Fri, 6 Nov 2020 12:30:47 +0900</pubDate>
    </item>
    <item>
      <title>[python] 상품 조회 응용 -  MSSQL, QT 사용</title>
      <link>https://ehclub.co.kr/3540</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGIZVW/btqMBvUsuca/FARxAm922kTX4QtBOOmUHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGIZVW/btqMBvUsuca/FARxAm922kTX4QtBOOmUHk/img.png&quot; data-alt=&quot;데이터베이스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGIZVW/btqMBvUsuca/FARxAm922kTX4QtBOOmUHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGIZVW%2FbtqMBvUsuca%2FFARxAm922kTX4QtBOOmUHk%2Fimg.png&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ProductSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/k4KOH/btqMDyQEJuH/AfF47C099SGp2jKcK3tro0/ProductSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ProductSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604562461192&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ProductSql.py
import  pymssql
class ProductSql:
    def AddProduct(self, pid,pname,price):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Product (PID, PNAME, Price) values('{0}','{1}',{2})&quot;, pid,pname,price)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def RemoveProduct(self,pkey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Product where Pkey={0}&quot;,pkey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindProduct(self,key):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select * from Product where Pkey={0}&quot;,key)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품이름:{1} 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row =cursor.fetchone()
        conn.commit()
        conn.close()
    def FindKeyByName(self,pname):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PName='{0}'&quot;,pname)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ViewProductList(self):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID,PNAME,PRICE from Product&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품명:{1} 상품 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row = cursor.fetchone()
        conn.close()
    def FindKeyByID(self,pid):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PID='{0}'&quot;,pid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return 0
    def FindProductID(self,pkey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID from Product where PKey={0}&quot;,pkey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def GetProductsID(self):
        products = list()
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID from Product&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            products.append(row[0])
            row = cursor.fetchone()
        conn.close()
        return products
    def FindProdctInfo(self,pid):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PName,Price from Product where PID='{0}'&quot;,pid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0], row[1]
        conn.close()
        return None,0


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MyWidget.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dxbOoC/btqMG6MEj6d/ItMFvk9qZP8o3cl4X3lrPK/MyWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MyWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604562487296&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MyWidget.py
from ProductSql import ProductSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;상품 조회&quot;)
        self.psql = ProductSql()
        self.lbox_product = QListWidget(self)
        self.lbox_product.resize(400,1000)
        self.resize(1000,1000)
        lb_info_pname = QLabel(&quot;상품명:&quot;,self)
        lb_info_pname.move(420,100)
        self.lb_pname = QLabel(&quot;&quot;,self)
        self.lb_pname.resize(200,80)
        self.lb_pname.move(550,100)
        lb_info_price = QLabel(&quot;가격:&quot;, self)
        lb_info_price.move(420,200)
        self.lb_price = QLabel(&quot;&quot;,self)
        self.lb_price.resize(200,80)
        self.lb_price.move(550,200)        
        self.lbox_product.currentItemChanged.connect(self.OnChangeProduct)
        self.ListProduct()        
    def OnChangeProduct(self):
        pid = self.lbox_product.currentItem().text()
        pname, price = self.psql.FindProdctInfo(pid)
        self.lb_pname.setText(pname)
        self.lb_price.setText(str(price))
    def ListProduct(self):
        self.lbox_product.clear()
        products = self.psql.GetProductsID()
        for product in products:
            self.lbox_product.addItem(product)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604562502939&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from MyWidget import MyWidget
app = QApplication(sys.argv)
myw = MyWidget()
myw.show()
sys.exit(app.exec_())
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>MSSQL</category>
      <category>Python</category>
      <category>Qt</category>
      <category>상품 조회</category>
      <category>소스 코드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3540</guid>
      <comments>https://ehclub.co.kr/3540#entry3540comment</comments>
      <pubDate>Thu, 5 Nov 2020 16:49:11 +0900</pubDate>
    </item>
    <item>
      <title>[python - QT] 리스트 박스 사용하기 - QListWidget</title>
      <link>https://ehclub.co.kr/3539</link>
      <description>&lt;p&gt;&lt;b&gt;항목 추가 : addItem(항목)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;항목 삭제: takeItem(항목 인덱스)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;모든 항목 삭제: clear()&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;선택 항목 변경 이벤트: currentItemChanged&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://doc.qt.io/qtforpython/PySide2/QtWidgets/QListWidget.html?highlight=qlistwidget&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;공식 QT 문서에서 자세히 살펴보기&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MyWidget.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bsvZJd/btqMG7xT0id/2XGL6T0rrjaOFKEqrZ89zK/MyWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MyWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604559115521&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MyWidget.py
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;리스트 박스 사용 데모&quot;)
        self.resize(1000,800)
        self.lbox = QListWidget(self)
        self.lbox.resize(400,600)
        self.te=QTextEdit(self)
        self.te.move(420,0)
        self.te.resize(400,80)
        self.btn = QPushButton(&quot;추가&quot;,self)
        self.btn.move(840,0)
        self.btn.resize(180,80)
        self.btn.clicked.connect(self.AddItem)
        self.lb_sel = QLabel(&quot;[테스트]&quot;,self)
        self.lb_sel.move(420,100)
        self.lbox.currentItemChanged.connect(self.OnLBoxSelectChange)
        self.btn_remove = QPushButton(&quot;선택 항목 삭제&quot;,self)
        self.btn_remove.move(420,200)
        self.btn_remove.clicked.connect(self.RemoveItem)
        self.btn_clear = QPushButton(&quot;모두 지우기&quot;,self)
        self.btn_clear.move(420,300)
        self.btn_clear.clicked.connect(self.ClearAll)
    def ClearAll(self):
        self.lbox.clear()
    def RemoveItem(self):
        index = self.lbox.currentRow()
        self.lbox.takeItem(index)
    def AddItem(self):
        data = self.te.toPlainText()
        self.lbox.addItem(data)
        self.te.setText(&quot;&quot;)
    def OnLBoxSelectChange(self):
        item = self.lbox.currentItem()
        self.lb_sel.setText(item.text())
        &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604559135510&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from MyWidget import MyWidget
app = QApplication(sys.argv)
myw = MyWidget()
myw.show()
sys.exit(app.exec_())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍 기술/Python - QT</category>
      <category>Python</category>
      <category>QListWidget</category>
      <category>Qt</category>
      <category>리스트 박스</category>
      <category>리스트 상자</category>
      <category>사용법</category>
      <category>소스 코드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3539</guid>
      <comments>https://ehclub.co.kr/3539#entry3539comment</comments>
      <pubDate>Thu, 5 Nov 2020 15:55:05 +0900</pubDate>
    </item>
    <item>
      <title>[python] QT, MSSQL 활용 - 상품 등록하기</title>
      <link>https://ehclub.co.kr/3538</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XNu0Z/btqMAP50TZ6/KkWFJLeu7oZNgZsNPNw5EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XNu0Z/btqMAP50TZ6/KkWFJLeu7oZNgZsNPNw5EK/img.png&quot; data-alt=&quot;Database 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XNu0Z/btqMAP50TZ6/KkWFJLeu7oZNgZsNPNw5EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXNu0Z%2FbtqMAP50TZ6%2FKkWFJLeu7oZNgZsNPNw5EK%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Database 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Product 테이블&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604544795688&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE [dbo].[Product] (
    [PId]   VARCHAR (50) NOT NULL,
    [PName] VARCHAR (50) NOT NULL,
    [Price] INT          NOT NULL,
    [PKey]  INT          IDENTITY (1, 1) NOT NULL,
    CONSTRAINT [PK__Product__C57755405495D0B5] PRIMARY KEY CLUSTERED ([PKey] ASC),
    CONSTRAINT [AK_PID] UNIQUE NONCLUSTERED ([PId] ASC)
);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;ProductSql.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bVpHK9/btqMzDLG9Zt/R1b9qjWGkGg9YjOHz5kvik/ProductSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ProductSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604543382215&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ProductSql.py
import  pymssql
class ProductSql:
    def AddProduct(self, pid,pname,price):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Product (PID, PNAME, Price) values('{0}','{1}',{2})&quot;,\
            pid,pname,price)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def RemoveProduct(self,pkey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Product where Pkey={0}&quot;,pkey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindProduct(self,key):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select * from Product where Pkey={0}&quot;,key)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품이름:{1} 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row =cursor.fetchone()
        conn.commit()
        conn.close()
    def FindKeyByName(self,pname):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PName='{0}'&quot;,pname)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ViewProductList(self):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID,PNAME,PRICE from Product&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품명:{1} 상품 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row = cursor.fetchone()
        conn.close()
    def FindKeyByID(self,pid):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PID='{0}'&quot;,pid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return 0
    def FindProductID(self,pkey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID from Product where PKey={0}&quot;,pkey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MyWidget.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bwCqon/btqMAQcJbWb/xc3Xmk3QGhva427bTVqMmk/MyWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MyWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604543438352&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MyWidget.py
from ProductSql import ProductSql
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;상품 등록 창&quot;)
        self.resize(1000,600)
        lb_id = QLabel(&quot;상품 ID:&quot;,self)
        lb_id.move(0,30)
        lb_name = QLabel(&quot;상품명:&quot;,self)
        lb_name.move(0,130)
        lb_price = QLabel(&quot;상품 가격:&quot;,self)
        lb_price.move(0,230)
        self.te_id = QTextEdit(self)
        self.te_id.move(180,20)
        self.te_id.resize(500,60)
        self.te_name = QTextEdit(self)
        self.te_name.move(180,120)
        self.te_name.resize(500,60)
        self.te_price = QTextEdit(self)
        self.te_price.move(180,220)
        self.te_price.resize(500,60)
        self.btn_add = QPushButton(&quot;추가&quot;,self)
        self.btn_add.resize(200,90)
        self.btn_add.move(180,310)
        self.btn_cancel = QPushButton(&quot;취소&quot;,self)
        self.btn_cancel.resize(200,90)
        self.btn_cancel.move(420,310)
        self.btn_add.clicked.connect(self.AddProduct)
        self.btn_cancel.clicked.connect(self.Clear)
        self.psql = ProductSql()
    def AddProduct(self):
        pid = self.te_id.toPlainText()
        pname = self.te_name.toPlainText()
        price = 0
        try:
            price = int(self.te_price.toPlainText())
        except:
            mbox = QMessageBox()
            mbox.setText(&quot;가격 정보는 정수로...&quot;)
            mbox.exec_()
        else:
            try:
                self.psql.AddProduct(pid,pname,price)
            except:
                mbox = QMessageBox()
                mbox.setText(&quot;이미 존재하는 상품 ID입니다.&quot;)
                mbox.exec_()
        self.Clear()
    def Clear(self):
        self.te_id.setText(&quot;&quot;)
        self.te_name.setText(&quot;&quot;)
        self.te_price.setText(&quot;&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604543473536&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from MyWidget import MyWidget
app = QApplication(sys.argv)
myw = MyWidget()
myw.show()
sys.exit(app.exec_())
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>MSSQL</category>
      <category>Python</category>
      <category>Qt</category>
      <category>상품 추가</category>
      <category>소스 코드</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3538</guid>
      <comments>https://ehclub.co.kr/3538#entry3538comment</comments>
      <pubDate>Thu, 5 Nov 2020 11:31:39 +0900</pubDate>
    </item>
    <item>
      <title>[Python - QT] 텍스트 입력 및 설정, 버튼 클릭 이벤트 핸들러 등록하기</title>
      <link>https://ehclub.co.kr/3537</link>
      <description>&lt;p&gt;&lt;b&gt;MyWidget.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604540736172&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MyWidget.py
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;테스트 입력 및 설정&quot;)
        self.te = QTextEdit(self)
        self.te.resize(400,90)
        self.resize(1000,600)
        self.btn = QPushButton(&quot;확인&quot;,self)
        self.btn.move(430,0)
        self.btn.resize(200,90)
        self.lb = QLabel(&quot;[테스트]&quot;,self)
        self.lb.move(0,110)
        self.btn.clicked.connect(self.BtnClick)
    def BtnClick(self):
        txt = self.te.toPlainText()
        self.lb.setText(txt)
        self.te.setText(&quot;&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604540755585&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from MyWidget import MyWidget
app = QApplication(sys.argv)
myw = MyWidget()
myw.show()
sys.exit(app.exec_())
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍 기술/Python - QT</category>
      <category>Python</category>
      <category>Qt</category>
      <category>소스 코드</category>
      <category>이벤트 핸들러</category>
      <category>텍스트 속성</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3537</guid>
      <comments>https://ehclub.co.kr/3537#entry3537comment</comments>
      <pubDate>Thu, 5 Nov 2020 10:46:25 +0900</pubDate>
    </item>
    <item>
      <title>[python - QT] 위젯의 타이틀 및 배경색 설정하기</title>
      <link>https://ehclub.co.kr/3536</link>
      <description>&lt;p&gt;&lt;b&gt;MyWidget.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cpsVGw/btqMArc8tSP/hjZg8Ov0QHm0KAw9xIsjnk/MyWidget.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MyWidget.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604538180170&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#MyWidget.py
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;나의 창&quot;)
        pal = QPalette()
        pal.setColor(QPalette.Background,QColor(255,0,255))
        self.setAutoFillBackground(True)
        self.setPalette(pal)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/T31qx/btqMAQRgYXP/byOvqRZuKU4rgMk6kkoi40/Main.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Main.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604538218952&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import QApplication
from MyWidget import MyWidget
app = QApplication(sys.argv)
myw = MyWidget()
myw.show()
sys.exit(app.exec_())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍 기술/Python - QT</category>
      <category>Python</category>
      <category>Qt</category>
      <category>나의 위젯</category>
      <category>배경색 설정하기</category>
      <category>소스 코드</category>
      <category>타이틀 설정</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3536</guid>
      <comments>https://ehclub.co.kr/3536#entry3536comment</comments>
      <pubDate>Thu, 5 Nov 2020 10:04:04 +0900</pubDate>
    </item>
    <item>
      <title>[python - QT] 첫 번째 프로그램 - 창 띄우기</title>
      <link>https://ehclub.co.kr/3535</link>
      <description>&lt;p&gt;&lt;b&gt;main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604538015561&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import *

app = QApplication(sys.argv)
qw = QWidget()
qw.show()
sys.exit(app.exec_())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍 기술/Python - QT</category>
      <category>Python</category>
      <category>Qt</category>
      <category>소스 코드</category>
      <category>위젯</category>
      <category>창 띄우기</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3535</guid>
      <comments>https://ehclub.co.kr/3535#entry3535comment</comments>
      <pubDate>Thu, 5 Nov 2020 10:01:22 +0900</pubDate>
    </item>
    <item>
      <title>[python] 쇼핑몰 구현 - MSSQL이용한 콘솔 응용</title>
      <link>https://ehclub.co.kr/3534</link>
      <description>&lt;p&gt;- &lt;b&gt;데이터 베이스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604468424300&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DBMS: MSSQL
테이블: 상품, 고객, 판매
        상품: 상품 ID(유일), 상품 이름, 가격, 상품 일련번호(Primary Key)
        고객: 고객 ID(유일), 고객 이름, 고객 일련번호(Primary Key)
        판매: 상품 일련변호(외래 Key), 고객 일련번호(외래 키), 판매 개수, 판매 일련번호(Primary Key)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BnKxt/btqMr4wG0zG/2kzrTxXx9YMKM8XSPXVqk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BnKxt/btqMr4wG0zG/2kzrTxXx9YMKM8XSPXVqk1/img.png&quot; data-alt=&quot;데이터베이스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BnKxt/btqMr4wG0zG/2kzrTxXx9YMKM8XSPXVqk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBnKxt%2FbtqMr4wG0zG%2F2kzrTxXx9YMKM8XSPXVqk1%2Fimg.png&quot; data-filename=&quot;데이터베이스 다이어그램.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;*CKey, PKey, SKey는 IDENTITY(1,1)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;- 제공할 기능&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604468869763&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;쇼핑몰 시나리오
1. 고객 추가
2. 상품 추가
3. 판매 추가
4. 상품 제거
5. 고객 탈퇴
6. 판매 취소
    6.1 판매키로 취소 6.2 상품으로 취소  6.3 고객으로 취소
7. 구입 현황 조회
8. 판매 현황 조회
9. 전체 고객 보기
10. 전체 상품 보기
11. 전체 판매 보기&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ProductSql.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bjW9dL/btqMArddhOB/EKf1XKkt1MH3rPKamvBX2k/ProductSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ProductSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604472444750&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ProductSql.py
import  pymssql
class ProductSql:
    def AddProduct(self, pid,pname,price):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Product (PID, PNAME, Price) values('{0}','{1}',{2})&quot;,\
            pid,pname,price)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def RemoveProduct(self,pkey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Product where Pkey={0}&quot;,pkey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindProduct(self,key):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select * from Product where Pkey={0}&quot;,key)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품이름:{1} 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row =cursor.fetchone()
        conn.commit()
        conn.close()
    def FindKeyByName(self,pname):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PName='{0}'&quot;,pname)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ViewProductList(self):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID,PNAME,PRICE from Product&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;상품ID:{0} 상품명:{1} 상품 가격:{2}&quot;.format(row[0], row[1],row[2]))
            row = cursor.fetchone()
        conn.close()
    def FindKeyByID(self,pid):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PKey from Product where PID='{0}'&quot;,pid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return 0
    def FindProductID(self,pkey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select PID from Product where PKey={0}&quot;,pkey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CustomSql.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/IYF3l/btqMBwylwor/kTEcKDkbMGANkuysP2XrP0/CustomSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CustomSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604472462446&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CustomSql.py
import pymssql
class CustomSql:
    def AddCustom(self, cid, cname):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Custom (CID, CNAME) values('{0}','{1}')&quot;, cid,cname)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def RemoveCustom(self, ckey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Custom where Ckey={0}&quot;,ckey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindCustom(self,ckey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select * from Custom where Ckey={0}&quot;,ckey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;고객ID:{0} 고객이름:{1}&quot;.format(row[0], row[1]))
            row =cursor.fetchone()
        conn.commit()
        conn.close()
    def FindKeyByName(self, cname):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CKey from Custom where CName='{0}'&quot;,cname)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None
    def ViewCustomList(self):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID,CNAME from Custom&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            print(&quot;고객 ID:{0}, 고객 이름:{1}&quot;.format(row[0],row[1]))
            row = cursor.fetchone()
        conn.close()
    def FindKeyByID(self,cid):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CKey from Custom where CID='{0}'&quot;,cid)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return 0
    def FindCustomId(self,ckey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select CID from Custom where CKey={0}&quot;,ckey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            return row[0]
        conn.close()
        return None&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SaleSql.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/czReFD/btqMwm4Lmon/kIfoMTWQn1X0Me4nq7ckDk/SaleSql.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SaleSql.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604472477446&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#SaleSql.py
import pymssql
from ProductSql import ProductSql
from CustomSql import CustomSql
class SaleSql:
    def __init__(self):
        self.psql = ProductSql()
        self.csql = CustomSql()
    def AddSale(self,ckey,pkey,scount):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;insert into Sale (CKey,PKey,SCount) values({0},{1},{2})&quot;, ckey,pkey,scount)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def CancelSale(self,skey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query =str.format(&quot;delete from Sale where skey={0}&quot;, skey)
        cursor.execute(query)
        conn.commit()
        conn.close()
    def FindProductsByCustom(self,ckey):
        sales = list()
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select * from Sale where Ckey={0}&quot;,ckey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            sales.append( [row[0], row[1], row[2], row[3] ]   )
            row =cursor.fetchone()
        conn.commit()
        conn.close()
        return sales
    def FindCustomsByProduct(self,pkey):
        sales = list()
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select * from Sale where Pkey={0}&quot;,pkey)
        cursor.execute(query)
        row = cursor.fetchone()
        while row:
            sales.append( [row[0], row[1], row[2], row[3] ]   )
            row =cursor.fetchone()
        conn.commit()
        conn.close()
        return sales
    def CancelSaleByProduct(self,pkey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Sale where Pkey={0}&quot;,pkey)
        cursor.execute(query)        
        conn.commit()
        conn.close()
    def CancelSaleByCustom(self,ckey):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;delete from Sale where Ckey={0}&quot;,ckey)
        cursor.execute(query)        
        conn.commit()
        conn.close()
    def ViewSaleList(self):
        conn = pymssql.connect(&quot;localhost&quot;,&quot;sa&quot;,&quot;1234&quot;,&quot;BigPro&quot;)
        cursor = conn.cursor()
        query = str.format(&quot;select pkey, ckey, scount from Sale&quot;)
        cursor.execute(query)
        row = cursor.fetchone()
        print(&quot;{0:15}{1:15}{2:15}&quot;.format(&quot;Product ID&quot;,&quot;Custom ID&quot;, &quot;Sale Count&quot;))
        while row:
            pid = self.psql.FindProductID(row[0])
            cid = self.csql.FindCustomId(row[1])
            print(&quot;{0:15}{1:15}{2:&amp;lt;15}&quot;.format(pid, cid,row[2]))
            row = cursor.fetchone()
        conn.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;EHMall.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/GJ1qD/btqMxn3t5m5/C3Gv0XvWJMRixPkiQWa6F1/EHMall.py?attach=1&amp;amp;knm=tfile.py&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;EHMall.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1604472492470&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#EHMall.py
import _mssql
from CustomSql import CustomSql 
from ProductSql import ProductSql
from SaleSql import SaleSql
import os
class EHMall:
    def __init__(self):
        print(&quot;EH Mall을 시작합니다.&quot;)
        input(&quot;엔터 키를 누르세요.&quot;)
        self.csql = CustomSql()
        self.psql = ProductSql()
        self.ssql = SaleSql()
    def Run(self):
        while True:
            key = self.SelectMenu()
            if key == '1':
                self.AddCustom()
            elif key == '2':
                self.AddProduct()
            elif key == '3':
                self.AddSale()
            elif key == '4':
                self.RemoveProduct()
            elif key == '5':
                self.RemoveCustom()
            elif key=='6':
                self.CancelSale()
            elif key == '7':
                self.ViewPurchase()
            elif key == '8':
                self.ViewSaleProduct()
            elif key == '9':
                self.ViewCustomList()
            elif key == '10':
                self.ViewProductList()
            elif key == '11':
                self.ViewSaleList()
            elif key =='0':
                break
            else:
                print(&quot;잘못 선택하였습니다.&quot;)
            input(&quot;엔터 키를 누르세요.&quot;)
    def SelectMenu(self):
        os.system(&quot;cls&quot;)
        print('1. 고객 추가')
        print('2. 상품 추가')
        print('3. 판매 추가')
        print('4. 상품 제거')
        print('5. 고객 탈퇴')
        print('6. 판매 취소')
        print('7. 구입 현황 조회')
        print('8. 상품 판매 조회')
        print('9. 전체 고객 보기')
        print('10. 전체 상품 보기')
        print('11. 전체 판매 보기')
        return input(&quot;메뉴 선택:&quot;)
    def AddCustom(self):
        try:
            print(&quot;고객 추가&quot;)
            cid = input(&quot;고객 ID:&quot;)
            cname = input(&quot;고객 이름:&quot;)
            self.csql.AddCustom(cid,cname)
        except:
            print(&quot;이미 존재하는 ID입니다.&quot;)
    def AddProduct(self):
        print(&quot;상품 추가&quot;)
        try:
            pid = input(&quot;상품 ID:&quot;)
            pname = input(&quot;상품 이름:&quot;)
            price = 0
            try:
                price = int(input(&quot;상품 가격:&quot;))
            except:
                print(&quot;상품 가격은 0원으로 처리합니다.&quot;)
            self.psql.AddProduct(pid,pname,price)
        #except Exception as e:
        #except IntegrityError:        
        #except pymssql.MSSQLDatabaseException:
        except:
            print(&quot;이미 존재하는 상품 ID입니다.&quot;)
    def AddSale(self):
        print(&quot;판매 추가&quot;)
        ckey = self.SelectCustom()
        if ckey==0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        pkey = self.SelectProduct()
        if pkey == 0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        count = 1
        try:
            count = int(input(&quot;판매 개수:&quot;))
        except:
            print(&quot;판매 개수를 1로 처리하였습니다.&quot;)
        self.ssql.AddSale(ckey,pkey,count)
    def SelectCustom(self):
        self.csql.ViewCustomList()
        cid = input(&quot;선택할 고객 ID:&quot;)
        return self.csql.FindKeyByID(cid)
    def SelectProduct(self):
        self.psql.ViewProductList()
        pid = input(&quot;선택할 상품 ID:&quot;)
        return self.psql.FindKeyByID(pid)
    def RemoveProduct(self):
        print(&quot;상품 제거&quot;)
        pkey = self.SelectProduct()
        if pkey == 0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        try:
            self.psql.RemoveProduct(pkey)
        except:
            print(&quot;해당 상품 관련 판매 정보를 먼저 제거하세요.&quot;)
    def RemoveCustom(self):
        print(&quot;고객 탈퇴&quot;)
        ckey = self.SelectCustom()
        if ckey==0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        try:
            self.csql.RemoveCustom(ckey)
        except:
            print(&quot;해당 고객 관련 판매 정보를 먼저 제거하세요.&quot;)
    def CancelSale(self):
        print(&quot;판매 취소&quot;)
        key = self.SelectCancelMenu()
        if key=='1':
            self.CancelSaleBySkey()
        elif key == '2':
            self.CancelSaleByProduct()
        elif key == '3':
            self.CancelSaleByCustom()
        else:
            print(&quot;잘못 선택하였습니다.&quot;)
    def SelectCancelMenu(self):
        print(&quot;1:단위 판매 취소 2:특정 상품 관련 판매 취소 3:특정 고객 관련 판매 취소&quot;)
        return input(&quot;선택:&quot;)
    def CancelSaleBySkey(self):
        skey = 0
        try:
            skey = int(input(&quot;판매 번호:&quot;))
        except:
            print(&quot;잘못 입력하였습니다.&quot;)
        try:
            self.ssql.CancelSale(skey)
        except:
            print(&quot;존재하지 않는 판매 번호입니다.&quot;)
    def CancelSaleByProduct(self):
        print(&quot;상품으로 판매 취소(주의:해당 상품의 모든 판매 정보 삭제됨)&quot;)
        pkey = self.SelectProduct()
        if pkey == 0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        self.ssql.CancelSaleByProduct(pkey)

    def CancelSaleByCustom(self):
        print(&quot;고객으로 판매 취소(주의:해당 고객의 모든 판매 정보 삭제됨)&quot;)
        ckey = self.SelectCustom()
        if ckey == 0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        self.ssql.CancelSaleByCustom(ckey)

    def ViewPurchase(self):
        print(&quot;구입 현황 조회&quot;)
        ckey = self.SelectCustom()
        if ckey == 0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        sales = self.ssql.FindProductsByCustom(ckey)
        for sale in sales:
            self.psql.FindProduct(sale[1])
            print(&quot;판매 개수:&quot;,sale[3])
            print(&quot;=======&quot;)

    def ViewSaleProduct(self):
        print(&quot;상품 판매 조회&quot;)
        pkey = self.SelectProduct()
        if pkey == 0:
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        sales = self.ssql.FindCustomsByProduct(pkey)
        for sale in sales:
            self.csql.FindCustom(sale[0])
            print(&quot;판매 개수:&quot;,sale[3])
            print(&quot;=======&quot;)

    def ViewCustomList(self):
        print(&quot;전체 고객 보기&quot;)
        self.csql.ViewCustomList()
    def ViewProductList(self):
        print(&quot;전체 상품 보기&quot;)
        self.psql.ViewProductList()
    def ViewSaleList(self):
        print(&quot;전체 판매 보기&quot;)
        self.ssql.ViewSaleList()

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604472508166&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from EHMall import EHMall
ehmall = EHMall()
ehmall.Run()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/y8Tdb/btqMzFhMv4X/UaiAzckGaGPvqZNyJ11k1K/%5B%EA%B8%B0%EC%88%A0%20%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4%5DEH%20%EC%87%BC%ED%95%91%EB%AA%B0%20-%20DBMS%28MSSQL%29%20%ED%99%9C%EC%9A%A9.docx?attach=1&amp;amp;knm=tfile.docx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;[기술 포트폴리오]EH 쇼핑몰 - DBMS(MSSQL) 활용.docx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>MSSQL</category>
      <category>Python</category>
      <category>소스 코드</category>
      <category>쇼핑몰</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3534</guid>
      <comments>https://ehclub.co.kr/3534#entry3534comment</comments>
      <pubDate>Wed, 4 Nov 2020 14:41:16 +0900</pubDate>
    </item>
    <item>
      <title>[python] OOP 실습 - 커뮤니트 시뮬레이션 만들기</title>
      <link>https://ehclub.co.kr/3533</link>
      <description>&lt;p&gt;&lt;b&gt;시나리오&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604041440999&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;커뮤니티 시뮬레이션 응용을 작성하시오.

로긴=&amp;gt;사용=&amp;gt;로긴=&amp;gt;사용=&amp;gt;로긴=&amp;gt;사용...순으로 수행한다.

로긴에서는 사용자 이름을 입력한다.
사용에서는 메뉴 선택에 의해 기능을 수행하는 것을 반복한다.
메뉴: 1.게시글 작성, 2. 게시글 삭제, 3. 게시글 검색, 4. 전체 보기 0.종료
종료를 선택하면 자동 로그아웃 처리되며 다시 로긴을 수행한다.

*로긴에서 입력한 사용자 이름이 &quot;Exit&quot;이면 프로그램을 종료한다.

게시글 작성에서는 제목, 내용, 비밀키를 입력받는다.
비밀키를 입력하지 않으면 일반 게시글, 입력하면 비밀 게시글

게시글 삭제에서는 제목, 비밀키를 입력받는다.
비밀게시글은 비밀키가 일치해야 삭제할 수 있다.
(*작성자가 아니어도 삭제할 수 있음)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;커뮤니티 클래스 다이어그램.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWbDU5/btqMaEDZvAu/kLtfPO0qffTYC6ghyOX4o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWbDU5/btqMaEDZvAu/kLtfPO0qffTYC6ghyOX4o0/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWbDU5/btqMaEDZvAu/kLtfPO0qffTYC6ghyOX4o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWbDU5%2FbtqMaEDZvAu%2FkLtfPO0qffTYC6ghyOX4o0%2Fimg.png&quot; data-filename=&quot;커뮤니티 클래스 다이어그램.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604042620942&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from Application import Application

app = Application()
while app.Login():
    app.Run()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Application.py&lt;/p&gt;
&lt;pre id=&quot;code_1604042642780&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Application.py
from Community import Community
class Application:
    def __init__(self):
        print(&quot;Application 생성&quot;)
        community = Community()
        self.user = &quot;&quot;
    def Login(self):
        print(&quot;로긴&quot;)
        self.user = input(&quot;사용자:&quot;)
        return self.user!=&quot;Exit&quot;
    def Run(self):
        print(&quot;사용&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;*Run 메서드부터 구체적으로 구현하시오.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;구현 예:&lt;/p&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604046215661&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from Application import Application

app = Application()
while app.Login():
    app.Run()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Application.py&lt;/p&gt;
&lt;pre id=&quot;code_1604046231829&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Application.py
import os
from Community import Community
class Application:
    def __init__(self):
        print(&quot;Application 생성&quot;)
        self.community = Community()
        self.user = &quot;&quot;
    def Login(self):
        print(&quot;로긴&quot;)
        self.user = input(&quot;사용자:&quot;)
        return self.user!=&quot;Exit&quot;
    def Run(self):
        print(&quot;사용&quot;)
        while True:
            key = self.SelectMenu()
            if key == '1':
                self.WritePost()
            elif key == '2':
                self.RemovePost()
            elif key == '3':
                self.Find()
            elif key == '4':
                self.View()
            elif key == '0':
                break
            else:
                print(&quot;잘못 선택하였습니다.&quot;)
            input(&quot;엔터 키를 누르세요.&quot;)
    def SelectMenu(self):
        os.system(&quot;cls&quot;)
        print(&quot;1:게시글 작성 2:게시글 삭제 3:게시글 검색 4:전체 보기 0:종료&quot;)
        return input(&quot;메뉴 선택:&quot;)
    def WritePost(self):
        print(&quot;게시글 작성&quot;)
        title = input(&quot;제목:&quot;)
        content = input(&quot;내용:&quot;)
        secret = input(&quot;비밀번호:&quot;)
        self.community.Publish(title,self.user,content,secret)
    def RemovePost(self):
        print(&quot;게시글 삭제&quot;)
        title = input(&quot;제목:&quot;)
        secret = input(&quot;비밀번호:&quot;)
        self.community.Remove(title,secret)
    def Find(self):
        print(&quot;게시글 검색&quot;)
        title = input(&quot;제목:&quot;)
        post = self.community.Find(title)
        if post == None:
            print(&quot;없는 게시글입니다.&quot;)
        self.community.ViewPost(post)
    def View(self):
        print(&quot;전체 보기&quot;)
        self.community.View()

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Community.py&lt;/p&gt;
&lt;pre id=&quot;code_1604046250955&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Community.py
from Post import Post
from SPost import SPost
class Community:
    def __init__(self):
        print(&quot;커뮤니티 생성&quot;)
        self.posts = list()
    def Publish(self,title,writer,content,secret=&quot;&quot;):
        print(&quot;Publish&quot;)
        if secret==&quot;&quot;:
            post = Post(title,writer,content)
            self.posts.append(post)
        else:
            post = SPost(title,writer,content,secret)
            self.posts.append(post)
    def View(self):
        print(&quot;View&quot;)
        for post in self.posts:
            self.ViewPost(post)
    def ViewPost(self,post):
        print(&quot;제목:&quot;,post.title)
        print(&quot;작성자:&quot;,post.writer)
        print(&quot;내용:&quot;,post.content)
        if(isinstance(post,SPost)):
            print(&quot;비밀글&quot;)
    def Find(self,title):
        print(&quot;Find&quot;)
        for post in self.posts:
            if(post.title == title):
                return post
        return None
    def Remove(self,title,secret=&quot;&quot;):
        print(&quot;Remove&quot;)
        for post in self.posts:
            if(post.title == title):
                if(isinstance(post, SPost)):
                    if post.secret == secret:
                        self.posts.remove(post)
                else:
                    self.posts.remove(post)
                break
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Post.py&lt;/p&gt;
&lt;pre id=&quot;code_1604046264218&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Post.py
class Post:
    def __init__(self,title,writer,content):
        print(&quot;Post 생성&quot;)
        self.title = title
        self.writer = writer
        self.content = content
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SPost.py&lt;/p&gt;
&lt;pre id=&quot;code_1604046276354&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#SPost.py
from Post import Post
class SPost(Post):
    def __init__(self,title,writer,content,secret):
        #Post.__init__(self,title,writer,content)
        super().__init__(title,writer,content)
        self.secret = secret
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>OOP</category>
      <category>Python</category>
      <category>소스 코드</category>
      <category>시나리오</category>
      <category>커뮤니티</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3533</guid>
      <comments>https://ehclub.co.kr/3533#entry3533comment</comments>
      <pubDate>Fri, 30 Oct 2020 16:04:31 +0900</pubDate>
    </item>
    <item>
      <title>[python] 상속 실습 - 커뮤니티(게시글, 비밀게시글)</title>
      <link>https://ehclub.co.kr/3532</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;321&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XxoPV/btqMaFP68WX/r58yYmvnfoLV6qsVTcR9OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XxoPV/btqMaFP68WX/r58yYmvnfoLV6qsVTcR9OK/img.png&quot; data-alt=&quot;커뮤니티 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XxoPV/btqMaFP68WX/r58yYmvnfoLV6qsVTcR9OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXxoPV%2FbtqMaFP68WX%2Fr58yYmvnfoLV6qsVTcR9OK%2Fimg.png&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;321&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커뮤니티 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;클래스 다이어그램과 사용하는 코드에 맞게 클래스를 정의하시오.&lt;/p&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604036130662&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
comm = Community()
comm.Publish(&quot;빅데이터&quot;,&quot;홍길동&quot;,&quot;빅데이터에 데이터는 빅하네.&quot;)
comm.Publish(&quot;AI&quot;,&quot;강감차&quot;,&quot;에잇, 아이야 저리로 가거라.&quot;,&quot;abcd&quot;)
comm.View()
post = comm.Find(&quot;AI&quot;)
print(&quot;제목:&quot;,post.title)
print(&quot;저자:&quot;,post.writer)
print(&quot;내용:&quot;,post.content)
comm.Remove(&quot;빅데이터&quot;)
comm.View()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Step1:&amp;nbsp;클래스에 멤버를 캡슐화하라.&lt;/p&gt;
&lt;p&gt;멤버 메서드에서는 어느 메서드가 수행 중인지만 출력하는 형태로 작성하시오.&lt;/p&gt;
&lt;p&gt;예를 들어 View메서드에서는 print(&quot;View&quot;)로 작성&lt;/p&gt;
&lt;p&gt;단) 프로그램은 오류없이 동작해야 합니다.&lt;/p&gt;
&lt;p&gt;Post.py&lt;/p&gt;
&lt;pre id=&quot;code_1604040709510&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Post.py
class Post:
    def __init__(self,title,writer,content):
        print(&quot;Post 생성&quot;)
        self.title = title
        self.writer = writer
        self.content = content
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Community.py&lt;/p&gt;
&lt;pre id=&quot;code_1604040769388&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Community.py
from Post import Post
from SPost import SPost
class Community:
    def __init__(self):
        print(&quot;커뮤니티 생성&quot;)
    def Publish(self,title,writer,content,secret=&quot;&quot;):
        print(&quot;Publish&quot;)
    def View(self):
        print(&quot;View&quot;)
    def Find(self,title):
        print(&quot;Find&quot;)
        return Post(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;)
    def Remove(self,title):
        print(&quot;Remove&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Main.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604040809371&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from Community import Community

comm = Community()
comm.Publish(&quot;빅데이터&quot;,&quot;홍길동&quot;,&quot;빅데이터에 데이터는 빅하네.&quot;)
comm.Publish(&quot;AI&quot;,&quot;강감차&quot;,&quot;에잇, 아이야 저리로 가거라.&quot;,&quot;abcd&quot;)
comm.View()
post = comm.Find(&quot;AI&quot;)
print(&quot;제목:&quot;,post.title)
print(&quot;저자:&quot;,post.writer)
print(&quot;내용:&quot;,post.content)
comm.Remove(&quot;빅데이터&quot;)
comm.View()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Step2: 목적에 맞게 메서드 내부를 구현하시오.&lt;/p&gt;
&lt;p&gt;SPost.py&lt;/p&gt;
&lt;pre id=&quot;code_1604040846805&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#SPost.py
from Post import Post
class SPost(Post):
    def __init__(self,title,writer,content,secret):
        #Post.__init__(self,title,writer,content)
        super().__init__(title,writer,content)
        self.secret = secret
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Post.py&lt;/p&gt;
&lt;pre id=&quot;code_1604040858371&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Post.py
class Post:
    def __init__(self,title,writer,content):
        print(&quot;Post 생성&quot;)
        self.title = title
        self.writer = writer
        self.content = content
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Community.py&lt;/p&gt;
&lt;pre id=&quot;code_1604040873981&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Community.py
from Post import Post
from SPost import SPost
class Community:
    def __init__(self):
        print(&quot;커뮤니티 생성&quot;)
        self.posts = list()
    def Publish(self,title,writer,content,secret=&quot;&quot;):
        print(&quot;Publish&quot;)
        if secret==&quot;&quot;:
            post = Post(title,writer,content)
            self.posts.append(post)
        else:
            post = SPost(title,writer,content,secret)
            self.posts.append(post)
    def View(self):
        print(&quot;View&quot;)
        for post in self.posts:
            self.ViewPost(post)
    def ViewPost(self,post):
        print(&quot;제목:&quot;,post.title)
        print(&quot;작성자:&quot;,post.writer)
        print(&quot;내용:&quot;,post.content)
        if(isinstance(post,SPost)):
            print(&quot;비밀글&quot;)
    def Find(self,title):
        print(&quot;Find&quot;)
        for post in self.posts:
            if(post.title == title):
                return post
        return None
    def Remove(self,title):
        print(&quot;Remove&quot;)
        for post in self.posts:
            if(post.title == title):
                self.posts.remove(post)
                break
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604040889012&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from Community import Community

comm = Community()
comm.Publish(&quot;빅데이터&quot;,&quot;홍길동&quot;,&quot;빅데이터에 데이터는 빅하네.&quot;)
comm.Publish(&quot;AI&quot;,&quot;강감차&quot;,&quot;에잇, 아이야 저리로 가거라.&quot;,&quot;abcd&quot;)
comm.View()
post = comm.Find(&quot;AI&quot;)
print(&quot;제목:&quot;,post.title)
print(&quot;저자:&quot;,post.writer)
print(&quot;내용:&quot;,post.content)
comm.Remove(&quot;빅데이터&quot;)
comm.View()
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>상속</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>커뮤니티</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3532</guid>
      <comments>https://ehclub.co.kr/3532#entry3532comment</comments>
      <pubDate>Fri, 30 Oct 2020 14:36:37 +0900</pubDate>
    </item>
    <item>
      <title>[python] 상속 실습 - 상품과 할인 상품</title>
      <link>https://ehclub.co.kr/3531</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;314&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4P7a/btqL7v8rRtC/6vYqqFlhTdEmZ7Bl5zX0d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4P7a/btqL7v8rRtC/6vYqqFlhTdEmZ7Bl5zX0d1/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4P7a/btqL7v8rRtC/6vYqqFlhTdEmZ7Bl5zX0d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4P7a%2FbtqL7v8rRtC%2F6vYqqFlhTdEmZ7Bl5zX0d1%2Fimg.png&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;314&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;주석으로 작성한 시나리오에 맞게 상품과 할인 상품 클래스를 정의하시오.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Product.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604024302028&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Product.py
#상품
#     상품명, 제조사,가격, 보유 개수, 판매량
#     생성할 때 상품명과 제조사, 가격을 입력받는다.
#     입고 기능에서는 입고 개수를 입력 인자로 받는다.
#     판매 기능에서는 출고 개수를 입력 인자로 받는다.
#     현황 보기에서는 상품명, 제조사, 가격, 보유 개수, 판매량, 판매 총액을 출력한다.


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SaleProduct.py&lt;/p&gt;
&lt;pre id=&quot;code_1604024321838&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#SaleProduct.py
#할인 상품:상품에서 파생
#             할인률(생성 시 전달)을 멤버로 갖는다. 
#             할인현황보기를 제공한다. 
#                 - 상품의 현황보기 외에 할인률을 고려하여 출력한다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604024335641&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from SaleProduct import SaleProduct
from Product import Product
sp = SaleProduct(&quot;롤TV&quot;,&quot;모르지&quot;,1000000000,0.2)
sp.ViewState()
sp.SaleViewState()

sp.InProduct(10)
sp.OutProduct(3)
sp.ViewState()
sp.SaleViewState()

sp.OutProduct(10)
sp.ViewState()
sp.SaleViewState()

sp.InProduct(5)
sp.OutProduct(2)
sp.ViewState()
sp.SaleViewState()

p = Product(&quot;롤TV&quot;,&quot;모르지&quot;,1000000000)
p.ViewState()

p.InProduct(10)
p.OutProduct(3)
p.ViewState()

p.OutProduct(10)
p.ViewState()

p.InProduct(5)
p.OutProduct(2)
p.ViewState()&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;실습 예&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Product.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604029111111&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Product.py
#상품
#     상품명, 제조사,가격, 보유 개수, 판매량
#     생성할 때 상품명과 제조사, 가격을 입력받는다.
#     입고 기능에서는 입고 개수를 입력 인자로 받는다.
#     판매 기능에서는 출고 개수를 입력 인자로 받는다.
#     현황 보기에서는 상품명, 제조사, 가격, 보유 개수, 판매량, 판매 총액을 출력한다.
class Product:
    #생성자(초기화) 메서드
    def __init__(self,name,company,price):
        self.name = name
        self.company = company
        self.price = price
        self.hcount = 0
        self.scount = 0
    def ViewState(self):
        print(&quot;상품명:&quot;,self.name)
        print(&quot;  제조사:&quot;,self.company)
        print(&quot;  가격:&quot;,self.price)
        print(&quot;  보유 개수:&quot;,self.hcount)
        print(&quot;  판매량:&quot;,self.scount)
        print(&quot;  판매 총액:&quot;,self.scount*self.price)
    def InProduct(self,cnt):
        self.hcount += cnt
    def OutProduct(self,cnt):
        if(self.hcount&amp;lt;cnt):
            cnt = self.hcount
        self.hcount -=cnt
        self.scount += cnt
        return cnt

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SaleProduct.py&lt;/p&gt;
&lt;pre id=&quot;code_1604029128446&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#SaleProduct.py
#할인 상품:상품에서 파생
#             할인률(생성 시 전달)을 멤버로 갖는다. 
#             할인현황보기를 제공한다. 
#                 - 상품의 현황보기 외에 할인률을 고려하여 출력한다.
from Product import Product
class SaleProduct(Product):
    def __init__(self,name,company,price,salep):
        Product.__init__(self,name,company,price)
        self.salep = salep
    def SaleViewState(self):
        self.ViewState()
        print(&quot;  할인율:&quot;,self.salep)
        print(&quot;실제 판매 가격:&quot;,self.price*(1-self.salep))
        print(&quot;실제 판매 총액:&quot;,self.price*self.scount*(1-self.salep))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Main.py&lt;/p&gt;
&lt;pre id=&quot;code_1604029157670&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from SaleProduct import SaleProduct
from Product import Product
sp = SaleProduct(&quot;롤TV&quot;,&quot;모르지&quot;,1000000000,0.2)
sp.ViewState()
sp.SaleViewState()

sp.InProduct(10)
sp.OutProduct(3)
sp.ViewState()
sp.SaleViewState()

sp.OutProduct(10)
sp.ViewState()
sp.SaleViewState()

sp.InProduct(5)
sp.OutProduct(2)
sp.ViewState()
sp.SaleViewState()

p = Product(&quot;롤TV&quot;,&quot;모르지&quot;,1000000000)
p.ViewState()

p.InProduct(10)
p.OutProduct(3)
p.ViewState()

p.OutProduct(10)
p.ViewState()

p.InProduct(5)
p.OutProduct(2)
p.ViewState()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>상속</category>
      <category>상품</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>할인 상품</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3531</guid>
      <comments>https://ehclub.co.kr/3531#entry3531comment</comments>
      <pubDate>Fri, 30 Oct 2020 11:19:15 +0900</pubDate>
    </item>
    <item>
      <title>[python] 상속 개요 - 책과 프로그래밍 책</title>
      <link>https://ehclub.co.kr/3530</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;416&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqX5oH/btqL380qxnm/aKcjpKuWd8vMP2HfO5hIg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqX5oH/btqL380qxnm/aKcjpKuWd8vMP2HfO5hIg1/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqX5oH/btqL380qxnm/aKcjpKuWd8vMP2HfO5hIg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqX5oH%2FbtqL380qxnm%2FaKcjpKuWd8vMP2HfO5hIg1%2Fimg.png&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;416&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Book.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604019137842&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Book.py
class Book:
    def __init__(self,title, author, publisher, price):
        self.title = title
        self.author = author
        self.publisher = publisher
        self.price = price
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;ProgrammingBook.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604019157111&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ProgrammingBook.py
from Book import Book
class ProgrammingBook(Book):
    def __init__(self,title,author,publisher,price,language):
        Book.__init__(self,title,author,publisher,price)
        self.language = language&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604019171680&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from ProgrammingBook import ProgrammingBook

book =ProgrammingBook(&quot;디파&quot;,&quot;언휴&quot;,&quot;언제나휴일&quot;,5000,&quot;파이썬&quot;)
print(&quot;제목:&quot;,book.title)
print(&quot;저자:&quot;,book.author)
print(&quot;출판사:&quot;,book.publisher)
print(&quot;가격:&quot;,book.price)
print(&quot;언어:&quot;,book.language)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>상속</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>책</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3530</guid>
      <comments>https://ehclub.co.kr/3530#entry3530comment</comments>
      <pubDate>Fri, 30 Oct 2020 09:53:14 +0900</pubDate>
    </item>
    <item>
      <title>[python] 상속 실습 - 음악가, 피아니스트</title>
      <link>https://ehclub.co.kr/3529</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;280&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDPgD/btqL5A99dQf/Lza2BkGoGnPuIvWHqQddBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDPgD/btqL5A99dQf/Lza2BkGoGnPuIvWHqQddBK/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDPgD/btqL5A99dQf/Lza2BkGoGnPuIvWHqQddBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQDPgD%2FbtqL5A99dQf%2FLza2BkGoGnPuIvWHqQddBK%2Fimg.png&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;280&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음과 같은 시나리오에 맞게 구현하시오.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Musician.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604018738814&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Musician.py
#음악가: 이름(생성 시 필수), 스킬(생성 시 필수), 매력(생성 시 전달 안 함:0)
#소개하다 기능: 자신의 이름, 스킬, 매력 출력
#연습하다: 스킬이 0.1 증가
#연주하다:매력이 스킬*0.1 증가
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;Pianist.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604018757535&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Pianist.py
#피아니스트: 음악가에서 파생
#레벨을 생성 시 전달받는다.
#독주회를 하다 - 레벨이 (스킬+매력)*0.1 증가
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;main.py&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;import 구문을 적절하게 추가하시오.&lt;/p&gt;
&lt;pre id=&quot;code_1604018783408&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
mus = Pianist(&quot;송정수&quot;,1,1)#피아니스트(이름,스킬,레벨)
mus.Introduce()
for i in range(0,10):
    for j in range(0,100):
        mus.Ex()#연습하다
    mus.Introduce()#소개하다
    mus.Play()#연주하다
    mus.Introduce()#소개하다
mus.SoloPlay()#독주회를 하다
mus.Introduce()#소개하다


&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;nbsp;구현 예&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Musician.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604021723368&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Musician.py
#음악가: 이름(생성 시 필수), 스킬(생성 시 필수), 매력(생성 시 전달 안 함:0)
#소개하다 기능: 자신의 이름, 스킬, 매력 출력
#연습하다: 스킬이 0.1 증가
#연주하다:매력이 스킬*0.1 증가
class Musician:
    def __init__(self,name,skill):
        self.name = name
        self.skill = skill
        self.charm = 0
    def Introduce(self):
        print(&quot;이름:{0} 스킬:{1} 매력:{2}&quot;.format(self.name,self.skill,self.charm))
    def Ex(self):
        self.skill += 0.1
    def Play(self):
        self.charm += (self.skill*0.1)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;Pianist.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604021745318&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Pianist.py
#피아니스트: 음악가에서 파생
#레벨을 생성 시 전달받는다.
#독주회를 하다 - 레벨이 (스킬+매력)*0.1 증가
from Musician import Musician

class Pianist(Musician):
    def __init__(self,name,skill,level):
        Musician.__init__(self,name,skill)
        self.level = level
    def SoloPlay(self):
        self.level += ((self.skill+self.charm)*0.1)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;Main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1604021758950&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from Pianist import Pianist

mus = Pianist(&quot;송정수&quot;,1,1)#피아니스트(이름,스킬,레벨)
mus.Introduce()
for i in range(0,10):
    for j in range(0,100):
        mus.Ex()#연습하다
    mus.Introduce()#소개하다
    mus.Play()#연주하다
    mus.Introduce()#소개하다
mus.SoloPlay()#독주회를 하다
mus.Introduce()#소개하다
print(&quot;level:&quot;,mus.level)

&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>상속</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>음악가</category>
      <category>파이썬</category>
      <category>피아니스트</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3529</guid>
      <comments>https://ehclub.co.kr/3529#entry3529comment</comments>
      <pubDate>Fri, 30 Oct 2020 09:47:08 +0900</pubDate>
    </item>
    <item>
      <title>[python] 캡슐화 실습 - 음악가 정의하기</title>
      <link>https://ehclub.co.kr/3528</link>
      <description>&lt;p&gt;&lt;b&gt;시나리오&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603954112621&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#실습 시나리오
#음악가는 생성할 때 이름(필수), 악기(선택:디폴트 피아노), 스킬(선택: 디폴트 0)을 입력받는다.
#음악가는 이름, 악기, 스킬, 매력(생성 시 0)
#음악가는 '인사하다', '연습하다', '연주하다' 기능을 수행할 수 있다.
#'인사하다'를 수행하면 자신을 소개한다.(이름, 악기,스킬,매력 정보 출력)
#'연습하다'를 수행하면 스킬이 0.1 올라간다. 
#'연주하다'를 수행하면 매력이 스킬*0.1만큼 올라간다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1603959439156&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Musician:
    def __init__(self,name,instrument='피아노',skill=0):
        self.name = name
        self.instrument = instrument
        self.skill = skill
        self.charm = 0
    def Introduce(self):
        print(&quot;{0}연주하는 {1}입니다.&quot;.format(self.instrument, self.name))
        print(&quot;연주 스킬:{0} 매력:{1}&quot;.format(self.skill,self.charm))
    def Play(self):
        self.charm+=(self.skill* 0.1)
    def Ex(self):
        self.skill+=0.1
m1 = Musician(&quot;송정수&quot;)
m1.Introduce()
for i in range(0,100):
    m1.Ex()
m1.Introduce()
m1.Play()
m1.Introduce()
m2 = Musician(&quot;언휴&quot;,&quot;드럼&quot;,2)
m3 = Musician(&quot;홍길동&quot;,skill=3)
m4 = Musician(&quot;야호&quot;,&quot;기타&quot;)
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>실습 시나리오</category>
      <category>음악가</category>
      <category>캡슐화</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3528</guid>
      <comments>https://ehclub.co.kr/3528#entry3528comment</comments>
      <pubDate>Thu, 29 Oct 2020 15:48:58 +0900</pubDate>
    </item>
    <item>
      <title>[python] 캡슐화 실습 - 직사각형 클래스 정의하기</title>
      <link>https://ehclub.co.kr/3527</link>
      <description>&lt;p&gt;다음과 같은 코드가 있다. 직사각형 클래스를 정의하시오.&lt;/p&gt;
&lt;pre id=&quot;code_1603951609622&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Point:#점(Point)
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y
#직사각형(Rectangle)
rectangle = Rectangle()
rectangle.position = Point(3,4)
rectangle.width =20
rectangle.height=40
print(&quot;면적:&quot;,rectangle.GetArea())

point = Point(10,10)
rect1 = Rectangle(point,20,30)
print(&quot;x:&quot;,rect1.position.x)
print(&quot;y:&quot;,rect1.position.y)
print(&quot;width:&quot;,rect1.width)
print(&quot;height:&quot;,rect1.height)
print(&quot;면적:&quot;,rect1.GetArea())&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1603953225110&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Point:#점(Point)
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y
#직사각형(Rectangle)
class Rectangle:
    def __init__(self,position=Point(0,0),width=0,height=0):
        self.position = position
        self.width = width
        self.height = height
    def GetArea(self):
        return self.width*self.height

rectangle = Rectangle()
rectangle.position = Point(3,4)
rectangle.width =20
rectangle.height=40
print(&quot;면적:&quot;,rectangle.GetArea())

point = Point(10,10)
rect1 = Rectangle(point,20,30)
print(&quot;x:&quot;,rect1.position.x)
print(&quot;y:&quot;,rect1.position.y)
print(&quot;width:&quot;,rect1.width)
print(&quot;height:&quot;,rect1.height)
print(&quot;면적:&quot;,rect1.GetArea())
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>직사각형</category>
      <category>캡슐화</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3527</guid>
      <comments>https://ehclub.co.kr/3527#entry3527comment</comments>
      <pubDate>Thu, 29 Oct 2020 15:07:14 +0900</pubDate>
    </item>
    <item>
      <title>[python] 캡슐화 실습 - 생성자(초기화) 정의하기</title>
      <link>https://ehclub.co.kr/3526</link>
      <description>&lt;p&gt;다음과 같이 사용하는 코드가 있다.&lt;/p&gt;
&lt;p&gt;정상적으로 동작할 수 있게 생성자를 정의하시오.&lt;/p&gt;
&lt;pre id=&quot;code_1603949266477&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#학생 형식
class Student:

    def GetSum(self):
        return self.korean+self.english+self.math
    def GetAverage(self):
        return self.GetSum()/3

#사용하는 코드
stu = Student(&quot;홍길동&quot;,12)
print(&quot;이름:{0} 번호:{1}&quot;.format(stu.name,stu.num))
stu.korean = 99
stu.english = 80
stu.math = 85
print(&quot;합계:{0} 평균:{1}&quot;.format(stu.GetSum(),stu.GetAverage()))
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1603949964917&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#학생 형식
class Student:
    def __init__(self,name,num):
        self.name = name
        self.num = num
        self.korean = 0
        self.english = 0
        self.math = 0
    def GetSum(self):
        return self.korean+self.english+self.math
    def GetAverage(self):
        return self.GetSum()/3

#사용하는 코드
stu = Student(&quot;홍길동&quot;,12)
print(&quot;이름:{0} 번호:{1}&quot;.format(stu.name,stu.num))
stu.korean = 99
stu.english = 80
stu.math = 85
print(&quot;합계:{0} 평균:{1}&quot;.format(stu.GetSum(),stu.GetAverage()))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>생성자</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>캡슐화</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3526</guid>
      <comments>https://ehclub.co.kr/3526#entry3526comment</comments>
      <pubDate>Thu, 29 Oct 2020 14:28:17 +0900</pubDate>
    </item>
    <item>
      <title>[python] 캡슐화 실습 - 학생 유닛 키우기</title>
      <link>https://ehclub.co.kr/3525</link>
      <description>&lt;p&gt;&lt;b&gt;시나리오&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603941326935&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;학생 유닛 키우기
콘솔 응용 프로그램이다.
메뉴 선택에 따라 기능을 수행한다.
1:생성 2:자습 3:강의시작 4:소등 5:취미 활동 6:파티 7:노래방가기 8:상태 확인

자습(공부하기), 취미 활동(휴식), 노래방 가기는 한 유닛을 선택하여 적용
강의시작, 소등(잠자기), 파티(음료마시기)는 전체 유닛에 적용

다음 내용처럼 학생 데이터를 정의하시오.
이름: 생성 시 전달
지력:100(최소 0, 최대 200)
체력: 100 (최소 0, 최대 200)
스트레스: 0 (최소 0, 최대 100)
연속으로 공부한 횟수: 0 (0,5), 공부를 하면 1 증가, 그 외의 행위를 하면 0으로 리셋, scnt로 부름

공부하다(체력 5소모, 지력: scnt 만큼 증가, 스트레스: 2감소)
강의를 받다.(체력 3소모, 지력: scnt 만큼 증가, 스트레스: scnt 만큼 증가)
잠자다.(체력 10회복, 스트레스: 5감소)
휴식하다.(체력 3회복, 스트레스: 25감소)
음료를 마시다.(체력 5회복, 지력:  10감소 , 스트레스: 2증가)
노래하다.(체력 10 소모, 지력: 5-scnt감소, 스트레스: 5-scnt증가)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;312&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ZhsK/btqL39XN7lJ/dCb6cBqny4VZyZxrRQ8e6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ZhsK/btqL39XN7lJ/dCb6cBqny4VZyZxrRQ8e6K/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ZhsK/btqL39XN7lJ/dCb6cBqny4VZyZxrRQ8e6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ZhsK%2FbtqL39XN7lJ%2FdCb6cBqny4VZyZxrRQ8e6K%2Fimg.png&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;312&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;취미활동, 노래방가기, 소등, 파티 부분은 자습, 강의시작을 구현한 것을 참고하여 직접 작성해 보세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;Student.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603941348224&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student:
    def __init__(self, name):
        self.name = name
        self.iq = 100
        self.hp = 100
        self.stress = 0
        self.scnt = 0
    def Study(self):
        self.SetHp(self.hp-5)
        self.SetIq(self.iq+self.scnt)
        self.SetStress(self.stress-2)
        self.IncreScnt()
    def ListenLecture(self):
        self.SetHp(self.hp-3)
        self.SetIq(self.iq+self.scnt)
        self.SetStress(self.stress+self.scnt)
        self.ResetScnt()
    def Sleep(self):
        self.SetHp(self.hp+10)
        self.SetStress(self.stress-5)
        self.ResetScnt()
    def Relax(self):
        self.SetHp(self.hp+3)
        self.SetStress(self.stress-25)
        self.ResetScnt()
    def Drink(self):
        self.SetHp(self.hp+5)
        self.SetIq(self.iq-10)
        self.SetStress(self.stress+2)
        self.ResetScnt()
    def Sing(self):
        self.SetHp(self.hp-10)
        self.SetIq(self.iq -(5-self.scnt))
        self.SetStress(self.stress+(5-self.scnt))
        self.ResetScnt()
    def IncreScnt(self):
        if self.scnt&amp;lt;5:
            self.scnt+=1
    def ResetScnt(self):
        self.scnt=0
    def SetStress(self,value):
        if value&amp;lt;0:
            value = 0
        if value&amp;gt;100:
            value = 100
        self.stress = value
    def SetIq(self,value):
        if value&amp;lt;0:
            value = 0
        if value&amp;gt;200:
            value = 200
        self.iq = value
    def SetHp(self,value):
        if value&amp;lt;0:
            value = 0
        if value&amp;gt;200:
            value = 200
        self.hp = value
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;Application.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603941364991&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import Student
class Application:
    def __init__(self):
        print(&quot;학생 유닛 키우기...&quot;)
        input(&quot;엔터 키를 누르면 시작합니다.&quot;)
        self.stucol = list()
    def Run(self):        
        while True:
            key = self.SelectMenu()
            if key =='0':
                break
            elif key == '1':
                self.MakeUnit()
            elif key == '2':
                self.SelfStudy()
            elif key == '3':
                self.StartLecture()
            elif key == '4':
                self.TurnOff()
            elif key == '5':
                self.DoFavorite()
            elif key == '6':
                self.GoParty()
            elif key == '7':
                self.GoNoraebang()
            elif key == '8':
                self.ViewStates()
            else:
                print(&quot;잘못 선택하였습니다.&quot;)
            input(&quot;엔터 키를 누르세요.&quot;)
    def SelectMenu(self):
        os.system(&quot;cls&quot;)
        print(&quot;1:유닛 생성&quot;)
        print(&quot;2:자습&quot;)
        print(&quot;3:강의 시작&quot;)
        print(&quot;4:소등&quot;)
        print(&quot;5:취미 활동&quot;)
        print(&quot;6:파티&quot;)
        print(&quot;7:노래방 가기&quot;)
        print(&quot;8:상태 보기&quot;)
        return input(&quot;메뉴 선택:&quot;)
    def MakeUnit(self):
        print(&quot;유닛 생성&quot;)
        name = input(&quot;이름:&quot;)
        stu = Student.Student(name)
        self.stucol.append(stu)
    def SelfStudy(self):
        print(&quot;자습&quot;)
        stu = self.SelectStudent(&quot;자습할 학생:&quot;)
        if stu == None:
            print(&quot;없는 학생입니다.&quot;)
            return
        print(&quot;{0} 공부한다.&quot;.format(stu.name))
        stu.Study()
    def SelectStudent(self,msg):
        name = input(msg)
        for stu in self.stucol:
            if stu.name == name:
                return stu
        return None
    def StartLecture(self):
        print(&quot;강의 시작&quot;)
        for stu in self.stucol:
            print(&quot;{0}...&quot;.format(stu.name))
            stu.ListenLecture()
    def TurnOff(self):
        print(&quot;소등&quot;)
    def DoFavorite(self):
        print(&quot;취미 활동&quot;)
    def GoParty(self):
        print(&quot;파티&quot;)
    def GoNoraebang(self):
        print(&quot;노래방 가기&quot;)
    def ViewStates(self):
        print(&quot;상태 보기&quot;)
        for stu in self.stucol:
            self.ViewStudent(stu)
    def ViewStudent(self,stu):
        print(&quot;{0}:{1},{2},{3}&quot;.format(stu.name,stu.iq,stu.hp,stu.stress))
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;main.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603941384486&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Application
def main():
    app = Application.Application()
    app.Run()


if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>유닛 키우기</category>
      <category>캡슐화</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3525</guid>
      <comments>https://ehclub.co.kr/3525#entry3525comment</comments>
      <pubDate>Thu, 29 Oct 2020 12:18:06 +0900</pubDate>
    </item>
    <item>
      <title>[python] 도서 관리 프로그램 - 클래스 및 파일 입출력 포함</title>
      <link>https://ehclub.co.kr/3524</link>
      <description>&lt;p&gt;시나리오&lt;/p&gt;
&lt;pre id=&quot;code_1603867641002&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;도서 관리 프로그램은 콘솔 응용 프로그램이다. 
응용에서는 사용자와 상호작용을 담당한다. 
응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다. 
메뉴에는 장르 추가, 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다. 
장르 추가를 선택하면 추가할 장르 명을 입력받아 추가한다. 
도서 추가를 선택하면 장르를 선택하고 도서 정보를 입력받아 추가한다. 
도서는 ISBN(주요키), 도서명, 저자, 출판사, 가격 정보를 사용자로부터 입력받는다. 
도서 삭제 기능에서는 도서의 ISBN을 사용자로부터 입력받아 삭제한다. 
도서 검색 기능에서는 도서의 ISBN을 사용자로부터 입력받아 검색한다. 
전체 보기에서는 전체 도서 정보를 출력한다. 

프로그램 종료할 때 데이터를 파일에 저장하고 프로그램 시작할 때 로딩한다.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;93&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAq0x0/btqLWJlTyZJ/ZfA6xXAwT7NsTKlFAJKaG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAq0x0/btqLWJlTyZJ/ZfA6xXAwT7NsTKlFAJKaG1/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAq0x0/btqLWJlTyZJ/ZfA6xXAwT7NsTKlFAJKaG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAq0x0%2FbtqLWJlTyZJ%2FZfA6xXAwT7NsTKlFAJKaG1%2Fimg.png&quot; data-filename=&quot;클래스 다이어그램.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;93&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;common.py&lt;/p&gt;
&lt;pre id=&quot;code_1603867671561&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#common.py - 공통적으로 사용할 만한 기능

def input_int(msg=''):
    try:
        ns = input(msg)
        return int(ns)
    except:
        return 0
def tryinput_int(msg=''):
    try:
        ns = input(msg)
        return int(ns),True
    except:
        return 0,False&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Book.py&lt;/p&gt;
&lt;pre id=&quot;code_1603867690369&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Book:
    def __init__(self,isbn,title,gn,author,publisher,price):
        self.isbn = isbn
        self.title = title
        self.gn = gn
        self.author = author
        self.publisher = publisher
        self.price = price
    def Write(self,fs):
        fs.write(self.isbn+&quot;,&quot;)
        fs.write(self.title+&quot;,&quot;)
        fs.write(str(self.gn)+&quot;,&quot;)
        fs.write(self.author+&quot;,&quot;)
        fs.write(self.publisher+&quot;,&quot;)
        fs.write(str(self.price)+&quot;\n&quot;)
    @staticmethod
    def LoadBook(fs):
        data = fs.readline()
        elems = data.split(&quot;,&quot;)
        if len(elems)&amp;lt;6:
            return None
        isbn = elems[0]
        title = elems[1]
        gn = int(elems[2])
        author = elems[3]
        publisher = elems[4]
        price = int(elems[5][:-1])
        return Book(isbn,title,gn,author,publisher,price)

&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Applicataion.py&lt;/p&gt;
&lt;pre id=&quot;code_1603867711217&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
from Book import Book
from common import input_int
from common import tryinput_int
class Application:
    def __init__(self):
        self.genres= list()
        self.books = list()
    def Run(self):
        self.Load()
        while True:
            key = self.SelectMenu()
            if key == '0':
                break
            elif key ==  '1':
                self.AddGenre()
            elif key =='2':
                self.AddBook()
            elif key == '3':
                self.RemoveBook()
            elif key == '4':
                self.FindBook()
            elif key =='5':
                self.ViewAll()
            else:
                print(&quot;잘못 선택하였습니다.&quot;)
            input(&quot;엔터 키를 누르세요.&quot;)
        self.Save()
    def Load(self):
        print(&quot;===Load===&quot;)
        try:
            self.LoadGenres()
            self.LoadBooks()
        except:
            print(&quot;환영합니다. 즐~&quot;)
        input(&quot;엔터 키를 누르세요.&quot;)
    def LoadGenres(self):
        fs = open(&quot;genres.csv&quot;,&quot;r&quot;)
        datas = fs.read()
        #datas:[&quot;시\n수필\n소설\n&quot;]
        ds_gs = datas.split(&quot;\n&quot;)#개행 문자를 기준으로 분리
        #dg_gs:[&quot;시&quot;,&quot;수필&quot;,&quot;소설&quot;,&quot;&quot;]
        fs.close()
        ds_gs.pop()#맨 마지막 원소 삭제
        #ds_gs:[&quot;시&quot;,&quot;수필&quot;,&quot;소설&quot;]
        self.genres.extend(ds_gs)
    def LoadBooks(self):
        fs = open(&quot;books.csv&quot;,&quot;r&quot;)
        while True:
            book = Book.LoadBook(fs)
            if book == None:
                break
            self.books.append(book)
        fs.close()
    def Save(self):
        print(&quot;===Save===&quot;)
        self.SaveGenres()
        self.SaveBooks()
    def SaveGenres(self):
        fs = open(&quot;genres.csv&quot;,&quot;w&quot;)
        for genre in self.genres:
            fs.write(genre+&quot;\n&quot;)
        fs.close()
    def SaveBooks(self):
        fs = open(&quot;books.csv&quot;,&quot;w&quot;)
        for book in self.books:
            book.Write(fs)
        fs.close()
    def SelectMenu(self):
        os.system(&quot;cls&quot;)
        print(&quot;==  도서 관리 프로그램 ==&quot;)
        print(&quot;1:장르 추가&quot;)
        print(&quot;2:도서 추가&quot;)
        print(&quot;3:도서 삭제&quot;)
        print(&quot;4:도서 검색&quot;)
        print(&quot;5:전체 보기&quot;)
        return input(&quot;\n메뉴 입력 ◀:&quot;)
    def AddGenre(self):
        print(&quot;===장르 추가===&quot;)
        self.ViewGenres()
        genre = input(&quot;추가할 장르 명:&quot;)
        self.genres.append(genre)
    def ViewGenres(self):
        sz = len(self.genres)
        for i in range(0,sz):
            print(&quot;{0}:{1}&quot;.format(i+1, self.genres[i]),end='  ')
        print()
    def AddBook(self):
        print(&quot;===도서 추가===&quot;)
        gn = self.SelectGenre()#장르를 선택한다.
        if gn == 0:#잘못 선택하였을 때
            print(&quot;잘못 선택하였습니다.&quot;)
            return
        isbn = input(&quot;ISBN:&quot;)#ISBN을 입력받는다.
        sbook = self.Find(isbn)#ISBN으로 도서를 검색한다.
        if sbook != None:#검색한 도서가 존재하면
            print(&quot;이미 존재하는 ISBN입니다.&quot;)
            return
        book = self.MakeBook(isbn,gn)#도서 개체를 만든다.
        self.books.append(book)#도서 컬렉션에 추가한다.
    def SelectGenre(self):
        self.ViewGenres()
        gn = input_int(&quot;선택할 장르 번호:&quot;)
        if gn&amp;gt;0 and gn&amp;lt;=len(self.genres):
            return gn
        return 0
    def Find(self,isbn):
        for book in self.books:
            if book.isbn == isbn:
                return book
        return None
    def MakeBook(self,isbn,gn):
        title = input(&quot;제목:&quot;)
        author = input(&quot;저자:&quot;)
        publisher = input(&quot;출판사:&quot;)
        price = input_int(&quot;가격:&quot;)
        return Book(isbn,title,gn,author,publisher,price)
    def RemoveBook(self):
        print(&quot;===도서 삭제===&quot;)
        isbn = input(&quot;isbn:&quot;)
        book =self.Find(isbn)
        if book == None:
            print(&quot;존재하지 않는 도서입니다.&quot;)
            return
        self.books.remove(book)
        del book #메모리에서 제거
        print(&quot;삭제하였습니다.&quot;)
    def FindBook(self):
        print(&quot;===도서 검색===&quot;)
        isbn = input(&quot;isbn:&quot;)
        book =self.Find(isbn)
        if book == None:
            print(&quot;존재하지 않는 도서입니다.&quot;)
            return
        self.ViewBook(book)
    def ViewAll(self):
        print(&quot;===전체 보기===&quot;)
        self.ViewGenres()
        self.ViewBooks()
    def ViewBooks(self):
        print(&quot;===도서 목록:{0}권&quot;.format(len(self.books)))
        for book in self.books:
            self.ViewBook(book)
    def ViewBook(self,book):
        print(&quot;{0}:{1}&quot;.format(book.isbn,book.title))
        print(&quot;\t장르 번호:&quot;,book.gn)
        print(&quot;\t저자:&quot;,book.author)
        print(&quot;\t출판사:&quot;,book.publisher)
        print(&quot;\t가격:&quot;,book.price)
        
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;main.py&lt;/p&gt;
&lt;pre id=&quot;code_1603867731167&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Application
def main():
    app = Application.Application()
    app.Run()
if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;기술 포트폴리오 예&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bB6Vti/btqLW7GQ02Y/r0cchmu4mIDDoHnAqR7pk1/%5B%EA%B8%B0%EC%88%A0%20%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4%5D%EB%8F%84%EC%84%9C%20%EA%B4%80%EB%A6%AC%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%20%EC%BA%A1%EC%8A%90%ED%99%94%2C%20%ED%8C%8C%EC%9D%BC%20%EC%9E%85%EC%B6%9C%EB%A0%A5.docx?attach=1&amp;amp;knm=tfile.docx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;[기술 포트폴리오]도서 관리 프로그램- 캡슐화, 파일 입출력.docx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.19MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>도서 관리 프로그램</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>캡슐화</category>
      <category>클래스</category>
      <category>파일 입출력</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3524</guid>
      <comments>https://ehclub.co.kr/3524#entry3524comment</comments>
      <pubDate>Wed, 28 Oct 2020 15:49:17 +0900</pubDate>
    </item>
    <item>
      <title>[python] 도서 관리 프로그램 - 파일 입출력 포함</title>
      <link>https://ehclub.co.kr/3523</link>
      <description>&lt;p&gt;시나리오&lt;/p&gt;
&lt;pre id=&quot;code_1603786702579&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;도서 관리 프로그램은 콘솔 응용 프로그램이다.
응용에서는 사용자와 상호작용을 담당한다.
응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다.
메뉴에는 장르 추가, 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다.
장르 추가를 선택하면 추가할 장르 명을 입력받아 추가한다.
도서 추가를 선택하면 장르를 선택하고 도서 정보를 입력받아 추가한다.
도서는 ISBN(주요키), 도서명, 저자, 출판사, 가격 정보를 사용자로부터 입력받는다.
도서 삭제 기능에서는 도서의 ISBN을 사용자로부터 입력받아 삭제한다.
도서 검색 기능에서는 도서의 ISBN을 사용자로부터 입력받아 검색한다.
전체 보기에서는 전체 도서 정보를 출력한다.

프로그램 종료할 때 데이터를 파일에 저장하고 프로그램 시작할 때 로딩한다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Fun.py&lt;/p&gt;
&lt;pre id=&quot;code_1603786745358&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

def SelectMenu():
    os.system('cls')
    print(&quot;도서 관리 프로그램 v0.1.0&quot;)
    print(&quot;1:장르 추가&quot;)
    print(&quot;2:도서 추가&quot;)
    print(&quot;3:도서 삭제&quot;)
    print(&quot;4:도서 검색&quot;)
    print(&quot;5:전체 보기&quot;)
    print(&quot;0:종료&quot;)
    return input(&quot;메뉴 선택 ☞: &quot;)
def ViewGenres(genres):
   print(&quot;◎◎◎ 장르 목록:({0}개)&quot;.format(len(genres)))
   for i in range(0,len(genres)):
       print(&quot;{0}:{1}&quot;.format(i+1,genres[i]),end='    ')
   print()
   print()
def ViewBook(book):
    print(&quot;{0}번 {1}도서 정보&quot;.format(book[0], book[1]))
    print(&quot;▷ 장르:{0} 저자:{1} 출판사:{2} 가격:{3}&quot;.format(book[2],book[3],book[4],book[5]))
    print(&quot;=============================&quot;)
def ViewBooks(books):
    print(&quot;☆☆☆ 도서 목록:({0}개)&quot;.format(len(books)))
    for book in books:
        ViewBook(book)


def AddGenre(genres):
    print(&quot;=========장르 추가==================&quot;)
    ViewGenres(genres)
    genre = input(&quot;추가할 장르 명:&quot;)
    genres.append(genre)
def Find(books,isbn):
    for i in range(0,len(books)):
        book = books[i]
        if book[0] == isbn:
            return i
    return -1
def AddBook(genres,books):
    print(&quot;=========도서 추가==================&quot;)
    ViewGenres(genres)
    gn = int(input(&quot;장르 번호&quot;))
    if gn&amp;lt;=0 or gn&amp;gt;len(genres):
        print(&quot;잘못 선택하였습니다.&quot;)
        return
    isbn = input(&quot;ISBN:&quot;)
    bi = Find(books,isbn)
    if bi != -1:
        print(&quot;이미 존재하는 ISBN이어서 추가할 수 없습니다.&quot;)
        return
    title = input(&quot;도서명:&quot;)
    author = input(&quot;저자:&quot;)
    publisher = input(&quot;출판사&quot;)
    price = input(&quot;가격:&quot;)
    book =[isbn,title,gn,author,publisher,price]
    books.append(book)

def RemoveBook(books):
    print(&quot;=========도서 삭제==================&quot;)
    isbn = input(&quot;삭제할 도서의 ISBN:&quot;)
    bi = Find(books,isbn)
    if bi == -1:
        print(&quot;존재하지 않는 ISBN입니다.&quot;)
        return
    book = books.pop(bi)
    ViewBook(book)
    print(&quot;삭제하였습니다.&quot;)

def FindBook(books):
    print(&quot;=========도서 검색==================&quot;)
    isbn = input(&quot;검색할 도서의 ISBN:&quot;)
    bi = Find(books,isbn)
    if bi == -1:
        print(&quot;존재하지 않는 ISBN입니다.&quot;)
        return
    book = books[bi]
    ViewBook(book)
    
def ViewAll(genres,books):
    print(&quot;=========전체 보기==================&quot;)
    ViewGenres(genres)
    ViewBooks(books)

def Save(genres,books):
    print(&quot;===============저장==================&quot;)
    gfs = open(&quot;genres.csv&quot;,&quot;w&quot;)
    for genre in genres:
        gfs.write(genre+&quot;\n&quot;)
    gfs.close()

    bfs = open(&quot;books.csv&quot;,'w')
    for book in books:
        b_str=&quot;&quot;   #한 권의 책 정보를 하나의 문자열로 표현하기 위한 변수
        for elem in book:  #책의 각 항목(elem)을
            b_str += str(elem) +&quot;,&quot; #항목을 문자열로 변환 후 &quot;,&quot;를 더하여 b_str에 추가
        b_str = b_str[:-1]+'\n' #마자막 콤마를 제외한 문자열과 개행('\n')을 합산
        bfs.write(b_str) #ISBN,제목, 장르번호,저자,출판사,가격\n&quot; 문자열 저장
    bfs.close()

def Load(genres,books):
    print(&quot;===============로딩==================&quot;)
    try:
        gfs = open(&quot;genres.csv&quot;,&quot;r&quot;)
        datas = gfs.read()
        gfs.close()
        ds_gs = datas.split('\n')
        for genre in ds_gs:
            if(genre==''):
                break
            genres.append(genre)

        bfs = open(&quot;books.csv&quot;,'r')
        bs = bfs.read()
        bfs.close()
        bs_bs = bs.split('\n')
        for bstr in bs_bs:
            bes = bstr.split(',')
            if len(bes)&amp;lt;6:
                break
            isbn,title = bes[0], bes[1]
            gn = int(bes[2])
            author, publisher,price = bes[3],bes[4],bes[5]
            book = [isbn,title,gn,author,publisher,price]
            books.append(book)
    except:
        print(&quot;처음 사용하시는 군요!!!&quot;)
        print(&quot;환영합니다.&quot;)
        return&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;main.py&lt;/p&gt;
&lt;pre id=&quot;code_1603786771155&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from Fun import SelectMenu
from Fun import AddBook
from Fun import AddGenre
from Fun import FindBook
from Fun import RemoveBook
from Fun import ViewAll
from Fun import Save
from Fun import Load

def main():
    genres =list()
    books = list()
    Load(genres,books)
    while True:
        key = SelectMenu()
        if key == '0':
            break
        elif key == '1':
            AddGenre(genres)
        elif key == '2':
            AddBook(genres,books)
        elif key == '3':
            RemoveBook(books)
        elif key == '4':
            FindBook(books)
        elif key == '5':
            ViewAll(genres,books)
        else:
            print(&quot;잘못 선택하였습니다.&quot;)
        print(&quot;엔터를 누르세요.&quot;)
        input()
    Save(genres,books)
    print(&quot;프로그램을 종료합니다.&quot;)
#별도의 진입점 main함수에서 출발하시오.
if __name__ == '__main__':
    main()
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>도서 관리 프로그램</category>
      <category>소스 코드</category>
      <category>파일 입출력</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3523</guid>
      <comments>https://ehclub.co.kr/3523#entry3523comment</comments>
      <pubDate>Tue, 27 Oct 2020 17:20:09 +0900</pubDate>
    </item>
    <item>
      <title>[python] 도서 관리 프로그램 (리스트 사용, 클래스 사용X)</title>
      <link>https://ehclub.co.kr/3522</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시나리오&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1603700384431&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;도서 관리 프로그램은 콘솔 응용 프로그램이다.
응용에서는 사용자와 상호작용을 담당한다.
응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다.
메뉴에는 장르 추가, 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다.
장르 추가를 선택하면 추가할 장르 명을 입력받아 추가한다.
도서 추가를 선택하면 장르를 선택하고 도서 정보를 입력받아 추가한다.
도서는 ISBN(주요키), 도서명, 저자, 출판사, 가격 정보를 사용자로부터 입력받는다.
도서 삭제 기능에서는 도서의 ISBN을 사용자로부터 입력받아 삭제한다.
도서 검색 기능에서는 도서의 ISBN을 사용자로부터 입력받아 검색한다.
전체 보기에서는 전체 도서 정보를 출력한다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로토타이핑 - 메뉴 선택에 의한 흐름 구현&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1603700475431&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

def SelectMenu():
    os.system('cls')
    print(&quot;도서 관리 프로그램 v0.1.0&quot;)
    print(&quot;1:장르 추가&quot;)
    print(&quot;2:도서 추가&quot;)
    print(&quot;3:도서 삭제&quot;)
    print(&quot;4:도서 검색&quot;)
    print(&quot;5:전체 보기&quot;)
    print(&quot;0:종료&quot;)
    return input(&quot;메뉴 선택 ☞: &quot;)



def AddGenre():
    print(&quot;=========장르 추가==================&quot;)

def AddBook():
    print(&quot;=========도서 추가==================&quot;)

def RemoveBook():
    print(&quot;=========도서 삭제==================&quot;)
   
def FindBook():
    print(&quot;=========도서 검색==================&quot;)

    
def ViewAll():
    print(&quot;=========전체 보기==================&quot;)

def main():

    while True:
        key = SelectMenu()
        if key == '0':
            break
        elif key == '1':
            AddGenre()
        elif key == '2':
            AddBook()
        elif key == '3':
            RemoveBook()
        elif key == '4':
            FindBook()
        elif key == '5':
            ViewAll()
        else:
            print(&quot;잘못 선택하였습니다.&quot;)
        print(&quot;엔터를 누르세요.&quot;)
        input()
    print(&quot;프로그램을 종료합니다.&quot;)

if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;구현 코드 - 리스트 사용, 클래스 사용X&lt;/p&gt;
&lt;pre id=&quot;code_1603700521161&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

def SelectMenu():
    os.system('cls')
    print(&quot;도서 관리 프로그램 v0.1.0&quot;)
    print(&quot;1:장르 추가&quot;)
    print(&quot;2:도서 추가&quot;)
    print(&quot;3:도서 삭제&quot;)
    print(&quot;4:도서 검색&quot;)
    print(&quot;5:전체 보기&quot;)
    print(&quot;0:종료&quot;)
    return input(&quot;메뉴 선택 ☞: &quot;)
def ViewGenres(genres):
   print(&quot;◎◎◎ 장르 목록:({0}개)&quot;.format(len(genres)))
   for i in range(0,len(genres)):
       print(&quot;{0}:{1}&quot;.format(i+1,genres[i]),end='    ')
   print()
   print()
def ViewBook(book):
    print(&quot;{0}번 {1}도서 정보&quot;.format(book[0], book[1]))
    print(&quot;▷ 장르:{0} 저자:{1} 출판사:{2} 가격:{3}&quot;.format(book[2],book[3],book[4],book[5]))
    print(&quot;=============================&quot;)
def ViewBooks(books):
    print(&quot;☆☆☆ 도서 목록:({0}개)&quot;.format(len(books)))
    for book in books:
        ViewBook(book)


def AddGenre(genres):
    print(&quot;=========장르 추가==================&quot;)
    ViewGenres(genres)
    genre = input(&quot;추가할 장르 명:&quot;)
    genres.append(genre)
def Find(books,isbn):
    for i in range(0,len(books)):
        book = books[i]
        if book[0] == isbn:
            return i
    return -1
def AddBook(genres,books):
    print(&quot;=========도서 추가==================&quot;)
    ViewGenres(genres)
    gn = int(input(&quot;장르 번호&quot;))
    if gn&amp;lt;=0 or gn&amp;gt;len(genres):
        print(&quot;잘못 선택하였습니다.&quot;)
        return
    isbn = input(&quot;ISBN:&quot;)
    bi = Find(books,isbn)
    if bi != -1:
        print(&quot;이미 존재하는 ISBN이어서 추가할 수 없습니다.&quot;)
        return
    title = input(&quot;도서명:&quot;)
    author = input(&quot;저자:&quot;)
    publisher = input(&quot;출판사&quot;)
    price = input(&quot;가격:&quot;)
    book =[isbn,title,gn,author,publisher,price]
    books.append(book)

def RemoveBook(books):
    print(&quot;=========도서 삭제==================&quot;)
    isbn = input(&quot;삭제할 도서의 ISBN:&quot;)
    bi = Find(books,isbn)
    if bi == -1:
        print(&quot;존재하지 않는 ISBN입니다.&quot;)
        return
    book = books.pop(bi)
    ViewBook(book)
    print(&quot;삭제하였습니다.&quot;)

def FindBook(books):
    print(&quot;=========도서 검색==================&quot;)
    isbn = input(&quot;검색할 도서의 ISBN:&quot;)
    bi = Find(books,isbn)
    if bi == -1:
        print(&quot;존재하지 않는 ISBN입니다.&quot;)
        return
    book = books[bi]
    ViewBook(book)
    
def ViewAll(genres,books):
    print(&quot;=========전체 보기==================&quot;)
    ViewGenres(genres)
    ViewBooks(books)
def main():
    genres =list()
    books = list()
    while True:
        key = SelectMenu()
        if key == '0':
            break
        elif key == '1':
            AddGenre(genres)
        elif key == '2':
            AddBook(genres,books)
        elif key == '3':
            RemoveBook(books)
        elif key == '4':
            FindBook(books)
        elif key == '5':
            ViewAll(genres,books)
        else:
            print(&quot;잘못 선택하였습니다.&quot;)
        print(&quot;엔터를 누르세요.&quot;)
        input()
    print(&quot;프로그램을 종료합니다.&quot;)
#별도의 진입점 main함수에서 출발하시오.
if __name__ == '__main__':
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>도서 관리 프로그램</category>
      <category>리스트</category>
      <category>소스 코드</category>
      <category>파이썬</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3522</guid>
      <comments>https://ehclub.co.kr/3522#entry3522comment</comments>
      <pubDate>Mon, 26 Oct 2020 17:23:08 +0900</pubDate>
    </item>
    <item>
      <title>[python] 함수 실습</title>
      <link>https://ehclub.co.kr/3521</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 제작 과정&lt;/h3&gt;
&lt;p&gt;단계1: 해야 할 일 분석&lt;/p&gt;
&lt;p&gt;&lt;span&gt;단계2&lt;span&gt;: &lt;/span&gt;함수 이름을 결정하시오&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;단계3&lt;span&gt;: &lt;/span&gt;입력 인자 개수를 판단하여 입력 매개 변수를 결정하시오&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;단계4&lt;span&gt;: &lt;/span&gt;무엇을 반환할 것인지 결정하시오&lt;span&gt;.(없을 수도 있습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;단계5&lt;span&gt;: &lt;/span&gt;함수의 논리 코드를 의사 코드로 작성하시오&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;단계6&lt;span&gt;: &lt;/span&gt;함수를 구현하시오&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;단계7&lt;span&gt;: &lt;/span&gt;함수를 호출하여 사용하는 코드를 작성하시오&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;span&gt;실습&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;1. 소수(Prime Number)인지 판별하는 함수를 작성하시오.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603417920456&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용 예===
정수 입력: 3
소수입니다.
정수 입력: 8
합성수입니다.
정수 입력: 7
소수입니다.
정수 입력: 0
프로그램을 종료합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;def IsPrimeNo(num): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(2,num):&amp;nbsp;#반복&amp;nbsp;i&amp;nbsp;in&amp;nbsp;구간(2~num-1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;num%i&amp;nbsp;==0:#조건&amp;nbsp;i가&amp;nbsp;num의&amp;nbsp;약수라면: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False#False&amp;nbsp;반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;True#True&amp;nbsp;반환 &lt;br /&gt;&lt;br /&gt;while&amp;nbsp;True:#반복&amp;nbsp;(무한) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;=&amp;nbsp;int(input(&quot;정수&amp;nbsp;입력:&quot;))#num&amp;nbsp;=&amp;nbsp;정수&amp;nbsp;입력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;num&amp;nbsp;==&amp;nbsp;0:#조건&amp;nbsp;num이&amp;nbsp;0이면: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break#반복문&amp;nbsp;탈출 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;IsPrimeNo(num):#조건&amp;nbsp;num이&amp;nbsp;소수일&amp;nbsp;때 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;소수입니다.&quot;)#소수입니다.&amp;nbsp;출력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:#아닐&amp;nbsp;때 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;합성수입니다.&quot;)#합성수입니다.출력 &lt;br /&gt;print(&quot;프로그램을&amp;nbsp;종료합니다.&quot;)#프로그램을&amp;nbsp;종료합니다.&amp;nbsp;출력&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;2. 특정 범위에 수를 출력하는 함수를 작성하시오.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1603417961978&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용 예===
구간 시작:3
구간 끝:10
3 4 5 6 7 8 9 10&lt;/code&gt;&lt;/pre&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;#2.&amp;nbsp;특정&amp;nbsp;범위에&amp;nbsp;수를&amp;nbsp;출력하는&amp;nbsp;함수를&amp;nbsp;작성하시오. &lt;br /&gt;&lt;br /&gt;#사용&amp;nbsp;예===&amp;nbsp; &lt;br /&gt;##구간&amp;nbsp;시작:3&amp;nbsp; &lt;br /&gt;##구간&amp;nbsp;끝:10&amp;nbsp; &lt;br /&gt;#3&amp;nbsp;4&amp;nbsp;5&amp;nbsp;6&amp;nbsp;7&amp;nbsp;8&amp;nbsp;9&amp;nbsp;10 &lt;br /&gt;&lt;br /&gt;#함수명:&amp;nbsp;PrintRange &lt;br /&gt;#입력&amp;nbsp;인자&amp;nbsp;개수:&amp;nbsp;2 &lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start,&amp;nbsp;end &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;PrintRagne(start,end): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(start,end+1):#반복&amp;nbsp;start&amp;nbsp;~end &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(i,end&amp;nbsp;=&amp;nbsp;'&amp;nbsp;')#출력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print() &lt;br /&gt;&lt;br /&gt;start&amp;nbsp;=&amp;nbsp;int(input(&quot;구간&amp;nbsp;시작:&quot;)) &lt;br /&gt;end&amp;nbsp;=&amp;nbsp;int(input(&quot;구간&amp;nbsp;끝:&quot;)) &lt;br /&gt;PrintRagne(start,end)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;3. 특정 범위에 수를 step 간격으로 출력하는 함수를 작성하시오.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1603418007673&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용 예===
구간 시작:3
구간 끝:40
step: 5
3 8 13 18 23 28 33 38&lt;/code&gt;&lt;/pre&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;#3.&amp;nbsp;특정&amp;nbsp;범위에&amp;nbsp;수를&amp;nbsp;step&amp;nbsp;간격으로&amp;nbsp;출력하는&amp;nbsp;함수를&amp;nbsp;작성하시오. &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;PrintRagne(start,end,step=1): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(start,end+1,step):#반복&amp;nbsp;start&amp;nbsp;~end &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(i,end&amp;nbsp;=&amp;nbsp;'&amp;nbsp;')#출력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print() &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;PrintRagne2(start,end,step=1): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(start&amp;lt;=end):#반복&amp;nbsp;start&amp;nbsp;~end &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(start,end&amp;nbsp;=&amp;nbsp;'&amp;nbsp;')#출력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start+=step &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print() &lt;br /&gt;&lt;br /&gt;start&amp;nbsp;=&amp;nbsp;int(input(&quot;구간&amp;nbsp;시작:&quot;)) &lt;br /&gt;end&amp;nbsp;=&amp;nbsp;int(input(&quot;구간&amp;nbsp;끝:&quot;)) &lt;br /&gt;step&amp;nbsp;=&amp;nbsp;int(input(&quot;step:&quot;)) &lt;br /&gt;&lt;br /&gt;PrintRagne(start,end,step) &lt;br /&gt;PrintRagne2(start,end,step) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#PrintRagne(start,end)&amp;nbsp;3번째&amp;nbsp;인자를&amp;nbsp;전달하지&amp;nbsp;않으면&amp;nbsp;step은&amp;nbsp;1로&amp;nbsp;적용&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span&gt;4. 특정 범위에 소수(Prime Number)의 개수를 구하는 함수를 작성하시오.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1603418051270&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용 예===
구간 시작:3
구간 끝:10
3~10사이의 소수는 2개입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;#4.&amp;nbsp;특정&amp;nbsp;범위에&amp;nbsp;소수(Prime&amp;nbsp;Number)의&amp;nbsp;개수를&amp;nbsp;구하는&amp;nbsp;함수를&amp;nbsp;작성하시오. &lt;br /&gt;def&amp;nbsp;IsPrimeNo(num): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(2,num):&amp;nbsp;#반복&amp;nbsp;i&amp;nbsp;in&amp;nbsp;구간(2~num-1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;num%i&amp;nbsp;==0:#조건&amp;nbsp;i가&amp;nbsp;num의&amp;nbsp;약수라면: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False#False&amp;nbsp;반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;True#True&amp;nbsp;반환 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def&amp;nbsp;GetCountPrimeNo(start,end): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;start#i는&amp;nbsp;start로&amp;nbsp;초기화 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;0#count는&amp;nbsp;0으로&amp;nbsp;초기화 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;i&amp;lt;=end:#반복&amp;nbsp;i가&amp;nbsp;end보다&amp;nbsp;작거나&amp;nbsp;같다면 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;IsPrimeNo(i):#조건&amp;nbsp;i가&amp;nbsp;소수일&amp;nbsp;때 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;+=1#count&amp;nbsp;1&amp;nbsp;증가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i+=1#i를&amp;nbsp;1&amp;nbsp;증가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;count#&amp;nbsp;count&amp;nbsp;반환 &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;GetCountPrimeNo2(start,end): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;0#count는&amp;nbsp;0으로&amp;nbsp;초기화 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(startf,end+1):#반복&amp;nbsp;i는&amp;nbsp;start~&amp;nbsp;end까지 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;IsPrimeNo(i):#조건&amp;nbsp;i가&amp;nbsp;소수일&amp;nbsp;때 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;+=1#count&amp;nbsp;1&amp;nbsp;증가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i+=1#i를&amp;nbsp;1&amp;nbsp;증가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;count#&amp;nbsp;count&amp;nbsp;반환 &lt;br /&gt;&lt;br /&gt;start&amp;nbsp;=&amp;nbsp;int(input(&quot;구간&amp;nbsp;시작:&quot;)) &lt;br /&gt;end&amp;nbsp;=&amp;nbsp;int((input(&quot;구간&amp;nbsp;끝:&quot;))) &lt;br /&gt;cnt&amp;nbsp;=&amp;nbsp;GetCountPrimeNo(start,end) &lt;br /&gt;print(&quot;{0}~{1}사이의&amp;nbsp;소수는&amp;nbsp;{2}개&amp;nbsp;입니다.&quot;.format(start,end,cnt))&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;5. 두 개의 정수의 최대 공약수를 구하는 함수를 작성하시오.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1603418088065&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용 예===
첫번째 정수:24
두번째 정수:36
24와 36의 최대공약수는 12입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;6. 피보나치 수열의 n번째 항의 값을 구하는 함수를 작성하시오.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;F(1)=F(2)=1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;F(n)=F(n-1)+F(n-2), n&amp;gt;=3인 정수&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603418153431&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용 예===
피보나치 수열
항: 3
2
항: 4
3
항: 0
프로그램을 종료합니다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언어 자료구조 알고리즘/프로그래밍 실습</category>
      <category>Python</category>
      <category>소수 판별</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>최대 공약수</category>
      <category>파이썬</category>
      <category>피보나치 수열</category>
      <category>함수</category>
      <category>합계 구하기</category>
      <author>언제나휴일</author>
      <guid isPermaLink="true">https://ehclub.co.kr/3521</guid>
      <comments>https://ehclub.co.kr/3521#entry3521comment</comments>
      <pubDate>Fri, 23 Oct 2020 08:56:17 +0900</pubDate>
    </item>
  </channel>
</rss>