<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DEV.BLOG</title>
    <link>https://zxxhe.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 16 Apr 2026 14:49:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>zxxhe</managingEditor>
    <image>
      <title>DEV.BLOG</title>
      <url>https://tistory1.daumcdn.net/tistory/5448873/attach/091f434799c64793a26c157d0fd0e37a</url>
      <link>https://zxxhe.tistory.com</link>
    </image>
    <item>
      <title>[스파르타코딩클럽] MSA 기반 물류 관리 및 배송 시스템 기획 명세서 정리</title>
      <link>https://zxxhe.tistory.com/22</link>
      <description>&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;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7wiW8/btsLbUMKRBw/vKkuPnR8auKnVYgrS6ynb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7wiW8/btsLbUMKRBw/vKkuPnR8auKnVYgrS6ynb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7wiW8/btsLbUMKRBw/vKkuPnR8auKnVYgrS6ynb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7wiW8%2FbtsLbUMKRBw%2FvKkuPnR8auKnVYgrS6ynb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;새 프로젝트.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스파르타코딩클럽 Spring 단기 심화 2기의 2번째 대규모 AI 시스템 설계 프로젝트는&amp;nbsp;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;물류 관리 및 배송 시스템을 위한 MSA 기반 플랫폼&lt;/span&gt;&lt;/b&gt;&lt;span data-token-index=&quot;0&quot;&gt;입니다. 이에 관련한 21팀 TEAM 낭만의 기획 명세서 정리 블로그입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.  ER 다이어그램&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;낭만HUB (4).png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWAzEc/btsLaAvod4i/2zCBFPLqbq4MIBfeCU6Li0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWAzEc/btsLaAvod4i/2zCBFPLqbq4MIBfeCU6Li0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWAzEc/btsLaAvod4i/2zCBFPLqbq4MIBfeCU6Li0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWAzEc%2FbtsLaAvod4i%2F2zCBFPLqbq4MIBfeCU6Li0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1027&quot; data-filename=&quot;낭만HUB (4).png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[낭만HUB] 시스템은 총 7개의 서비스, 11개의 테이블로 분리되어 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;user-service&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot; 사용자 (User)&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee; color: #212529; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot; 배송담당자 (Shipper)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;hub-service&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot; 허브 (Hub)&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee; color: #212529; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot;&lt;span&gt; 허브이동정보 (Route)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;company-service&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot; 업체 (Company)&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee; color: #212529; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot;&lt;span&gt; 상품 (Product)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;order-service&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot; 주문 (Order)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;delivery-service&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot; 배송 (Delivery)&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee; color: #212529; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot;&lt;span&gt; 배송경로 (Track)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;ai-service&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot;  AI (AI)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;slack-service&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;&lt;span style=&quot;color: #212529; text-align: start;&quot;&gt;&amp;middot; 슬랙메시지 (Slack)&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee; color: #212529; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 테이블 명세서&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ykkAp/btsLbugFlvZ/SBKR8XG1gUMgt9woqy3rTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ykkAp/btsLbugFlvZ/SBKR8XG1gUMgt9woqy3rTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ykkAp/btsLbugFlvZ/SBKR8XG1gUMgt9woqy3rTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FykkAp%2FbtsLbugFlvZ%2FSBKR8XG1gUMgt9woqy3rTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;704&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAlnoZ/btsLanwjRlR/amlrrOyl8gBPS6O1KXoPBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAlnoZ/btsLanwjRlR/amlrrOyl8gBPS6O1KXoPBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAlnoZ/btsLanwjRlR/amlrrOyl8gBPS6O1KXoPBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAlnoZ%2FbtsLanwjRlR%2FamlrrOyl8gBPS6O1KXoPBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;437&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PN1QS/btsLbRQfLBB/KLl2kk3G8V9NxkCCRkTNy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PN1QS/btsLbRQfLBB/KLl2kk3G8V9NxkCCRkTNy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PN1QS/btsLbRQfLBB/KLl2kk3G8V9NxkCCRkTNy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPN1QS%2FbtsLbRQfLBB%2FKLl2kk3G8V9NxkCCRkTNy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;485&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeL89b/btsLaDr9HWD/4b6BfOzKoDpAWFjaxWEfu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeL89b/btsLaDr9HWD/4b6BfOzKoDpAWFjaxWEfu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeL89b/btsLaDr9HWD/4b6BfOzKoDpAWFjaxWEfu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeL89b%2FbtsLaDr9HWD%2F4b6BfOzKoDpAWFjaxWEfu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;730&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TNGNQ/btsLaKLj6Ps/5SGrsJfSe144qZ9q9XRoK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TNGNQ/btsLaKLj6Ps/5SGrsJfSe144qZ9q9XRoK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TNGNQ/btsLaKLj6Ps/5SGrsJfSe144qZ9q9XRoK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTNGNQ%2FbtsLaKLj6Ps%2F5SGrsJfSe144qZ9q9XRoK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;804&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FAoQk/btsLaDlo8Zj/xq27BK2PFDxzQiD3U6qJN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FAoQk/btsLaDlo8Zj/xq27BK2PFDxzQiD3U6qJN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FAoQk/btsLaDlo8Zj/xq27BK2PFDxzQiD3U6qJN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFAoQk%2FbtsLaDlo8Zj%2Fxq27BK2PFDxzQiD3U6qJN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;667&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5Vpg1/btsLal6rccP/N7LxX7Kcv3aFm091cKpQK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5Vpg1/btsLal6rccP/N7LxX7Kcv3aFm091cKpQK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5Vpg1/btsLal6rccP/N7LxX7Kcv3aFm091cKpQK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5Vpg1%2FbtsLal6rccP%2FN7LxX7Kcv3aFm091cKpQK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;689&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJIiE/btsLavVejMq/3B6XOsH554w4mhAHPumnZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJIiE/btsLavVejMq/3B6XOsH554w4mhAHPumnZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJIiE/btsLavVejMq/3B6XOsH554w4mhAHPumnZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJIiE%2FbtsLavVejMq%2F3B6XOsH554w4mhAHPumnZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;384&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 테이블은 해당 공통 컬럼을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 와이어프레임 &amp;amp; DTO 도출&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[TEAM 낭만]은 Figma의 Figjam 기능을 이용하여 빠르게 와이어프레임을 구성했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6PiCQ/btsLaFcbllV/bkUaZbJkK1cHOOeLylruS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6PiCQ/btsLaFcbllV/bkUaZbJkK1cHOOeLylruS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6PiCQ/btsLaFcbllV/bkUaZbJkK1cHOOeLylruS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6PiCQ%2FbtsLaFcbllV%2FbkUaZbJkK1cHOOeLylruS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;683&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVI0RR/btsLaFDf1c5/AKKUXzqfru907tk2fwr101/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVI0RR/btsLaFDf1c5/AKKUXzqfru907tk2fwr101/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVI0RR/btsLaFDf1c5/AKKUXzqfru907tk2fwr101/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVI0RR%2FbtsLaFDf1c5%2FAKKUXzqfru907tk2fwr101%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;846&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ufeKV/btsK9Yp2xbC/CxxyyNmXF90fTWOxYkSUZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ufeKV/btsK9Yp2xbC/CxxyyNmXF90fTWOxYkSUZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ufeKV/btsK9Yp2xbC/CxxyyNmXF90fTWOxYkSUZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FufeKV%2FbtsK9Yp2xbC%2FCxxyyNmXF90fTWOxYkSUZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;648&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xgmtl/btsLaACdZup/HBpJqxFGZj4nlQqZmHJ7V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xgmtl/btsLaACdZup/HBpJqxFGZj4nlQqZmHJ7V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xgmtl/btsLaACdZup/HBpJqxFGZj4nlQqZmHJ7V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXgmtl%2FbtsLaACdZup%2FHBpJqxFGZj4nlQqZmHJ7V1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;867&quot; height=&quot;648&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. API 명세서&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4EEZ9/btsLa1e42vS/7kJJcggZJIKf4IuyTFKWL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4EEZ9/btsLa1e42vS/7kJJcggZJIKf4IuyTFKWL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4EEZ9/btsLa1e42vS/7kJJcggZJIKf4IuyTFKWL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4EEZ9%2FbtsLa1e42vS%2F7kJJcggZJIKf4IuyTFKWL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1361&quot; height=&quot;829&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEwkOG/btsLbcgkkwp/4TgjOBxgtoiZnLOQPXv5u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEwkOG/btsLbcgkkwp/4TgjOBxgtoiZnLOQPXv5u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEwkOG/btsLbcgkkwp/4TgjOBxgtoiZnLOQPXv5u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEwkOG%2FbtsLbcgkkwp%2F4TgjOBxgtoiZnLOQPXv5u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1349&quot; height=&quot;860&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8IcpO/btsLaFQTVQu/RZJfsDeAV9PCyw7NcKDWy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8IcpO/btsLaFQTVQu/RZJfsDeAV9PCyw7NcKDWy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8IcpO/btsLaFQTVQu/RZJfsDeAV9PCyw7NcKDWy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8IcpO%2FbtsLaFQTVQu%2FRZJfsDeAV9PCyw7NcKDWy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1352&quot; height=&quot;328&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbVL0C/btsLaDyLjay/PgktkUWwjeLcElUQRMiapk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbVL0C/btsLaDyLjay/PgktkUWwjeLcElUQRMiapk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbVL0C/btsLaDyLjay/PgktkUWwjeLcElUQRMiapk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbVL0C%2FbtsLaDyLjay%2FPgktkUWwjeLcElUQRMiapk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;518&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7o4vS/btsK9ZvNAQX/uaHKVjZx0W8BS0MVzkDFzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7o4vS/btsK9ZvNAQX/uaHKVjZx0W8BS0MVzkDFzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7o4vS/btsK9ZvNAQX/uaHKVjZx0W8BS0MVzkDFzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7o4vS%2FbtsK9ZvNAQX%2FuaHKVjZx0W8BS0MVzkDFzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;722&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rvoFq/btsLap8QZiz/jJfmYJdXvxyGCLkv2Wgvu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rvoFq/btsLap8QZiz/jJfmYJdXvxyGCLkv2Wgvu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rvoFq/btsLap8QZiz/jJfmYJdXvxyGCLkv2Wgvu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrvoFq%2FbtsLap8QZiz%2FjJfmYJdXvxyGCLkv2Wgvu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1380&quot; height=&quot;714&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsvEru/btsLbTgiZkw/wkTar3J9NrVvGJnxNVQMq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsvEru/btsLbTgiZkw/wkTar3J9NrVvGJnxNVQMq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsvEru/btsLbTgiZkw/wkTar3J9NrVvGJnxNVQMq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsvEru%2FbtsLbTgiZkw%2FwkTar3J9NrVvGJnxNVQMq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;739&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lEMby/btsLblYH6iS/8EZwdqdn6HBfkPQVQigGvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lEMby/btsLblYH6iS/8EZwdqdn6HBfkPQVQigGvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lEMby/btsLblYH6iS/8EZwdqdn6HBfkPQVQigGvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlEMby%2FbtsLblYH6iS%2F8EZwdqdn6HBfkPQVQigGvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;301&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQ0WV/btsLalyDbJn/xFwwy9stMl9XE02vgxnORk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQ0WV/btsLalyDbJn/xFwwy9stMl9XE02vgxnORk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQ0WV/btsLalyDbJn/xFwwy9stMl9XE02vgxnORk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQ0WV%2FbtsLalyDbJn%2FxFwwy9stMl9XE02vgxnORk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1381&quot; height=&quot;809&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQhhzn/btsLbnoFthG/2W2dA3vYcAyCjgzVcwUaIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQhhzn/btsLbnoFthG/2W2dA3vYcAyCjgzVcwUaIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQhhzn/btsLbnoFthG/2W2dA3vYcAyCjgzVcwUaIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQhhzn%2FbtsLbnoFthG%2F2W2dA3vYcAyCjgzVcwUaIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1379&quot; height=&quot;771&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCukO/btsLbPdTF68/3EckyeIIjA2e9k4G2VIMh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCukO/btsLbPdTF68/3EckyeIIjA2e9k4G2VIMh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCukO/btsLbPdTF68/3EckyeIIjA2e9k4G2VIMh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCukO%2FbtsLbPdTF68%2F3EckyeIIjA2e9k4G2VIMh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;755&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;755&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7pKYC/btsLaW5Uedh/cQCEwZkSu63RQe1hsEE4y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7pKYC/btsLaW5Uedh/cQCEwZkSu63RQe1hsEE4y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7pKYC/btsLaW5Uedh/cQCEwZkSu63RQe1hsEE4y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7pKYC%2FbtsLaW5Uedh%2FcQCEwZkSu63RQe1hsEE4y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1375&quot; height=&quot;721&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XiDuT/btsLaH2dw4Q/TUX6Vwus4Wx9bT5tZR0YbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XiDuT/btsLaH2dw4Q/TUX6Vwus4Wx9bT5tZR0YbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XiDuT/btsLaH2dw4Q/TUX6Vwus4Wx9bT5tZR0YbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXiDuT%2FbtsLaH2dw4Q%2FTUX6Vwus4Wx9bT5tZR0YbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1375&quot; height=&quot;731&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw2rGy/btsLbQRp2wl/wivsKL5uIrX6q6RbpXNg80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw2rGy/btsLbQRp2wl/wivsKL5uIrX6q6RbpXNg80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw2rGy/btsLbQRp2wl/wivsKL5uIrX6q6RbpXNg80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw2rGy%2FbtsLbQRp2wl%2FwivsKL5uIrX6q6RbpXNg80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1363&quot; height=&quot;544&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhSPyh/btsLaLp2q7Q/N6OKcU6DueXpS0GKKcvYv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhSPyh/btsLaLp2q7Q/N6OKcU6DueXpS0GKKcvYv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhSPyh/btsLaLp2q7Q/N6OKcU6DueXpS0GKKcvYv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhSPyh%2FbtsLaLp2q7Q%2FN6OKcU6DueXpS0GKKcvYv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1352&quot; height=&quot;665&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjG5Ld/btsK9UOPYJH/sGiguvvqQ5WUeO9uDjKXk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjG5Ld/btsK9UOPYJH/sGiguvvqQ5WUeO9uDjKXk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjG5Ld/btsK9UOPYJH/sGiguvvqQ5WUeO9uDjKXk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjG5Ld%2FbtsK9UOPYJH%2FsGiguvvqQ5WUeO9uDjKXk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1338&quot; height=&quot;391&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pFi8G/btsK9NhRrMG/XvzZ7OLeTQKt6p5yjqfcak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pFi8G/btsK9NhRrMG/XvzZ7OLeTQKt6p5yjqfcak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pFi8G/btsK9NhRrMG/XvzZ7OLeTQKt6p5yjqfcak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpFi8G%2FbtsK9NhRrMG%2FXvzZ7OLeTQKt6p5yjqfcak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1363&quot; height=&quot;674&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CHWze/btsLbXbHp6c/xtVBONQDfD8kKZKCzulJXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CHWze/btsLbXbHp6c/xtVBONQDfD8kKZKCzulJXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CHWze/btsLbXbHp6c/xtVBONQDfD8kKZKCzulJXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCHWze%2FbtsLbXbHp6c%2FxtVBONQDfD8kKZKCzulJXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1370&quot; height=&quot;791&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QxGKv/btsLaBnFE2P/Ox3zyNHELcnK3iSKKLKBOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QxGKv/btsLaBnFE2P/Ox3zyNHELcnK3iSKKLKBOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QxGKv/btsLaBnFE2P/Ox3zyNHELcnK3iSKKLKBOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQxGKv%2FbtsLaBnFE2P%2FOx3zyNHELcnK3iSKKLKBOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1365&quot; height=&quot;814&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctMM7L/btsLaCAzJSn/COkShOt2gNse0B3xK27Nyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctMM7L/btsLaCAzJSn/COkShOt2gNse0B3xK27Nyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctMM7L/btsLaCAzJSn/COkShOt2gNse0B3xK27Nyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctMM7L%2FbtsLaCAzJSn%2FCOkShOt2gNse0B3xK27Nyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1369&quot; height=&quot;521&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yEenb/btsLaZIMPSt/kDNa0OrCYjo1SZQ43Kvh8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yEenb/btsLaZIMPSt/kDNa0OrCYjo1SZQ43Kvh8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yEenb/btsLaZIMPSt/kDNa0OrCYjo1SZQ43Kvh8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyEenb%2FbtsLaZIMPSt%2FkDNa0OrCYjo1SZQ43Kvh8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1381&quot; height=&quot;301&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btDzHP/btsLbM2XjSJ/rPH7FKjioKtTbunLwLHPKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btDzHP/btsLbM2XjSJ/rPH7FKjioKtTbunLwLHPKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btDzHP/btsLbM2XjSJ/rPH7FKjioKtTbunLwLHPKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtDzHP%2FbtsLbM2XjSJ%2FrPH7FKjioKtTbunLwLHPKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;556&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP0P3F/btsLaJMVJ01/YXukMmkJ0kmyKe9SkrXUf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP0P3F/btsLaJMVJ01/YXukMmkJ0kmyKe9SkrXUf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP0P3F/btsLaJMVJ01/YXukMmkJ0kmyKe9SkrXUf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP0P3F%2FbtsLaJMVJ01%2FYXukMmkJ0kmyKe9SkrXUf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;330&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 인프라 설계서&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;8828&quot; data-origin-height=&quot;4049&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GCm25/btsLbTVmxBV/w6H6O5ILaoINpKv8iKI19k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GCm25/btsLbTVmxBV/w6H6O5ILaoINpKv8iKI19k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GCm25/btsLbTVmxBV/w6H6O5ILaoINpKv8iKI19k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGCm25%2FbtsLbTVmxBV%2Fw6H6O5ILaoINpKv8iKI19k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;8828&quot; height=&quot;4049&quot; data-origin-width=&quot;8828&quot; data-origin-height=&quot;4049&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>⚔️ Boot Camp/SPARTA CODING CLUB</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/22</guid>
      <comments>https://zxxhe.tistory.com/22#entry22comment</comments>
      <pubDate>Mon, 9 Dec 2024 11:39:35 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] Spring Cloud Gateway 가중치 라우팅</title>
      <link>https://zxxhe.tistory.com/21</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;msaThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtMsXE/btsK4e55qs0/ku8ljTXRvMKqPcmKWQndIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtMsXE/btsK4e55qs0/ku8ljTXRvMKqPcmKWQndIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtMsXE/btsK4e55qs0/ku8ljTXRvMKqPcmKWQndIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtMsXE%2FbtsK4e55qs0%2Fku8ljTXRvMKqPcmKWQndIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;msaThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 Spring Cloud를 이용해 MSA 방식의 서버를 구축할 때, 게이트웨이에서 사용자가 지정한 비율로 특정 서비스를 라우팅하는 방법에 대해 정리하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가중치 라우팅(Weighted Routing)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA에서 가중치 라우팅은 트래픽을 여러 마이크로서비스 인스턴스에 지정한 가중치에 따라 분산시키는 기법입니다. 카나리 배포, 블루-그린 배포와 같이 서버의 버전을 나누어야 할 상황에서도 적용될 수 있습니다. 예를 들면, 서비스 A에 70% 서비스 B에 30%의 트래픽을 보내도록 설정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Spring Cloud Gateway&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Cloud Gateway는 Spring Framework 기반의 API Gateway 솔루션입니다. 주요 기능으로 라우팅, 필터, 로드 밸런싱, 보안, 모니터링 및 로깅이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 다뤄볼 기능은 라우팅이며, 그 중에서도 Weight를 적용하여 트래픽을 분산하는 가중치 라우팅을 적용해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서버 설정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XklRn/btsK3kTdtaV/LkDTSU7tPmA4IAnEnMcK91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XklRn/btsK3kTdtaV/LkDTSU7tPmA4IAnEnMcK91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XklRn/btsK3kTdtaV/LkDTSU7tPmA4IAnEnMcK91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXklRn%2FbtsK3kTdtaV%2FLkDTSU7tPmA4IAnEnMcK91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;412&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이에서 [Edit Configurations]에 들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;1350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVNei1/btsK2v9eDGP/4tjM6iQMVzkGQKuMTlgXLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVNei1/btsK2v9eDGP/4tjM6iQMVzkGQKuMTlgXLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVNei1/btsK2v9eDGP/4tjM6iQMVzkGQKuMTlgXLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVNei1%2FbtsK2v9eDGP%2F4tjM6iQMVzkGQKuMTlgXLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2076&quot; height=&quot;1350&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;1350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Product Service Instance를 포트를 다르게 열어서 두개 실행하려고 합니다. [Modify options] 에 들어가 [Add VM options] 체크해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TTQqG/btsK2zXUlbg/bN6HyAJCKJK2k7dSAJJyoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TTQqG/btsK2zXUlbg/bN6HyAJCKJK2k7dSAJJyoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TTQqG/btsK2zXUlbg/bN6HyAJCKJK2k7dSAJJyoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTTQqG%2FbtsK2zXUlbg%2FbN6HyAJCKJK2k7dSAJJyoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2076&quot; height=&quot;1344&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;1344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java 버전과 패키지명 사이에 칸이 생겼을 텐데 저기에 [-Dserver.port={포트번호}] 를 적어줍니다. 그리고 헷갈리지 않게 Application Name에 포트 번호를 추가해줍시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;application.yml (gateway service)&lt;/h4&gt;
&lt;pre id=&quot;code_1733107565274&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server:
  port: 19091

spring:
  main:
    web-application-type: reactive
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: order
          uri: lb://order
          predicates:
            - Path=/orders/**
        - id: product-70               # 라우트의 고유 ID
          uri: http://localhost:19093  # 요청이 전달될 대상 URI
          predicates:                  # 요청이 이 라우트에 매핑될 조건
            - Path=/products/**        # 요청 경로가 /products/** 인 경우
            - Weight=product-group, 7  # 가중치 70%
        - id: product-30
          uri: http://localhost:19094
          predicates:
            - Path=/products/**
            - Weight=product-group, 3  # 가중치 30%
        - id: auth
          uri: lb://auth
          predicates:
            - Path=/auth/**

service:
  jwt:
    secret-key: &quot;&quot;

eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기로 효율적인 서버 실행을 위해 [spring.main.web-application-type: reactive] 으로 설정해줍니다. 그리고 각각 서비스에 맞게 라우팅 설정을 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;product는 가중치 라우팅을 위해&amp;nbsp; predicates에 weight를 추가합니다. 이렇게 설정하면 /products/** 로 들어오는 요청은 product-group에 의해 70%는 19093포트, 30%는 19094 포트로 분산됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ProductController&lt;/h4&gt;
&lt;pre id=&quot;code_1733108772985&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
@RestController
@RequestMapping(&quot;/products&quot;)
public class ProductController {

    @Value(&quot;${server.port}&quot;)
    private String port;

    @GetMapping(&quot;/health-check&quot;)
    public String getHealthCheck() {
        return &quot;Server port: &quot; + port;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇번 포트로 요청이 전송되고 있는 지 확인하기 위한 포트 조회 메소드를 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Test&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfSIZj/btsK2ykteVK/HyrsAU36IW5TE5dHyXO8RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfSIZj/btsK2ykteVK/HyrsAU36IW5TE5dHyXO8RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfSIZj/btsK2ykteVK/HyrsAU36IW5TE5dHyXO8RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfSIZj%2FbtsK2ykteVK%2FHyrsAU36IW5TE5dHyXO8RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;205&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eSskiE/btsK2zXVsae/N75aK24EH1KaNuRIi1Q6E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eSskiE/btsK2zXVsae/N75aK24EH1KaNuRIi1Q6E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eSskiE/btsK2zXVsae/N75aK24EH1KaNuRIi1Q6E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeSskiE%2FbtsK2zXVsae%2FN75aK24EH1KaNuRIi1Q6E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;204&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10번 요청 보냈을 때 19093이 6번 19094가 4번 응답으로 왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 후 계속 요청을 보냈을 때 얼추 7:3 비율로 라우팅되는 모습을 확인할 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해서 Spring Cloud Gateway에서 원하는 비율로 요청이 전달되게 구성해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출처&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733109385027&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring Cloud Gateway&quot; data-og-description=&quot;This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 6, Spring Boot 3 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them &quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory&quot; data-og-url=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c7uQcP/hyXGBnnobr/zyR9KeSekGyUKq2BsFxUy0/img.png?width=443&amp;amp;height=595&amp;amp;face=0_0_443_595&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c7uQcP/hyXGBnnobr/zyR9KeSekGyUKq2BsFxUy0/img.png?width=443&amp;amp;height=595&amp;amp;face=0_0_443_595');&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;Spring Cloud Gateway&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 6, Spring Boot 3 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Web/Back-end</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/21</guid>
      <comments>https://zxxhe.tistory.com/21#entry21comment</comments>
      <pubDate>Mon, 2 Dec 2024 12:16:57 +0900</pubDate>
    </item>
    <item>
      <title>[코드트리 조별과제] BFS 비를 피하기 Python</title>
      <link>https://zxxhe.tistory.com/20</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;algoThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH7hHL/btsIUUDn4rj/xJHzDwAUHkfcD1RkSDUc9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH7hHL/btsIUUDn4rj/xJHzDwAUHkfcD1RkSDUc9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH7hHL/btsIUUDn4rj/xJHzDwAUHkfcD1RkSDUc9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH7hHL%2FbtsIUUDn4rj%2FxJHzDwAUHkfcD1RkSDUc9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;algoThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;%EB%AC%B8%EC%A0%9C-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOqNjx/btsIVGEMx41/HI32V2o1xRcgI0WzAjfmPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOqNjx/btsIVGEMx41/HI32V2o1xRcgI0WzAjfmPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOqNjx/btsIVGEMx41/HI32V2o1xRcgI0WzAjfmPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOqNjx%2FbtsIVGEMx41%2FHI32V2o1xRcgI0WzAjfmPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1054&quot; height=&quot;648&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- n*n 그래프 / h : 사람 수 / m : 비를 피할 수 있는 칸 수&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 0 : 이동 가능한 칸 / 1 : 이동 불가능한 칸 (벽) / 2 : 사람 서있는 칸 / 3 : 비를 피할 수 있는 칸&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 출력값 : 각 칸마다 사람이 없었던 칸이면 0, 사람이 있었던 칸이면 제일 가까운 비를 피할 수 있는 칸까지의 거리 출력&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;%ED%92%80%EC%9D%B4%20%EB%B0%A9%EC%8B%9D-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;풀이 방식&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722954374537&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def bfs(x, y):
    que = deque([(x, y, 0)])
    visited = [[False] * n for _ in range(n)]
    visited[x][y] = True

    while que:
        x, y, dist = que.popleft()
        if graph[x][y] == 3:
            return dist

        for d in range(4):
            nx, ny = x + dx[d], y + dy[d]
            if 0 &amp;lt;= nx &amp;lt; n and 0 &amp;lt;= ny &amp;lt; n and not visited[nx][ny] and graph[nx][ny] != 1:
                que.append((nx, ny, dist+1))
                visited[nx][ny] = True
    
    return -1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;전형적인 bfs 문제이다. 상하좌우 방향으로 한칸씩 전진하면서 비를 피할 수 있는 공간인지 확인한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 비를 피할 수 있는 칸(3)을 만나면 해당 칸까지 이동한 거리를 return한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722956060799&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n, h, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

answer = [[0] * n for _ in range(n)]
people_cnt = 0
for i in range(n):
    for j in range(n):
        if graph[i][j] == 2:
            answer[i][j] = bfs(i, j)
            people_cnt += 1
        
        if people_cnt == h:
            for row in answer:
                print(*row)
            exit(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사람이 서 있는 칸(2)을 만나면 bfs를 시작하고 return 받은 값을&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;새로운 배열 answer의 같은 위치에 저장한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 사람이 서있는 수 만큼 bfs를 진행했다면&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;구한 answer를 출력하고 프로그램을 종료한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;%EC%A0%84%EC%B2%B4%20%EC%BD%94%EB%93%9C%20(Python3%20%2F%20217ms%20%2F%2027MB)-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드 (Python3 / 402ms / 30MB)&lt;/h3&gt;
&lt;pre id=&quot;code_1722955930776&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def bfs(x, y):
    que = deque([(x, y, 0)])
    visited = [[False] * n for _ in range(n)]
    visited[x][y] = True

    while que:
        x, y, dist = que.popleft()
        if graph[x][y] == 3:
            return dist

        for d in range(4):
            nx, ny = x + dx[d], y + dy[d]
            if 0 &amp;lt;= nx &amp;lt; n and 0 &amp;lt;= ny &amp;lt; n and not visited[nx][ny] and graph[nx][ny] != 1:
                que.append((nx, ny, dist+1))
                visited[nx][ny] = True
    
    return -1


n, h, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

answer = [[0] * n for _ in range(n)]
people_cnt = 0
for i in range(n):
    for j in range(n):
        if graph[i][j] == 2:
            answer[i][j] = bfs(i, j)
            people_cnt += 1
        
        if people_cnt == h:
            for row in answer:
                print(*row)
            exit(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;%EB%AC%B8%EC%A0%9C%20%EB%A7%81%ED%81%AC-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;문제 링크&lt;/h3&gt;
&lt;figure id=&quot;og_1722955860415&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코드트리 | 코딩테스트 준비를 위한 알고리즘 정석&quot; data-og-description=&quot;국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.&quot; data-og-host=&quot;www.codetree.ai&quot; data-og-source-url=&quot;https://www.codetree.ai/missions/2/problems/stay-out-of-rain/description&quot; data-og-url=&quot;https://codetree.ai/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyFWKe/hyWKHWGjZy/44G8DNBvZUE9yKNi31VRQk/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/missions/2/problems/stay-out-of-rain/description&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.codetree.ai/missions/2/problems/stay-out-of-rain/description&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyFWKe/hyWKHWGjZy/44G8DNBvZUE9yKNi31VRQk/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508');&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;코드트리 | 코딩테스트 준비를 위한 알고리즘 정석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.codetree.ai&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> ️ Study/Algorithm</category>
      <category>BFS</category>
      <category>비를피하기</category>
      <category>코드트리</category>
      <category>코드트리조별과제</category>
      <category>코딩테스트</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/20</guid>
      <comments>https://zxxhe.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 6 Aug 2024 23:56:42 +0900</pubDate>
    </item>
    <item>
      <title>[코드트리 조별과제] 시뮬레이션 1차원 바람 Python</title>
      <link>https://zxxhe.tistory.com/19</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;algoThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfuajC/btsIHBYpMsV/F4hladNsIanE9VqEI4Yqp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfuajC/btsIHBYpMsV/F4hladNsIanE9VqEI4Yqp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfuajC/btsIHBYpMsV/F4hladNsIanE9VqEI4Yqp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfuajC%2FbtsIHBYpMsV%2FF4hladNsIanE9VqEI4Yqp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;algoThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3bBK9/btsIH2uGBMr/BBFnEwvJk4d6h3UHjUELJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3bBK9/btsIH2uGBMr/BBFnEwvJk4d6h3UHjUELJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3bBK9/btsIH2uGBMr/BBFnEwvJk4d6h3UHjUELJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3bBK9%2FbtsIH2uGBMr%2FBBFnEwvJk4d6h3UHjUELJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;321&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바람이 불어오는 방향과 행의 숫자가 주어지고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 인접한 행의 같은 열에 같은 숫자가 있다면 &lt;b&gt;반대 방향&lt;/b&gt;에서 바람을 불어오게 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(바람이 분다 = 한 칸씩 밀어낸다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 바람의 정보 수만큼 반복해서 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 방식&lt;/h3&gt;
&lt;pre id=&quot;code_1721677090226&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def rotate(row, direction):
    if direction == 'L':
        tmp = graph[row][-1]
        for i in range(m-1, 0, -1):
            graph[row][i] = graph[row][i-1]
        graph[row][0] = tmp
    elif direction == 'R':
        tmp = graph[row][0]
        for i in range(m-1):
            graph[row][i] = graph[row][i+1]
        graph[row][-1] = tmp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 한 칸씩 밀어 내는 함수를 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽에서 불어 오면 오른쪽으로 한 칸씩 밀고, 오른쪽에서 불어 오면 왼쪽으로 한 칸씩 민다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721677220287&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def infection(row, direction):
    if direction == 'U':
        if row - 1 &amp;gt;= 0:
            for i in range(m):
                if graph[row][i] == graph[row-1][i]:
                    return True
    elif direction == 'D':
        if row + 1 &amp;lt; n:
            for i in range(m):
                if graph[row][i] == graph[row+1][i]:
                    return True

    return False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 인접한 행에 같은 숫자가 있는 지 확인한 후 바람 전파를 진행할 것인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 전파 가능하면 True를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721677276837&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n, m, q = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
for _ in range(q):
    r, d = input().split()
    r = int(r) - 1

    rotate(r, d)

    next_d = 'R' if d=='L' else 'L'
    direction = 'U'
    for i in range(r, 0, -1):
        if infection(i, direction):
            rotate(i-1, next_d)
            next_d = 'R' if next_d=='L' else 'L'
        else:
            break

    next_d = 'R' if d=='L' else 'L'
    direction = 'D'
    for i in range(r, n):
        if infection(i, direction):
            rotate(i+1, next_d)
            next_d = 'R' if next_d=='L' else 'L'
        else:
            break

for i in range(n):
    print(*graph[i])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바람이 시작한 행에서 위아래로 전파를 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전파 가능해서 True를 반환받으면 rotate를 진행하고, 바람의 방향을 반대로 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바람 정보 수만큼 진행하고 최종 건물의 상태를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 코드 (Python3 / 217ms / 27MB)&lt;/h3&gt;
&lt;pre id=&quot;code_1721677488301&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def rotate(row, direction):
    if direction == 'L':
        tmp = graph[row][-1]
        for i in range(m-1, 0, -1):
            graph[row][i] = graph[row][i-1]
        graph[row][0] = tmp
    elif direction == 'R':
        tmp = graph[row][0]
        for i in range(m-1):
            graph[row][i] = graph[row][i+1]
        graph[row][-1] = tmp

def infection(row, direction):
    if direction == 'U':
        if row - 1 &amp;gt;= 0:
            for i in range(m):
                if graph[row][i] == graph[row-1][i]:
                    return True
    elif direction == 'D':
        if row + 1 &amp;lt; n:
            for i in range(m):
                if graph[row][i] == graph[row+1][i]:
                    return True

    return False


n, m, q = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
for _ in range(q):
    r, d = input().split()
    r = int(r) - 1

    rotate(r, d)

    next_d = 'R' if d=='L' else 'L'
    direction = 'U'
    for i in range(r, 0, -1):
        if infection(i, direction):
            rotate(i-1, next_d)
            next_d = 'R' if next_d=='L' else 'L'
        else:
            break

    next_d = 'R' if d=='L' else 'L'
    direction = 'D'
    for i in range(r, n):
        if infection(i, direction):
            rotate(i+1, next_d)
            next_d = 'R' if next_d=='L' else 'L'
        else:
            break

for i in range(n):
    print(*graph[i])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/missions/2/problems/The-1D-wind-blows/description&quot;&gt;https://www.codetree.ai/missions/2/problems/The-1D-wind-blows/description&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721677417390&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코드트리 | 코딩테스트 준비를 위한 알고리즘 정석&quot; data-og-description=&quot;국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.&quot; data-og-host=&quot;www.codetree.ai&quot; data-og-source-url=&quot;https://www.codetree.ai/missions/2/problems/The-1D-wind-blows/description&quot; data-og-url=&quot;https://codetree.ai/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfmN2l/hyWCNwcbNz/Vrenb3EGjHsG6OcJV9xwdK/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508,https://scrap.kakaocdn.net/dn/xwTpc/hyWCHJyaTo/CDBgkSCbOostvWIdnwu6q1/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/missions/2/problems/The-1D-wind-blows/description&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.codetree.ai/missions/2/problems/The-1D-wind-blows/description&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfmN2l/hyWCNwcbNz/Vrenb3EGjHsG6OcJV9xwdK/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508,https://scrap.kakaocdn.net/dn/xwTpc/hyWCHJyaTo/CDBgkSCbOostvWIdnwu6q1/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508');&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;코드트리 | 코딩테스트 준비를 위한 알고리즘 정석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.codetree.ai&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> ️ Study/Algorithm</category>
      <category>코드트리</category>
      <category>코드트리조별과제</category>
      <category>코딩테스트</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/19</guid>
      <comments>https://zxxhe.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 23 Jul 2024 04:45:06 +0900</pubDate>
    </item>
    <item>
      <title>[Git] Repository 초기 세팅 + 파일 업로드</title>
      <link>https://zxxhe.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;etcThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8t2Sd/btsCN55mKUy/dK8mQkqKy1DKFGQSpCJzXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8t2Sd/btsCN55mKUy/dK8mQkqKy1DKFGQSpCJzXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8t2Sd/btsCN55mKUy/dK8mQkqKy1DKFGQSpCJzXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8t2Sd%2FbtsCN55mKUy%2FdK8mQkqKy1DKFGQSpCJzXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;etcThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;GitHub Repository 생성 후 첫 파일 업로드 방법&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;협업하거나 개인적으로 리포지토리를 생성해서 첫 파일 업로드할 때 매 번 하는 방법을 까먹어서 내가 잊지 않기 위해 쓰는 글이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. git 로컬 repository 선언&lt;/p&gt;
&lt;pre id=&quot;code_1704080877960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 업로드할 파일 staging area에 추가 (.은 현재 모든 변경 내용을 올린다는 뜻)&lt;/p&gt;
&lt;pre id=&quot;code_1704080894877&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. staging area에 있는 변경 내용을 커밋으로 남기기&lt;/p&gt;
&lt;pre id=&quot;code_1704081107171&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git commit -m &quot;message&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 현재 branch를 main이라고 명시하기&lt;/p&gt;
&lt;pre id=&quot;code_1704081119039&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch -m main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 내 로컬 repository와 원격 repository 연결&lt;/p&gt;
&lt;pre id=&quot;code_1704081159297&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote add origin [repositorylink.git]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 현재 커밋을 원격 repository에 올리기&lt;/p&gt;
&lt;pre id=&quot;code_1704081176037&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push -u origin main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 현재 로컬 repository 상태 확인 - 수시로 해주기&lt;/p&gt;
&lt;pre id=&quot;code_1704081355192&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Etc.</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/18</guid>
      <comments>https://zxxhe.tistory.com/18#entry18comment</comments>
      <pubDate>Mon, 1 Jan 2024 13:01:01 +0900</pubDate>
    </item>
    <item>
      <title>[SSAFY] 1학기 수료, 5개월 간의 여정 회고</title>
      <link>https://zxxhe.tistory.com/17</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssafyThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brr3JT/btsBo6dvM0O/0aakWQiKFRBBdLVhlCk9Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brr3JT/btsBo6dvM0O/0aakWQiKFRBBdLVhlCk9Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brr3JT/btsBo6dvM0O/0aakWQiKFRBBdLVhlCk9Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrr3JT%2FbtsBo6dvM0O%2F0aakWQiKFRBBdLVhlCk9Ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;ssafyThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  무엇을 했고 무엇을 배웠나?&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7월&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;스타트캠프&lt;/b&gt; : 오리엔테이션 겸 예비반 사람들과 아이디어톤을 진행하는 시간을 가졌다. 그 외에도 디자인싱킹, 미니자동차 움직이는 알고리즘 만들기, 메타버스에서 코딩하기 등등 신기한 경험도 했다,, 아이디어로 기획하는 건 앱스쿨에서 많이 해봤기 때문에 익숙했고 또 잘 맞는 팀원들을 만나서 재밌게 할 수 있었다! 딱 5일 정도 만났는데 한 학기 내내 반갑게 인사하고 만나서 노는 사이가 되었다 (^^)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Java 기본&lt;/b&gt; : 학부시절에 자바 수업을 듣긴 했지만 정말 훑은 수준이라서 아예 쌩초보 수준이었던 나... 첫 날부터 강사님의 심도 깊은 강의가 아주 인상 깊었다. 자바의 역사부터 객체지향까지..! 이 때는 웹이나 자바에 대한 지식이 전혀 없어서 JVM이나 Servlet, JDK, JSP 이런 것도 처음 듣고 귀에 하나도 안 들어왔었는데 지금 필기했던 것들을 보니 이해되는 내가 신기하다. 나는 Python이나 Swift를 주로 다뤘었기 때문에 새로운 언어를 또 배우면서 자연스럽게 공통점과 차이점을 찾게 되었다. 아무래도 Swift와 가장 비슷한 점은 둘 다 객체지향적으로 프로그래밍한다는 점? 처음에 socket을 이용해서 채팅 만드는 것을 배울 때 그냥 언어만 다르지 Swift로 하는 느낌이었다. 그래서 처음엔 되게 &lt;s&gt;구닥다리 언어&lt;/s&gt;라고 선입견 가졌는데 막상 해보니 또 Java가 안정적이며 견고했고, J ava의 전체적인 그림을 같이 배우니까 왜 객체지향과 분석 설계가 중요한 지도 점점 깨닫게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8월&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;알고리즘&lt;/b&gt; : 정말 한 달 동안 알고리즘만 주.구.장.창 했다. 나는 싸피 들어오기 전에 약 150 문제 정도 풀어본 상태였고 백준 레벨은 아마 골드4였다. 나도 나름 꽤 공부하고 들어갔다고 생각했는데 우리 반에는 백준 플래티넘 레벨인 친구들도 있었다. 아무래도 코딩테스트를 치고 들어왔다 보니 잘하는 친구들이 꽤 많았다. 문제를 풀면서 친구들보다 너무 뒤처지는 속도에 가끔은 자괴감도 들었지만.. 오히려 잘하는 친구들의 풀이를 듣고 내 풀이와 비교해 보거나, 내 풀이의 부족한 부분에 대한 힌트를 얻어서 끝까지 내 힘으로 풀 수 있었어서 굉장히 좋았고 얻어가는 것이 많았다! 결과적으로 백준 레벨은 골드2까지 올랐고 새로운 알고리즘도 많이 접해보면서 나의 취약점을 알게 되었고 풀이를 설명해 보면서 논리적으로 말하는 연습도 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9월&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Frontend&lt;/b&gt; : 기초적인 프론트 수업도 들었다. html, css, javascript 문법과 bootstrap으로 레이아웃 잡고 Ajax로 비동기 통신하는 법까지! 백엔드 개발자가 이런 걸 왜 알아야 해?? 라고 생각할 수도 있지만 배운 것과 안 배운 것은 역시 다르다. 오랜만에 레이아웃 잡고 있으니 iOS가 살짝 그리웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Servlet + JSP&lt;/b&gt; : 본격적으로 웹이라는 것을 만들어 보기 시작했다. 이 때부터 몰랐던 단어나 개념들을 하나씩 맞춰가며 머릿속에 정리를 해나갔던 것 같다. 처음에는 JSP, JRE, JDK, JSTL 뭐 J로 시작하는 건 다 비슷해 보였었는데 지금은 다르다! 아무튼 DB와 서버 연결하는 것부터 Session과 Cookie를 이용해서 간단한 유저 서비스도 구현해 보고 (우리 반은 다 알만한 명대사 &lt;b&gt;&quot;리퀘스트야 너 세션 가져왔니?&quot;&lt;/b&gt;) HTTP 방식으로 Client와 Server가 소통하는 법 또한 구현해보면서 웹..이란 자식을 이해하려고 많이 노력한 시기였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;보안 + 인증 강화&lt;/b&gt; : 추가로 우리반 강사님은 보안을 특히나 중요시 여기며 가르쳐주셨던 분이다. 그래서 모든 과정 중간중간 보안에 대해 알려주셨다. 우리가 개발하는 것들엔 보안적인 허점이 너무나도 많고 보안에는 끝이 없다는 것을 뼈저리게 알게 되었다. 보안은 정말 어려운 것 같다. 완벽할 수 없지만 완벽하려고 노력해야 하는...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10월&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;알고리즘 DB 심화 +&lt;/b&gt;  &lt;b&gt;Spring&lt;/b&gt; : 현업에서 많이 사용되는 Spring Framework를 배웠다. 기억에 남는 건 의존성 주입과 AOP를 이해하느라 반 친구들과 거의 토론을 하다시피 했던 것.. 보다 못한 교수님의 중재까지.. 싸피를 다니면서 제일 좋았던 것 중 하나가 내가 궁금하고 모르는 것을 같이 공유하고 얘기하면서 답을 도출해 나갈 친구들이 있었다는 것이다. 이 모든 것들을 혼자 공부하려고 했으면 과연 빠르게 흡수할 수 있었을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11월&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Vue.js&lt;/b&gt; : Vue.js는 써보니까 진짜 간편했다. 이렇게 짧게 배워서 바로 무언가를 만들 수 있다는 것이 신기했다. 물론 기본적인 html, css, js는 알아야 하지만 Vue.js에서는 컴포넌트로 쪼개기, 바인딩, 라우팅만 알면 어느 정도 원하는 화면 구성을 할 수 있게 되는 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;대망의 최종 관통 프로젝트!&lt;/b&gt; : 1학기 과정을 진행하면서 한 챕터(?)가 끝날 때마다 관통 프로젝트 라는 것을 하는데(Frontend 관통, Spring 관통, ...) 드디어 최종 관통 프로젝트를 하게 된 것이다. 우리 팀은 앞서 배운 것들을 전부 활용하고 새로운 기술 써보는 걸 도전하자라는 목표로 진행했다. DB 모델링부터 화면 구성, 시나리오 작성, 사용할 기술까지 모든 것을 처음부터 정하려니 조금 막막하기도 했다. 그래도 최대한 배운 것들을 활용하기 위해 기록했던 것들을 많이 참고했고 페어(팀원)도 내 의견을 적극 존중해 주어서 수월히 진행되었다. 나는 로그인/회원가입 부분을 집중적으로 맡아서 JWT를 이용해 인증/인가를 구현하기로 했다. 그러다가 이 JWT에 대해서 제대로 고찰하게 되는데,,, 이건 따로 글을 작성할 예정이다. 아무튼 기획-개발-발표까지 모든 과정을 2주 만에 하려니 시간이 정말 부족했고 더 많은 것을 하지 못해서 아쉬웠지만 잠을 줄여가며 할 수 있는 최대한 노력했다고 생각한다. 2주간 고생해 준 페어에게도 또다시 고맙다고 말하고 싶다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3534.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7xVi0/btsBGn5g49I/Wkbf4hNRjR5Ly4Gc37sY5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7xVi0/btsBGn5g49I/Wkbf4hNRjR5Ly4Gc37sY5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7xVi0/btsBGn5g49I/Wkbf4hNRjR5Ly4Gc37sY5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7xVi0%2FbtsBGn5g49I%2FWkbf4hNRjR5Ly4Gc37sY5k%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;IMG_3534.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  스터디 회고&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;알고리즘 스터디&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음부터 스터디할 계획은 없었는데, 알고리즘 문제를 푸는 데 있어서는 강제성이 부여될 필요가 있다고 느껴서 스터디를 구성하게 되었다. 같은 반 친구들, 나까지 4명으로 구성했고, 학기 초라서 조금 서먹했지만 점차 스터디를 진행하면서 친해졌다. 알고리즘 스터디 진행 방식은 처음에는 주2회(화, 토)로 잡아서 화~토 사이에 각자 1문제씩 공지해서 총 &lt;b&gt;4문제를 숙제&lt;/b&gt;로 풀고 토요일에 만나서 문제풀이를 공유하고 코드 리뷰를 진행했다. 문제풀이 공유가 끝나면 같이 1~2문제를 풀었고, 토~화는 좀 시간이 짧아서 화요일에 &lt;b&gt;만나서 2문제&lt;/b&gt; 푸는 것으로 대체했다. 후에 프로젝트 기간이 겹치면서 주 1회 만나고 숙제로 4문제 푸는 형태로 방식을 바꿔서 꾸준히 진행했다. 이렇게 하고 커리큘럼에 있는 문제들까지 푸니 정말 많은 문제들을 풀었구나 싶고 꾸준히 한 것에 대한 보람이 있었다. 그 결과 &lt;b&gt;우수 스터디&lt;/b&gt;로 뽑히기도 했다 !&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6da06252-c291-4b2f-98b2-db37bcc50bc0.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qtemw/btsBySGb39X/pQ7ck4azY0LgjkFzv041U1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qtemw/btsBySGb39X/pQ7ck4azY0LgjkFzv041U1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qtemw/btsBySGb39X/pQ7ck4azY0LgjkFzv041U1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqtemw%2FbtsBySGb39X%2FpQ7ck4azY0LgjkFzv041U1%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;300&quot; height=&quot;518&quot; data-filename=&quot;6da06252-c291-4b2f-98b2-db37bcc50bc0.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CS 스터디&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CS 스터디는 사실 싸피에 있을 때 아니면 할 기회가 없을 것 같다고 느껴서 급조된 스터디다. 알고리즘 스터디 인원에 2명을 추가해서 시험이 있는 월요일을 제외하고 화, 수, 목, 금 아침 8시 10분에 모여서 돌아가면서 한 명이 CS 주제에 대해서 발표를 하고 그 발표에 대한 질의응답과 토론하는 것까지 약 3-40분 정도 진행했다. 주제는 Database, Java, OS, Network를 순서대로 진행했다. 노션에 발표 자료를 만들면서 한 주제에 대해 깊게 공부하는 것도 도움이 됐고, 학부 시절에 네트워크를 안 배워서 지식이 부족했었는데 스터디를 통해 네트워크에 대한 이해가 한 층 늘게 되었다. 급조된 스터디 치고 다들 너무 열심히 참여해 주어서 고마웠고 또 아침마다 모여서 하루를 활기차게 보내는 데도 많은 도움이 되었던 것 같다. 우리 다 좋은 곳 갔으면 좋겠다 ㅎㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfJ5z1/btsBCuR0dTZ/6wMp8GfqAb3ilTH0OxKgdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfJ5z1/btsBCuR0dTZ/6wMp8GfqAb3ilTH0OxKgdk/img.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;927&quot; data-is-animation=&quot;false&quot; width=&quot;300&quot; height=&quot;297&quot; style=&quot;width: 49.0967%; margin-right: 10px;&quot; data-widthpercent=&quot;49.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfJ5z1/btsBCuR0dTZ/6wMp8GfqAb3ilTH0OxKgdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfJ5z1%2FbtsBCuR0dTZ%2F6wMp8GfqAb3ilTH0OxKgdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OQtbk/btsBGm6bxeC/jc2jkLkZwmk3zjqGfd8AV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OQtbk/btsBGm6bxeC/jc2jkLkZwmk3zjqGfd8AV0/img.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;915&quot; data-is-animation=&quot;false&quot; width=&quot;300&quot; height=&quot;294&quot; style=&quot;width: 49.7405%;&quot; data-widthpercent=&quot;50.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OQtbk/btsBGm6bxeC/jc2jkLkZwmk3zjqGfd8AV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOQtbk%2FbtsBGm6bxeC%2Fjc2jkLkZwmk3zjqGfd8AV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  생활 패턴과 습관&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;미라클 모닝&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미라클 모닝이라고 했지만 5개월 내내 그랬던 것은 아니다. 두 달 정도 다녔을 때쯤, 왕복 1시간 40분 정도 통학을 매일 하니 저녁에 집에 오면 너~~무 피곤해서 할 일을 제대로 집중하지 못하고 공부를 좀 얼렁뚱땅하는 느낌이 들기 시작했다. 그래서 차라리 피곤할 때 자버리고 아침에 일찍 일어나서 할 일을 하자고 마음을 먹게 되었다. 보통은 &lt;b&gt;7~8시에 자서 3~4시에 일어나서&lt;/b&gt; 공부, 스터디 준비를 했고 가끔은 너무 일찍 2시에 일어나 버리는 잘못된 미라클 모닝(ㅎ)을 할 때도 있었지만 일찍 일어나서 공부하는 것을 해보니 저녁에 할 때보다 잡생각도 많이 안 들고 집중도가 좋았다. 또 곧 나가야 한다는 압박감에 훨씬 추진력 있게 할 일을 할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_IMG_3384.PNG&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1082&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w3KvV/btsBBnstj5H/NSlAmNCA4Vb6jIzFpU17S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w3KvV/btsBBnstj5H/NSlAmNCA4Vb6jIzFpU17S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w3KvV/btsBBnstj5H/NSlAmNCA4Vb6jIzFpU17S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw3KvV%2FbtsBBnstj5H%2FNSlAmNCA4Vb6jIzFpU17S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;169&quot; height=&quot;366&quot; data-filename=&quot;edited_IMG_3384.PNG&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1082&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;틈틈이 일본어 공부&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12월 JLPT N3를 목표로 짬날 때마다 일본어 공부를 했다. 출퇴근 지하철에서 앱으로 단어 암기 또는 유튜브로 청해 공부를 하고, 쉬는 시간을 활용해서 강의를 듣는다거나 독해 연습을 했다. 또 싸피가 없는 주말을 활용해서 강의를 열심히 듣고 문법 공부도 했다. 시간을 많이 내지 못해서 시험에서 많은 문제를 제대로 풀지는 못했지만 꾸준히 제2외국어를 공부했다는 것에 의의를 두려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;발표를 마다하지 말자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째로 나는 남들 앞에서 말하는 것에 너무 긴장하는 스타일이다. 어릴 때부터 여러 사람들 앞에 서는 것에 자신 없어했고, 최대한 회피하려고 했었던 것 같다. 또 팀플 수업이나 발표활동 같은 것이 있을 때도 &quot;나는 발표를 잘 못하니까&quot;라는 이유로 다른 팀원들에게 발표를 미루던 잘못된 행동들을 했을 때도 있었다. 이렇게 계속 회피하다가는 평생 발표할 때마다 긴장하겠구나 싶었다. 그래서 싸피에 들어오면서 발표 연습할 기회가 있으면 빼지 말고 최대한 참여해보자! 라는 다짐을 하게 되었다. 실제로 수업할 때나 스터디할 때, 프로젝트 발표 등 여러 번의 기회가 주어졌고 매번 긴장을 컨트롤하는 연습을 했고 말을 조리 있게 하는 연습을 했는데 그래도 아직은 많이 부족하다. 2학기 가서도 발표에 대한 연습은 꾸준히 필요할 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_6FD2A901-5B1A-4DAE-979B-6B987529603F-1118-000005260AA6FD85.JPG&quot; data-origin-width=&quot;1817&quot; data-origin-height=&quot;1023&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njIN4/btsBC2nbybm/GtlJWKA70cd8hyOBykIO70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njIN4/btsBC2nbybm/GtlJWKA70cd8hyOBykIO70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njIN4/btsBC2nbybm/GtlJWKA70cd8hyOBykIO70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnjIN4%2FbtsBC2nbybm%2FGtlJWKA70cd8hyOBykIO70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;384&quot; data-filename=&quot;edited_6FD2A901-5B1A-4DAE-979B-6B987529603F-1118-000005260AA6FD85.JPG&quot; data-origin-width=&quot;1817&quot; data-origin-height=&quot;1023&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  2학기 계획&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;취업 활동을 더 열심히 할 것이다. 이력서와 자기소개서, 포트폴리오를 주기적으로 보완하고 원하는 회사의 공고가 떴을 때 바로 지원할 수 있도록 항상 준비 상태로 만들어 놓을 것이다. 2학기 수료 전에 면접까지 가서 1학기 때 못해본 면접 경험을 쌓아보는 것이 목표다.&lt;/li&gt;
&lt;li&gt;알고리즘은 꼭 꾸준히! 안 하면 까먹는 것이 알고리즘이니.. 프로젝트를 하면서도 1일 1문제는 못하더라도 까먹지 않을 수준의 양을 푸는 것을 목표로 하겠다.&lt;/li&gt;
&lt;li&gt;남은 싸피 생활을 후회 없이 하도록 노력할 것이다. 2학기에서도 좋은 친구들 많이 만나고 주어지는 프로젝트도 열심히 할 것이다. 물론 공부도 열심히 해야겠지..! 취뽀하는 그날까지 화이팅 !&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>⚔️ Boot Camp/SSAFY</category>
      <category>SSAFY</category>
      <category>싸피10기</category>
      <category>싸피1학기회고</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/17</guid>
      <comments>https://zxxhe.tistory.com/17#entry17comment</comments>
      <pubDate>Fri, 8 Dec 2023 15:52:09 +0900</pubDate>
    </item>
    <item>
      <title>[Database] 인덱스(index)</title>
      <link>https://zxxhe.tistory.com/16</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dbThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf3DoF/btsys1MQIcn/ufk9IbxykkMITmnf8CfhD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf3DoF/btsys1MQIcn/ufk9IbxykkMITmnf8CfhD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf3DoF/btsys1MQIcn/ufk9IbxykkMITmnf8CfhD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf3DoF%2Fbtsys1MQIcn%2Fufk9IbxykkMITmnf8CfhD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;dbThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인덱스(Index)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에서 테이블의 데이터 조회 시 &lt;b&gt;동작 속도를 높여주는&lt;/b&gt; 자료 구조. &lt;br /&gt;북마크처럼 &lt;b&gt;컬럼의 값&lt;/b&gt;과 &lt;b&gt;레코드가 저장된 주소&lt;/b&gt;를 키와 값의 쌍으로 인덱스를 만들어서 MYI(MySQL Index) 파일에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 인덱스를 볼 수 없으며 단지 검색/쿼리의 속도를 높이는 데만 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Index의 문제점&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요 없는 인덱스를 많이 만들다 보면 배보다 배꼽이 커지는 상황이 발생한다. 전체 테이블에서 찾는 것보다 느려질 수 있음. 따라서 자주 검색할 것만 인덱스를 생성해야 한다.&lt;/li&gt;
&lt;li&gt;데이터베이스의 공간을 차지하므로 추가적인 공간 확보가 필요하다. (DB 크기의 10% 정도 추가 공간 필요)&lt;/li&gt;
&lt;li&gt;처음 index를 생성하는 데 많은 시간이 소요된다.&lt;/li&gt;
&lt;li&gt;데이터 변경 작업이 자주 일어나는 경우 성능 저하가 일어날 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Index의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;클러스터형 인덱스(clustered index)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;특정 나열된 데이터들을 일정 기준으로 정렬해 주는 인덱스&lt;/li&gt;
&lt;li&gt;클러스터형 인덱스 생성 시 데이터 페이지 전체가 다시 정렬됨&lt;/li&gt;
&lt;li&gt;보조 인덱스보다 검색 속도가 빠르며, 입력/수정/삭제는 더 느림&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보조 인덱스(secondary index)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;후보키에만 부여 가능한 인덱스&lt;/li&gt;
&lt;li&gt;보조 인덱스 생성 시 별도의 페이지에 인덱스를 구성하며 자동 정렬되지 않음&lt;/li&gt;
&lt;li&gt;클러스터형 인덱스보다 검색 속도는 느리지만 데이터의 입력/수정/삭제 시 성능 부하가 적음&lt;/li&gt;
&lt;li&gt;테이블 당 여러 개 생성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;제약 조건에 따른 Index 결정&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 테이블에 Primary Key와 Unique Key 둘 다 존재
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;PK 지정 컬럼 : Clustered Index&lt;/li&gt;
&lt;li&gt;UK 지정 컬럼 : Secondary Index (null 허용과 상관 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;특정 테이블에 Primary Key가 존재하지 않고 특정 컬럼에 Unique + not null 제약 조건인 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 컬럼이 Clustered Index&lt;/li&gt;
&lt;li&gt;not null 조건이 없다면 해당 컬럼이 Secondary Index&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Index 생성하기 좋은 Column&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;where절에서 자주 사용되는 열&lt;/li&gt;
&lt;li&gt;데이터 중복도가 낮은 열&lt;/li&gt;
&lt;li&gt;조인에 자주 사용되는 열&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Index  SQL문&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DB에 생성된 인덱스 조회&lt;/h4&gt;
&lt;pre id=&quot;code_1697382212482&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show index from 데이터베이스이름;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인덱스 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1697383103357&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create [unique] index 인덱스이름
on 테이블이름 (열이름) [asc | desc]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;create로 인덱스를 생성하면 자동으로 보조 인덱스가 생성되고 클러스터형 인덱스는 만들 수 없다.&lt;/li&gt;
&lt;li&gt;[] 는 생략 가능&lt;/li&gt;
&lt;li&gt;열이름에는 (a, b, ..) 형태로 복합키로 만들 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인덱스 삭제&lt;/h4&gt;
&lt;pre id=&quot;code_1697383900579&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;drop index 인덱스이름 on 테이블이름;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> ️ Study/Database</category>
      <category>DATABASE</category>
      <category>DB index</category>
      <category>Index</category>
      <category>MySQL</category>
      <category>sql</category>
      <category>데이터베이스</category>
      <category>데이터베이스 인덱스</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/16</guid>
      <comments>https://zxxhe.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 16 Oct 2023 00:36:58 +0900</pubDate>
    </item>
    <item>
      <title>[Servlet] Forward와 Redirect의 차이점 (feat. 보안)</title>
      <link>https://zxxhe.tistory.com/15</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BiIhe/btsxvH1vzqk/TkE7u3agH1D4ruiENrsRN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BiIhe/btsxvH1vzqk/TkE7u3agH1D4ruiENrsRN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BiIhe/btsxvH1vzqk/TkE7u3agH1D4ruiENrsRN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBiIhe%2FbtsxvH1vzqk%2FTkE7u3agH1D4ruiENrsRN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;webThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Forward와 Redirect의 정의와 구현&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Forward&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;:&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;주로 같은 애플리케이션 내의 &lt;b&gt;다른 서블릿 또는 JSP 페이지&lt;/b&gt;로 요청을 전달하는 데 사용되는 기능. &lt;br /&gt;&lt;b&gt;서버 측에서&lt;/b&gt; 처리되며, 클라이언트에게 새로운 요청이 생성되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696868033208&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ForwardServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Forward할 다른 서블릿 또는 JSP 페이지의 경로를 지정합니다.
        String forwardPath = &quot;/destination.jsp&quot;;

        // RequestDispatcher를 얻어와 Forward를 수행합니다.
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(forwardPath);
        dispatcher.forward(request, response);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Redirect&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;주로 &lt;b&gt;다른 도메인&lt;/b&gt;으로 사용자를 보낼 때 또는 외부 웹 페이지로 리디렉션할 때 사용되는 기능.&lt;br /&gt;&lt;b&gt;클라이언트&lt;/b&gt;에게 새로운 요청을 만들도록 지시하며, &lt;b&gt;새로운 URL&lt;/b&gt;로 이동한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696868080736&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class RedirectServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 클라이언트에게 보낼 새로운 URL을 지정합니다.
        String redirectURL = &quot;/newpage.jsp&quot;;

        // response 객체의 sendRedirect 메서드를 사용하여 Redirect를 수행합니다.
        response.sendRedirect(redirectURL);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 보안 측면에서의 차이점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;KISA(한국인터넷진흥원)&lt;/span&gt;의 소프트웨어 개발 보안 가이드에 따르면, 사용자로부터 입력되는 값을 외부사이트의 주소로 사용하여 연결하는 서버 프로그램은 해커가 &lt;b&gt;클라이언트의 request를 변조함으로써 위험한 url로 접속할 수 있도록 공격이 가능&lt;/b&gt;하다고 나와있다. 따라서 &lt;b&gt;Redirect&lt;/b&gt; 방법은 요청 url로 바로 이동이 가능하므로 피싱 공격에 노출되는 취약점을 가질 수 있다. 그래서 안전하게 Redirect 방법을 사용하려면, 외부 도메인 리스트를 따로 작성해 두고 검증해야 하며 위험한 접근이 있을 경우 접근을 차단시켜야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJhbQq/btsxzXC9zVQ/iEkBOUUftEVkbVKKXGV4kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJhbQq/btsxzXC9zVQ/iEkBOUUftEVkbVKKXGV4kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJhbQq/btsxzXC9zVQ/iEkBOUUftEVkbVKKXGV4kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJhbQq%2FbtsxzXC9zVQ%2FiEkBOUUftEVkbVKKXGV4kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;402&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면에 &lt;b&gt;Forward&lt;/b&gt;는 서버 내부에서 요청을 전달하는 것이기 때문에, 클라이언트에게 새로운 url을 노출하지도 않고 클라이언트가 직접 url을 조작할 수도 없다. Forward 방법은 url 조작에 대한 취약점은 없지만 여전히 입력값 검증은 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;출처&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696869103570&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;KISA 한국인터넷진흥원&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.kisa.or.kr&quot; data-og-source-url=&quot;https://www.kisa.or.kr/2060204/form?postSeq=5&amp;amp;lang_type=KO&amp;amp;page=1#fnPostAttachDownload&quot; data-og-url=&quot;https://www.kisa.or.kr/2060204/form?lang_type=KO&amp;amp;page=1&amp;amp;postSeq=5#fnPostAttachDownload&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/obv7Y/hyT9HSj3la/Hp3FieouOiHBMv1VVRRCa0/img.jpg?width=1921&amp;amp;height=343&amp;amp;face=0_0_1921_343&quot;&gt;&lt;a href=&quot;https://www.kisa.or.kr/2060204/form?postSeq=5&amp;amp;lang_type=KO&amp;amp;page=1#fnPostAttachDownload&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kisa.or.kr/2060204/form?postSeq=5&amp;amp;lang_type=KO&amp;amp;page=1#fnPostAttachDownload&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/obv7Y/hyT9HSj3la/Hp3FieouOiHBMv1VVRRCa0/img.jpg?width=1921&amp;amp;height=343&amp;amp;face=0_0_1921_343');&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;KISA 한국인터넷진흥원&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kisa.or.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발보안 가이드 166 - 169p&lt;/p&gt;
&lt;figure id=&quot;og_1696869967114&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Difference Between Forward and Redirect | Difference Between&quot; data-og-description=&quot;Difference Between Forward and Redirect &amp;bull; Categorized under internet,Software,Technology,Web Applications | Difference Between Forward and Redirect There are multiple screens and servlets which together form a Java based web application. A JSP passes the&quot; data-og-host=&quot;www.differencebetween.net&quot; data-og-source-url=&quot;http://www.differencebetween.net/technology/difference-between-forward-and-redirect/&quot; data-og-url=&quot;http://www.differencebetween.net/technology/difference-between-forward-and-redirect/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PtE6L/hyT9G6V3ux/Wdk7MnWd5ph7GdEjOaey81/img.jpg?width=550&amp;amp;height=813&amp;amp;face=0_0_550_813,https://scrap.kakaocdn.net/dn/bnyvhZ/hyT9F1hQf9/BuLjANPNvMS3l68aAkIG70/img.png?width=640&amp;amp;height=586&amp;amp;face=0_0_640_586,https://scrap.kakaocdn.net/dn/fcNRV/hyT9ygRiI4/fYruQcxEvZS5LDM9gnX6Yk/img.png?width=328&amp;amp;height=164&amp;amp;face=0_0_328_164&quot;&gt;&lt;a href=&quot;http://www.differencebetween.net/technology/difference-between-forward-and-redirect/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.differencebetween.net/technology/difference-between-forward-and-redirect/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PtE6L/hyT9G6V3ux/Wdk7MnWd5ph7GdEjOaey81/img.jpg?width=550&amp;amp;height=813&amp;amp;face=0_0_550_813,https://scrap.kakaocdn.net/dn/bnyvhZ/hyT9F1hQf9/BuLjANPNvMS3l68aAkIG70/img.png?width=640&amp;amp;height=586&amp;amp;face=0_0_640_586,https://scrap.kakaocdn.net/dn/fcNRV/hyT9ygRiI4/fYruQcxEvZS5LDM9gnX6Yk/img.png?width=328&amp;amp;height=164&amp;amp;face=0_0_328_164');&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;Difference Between Forward and Redirect | Difference Between&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Difference Between Forward and Redirect &amp;bull; Categorized under internet,Software,Technology,Web Applications | Difference Between Forward and Redirect There are multiple screens and servlets which together form a Java based web application. A JSP passes the&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.differencebetween.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 Forward와 Redirect의 차이점&lt;/p&gt;</description>
      <category>  Web/Back-end</category>
      <category>forward</category>
      <category>forward VS redirect</category>
      <category>java</category>
      <category>JSP</category>
      <category>Redirect</category>
      <category>servlet</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/15</guid>
      <comments>https://zxxhe.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 10 Oct 2023 01:46:54 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm/DP] 최단 경로 알고리즘 : 플로이드-워셜(Floyd-Warshall)</title>
      <link>https://zxxhe.tistory.com/14</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;algoThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2pbzy/btswPXDqI9C/6xuHJi6tMVO5KsOTU1Rq6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2pbzy/btswPXDqI9C/6xuHJi6tMVO5KsOTU1Rq6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2pbzy/btswPXDqI9C/6xuHJi6tMVO5KsOTU1Rq6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2pbzy%2FbtswPXDqI9C%2F6xuHJi6tMVO5KsOTU1Rq6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;algoThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최단 경로 알고리즘&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최단 경로 알고리즘은 다음과 같이 경우를 나눠서 사용하는 알고리즘이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. &lt;b&gt;단일 출발점&lt;/b&gt;에서 다른 모든 정점까지의 최단 경로를 구하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; a. Dijkstra's Algorithm (다익스트라 알고리즘):&amp;nbsp;간선의 양의 가중치만 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; b.&lt;span&gt; Bellman-Ford Algorithm (벨만-포드 알고리즘):&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;간선의&amp;nbsp;&lt;/span&gt;양, 음의 가중치 모두 허용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; c. BFS : 간선의 가중치가 없는 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 그래프 내의 &lt;b&gt;모든 정점&lt;/b&gt; &lt;b&gt;쌍 간의 최단 경로&lt;/b&gt;를&amp;nbsp;구하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #dcfae4;&quot;&gt;a. &lt;b&gt;Floyd-Warshall (플로이드-워셜 알고리즘)&lt;/b&gt;: 간선의 양, 음의 가중치 모두 허용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; b. Johnson's Algorithm (존슨 알고리즘): 간선의 양, 음의 가중치 모두 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 이번에는 플로이드-워셜 알고리즘에 대해 알아보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;플로이드-워셜(Floyd-Warshall) 알고리즘이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; background-color: #ffffff;&quot;&gt;그래프 내의 모든 정점 쌍 간의 최단 경로를 찾는 데 사용되는 &lt;b&gt;동적 프로그래밍&lt;/b&gt; 알고리즘이다. &lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;플로이드-워셜은 &lt;b&gt;음의 가중치&lt;/b&gt;를 가진 그래프에서도 작동하며, 음의 가중치 사이클을 감지할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #374151; text-align: start; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;플로이드-워셜 알고리즘의 시간복잡도는 O(N^3)으로 다익스트라의 인접행렬버전과 동일하지만, 구현이 매우 간단하여 다익스트라보다 &lt;b&gt;효율적&lt;/b&gt;이다. 구현이 간단하다는 것은 아래에서 확인해보겠다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;DP 접근법&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 한개의 정점부터 시작해서 1~n개까지의 모든 정점을 경유 가능한 정점으로 고려하면서, 모든 쌍의 최단 경로의 거리를 계산한다. 임시최적해를 구하고 현재 값과 비교하여 계속해서 최적해를 구해나가는 방법이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;따라서, 부분 문제는 &lt;span style=&quot;background-color: #dcfae4;&quot;&gt;정점 1~k개를 경유 가능한 정점으로 고려해서 정점 i부터 정점 j까지의 모든 경로 중에서 최단 경로 D[i][j]&lt;/span&gt;를 구하는 것!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;ex) &lt;b&gt;i &amp;rarr; j&lt;/b&gt; / &lt;b&gt;i &lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&amp;rarr; 정점1 &lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&amp;rarr; j&lt;/span&gt;&lt;/span&gt;&lt;/b&gt; / &lt;b&gt;i &lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&lt;b&gt;&amp;rarr; 정점1 &lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&lt;b&gt;&amp;rarr; 정점2 &lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&lt;b&gt;&amp;rarr; j&lt;/b&gt; / &lt;b&gt;.....&lt;/b&gt; / &lt;b&gt;i &lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&amp;rarr;&lt;/span&gt; 정점1 &lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&lt;b&gt;&amp;rarr; ... &lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&lt;b&gt;&amp;rarr; k &lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;&lt;b&gt;&amp;rarr; j&lt;/b&gt; 중에서 최단경로를 구하는 것&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;수행 과정&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;graph2.png&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;1512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdogMF/btswbzKVQlj/Ntf9E6Nzpy1xzLZLUtLmsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdogMF/btswbzKVQlj/Ntf9E6Nzpy1xzLZLUtLmsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdogMF/btswbzKVQlj/Ntf9E6Nzpy1xzLZLUtLmsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdogMF%2FbtswbzKVQlj%2FNtf9E6Nzpy1xzLZLUtLmsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;309&quot; height=&quot;290&quot; data-filename=&quot;graph2.png&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;1512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;k=0&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.7441%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;-2&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;행이 시작점, 열이 도착점인 테이블.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;초기 상태는 정점 i에서 정점 j로 직접 가는 경로가 최단 경로로, 가중치를 바로 저장해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;k=1&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.7441%; height: 91px;&quot; border=&quot;1&quot; data-ke-style=&quot;style4&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;-2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;정점4 &amp;rarr; 정점2로 바로 가는 경로보다 정점1을 거쳐 가는 경로가 더 작기 때문에 갱신&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;k=2&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.7441%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;9&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;-2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;k=3&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.7441%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;-2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;k=4&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.7441%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;INF&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;-2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;k=5&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.7441%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;7&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;6&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-3&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;-2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 (Python)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플로이드 워셜 알고리즘을 쓰는 문제 중 백준의 11404 &amp;lt;플로이드&amp;gt; 문제의 코드를 들고 왔다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696322428353&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline
INF = int(1e9)

n = int(input())
m = int(input())

graph = [[INF]*(n+1) for _ in range(n+1)]
for i in range(1, n+1):
    graph[i][i] = 0
    
for _ in range(m):
    s, e, w = map(int, input().split())
    graph[s][e] = min(graph[s][e], w)
    
# 거쳐가는 경로 중 더 최단경로가 있으면 갱신    
for k in range(1, n+1):
    for i in range(1, n+1):
        for j in range(1, n+1):
            graph[i][j] = min(graph[i][j], graph[i][k]+graph[k][j])
            
for i in range(1, n+1):
    for j in range(1, n+1):
        if graph[i][j] == INF:
            print(0,  end=&quot; &quot;)
        else:
            print(graph[i][j], end=&quot; &quot;)
    print()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;대표 문제&lt;/h2&gt;
&lt;figure id=&quot;og_1696322699643&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1389번: 케빈 베이컨의 6단계 법칙&quot; data-og-description=&quot;첫째 줄에 유저의 수 N (2 &amp;le; N &amp;le; 100)과 친구 관계의 수 M (1 &amp;le; M &amp;le; 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1389&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1389&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gK59e/hyT5TkCcjc/HTva38ndbiM753Ptsp8611/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1389&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1389&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gK59e/hyT5TkCcjc/HTva38ndbiM753Ptsp8611/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;1389번: 케빈 베이컨의 6단계 법칙&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 유저의 수 N (2 &amp;le; N &amp;le; 100)과 친구 관계의 수 M (1 &amp;le; M &amp;le; 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696322675482&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;11404번: 플로이드&quot; data-og-description=&quot;첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11404&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11404&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQbp5s/hyT5R1rHHp/TBKJwrstNMAOZHaBMMvdlk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11404&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11404&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQbp5s/hyT5R1rHHp/TBKJwrstNMAOZHaBMMvdlk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;11404번: 플로이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696322687247&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1956번: 운동&quot; data-og-description=&quot;첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 &amp;le; V &amp;le; 400, 0 &amp;le; E &amp;le; V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1956&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1956&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bW0Bh1/hyT5XUUVxX/BqvJHoKsXBCZaFKXQiozK0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1956&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1956&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bW0Bh1/hyT5XUUVxX/BqvJHoKsXBCZaFKXQiozK0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;1956번: 운동&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 &amp;le; V &amp;le; 400, 0 &amp;le; E &amp;le; V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&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> ️ Study/Algorithm</category>
      <category>DP</category>
      <category>동적계획법</category>
      <category>백준11404</category>
      <category>최단경로</category>
      <category>최단경로파이썬</category>
      <category>플로이드워셜</category>
      <category>플로이드워셜알고리즘</category>
      <category>플로이드워셜파이썬</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/14</guid>
      <comments>https://zxxhe.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 3 Oct 2023 17:45:54 +0900</pubDate>
    </item>
    <item>
      <title>[Swift]의 빌드 과정과 메모리 구조</title>
      <link>https://zxxhe.tistory.com/13</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;swiftThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chzRiy/btsv7f01WQE/ZdUWrVleLcLxwQe30WLjIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chzRiy/btsv7f01WQE/ZdUWrVleLcLxwQe30WLjIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chzRiy/btsv7f01WQE/ZdUWrVleLcLxwQe30WLjIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchzRiy%2Fbtsv7f01WQE%2FZdUWrVleLcLxwQe30WLjIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;swiftThumb.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 java의 작동 방식에 대해서 배우고 있는데, 생각해보니 swift는 어떤 과정을 통해 빌드가 되고 있고 메모리 영역은 어떻게 나뉘어 있는지, 어떤 머신으로 돌아가고 있는지에 대해서는 모르고 있었다는 것을 깨달았다. 이번 기회에 swift가 돌아가는 과정을 공부해보려고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swift 프로그램은 &lt;b&gt;Xcode의 빌드 시스템&lt;/b&gt;에 의해 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #daeef7;&quot;&gt;&lt;b&gt;Xcode Build System이란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;Apple의 통합 개발 환경 (IDE)인 &lt;b&gt;Xcode에서 프로젝트를 빌드하고 컴파일&lt;/b&gt;하는 데 사용되는 소프트웨어 시스템이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 시스템은 코드와 리소스 파일을 완성된 앱으로 변환하는 도구를 관리한다. Xcode에 프로젝트를 빌드하라고 지시하면 빌드 시스템은 파일을 분석하고 프로젝트 설정을 사용하여 수행할 작업 세트를 조합한다. 프로젝트 설정으로 빌드 프로세스를 수정하고 빌드를 완료하는 데 필요한 작업을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode build system은 다음과 같이 5가지 부분으로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhlJvH/btsv8cv5Ani/7ylglmf6KpnqVOGMln1D50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhlJvH/btsv8cv5Ani/7ylglmf6KpnqVOGMln1D50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhlJvH/btsv8cv5Ani/7ylglmf6KpnqVOGMln1D50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhlJvH%2Fbtsv8cv5Ani%2F7ylglmf6KpnqVOGMln1D50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;391&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Preprocessor 전처리기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러에게 제공할 수 있는 방식으로 프로그램을 변환해주는 역할. llbuild라는 Xcode의 하위 레벨 빌드 시스템을 통해 dependencies를 해결한다. #if DEBUG ~ #endif, #define 과 같은 전처리문이 여기서 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Compiler 컴파일러&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swift&lt;span&gt;&amp;nbsp;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;Objective-C&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;C/C++&lt;span&gt;&amp;nbsp;소스&lt;/span&gt;코드를 어셈블리어로 변환해주는 역할.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Apple에서 진행한 컴파일러에 필요한 툴체인 프로젝트인 &lt;b&gt;LLVM&lt;/b&gt;을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLVM은 두 가지의 컴파일러를 사용한다. 하나는 &lt;b&gt;swiftc(swift-clang)&lt;/b&gt;라는 Swift용 컴파일러고, 하나는 Objective-C&lt;span&gt;&amp;nbsp;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;Objective-C++&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;C/C++&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일용인 &lt;b&gt;clang&lt;/b&gt;이다. &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ghrtv/btswbz4VuFN/vC794RweXficPoKY2aS6ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ghrtv/btswbz4VuFN/vC794RweXficPoKY2aS6ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ghrtv/btswbz4VuFN/vC794RweXficPoKY2aS6ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGhrtv%2Fbtswbz4VuFN%2FvC794RweXficPoKY2aS6ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;303&quot; height=&quot;177&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러는 프론트엔드/백엔드 두 가지 부분으로 구성되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 말한 swiftc와 clang은 &lt;b&gt;프론트엔드&lt;/b&gt; 역할에 해당하며 고급언어(Swift, C)를&amp;nbsp; IR로 바꾸어준다. 프론트엔드 단계에서 소스 프로그램의 &lt;b&gt;Intermediate Representation(이하 IR)&lt;/b&gt;과 소스 프로그램에 대한 정보를 수집하는 &lt;b&gt;symbol table&lt;/b&gt;이 생성된다. (*symbol table: property, function, class 이름을 저장하고 매핑하는 역할.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백엔드&lt;/b&gt; 단계에서는 IR을 최적화한 뒤, 타겟머신에 맞는 어셈블리어로 변환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Assembler 어셈블러&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어셈블러는 사람이 읽을 수 있는 Assembly code를 기계어 코드로 변환해주고, 코드와 데이터 모음인 Mach-O 파일을 생성한다. Xcode에서 .o 타입을 가지는 파일들이 있는데 이를 Mach-O 타입이라고 명칭한다. Mach-O 파일은&lt;span&gt;&amp;nbsp;&lt;/span&gt;object 파일, 실행 파일 및 라이브러리에 사용되는 iOS 및 macOS 운영 체제용 특수 파일 형식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Linker 링커&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링커는 어셈블러에서 만든 object 파일과 라이브러리를 병합하여 실행할 수 있는 파일로 만들어 주는 역할.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어셈블러와 링커 모두 Mach-O 파일로 출력하는데, 여기에는 약간의 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어셈블리 단계에서 나오는 object 파일은 아직 링커에서 연결되지 못한 부분이 포함되어 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Loader 로더&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;운영체제의 일부인&lt;span&gt;&amp;nbsp;&lt;/span&gt;로더(loader)는 만들어진 실행 파일을 메모리에 올려놓고 실행하는 역할을 한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;로더는 프로그램 실행에 필요한 메모리 공간을 할당하고 레지스터를 초기 상태로 초기화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #daeef7;&quot;&gt;&lt;b&gt;Swift의 메모리 구조&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 실행되면 운영체제는 메모리 공간을 할당해주는데 메모리는 총 4개의 영역으로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 62.5581%; height: 160px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.8837%;&quot;&gt;Code&lt;/td&gt;
&lt;td style=&quot;width: 80.1163%;&quot;&gt;&amp;bull; 소스 코드를 기계어 형태로 저장&lt;br /&gt;&amp;bull; 컴파일 타임에 결정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.8837%;&quot;&gt;Data&lt;/td&gt;
&lt;td style=&quot;width: 80.1163%;&quot;&gt;&amp;bull; 데이터 저장 (전역변수, static변수)&lt;br /&gt;&amp;bull; 컴파일 타임에 결정&lt;br /&gt;&amp;bull; 프로그램 시작과 동시에 할당되며, 프로그램 종료시 메모리 해제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.8837%;&quot;&gt;Heap&lt;/td&gt;
&lt;td style=&quot;width: 80.1163%;&quot;&gt;&amp;bull; 참조 타입 저장 (class, closure, function, ...)&lt;br /&gt;&amp;bull; &lt;b&gt;런타임&lt;/b&gt; 시에 결정&lt;br /&gt;&amp;bull; 힙은 사용 후 반드시 메모리 해제를 해주어야 하는데, swift는 ARC라는 것이 &lt;b&gt;자동으로 해제&lt;/b&gt;해줌 (가비지컬렉터 같은건가..?)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.8837%;&quot;&gt;Stack&lt;/td&gt;
&lt;td style=&quot;width: 80.1163%;&quot;&gt;&amp;bull; 값 타입 저장 (struct, enum, tuple, 기본자료형, ...)&lt;br /&gt;(* let msg = &quot;Hello&quot; 같은 값도 스택에 저장)&lt;br /&gt;&amp;bull; 컴파일 타임에 결정&lt;br /&gt;&amp;bull; 함수가 종료되면 메모리도 해제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 정리해보았는데, 메모리 구조에 대해서는 공부하고 정리할 것이 많아서 따로 포스팅을 해야겠다...:)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696141513756&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Build system | Apple Developer Documentation&quot; data-og-description=&quot;Compile your code into a binary format, and customize your project settings to build your code.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/xcode/build-system&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/xcode/build-system&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beoX6M/hyT5ZLvpGC/0W7gq6NWOgkX50Gu5KCHtK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/pGrbh/hyT504Jbrn/CdmLtElUVqKdk4FYUuTLZ1/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/xcode/build-system&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/xcode/build-system&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beoX6M/hyT5ZLvpGC/0W7gq6NWOgkX50Gu5KCHtK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/pGrbh/hyT504Jbrn/CdmLtElUVqKdk4FYUuTLZ1/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;Build system | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Compile your code into a binary format, and customize your project settings to build your code.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696141513567&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Understanding Xcode Build System&quot; data-og-description=&quot;Every Swift program undergoes a number of transformations before it can be run on a real device. This process is usually handled by an Xcode Build System. In this article we'll take a look at each part of Xcode Build System: Swift compiler, linker, preproc&quot; data-og-host=&quot;www.vadimbulavin.com&quot; data-og-source-url=&quot;https://www.vadimbulavin.com/xcode-build-system/&quot; data-og-url=&quot;https://www.vadimbulavin.com/xcode-build-system/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CV1cc/hyT2CxEK19/e0TmNiPgQ9TbDGu9W7HUkK/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/KTJ0i/hyT5X1eaUC/KCjZPSSPikOJc9GhmZy8jk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/FTK98/hyT56cNt8D/4zKvLzmggstKA6XmVasj6K/img.jpg?width=960&amp;amp;height=960&amp;amp;face=310_225_620_562&quot;&gt;&lt;a href=&quot;https://www.vadimbulavin.com/xcode-build-system/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.vadimbulavin.com/xcode-build-system/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CV1cc/hyT2CxEK19/e0TmNiPgQ9TbDGu9W7HUkK/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/KTJ0i/hyT5X1eaUC/KCjZPSSPikOJc9GhmZy8jk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/FTK98/hyT56cNt8D/4zKvLzmggstKA6XmVasj6K/img.jpg?width=960&amp;amp;height=960&amp;amp;face=310_225_620_562');&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;Understanding Xcode Build System&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Every Swift program undergoes a number of transformations before it can be run on a real device. This process is usually handled by an Xcode Build System. In this article we'll take a look at each part of Xcode Build System: Swift compiler, linker, preproc&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.vadimbulavin.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696167142447&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;LLVM이란&quot; data-og-description=&quot;안녕하세요 :) Zedd입니다. 오늘은 LLVM에 대해서 공부해보겠습니다! 제 수준에 맞춰서..차근차근 공부해볼 예정입니다. # 컴파일러 특정 프로그래밍 언어로 작성된 코드를 다른 프로그래밍 언어로&quot; data-og-host=&quot;zeddios.tistory.com&quot; data-og-source-url=&quot;https://zeddios.tistory.com/1175&quot; data-og-url=&quot;https://zeddios.tistory.com/1175&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HM04f/hyT2y3b7EF/wr1vR8J3y7xdw11VS9Gprk/img.png?width=782&amp;amp;height=628&amp;amp;face=0_0_782_628,https://scrap.kakaocdn.net/dn/ehGoOu/hyT2EWE65W/Hk5OuJ0W1ZoSPYFQF1taG0/img.png?width=782&amp;amp;height=628&amp;amp;face=0_0_782_628,https://scrap.kakaocdn.net/dn/cNZnlW/hyT2BFASq6/kI6DPG7B1aYmizFC1oZ4Bk/img.jpg?width=1838&amp;amp;height=551&amp;amp;face=0_0_1838_551&quot;&gt;&lt;a href=&quot;https://zeddios.tistory.com/1175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zeddios.tistory.com/1175&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HM04f/hyT2y3b7EF/wr1vR8J3y7xdw11VS9Gprk/img.png?width=782&amp;amp;height=628&amp;amp;face=0_0_782_628,https://scrap.kakaocdn.net/dn/ehGoOu/hyT2EWE65W/Hk5OuJ0W1ZoSPYFQF1taG0/img.png?width=782&amp;amp;height=628&amp;amp;face=0_0_782_628,https://scrap.kakaocdn.net/dn/cNZnlW/hyT2BFASq6/kI6DPG7B1aYmizFC1oZ4Bk/img.jpg?width=1838&amp;amp;height=551&amp;amp;face=0_0_1838_551');&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;LLVM이란&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 :) Zedd입니다. 오늘은 LLVM에 대해서 공부해보겠습니다! 제 수준에 맞춰서..차근차근 공부해볼 예정입니다. # 컴파일러 특정 프로그래밍 언어로 작성된 코드를 다른 프로그래밍 언어로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zeddios.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696169548737&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;iOS) 메모리 구조 (Code, Data, Stack, Heap)&quot; data-og-description=&quot;안녕하세여~~ 소들입니다 :-))))) 오늘 웬 듣보잡 버그 한 놈이 나왔는데 처음에 메모리 참조 오류인 줄 알고 하루 종일 메모리에 대해서 공부 했는데 버그 원인은 메모리가 아니었음ㅋ (디코딩 네&quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/25&quot; data-og-url=&quot;https://babbab2.tistory.com/25&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Wh9ei/hyT5WnN9ns/0jFAOBXNKwEVswY52WKJ3K/img.png?width=800&amp;amp;height=422&amp;amp;face=0_0_800_422,https://scrap.kakaocdn.net/dn/flJmS/hyT5Y0duxi/XDLppWw10oYSjMOSbBZKrK/img.png?width=800&amp;amp;height=422&amp;amp;face=0_0_800_422,https://scrap.kakaocdn.net/dn/kPp39/hyT2rbWf2j/lFqTqrZr6BbQQXxnDw2Sf1/img.png?width=1410&amp;amp;height=424&amp;amp;face=0_0_1410_424&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/25&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Wh9ei/hyT5WnN9ns/0jFAOBXNKwEVswY52WKJ3K/img.png?width=800&amp;amp;height=422&amp;amp;face=0_0_800_422,https://scrap.kakaocdn.net/dn/flJmS/hyT5Y0duxi/XDLppWw10oYSjMOSbBZKrK/img.png?width=800&amp;amp;height=422&amp;amp;face=0_0_800_422,https://scrap.kakaocdn.net/dn/kPp39/hyT2rbWf2j/lFqTqrZr6BbQQXxnDw2Sf1/img.png?width=1410&amp;amp;height=424&amp;amp;face=0_0_1410_424');&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;iOS) 메모리 구조 (Code, Data, Stack, Heap)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세여~~ 소들입니다 :-))))) 오늘 웬 듣보잡 버그 한 놈이 나왔는데 처음에 메모리 참조 오류인 줄 알고 하루 종일 메모리에 대해서 공부 했는데 버그 원인은 메모리가 아니었음ㅋ (디코딩 네&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696171495212&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;iOS) 메모리 관리 (1/3) - ARC(Automatic Reference Counting)&quot; data-og-description=&quot;안녕하세요~~ 소들입니다   오늘은 지난 시간 메모리 구조에 이어 Swift를 사용할 때 메모리 관리가 어떤 식으로 되는지에 대해 공부해볼 거예요 :) ARC 면접 단골 질문이라죠? 깔깔 iOS 개발자라&quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/26&quot; data-og-url=&quot;https://babbab2.tistory.com/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blwCtR/hyT5SFIej8/C5SaDzZOFhK4ArlM99Sm4k/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/pzHyL/hyT5VPX4Tk/m4kC4j2aGr7kuEk8wiLSl0/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/1ewxF/hyT53HeIdb/jMUWHvKYuLHbvJEJ1BAIwk/img.png?width=1844&amp;amp;height=1000&amp;amp;face=0_0_1844_1000&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blwCtR/hyT5SFIej8/C5SaDzZOFhK4ArlM99Sm4k/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/pzHyL/hyT5VPX4Tk/m4kC4j2aGr7kuEk8wiLSl0/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/1ewxF/hyT53HeIdb/jMUWHvKYuLHbvJEJ1BAIwk/img.png?width=1844&amp;amp;height=1000&amp;amp;face=0_0_1844_1000');&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;iOS) 메모리 관리 (1/3) - ARC(Automatic Reference Counting)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요~~ 소들입니다   오늘은 지난 시간 메모리 구조에 이어 Swift를 사용할 때 메모리 관리가 어떤 식으로 되는지에 대해 공부해볼 거예요 :) ARC 면접 단골 질문이라죠? 깔깔 iOS 개발자라&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.tistory.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>  iOS/Swift</category>
      <author>zxxhe</author>
      <guid isPermaLink="true">https://zxxhe.tistory.com/13</guid>
      <comments>https://zxxhe.tistory.com/13#entry13comment</comments>
      <pubDate>Sun, 1 Oct 2023 23:54:58 +0900</pubDate>
    </item>
  </channel>
</rss>