<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ddingstory</title>
    <link>https://ddingmin00.tistory.com/</link>
    <description>개발, PS 풀이</description>
    <language>ko</language>
    <pubDate>Tue, 19 May 2026 10:18:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ddingmin00</managingEditor>
    <image>
      <title>ddingstory</title>
      <url>https://tistory1.daumcdn.net/tistory/5006879/attach/f565167c31d94c51a2c6c7a67b84a515</url>
      <link>https://ddingmin00.tistory.com</link>
    </image>
    <item>
      <title>홈 서버 구축기 - DDNS 설정하기</title>
      <link>https://ddingmin00.tistory.com/entry/%ED%99%88-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-DDNS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mac mini 환경에서, KT 기본 공유기 기준으로 작성된 글입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzTLf/btsLCtVtwV9/DnPfIvGkgwhDc3Zi6YLj9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzTLf/btsLCtVtwV9/DnPfIvGkgwhDc3Zi6YLj9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzTLf/btsLCtVtwV9/DnPfIvGkgwhDc3Zi6YLj9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnzTLf%2FbtsLCtVtwV9%2FDnPfIvGkgwhDc3Zi6YLj9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;263&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 문제 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;이전 글&quot; href=&quot;https://ddingmin00.tistory.com/entry/%ED%99%88-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-%EC%99%B8%EB%B6%80%EC%99%80-%ED%86%B5%EC%8B%A0%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-KT-%EA%B3%B5%EC%9C%A0%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전 글&lt;/a&gt;에서 내부 IP는 고정으로 사용하도록 하였지만, 가정에서는 공인 IP는 언제나 바뀔 수 있는 상황이다.&lt;br /&gt;이를 해결하기 위해 IP 주소가 바뀔 때 마다 DNS와 매핑을 다시 해주어야 하는데, 이를 위해 DDNS 설정이 필요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. DDNS의 간단한 동작 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDNS는 다음과 같은 동작 방식을 가진다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트 장치의 IP 변경을 감지한다.&lt;/li&gt;
&lt;li&gt;변경된 IP 주소를 DDNS 서버로 전송한다.&lt;/li&gt;
&lt;li&gt;DNS 레코드를 업데이트한다.&lt;/li&gt;
&lt;li&gt;사용자가 정상적으로 도메인에 접속할 수 있게된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. DDNS 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KT 공유기를 사용하는 환경에서는 &lt;a href=&quot;https://www.noip.com/&quot;&gt;https://www.noip.com/&lt;/a&gt; 에서 무료로 DDNS 설정을 해줄 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gej0m/btsLz4QSWRg/e2AhQIsIVh0yld7PAmi29K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gej0m/btsLz4QSWRg/e2AhQIsIVh0yld7PAmi29K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gej0m/btsLz4QSWRg/e2AhQIsIVh0yld7PAmi29K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGej0m%2FbtsLz4QSWRg%2Fe2AhQIsIVh0yld7PAmi29K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1281&quot; height=&quot;758&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 사이트에 가입하고, &lt;code&gt;Dynamic DNS &amp;gt; No-IP Hostnames&lt;/code&gt; 탭에 들어가서 &lt;code&gt;Create Hostname&lt;/code&gt;을 눌러 새로운 호스트를 등록하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tq5Sm/btsLzuvjVRr/I4KfwukrcGK80J3XxDrGNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tq5Sm/btsLzuvjVRr/I4KfwukrcGK80J3XxDrGNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tq5Sm/btsLzuvjVRr/I4KfwukrcGK80J3XxDrGNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftq5Sm%2FbtsLzuvjVRr%2FI4KfwukrcGK80J3XxDrGNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1275&quot; height=&quot;851&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;851&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 이름과 도메인을 정하고, A 레코드로 생성하자.&lt;br /&gt;IP는 자동으로 나의 현재 공인 IP로 설정되어 있어 다르지만 않다면 그대로 두고, &lt;code&gt;create Hostname with DDNS Key&lt;/code&gt;를 누른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc6lzW/btsLyWyQQQU/5fhPjAIMQkbzQPWlf2AOb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc6lzW/btsLyWyQQQU/5fhPjAIMQkbzQPWlf2AOb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc6lzW/btsLyWyQQQU/5fhPjAIMQkbzQPWlf2AOb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc6lzW%2FbtsLyWyQQQU%2F5fhPjAIMQkbzQPWlf2AOb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1275&quot; height=&quot;851&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;851&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;무언가 계정이 생성되는데, 이는 2번에서 설명했던 클라이언트가 장치의 IP 변경을 감지하면, No-IP 서버로 변경된 IP 정보를 전달하기 위한 계정이 필요하다.&lt;br /&gt;따라서 발급받은 계정 정보를 공유기 DDNS 설정에 기입해주어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmYxlk/btsLz9jTC3z/mk9zZcj1k4ve6SP5jWJzMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmYxlk/btsLz9jTC3z/mk9zZcj1k4ve6SP5jWJzMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmYxlk/btsLz9jTC3z/mk9zZcj1k4ve6SP5jWJzMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmYxlk%2FbtsLz9jTC3z%2Fmk9zZcj1k4ve6SP5jWJzMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;425&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다시 KT 공유기 설정 페이지에 돌아와서 다음과 같이 DDNS서버(no-ip), 사용자 ID와 비밀번호 그리고, URL을 지정하고 저장한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 테스트 하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDNS 설정이 모두 완료되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U1qsh/btsLBkyehTN/DZc8xaQVrEf9KAH96gIAZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U1qsh/btsLBkyehTN/DZc8xaQVrEf9KAH96gIAZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U1qsh/btsLBkyehTN/DZc8xaQVrEf9KAH96gIAZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU1qsh%2FbtsLBkyehTN%2FDZc8xaQVrEf9KAH96gIAZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;374&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;DDNS가 제대로 작동되기 테스트하기 위해 공유기를 재부팅하거나, 다음 설정에서 IP 할당 정책을 바꿔보면 IP가 바뀌더라도 동일하게 DDNS가 재설정해주는 모습을 볼 수 있다.&lt;/p&gt;</description>
      <category>홈 서버</category>
      <category>홈서버</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/137</guid>
      <comments>https://ddingmin00.tistory.com/entry/%ED%99%88-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-DDNS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0#entry137comment</comments>
      <pubDate>Sun, 29 Dec 2024 19:26:53 +0900</pubDate>
    </item>
    <item>
      <title>홈 서버 구축기 - 외부와 통신할 수 있는 환경 구축하기 (KT 공유기)</title>
      <link>https://ddingmin00.tistory.com/entry/%ED%99%88-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-%EC%99%B8%EB%B6%80%EC%99%80-%ED%86%B5%EC%8B%A0%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-KT-%EA%B3%B5%EC%9C%A0%EA%B8%B0</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mac mini 환경에서, KT 공유기 기준으로 작성된 글입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;result.png&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;264&quot;&gt;&lt;a href=&quot;https://thumbnail-maker-sumi.vercel.app/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xsSYm/btsLAedsHuR/fKAyobSRJDRPTFXlNH6bJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxsSYm%2FbtsLAedsHuR%2FfKAyobSRJDRPTFXlNH6bJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;554&quot; height=&quot;264&quot; data-filename=&quot;result.png&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 공유기 설정 페이지 접속하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 네트워크에서 내부 네트워크에 접근하기 위해서는 포트 포워딩을 설정해야한다.&lt;br /&gt;KT 공유기는 &lt;a href=&quot;http://172.30.1.254%5D&quot;&gt;http://172.30.1.254&lt;/a&gt; 다음 주소를 통해 접속 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3cuCs/btsLzc1LuVf/nbLwYCwZsM7qEg7kZ28D0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3cuCs/btsLzc1LuVf/nbLwYCwZsM7qEg7kZ28D0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3cuCs/btsLzc1LuVf/nbLwYCwZsM7qEg7kZ28D0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3cuCs%2FbtsLzc1LuVf%2FnbLwYCwZsM7qEg7kZ28D0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;754&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 ID/PW는 ktuser/homehub 이며, 최초 로그인 시 로그인 정보 재설정이 필요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 내부 IP 고정 할당받기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈 서버로 사용하기 위해서는 고정 IP를 사용해야한다.&lt;br /&gt;기본 설정으로는 DHCP를 통해 자동으로 IP를 할당받도록 설정되어 있으므로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터가 재부팅되거나 특정 시간이 된다면 IP가 변경될 수 있다.&lt;br /&gt;따라서 외부에서 접근 가능하도록 하기 위해서는 고정 IP를 사용해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-27 오전 11.02.06.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/briGPv/btsLyFpEvbb/KgHdcHYtqmQcNeS4HJe1VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/briGPv/btsLyFpEvbb/KgHdcHYtqmQcNeS4HJe1VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/briGPv/btsLyFpEvbb/KgHdcHYtqmQcNeS4HJe1VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbriGPv%2FbtsLyFpEvbb%2FKgHdcHYtqmQcNeS4HJe1VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;186&quot; data-filename=&quot;스크린샷 2024-12-27 오전 11.02.06.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;장치설정 &amp;gt; 네트워크 관리 &amp;gt; LAN 연결 설정&lt;/code&gt;에 접속하고,&lt;br /&gt;하단의 수동 IP 할당 설정에서 타겟 MAX 주소를 현재 LAN 포트 접속,&lt;br /&gt;할당 IP는 현재 나의 내부 IP로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 ip는 Mac 기준 다음 명령어를 통해 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;ifconfig | grep inet&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 포트 포워딩 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서 내부 네트워크의 특정 장치로 전달하기 위해 포트 포워딩을 설정해야한다.&lt;br /&gt;NAT 환경에서는 내부 IP 주소가 숨겨져 있으므로, 특정 포트로 들어오는 요청을 내부 장치로 전달할 수 있도록 해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/de6caG/btsLxhXk4t7/2ShjHNcx6aKjScRwj748qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/de6caG/btsLxhXk4t7/2ShjHNcx6aKjScRwj748qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/de6caG/btsLxhXk4t7/2ShjHNcx6aKjScRwj748qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fde6caG%2FbtsLxhXk4t7%2F2ShjHNcx6aKjScRwj748qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;234&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;장치설정 &amp;gt; 트래픽 관리 &amp;gt; 포트 포워딩 설정&lt;/code&gt;에 접속하고,&lt;br /&gt;listen 받을 외부 포트, 2번에서 고정한 내부 IP 주소와 전달할 내부 포트를 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgIwpj/btsLx4pIkeK/hrCjHQKj3BWixh1gT4CRv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgIwpj/btsLx4pIkeK/hrCjHQKj3BWixh1gT4CRv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgIwpj/btsLx4pIkeK/hrCjHQKj3BWixh1gT4CRv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgIwpj%2FbtsLx4pIkeK%2FhrCjHQKj3BWixh1gT4CRv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;201&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버를 띄우고, 설정했던 포트에 접속하면 정상적으로 동작한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 기타&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가정용 인터넷은 공인 IP를 동적으로 할당하기 때문에 시간이 자나면 언제든지 접속 IP가 바뀔 수 있다.&lt;br /&gt;따라서 이를 해결하기 위해 고정된 IP를 사용하도록 하거나 DDNS를 통해 IP주소가 변경되어도 언제든지 도메인 이름에 매핑되도록 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고정된 IP를 사용하기 위해선 추가적인 비용을 지불해야 하기 때문에 DDNS 설정을 해보자.&lt;/p&gt;</description>
      <category>홈 서버</category>
      <category>홈서버</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/136</guid>
      <comments>https://ddingmin00.tistory.com/entry/%ED%99%88-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-%EC%99%B8%EB%B6%80%EC%99%80-%ED%86%B5%EC%8B%A0%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-KT-%EA%B3%B5%EC%9C%A0%EA%B8%B0#entry136comment</comments>
      <pubDate>Fri, 27 Dec 2024 11:38:17 +0900</pubDate>
    </item>
    <item>
      <title>TIL 생성 쉘 스크립트</title>
      <link>https://ddingmin00.tistory.com/entry/TIL-%EC%83%9D%EC%84%B1-%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
      <description>&lt;pre id=&quot;code_1710478767019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

# 현재 날짜를 YYYY-MM-DD 형식으로 가져오기
today=$(date +&quot;%Y-%m-%d&quot;)

# 파일명 생성
filename=&quot;[TIL]$today.md&quot;

# 파일 생성 및 내용 추가
echo -e &quot;# TIL\n&quot; &amp;gt; &quot;$filename&quot;

echo &quot;$filename 생성&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ETC..</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/135</guid>
      <comments>https://ddingmin00.tistory.com/entry/TIL-%EC%83%9D%EC%84%B1-%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8#entry135comment</comments>
      <pubDate>Fri, 15 Mar 2024 13:59:36 +0900</pubDate>
    </item>
    <item>
      <title>현대자동차 소프티어 부트캠프 2기를 마치고..</title>
      <link>https://ddingmin00.tistory.com/entry/%ED%98%84%EB%8C%80%EC%9E%90%EB%8F%99%EC%B0%A8-%EC%86%8C%ED%94%84%ED%8B%B0%EC%96%B4-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-2%EA%B8%B0%EB%A5%BC-%EB%A7%88%EC%B9%98%EA%B3%A0</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://velog.io/@ddingmin/%ED%98%84%EB%8C%80%EC%9E%90%EB%8F%99%EC%B0%A8-%EC%86%8C%ED%94%84%ED%8B%B0%EC%96%B4-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-2%EA%B8%B0%EB%A5%BC-%EB%A7%88%EC%B9%98%EA%B3%A0&quot;&gt;&lt;strong&gt;본문이 훨씬 가독성이 좋습니다.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://ddingmin00.tistory.com/entry/%ED%98%84%EB%8C%80%EC%9E%90%EB%8F%99%EC%B0%A8-%EC%86%8C%ED%94%84%ED%8B%B0%EC%96%B4-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-2%EA%B8%B0-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-1-2%EC%B0%A8-%ED%9B%84%EA%B8%B0&quot;&gt;현대 자동차 부트캠프 입과 프로세스 후기&lt;/a&gt;&lt;br&gt;소프티어 부트캠프 2기를 수료한지 시간이 꽤나 지난 시점이지만 느즈막하게 후기를 작성해보려한다..&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/16fd4c7e-3238-47bd-9461-def5893fa2dd/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;내게 이번 여름은 너무 더웠다.&lt;br&gt;날씨만이 아니라 부트캠프 과정을 함께한 동료들의 열정이 너무 뜨거웠다.&lt;/p&gt;
&lt;h2&gt;교육과정&lt;/h2&gt;
&lt;p&gt;나는 백엔드 파트로 지원해 30명의 교육생들과 함께 매일 함께하며 교육을 진행했다.&lt;br&gt;전환은 생각하지 않고 좋은 배움의 기회로 생각하고, 부족했던 프로젝트 경험을 할 수 있다는 것만으로도 만족하며 과정을 시작했다.&lt;br&gt;실제로 함께 수업을 들으며 주변 교육생들은 너무나 열심히 살았고, 배움의 깊이가 다르게 느껴졌다.&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/6dd47840-deca-4e5e-88fc-42388a13bf66/image.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;&lt;del&gt;나는 모기 처럼 함께 공부하며, 최대한 빨아먹고자 목표했다 ㅋ-ㅋ&lt;/del&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;실제로 교육 과정 진행동안 다짐했던 첫 목표는 &amp;quot;모든 교육생들과 한마디 해보자&amp;quot; 였고 지금 와서는 나름 목표를 이룬 것 같아 만족한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;*&lt;em&gt;교육은 1달의 자바/스프링 + CS 학습과 1달의 프로젝트 과정이 이루어진다. *&lt;/em&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;자바/스프링&lt;/h3&gt;
&lt;p&gt;매주 주어지는 미션을 기반으로 문제를 해결해나가며 자바와 스프링을 학습한다.&lt;br&gt;객체지향과 클린코드, 테스트 코드를 중점으로 공부하며 그저 주어진 문제를 해결하기 보다는 항상 의문을 던지며 공부하는 방식을 지향한다.&lt;/p&gt;
&lt;p&gt;평소에는 당장 돌아가는 코드를 작성하곤 했는데, 지난 날의 나를 반성하는 시간이 되었다.&lt;br&gt;또한 매일매일 아침에는 조원들과 함께 스크럼을 시작으로 각자 할 일들을 공유하고, 일과를 마친 저녁에는 회고와 함께 하루의 배움을 정리하는 학습 스택을 작성하곤 했다.&lt;br&gt;내가 공부했던 내용들을 정리했을뿐만 아니라 다른 동료들의 학습 스택을 통해서 내가 놓쳤던 부분도 공부할 수 있는 기회가 되었다.&lt;/p&gt;
&lt;p&gt;이러한 과정들이 더욱 교육에 몰입할 수 있는 계기가 되었고, 혼자 문제를 해결하는 것이 아닌 함께 문제를 고민하는 과정을 통해 다양한 인사이트를 얻을 수 있었다.&lt;br&gt;또한 주기적으로 피어세션과 코드 리뷰를 통해 나와 다른 구현 방향들을 배울 수 있는 점 또한 좋았다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;교육 내에서 할 수 있는건 다 도전했던 것 같다. 미니 세미나에도 자율적으로 참가해보고 블로그 작성 모집에도 도전했지만 가위바위보에 져서 경험해보진 못했다  &lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;슬랙을 통해 정리한 내용들을 공유하고, 도움이 되는 레퍼런스들도 공유하며, 2기의 백엔드의 분위기는 혼자 앞서가는 사람 없이 함께 성장해나가는 모습이었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;점차 시간이 지나 친해진 뒤에는 서로의 학습 스택에 이모지들을 열심히 달아주며 적극적인 소통 창구가 되었다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;가장 기억에 남았던 미션은 WAS를 직접 자바로 구현해내는 과정이었다.&lt;br&gt;사실 스프링에 대해 겉핥기식으로 공부해, 제대로된 동작 방식에 대해 알지못했다. 또한 프로젝트 과정에서 요청에 응답하는 과정을 당연시 여겼고, 실제로 어떤 과정으로 응답하는지 궁금하지 않았다.&lt;br&gt;미션을 통해 직접 Java를 통해 스프링의 동작 방식과 유사한 WAS를 구현해보면서 원론적인 동작 방식에 대해 공부할 수 있었다.&lt;br&gt;미션 역시도 다른 교육생들과 함께 인사이트를 나누며 정말 많이 물어보고 배웠던 것 같다.&lt;br&gt;내가 너무 많이 물어보았던 것 같은데 다들 너무나 흔쾌히 대답해주었다..  &lt;/p&gt;
&lt;p&gt;미션이 슬슬 지칠 때 즈음 프로젝트의 팀원들을 뽑고 시작한다.&lt;/p&gt;
&lt;h3&gt;프로젝트&lt;/h3&gt;
&lt;p&gt;사실 1기에서는 자유 주제로 프로젝트를 진행했다고 한다.&lt;br&gt;하지만 2기부터는 기획/디자인 연수생들이 함께하는 만큼 기획서와 디자인을 받아 개발자로써 분석하고 개발하게 된다.&lt;br&gt;개발 교육생들이 한 달동안 교육받는 동안 기획/디자인 연수생들은 열심히 기획, 디자인을 제작해 프로젝트 과정이 시작하는 시점에 받게된다..!&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/ad22b58e-896d-4376-a7b3-babd028b55f3/image.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;기획서를 받고 개발할 수 있다는 경험을 할 수 있어 기대했지만 프로세스가 자연스럽지 못해 아쉬웠다. 주어진 기획서를 개발자들도 분석하고 조율해나가야 하는 시간이 필요했지만 기획/디자인 연수생들은 곧바로 다음 프로젝트를 만들어야 하기 때문에 소통 부재가 발생했다.&lt;br&gt;당연하게도 기획자들은 개발을 모르고, 개발자들도 기획자의 의도를 파악하기 어렵기에 소통의 시간이 적었던 점이 아쉬웠다.&lt;br&gt;그래도 마스터님의 배려로 적당히 타협하며 프로젝트를 시작할 수 있었다.&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/882024a4-e7f3-4868-bcbb-a91925f57f2e/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;프로젝트에서도 여러 제약들이 존재했다. (Java 11, JPA 금지, Spring 시큐리티 금지.. AWS ALB 금지 등등..)&lt;br&gt;마스터님의 의도는 조금도 Row한 기술을 사용하며 불편한 점들을 느끼고, 왜 이제는 이런 기술을 사용하는지 느껴보라는 의도였다.&lt;br&gt;몇몇 팀은 JPA를 사용한 팀도 존재했지만 우리팀에서는 가장 Row한 걸 사용해보자. 해서  JDBC Template을 사용했다.&lt;/p&gt;
&lt;p&gt;사실 프로젝트 초반부터 삐걱되었다. 첫 주에 기획 분석과 ERD 설계가 늦어진 탓에 자연스럽게 API 명세에 대한 작업도 늦어지게 되었다.&lt;br&gt;다행히도 웹과 AOS 파트의 팀원들은 너그럽게 이해해주었고, 빠르게 개발을 시작하며 기간 내에 프로젝트를 완성할 수 있었다.&lt;/p&gt;
&lt;p&gt;서버에서 부족한 점이 많았다고 생각하지만 팀원들이 함께 고민해주고, 문제를 함께 해결해주려 노력해주었다.&lt;br&gt;한 달동안 함께 프로젝트하면서 너무 재밌었고, 든든했다.&lt;br&gt;매일 오프라인으로 함께하며 프로젝트를 진행했고, 정말 많은 이야기와 고민들을 나누면서 개발했다.&lt;/p&gt;
&lt;p&gt;어쩌면 자유 주제가 아닌 정해진 기획에 따라 개발하는 일에 좋은 프로젝트 경험이 되지 못했을거라 생각했는데, 주어진 환경에서 얻어갈 수 있는 부분들을 모두 도전해나갔다.&lt;br&gt;최대한 많은 데이터들을 넣어 API 레이턴시를 측정해보고, 직접 개선해보는 경험과 무한 스크롤을 페이지네이션으로 구현하는 과정에서 발생했던 문제들을 개선하는 경험, 로그인 구현 이후 CORS문제를 해결해보는 경험 등등 오프라인이기에 더욱 함께 고민하고 도전적으로 얻어낸 결과물이었다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/b1600b11-3a6c-4096-982c-d3786992341f/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;프로젝트를 성공적으로 마치고, 마지막까지 밤을 새가며 발표를 준비한 팀원들에게 다시 고생했다는 말을 하고싶다!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;프로젝트 과정뿐만 아니라 교육 과정에서도 퇴근 시간인 7시 이후에도 남아서 함께 공부했다. 혼자였더라면 이쯤하면 되겠지 하고 멈췄을 것 같은데 끝까지 열심히 함께 해주던 친구들 덕에 더 크게 성장할 수 있었다.&lt;br&gt;그리고 한양대 경영관 시설이 너무 좋다.. 편하게 쉴 공간도 많았고, 늘 배려해주셨던 카페 사장님이 생각난다..  &lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;채용 연계 과정&lt;/h2&gt;
&lt;p&gt;소프티어 부트캠프 2기는 채용 연계형 과정이였기 때문에 수료 이후 추후 채용 프로세스가 진행된다.&lt;/p&gt;
&lt;p&gt;사실 채용에는 큰 기대 없이 시작했고, 좋은 사람들과 이어졌다는 점으로도 충분히 얻어간 것이 많았지만 주어진 전환의 기회도 잡고 싶었다.&lt;/p&gt;
&lt;p&gt;기본적으로 교육과정에서 공부했던 내용들을 매일 남겨놨던 스크럼과 회고의 기록을 통해 다시 정리했다.&lt;br&gt;프로젝트 과정에서 적용한 부분이나 고민했던 내용들은 모두 과정에서 깊이있게 생각해 보았지만 말하는 것과 아는 것은 다르기에 직접 말해가며 열심히 준비했다.&lt;br&gt;대부분의 시간은 학부에서 공부했던 CS를 복습하며 시간을 보냈다.&lt;br&gt;그 외에도 회사 로열티, 인성, 도메인에 관해서도 간단하게 준비하며 최종 면접의 시간이 되었다. &lt;/p&gt;
&lt;p&gt;솔직히 면접은 내용은 너무 좋았고 후회없었다. 그동안 공부했던 내용들이 헛되이지 않았음을 나 스스로 만족했다.&lt;br&gt;물론 아쉬운 부분도 존재했지만 정말 후회없이 본 면접이였고, 결과에 대한 기대감이 컸다. &lt;/p&gt;
&lt;p&gt;하지만 최종 결과는 탈락이었다. &lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;del&gt;귀하의 역량은 ..&lt;/del&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;올해 초 소프트웨어 마에스트로 면접 탈락에서 느낀 허무함이 다시 느껴지는 기분이었다.&lt;br&gt;사실 함께했던 동료들과 비교하면 붙는게 더 이상했다. 또한 얼어붙은 시장탓에 적은 티오로 전체적인 전환율이 높지 않았다는 생각으로 스스로를 위로했다. &lt;/p&gt;
&lt;p&gt;전환 실패의 슬픔에 멈춰있는 것은 아무런 도움이 안된다. 소마 탈락에서 경험했던 일이다.&lt;br&gt;그렇게 내가 처음 경험한 대기업의 첫 최종 면접 경험은 마무리 되었다. &lt;/p&gt;
&lt;h2&gt;이제 현실로&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/1ee1127a-0133-44b5-ad70-fa262859688d/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;뜨거웠던 방학이 끝나고 나는 다시 취준생이자 4학년 2학기를 재학중인 평범한 대학생으로 돌아왔다.&lt;br&gt;달라진 점은 취준한 동료들이 더 많이 생겼다는 것이다. 합격자들 불합격자들 구분없이 지금까지 연락하며 도움이 필요한 부분들은 적극적으로 도와준다. &lt;/p&gt;
&lt;p&gt;사실 교육과정 중간에서 네이버 부스트캠프 웹 과정에 합격했었지만 입과를 포기하고 소프티어 부트캠프에 참여했다.&lt;br&gt;당시에는 전환의 기회가 존재하기 때문에 포기했던 이유가 컸던 것 같다.&lt;br&gt;하지만 지금와서는 전환보다는 같은 길을 걷는 동료들을 얻었다는 것이 더 큰 수확이다.&lt;br&gt;물론 전환의 실패를 알고 다시 돌아간다해도 소프티어 부트캠프를 참여할 것 같다. &lt;/p&gt;
&lt;h3&gt;어쨋든..!&lt;/h3&gt;
&lt;p&gt;이 글에 들어온 분들은 소프티어 부트캠프가 궁금해서 일텐데 너무 내 이야기로 가득채웠던 것 같다.&lt;br&gt;3기부터는 교육기관이 변경될 수도 있지만 오프라인으로 진행되는 교육이라는 점이 큰 장점인 것 같다.&lt;br&gt;부트캠프 과정을 통해 나의 공부 방향과 방버버을 다시 생각하게 되었고, 무엇보다 함께 길을 걷는 친구들을 얻을 수 있었다.&lt;br&gt;자연스럽게 내가 몰랐던 개발 방향과 방법에 대해 눈을 뜰 수 있는 계기가 되었다.&lt;br&gt;무엇보다 쉽게 얻을 수 없는 대기업의 면접 기회까지 얻을 수 있다는 점이 큰 장점인 것 같다!&lt;/p&gt;</description>
      <category>Diary &amp;amp; 후기</category>
      <category>소프티어</category>
      <category>회고</category>
      <category>후기</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/134</guid>
      <comments>https://ddingmin00.tistory.com/entry/%ED%98%84%EB%8C%80%EC%9E%90%EB%8F%99%EC%B0%A8-%EC%86%8C%ED%94%84%ED%8B%B0%EC%96%B4-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-2%EA%B8%B0%EB%A5%BC-%EB%A7%88%EC%B9%98%EA%B3%A0#entry134comment</comments>
      <pubDate>Wed, 27 Dec 2023 22:40:09 +0900</pubDate>
    </item>
    <item>
      <title>엘리스 코드 챌린지 본선 참여 후기</title>
      <link>https://ddingmin00.tistory.com/entry/%EC%97%98%EB%A6%AC%EC%8A%A4-%EC%BD%94%EB%93%9C-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%B3%B8%EC%84%A0-%EC%B0%B8%EC%97%AC-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://velog.io/@ddingmin/%EC%97%98%EB%A6%AC%EC%8A%A4-%EC%BD%94%EB%93%9C-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%B3%B8%EC%84%A0-%EC%B0%B8%EA%B0%80-%ED%9B%84%EA%B8%B0&quot; title=&quot;본문 Velog 링크&quot;&gt;본문 Velog 링크&lt;/a&gt;&lt;br&gt;본문이 가독성이 좋습니다!&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/0649a13c-877d-49e7-8edd-47273b5bcf93/image.png&quot; alt=&quot;엘리스 코드 챌린지&quot;&gt;&lt;/p&gt;
&lt;h2&gt;참가하게 된 계기&lt;/h2&gt;
&lt;p&gt;지인의 추천으로 엘리스 코드 챌린지에 참가하게 되었다.&lt;br&gt;파이썬 기술 스택을 기반으로 하는 대회로, 다른 PS 대회와는 다르게 알고리즘 문제만 출제되는 것이 아닌 FastAPI를 이용한 API 구현 문제도 출제되었다.&lt;/p&gt;
&lt;p&gt;평소 PS와 코딩테스트의 언어로 파이썬을 사용하였고, 간단한 Flask 서버 구축을 해 본 경험이 있기에 참여의 목적을 두고 신청하게 되었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;예선&lt;/h2&gt;
&lt;p&gt;예선은 온라인으로 진행되었고, 별 다른 화상 감독 없이 진행했다.&lt;br&gt;기간 내에 자율적으로 응시가 가능해 문제없이 참여할 수 있었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;사실 이번 학기에 조교를 맡으면서 실습 플랫폼으로 엘리스를 사용했다. 학생들의 채점 용도로 사용하다 처음으로 직접 코드를 작성해보았는데, IDE가 굉장히 이뻣다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;이전에 알고리즘 문제와 API 문제가 나온다는 공지에 맞게 알고리즘 3문제와 API 문제가 출제되었다.&lt;/p&gt;
&lt;h3&gt;알고리즘&lt;/h3&gt;
&lt;p&gt;알고리즘 문제는 코딩 테스트에 비해서는 난이도가 높은 편에 속했다.&lt;br&gt;구현을 기초로한 해결 방법이 아니라 특정 알고리즘을 알아야 해결할 수 있는 문제들이 출제되었다.&lt;br&gt;고급 알고리즘을 많이 알지 못해서 해결하지 못한 문제들이 꽤나 있었다.&lt;/p&gt;
&lt;h3&gt;API&lt;/h3&gt;
&lt;p&gt;API 문제는 기본적인 스켈레톤 코드들이 제공되었고, 실무에서 접할 수 있는 문제들을 해결해나가는 문제로 출제되었다.&lt;br&gt;분명 이론적으로는 해결되지만, FastAPI를 사용해보지 않아 레퍼런스를 찾으며 문제를 해결해나가야 했다.&lt;br&gt;덕분에 시간도 많이 걸리게 되었고, 부분 점수 일부만을 획득한 채 예선을 종료하게 되었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;API 문제는 Swagger가 제공되어 직접 응답을 테스트해 볼 수 있다는 점이 신기했다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;큰 기대는 하지 않은 채 열심히 취준과 막학기 졸업 프로젝트를 병행하며 시간을 보냈다..&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/d6b82db3-8405-4873-99c5-d3485b733480/image.png&quot; alt=&quot;본선 메시지&quot;&gt;&lt;br&gt;별 생각 없이 시간을 보내고 있던 와중에 본선에 진출했다는 안내를 받았다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;본선&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/111c02b1-5fe9-484b-806d-14a5cdc82b9e/image.png&quot; alt=&quot;해설&quot;&gt;&lt;/p&gt;
&lt;p&gt;본선을 진행하기 전 예선 문제에 대한 해설 세션도 들어볼 수 있었다.&lt;br&gt;출제자분들이 직접 해설해주시면서 출제 의도와 함께 설명해주는 방식으로 진행되었다.&lt;br&gt;블로그에서 문제의 풀이 방법을 보는 것과 다르게 출제자의 의도와 함께 설명을 듣는 방식은 또 새로웠다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;사실 파이썬 개발 스택을 목표로하는 개발자도 아니고, 본선에서 좋은 성적을 얻을 수 없다는 점에 참가를 고민했다.&lt;br&gt;&lt;del&gt;또한 디프만 활동 세션이 토요일이기에 결석이 불가피해 고민했다.&lt;/del&gt;&lt;br&gt;하지만 무엇이든 해보는 경험이 늘 좋은 인사이트를 주었고, 파이썬도 충분히 매력적인 언어임을 알고 있기에 참여하게 되었다.&lt;/p&gt;
&lt;p&gt;본선은 오프라인으로 엘리스 Lab 성수점에서 진행되었다.&lt;br&gt;간단히 엘리스가 나아가고자 하는 방향과 목표에 대해서 들을 수 있었다.&lt;br&gt;교육 기업이 아니라 서비스 기업을 목표로 교육 서비스뿐만 아니라 AI, 클라우드 서비스 또한 적극적으로 제공하고 있었다.&lt;/p&gt;
&lt;p&gt;본선 참가자들에게 한해 웰컴 키트도 제공해 주었다.&lt;br&gt;마우스 패드, 칫솔 살균제 그리고 평소 구매할까 고민했던 팜레스트를 제공해주었다.&lt;br&gt;&lt;del&gt;아크릴 팜레스트로 겨울에 차가울까 걱정했는데 너무 편하고 좋다..&lt;/del&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/92948ac0-9434-4258-8d71-5261691a1efc/image.jpg&quot; alt=&quot;팜레스트&quot;&gt;&lt;/p&gt;
&lt;p&gt;3시간동안 본선 시험이 시작되었고, 엘리스 Lab에 존재하는 아이맥을 통해 대회를 진행했다.&lt;br&gt;아이맥과 매직 마우스를 처음 사용해보았는데 마우스 정말 불편했다..&lt;/p&gt;
&lt;h3&gt;시상식&lt;/h3&gt;
&lt;p&gt;대회가 모두 끝나고 시상식이 진행되었다.&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/15ea97b4-8a8b-4b36-8ae7-76ffc08e5444/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;사실 큰 기대는 안하고 받아봤자 장려상?? 정도를 기대했다.&lt;br&gt;하지만 장려상에서 내 이름을 나오지 않았고, 아쉽게 대회에서 수상을 못했구나 라고 지인과 연락하던 찰나 우수상에서 내 이름이 나왔다.&lt;br&gt;어안이 벙벙해 조금 늦게 나갔던 것 같다.&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/ddingmin/post/614b8c95-c108-40ec-9148-a2b7b5fb2bc3/image.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이후 진행했던 네트워킹 시간에도 자율적으로 이야기를 나누며 좋은 시간을 보냈다.&lt;br&gt;이후 약속이 있어서 더 많은 사람들과 대화해보지 못한 것은 아쉽지만 상품도 받으며 좋은 경험이 되었다!&lt;/p&gt;</description>
      <category>Diary &amp;amp; 후기</category>
      <category>대회</category>
      <category>파이썬</category>
      <category>회고</category>
      <category>후기</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/133</guid>
      <comments>https://ddingmin00.tistory.com/entry/%EC%97%98%EB%A6%AC%EC%8A%A4-%EC%BD%94%EB%93%9C-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%B3%B8%EC%84%A0-%EC%B0%B8%EC%97%AC-%ED%9B%84%EA%B8%B0#entry133comment</comments>
      <pubDate>Sat, 16 Dec 2023 16:45:13 +0900</pubDate>
    </item>
    <item>
      <title>[Infra] GitHub Actions를 통한 CI/CD 구축 - 1</title>
      <link>https://ddingmin00.tistory.com/entry/Infra-GitHub-Actions%EB%A5%BC-%ED%86%B5%ED%95%9C-CICD-%EA%B5%AC%EC%B6%95-1</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9thwG/btsByrVCrK9/A7a12YcPVKlpXk1SyEkknK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9thwG/btsByrVCrK9/A7a12YcPVKlpXk1SyEkknK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9thwG/btsByrVCrK9/A7a12YcPVKlpXk1SyEkknK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9thwG%2FbtsByrVCrK9%2FA7a12YcPVKlpXk1SyEkknK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;610&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;소프티어 부트캠프 프로젝트 과정을 진행하면서 몸으로 부딪히면 구축했던 CICD의 방법에 대해 남겨보려 한다.&lt;/blockquote&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAxFzF/btsBB7Pj0C6/mULR6KNkMlKNGkzgnZOLMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAxFzF/btsBB7Pj0C6/mULR6KNkMlKNGkzgnZOLMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAxFzF/btsBB7Pj0C6/mULR6KNkMlKNGkzgnZOLMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAxFzF%2FbtsBB7Pj0C6%2FmULR6KNkMlKNGkzgnZOLMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;441&quot; height=&quot;270&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 시작하기 앞서 짧은 기간 내에 성공적인 프로젝트를 위해서는 애자일한 방법의 프로젝트를 적용해 보는 것이 중요하다고 하셨다. 따라서 매주 유의미한 결과를 데모 영상으로 찍어내어야 한다는 조건 또한 주어졌다. 결국 작은 부분이라도 함께 완성된 부분을 만들어나가기 위해서는 자주 배포하는 환경이 필요했고, CICD 자동화 배포 환경을 구축하게 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgCSqo/btsBC6oPH7y/aWU8zMoEobkKnDRdc0kHB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgCSqo/btsBC6oPH7y/aWU8zMoEobkKnDRdc0kHB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgCSqo/btsBC6oPH7y/aWU8zMoEobkKnDRdc0kHB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgCSqo%2FbtsBC6oPH7y%2FaWU8zMoEobkKnDRdc0kHB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;316&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발자로서 프로젝트를 직접 배포해 본다면 CI/CD라는 키워드는 당연히 들어봤을 거라고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무작정 사용하고 적용하는 것이 아닌 왜 사용할까? 조금만 생각해 보자.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CI&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 CI란 Continuous Integration으로 지속적인 통합을 의미한다. 혼자서 진행하는 프로젝트가 아닌 이상 많은 팀원들이 함께 기능들을 구현하고 통합하게 된다. 이 과정에서 당연하게도 충돌은 발생하게 된다.&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;s&gt;복잡하게 작성된 코드들을 다시 읽어 오류를 찾는 것보다 새로 구현하는 게 더 빠른 경험은 다 있을 것이다!!&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 &lt;b&gt;개발하면서 발생하는 충돌 해결의 리소스를 줄이기 위한 방법&lt;/b&gt;이 CI 지속적 통합의 목표라고 할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CD&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CD란 Continuous Delivery / Deploy로 지속적인 배포를 의미한다. 두 가지의 뜻을 가지고 있지만 대게 통합해서 빌드된 파일을 전달하고, 배포하는 의미로 생각하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 서비스를 출시하기 위해 개발을 하고 배포에 성공했다. 하지만 첫 릴리즈 된 상태에서 예상치 못한 버그가 발생할 수 있고, 요구사항이 추가로 생겨 기능 개발을 할 상황이 있을 수 있다. 즉, 서비스를 유지하고 관리하기 위해서는 한 번의 배포만으로 끝나는 경우가 드물다. 또한 서버가 하나가 아니라 분산 환경에서 존재한다면 수동으로 배포하기에는 소요되는 리소스가 많아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 &lt;b&gt;배포하면서 발생하는 리소스를 줄이기 위한 방법&lt;/b&gt;이 CD 지속적 배포의 목표라고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실제로 자동화 배포를 도입하기 전에는 머지 데이가 존재했다. 머지 데이에는 개발자들이 모여 통합하면서 기도하고, 발생하는 수많은 오류에 밤을 새웠다고 한다..!  &lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitHub Actions&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 GitHub Actions에 대해 간단하게 알아보자.&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;1280&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OsDq4/btsByqh3nSx/YPzTJKKkrejWO0ytk0vvEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OsDq4/btsByqh3nSx/YPzTJKKkrejWO0ytk0vvEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OsDq4/btsByqh3nSx/YPzTJKKkrejWO0ytk0vvEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOsDq4%2FbtsByqh3nSx%2FYPzTJKKkrejWO0ytk0vvEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;448&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃헙 액션은 빌드, 테스트 및 배포 파이프 라인을 자동화할 수 있는 CICD 플랫폼이다. 리포지토리에 대한 모든 PR 요청을 빌드 및 테스트하거나 Merge 된 프로젝트를 배포할 수 있는 WorkFlow를 생성할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;WorkFlows&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;workflow를 정의하기 위해서는 yaml 파일로 .github/workflows 위치시켜야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Events&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트는 workflow를 실행시키기 위한 일종의 트리거이다. yaml 파일에 정의된 트리거인 PR을 요청하거나 merge 되는 특정 이벤트의 경우에 자동으로 인식해 workflow를 동작시킨다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Jobs&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 workflow에서 실행되는 일련의 작업의 단위이다. 각 단계는 순서대로 실행되거나 병렬적으로 실행될 수 있다. 각 단계는 동일한 환경에서 수행되므로 데이터들을 공유할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 특정 파일을 빌드하고 테스트하는 과정에서 빌드된 파일을 테스트 과정에 사용할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Actions&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 반복되는 작업들을 쉽게 사용할 수 있도록 구성된 작업을 가져와서 사용할 수 있도록 한 기능이다. 예를 들어 빌드 환경을 구성하는 일이나 SSH 접속을 위해 인증하는 일 등등 자주 사용되는 일들을 쉽게 라이브러리처럼 가져와 사용할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Runners&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;workflow가 트리거 될 때 실행되는 실행 환경이다. Ubuntu, Window, Mac OS의 가상 컴퓨터가 지원되며 해당 인스턴스에서 실제 동작이 이루어진다.&lt;/p&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;blockquote data-ke-style=&quot;style2&quot;&gt;[참고 문헌]&lt;br /&gt;https://docs.github.com/ko/actions&lt;br /&gt;https://velog.io/@adam2/Github%EC%97%90-Action%EC%9D%B4%EB%9D%BC%EB%8A%94-%ED%83%AD%EC%9D%B4-%EC%83%9D%EA%B2%BC%EB%8B%A4..-github-Action%EC%9D%B4%EB%9E%80-3gk336pk8q&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <category>인프라</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/132</guid>
      <comments>https://ddingmin00.tistory.com/entry/Infra-GitHub-Actions%EB%A5%BC-%ED%86%B5%ED%95%9C-CICD-%EA%B5%AC%EC%B6%95-1#entry132comment</comments>
      <pubDate>Thu, 7 Dec 2023 18:25:30 +0900</pubDate>
    </item>
    <item>
      <title>[백준/파이썬, 코틀린] 14658번 하늘에서 별똥별이 빗발친다</title>
      <link>https://ddingmin00.tistory.com/entry/%EB%B0%B1%EC%A4%80%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%ED%8B%80%EB%A6%B0-14658%EB%B2%88-%ED%95%98%EB%8A%98%EC%97%90%EC%84%9C-%EB%B3%84%EB%98%A5%EB%B3%84%EC%9D%B4-%EB%B9%97%EB%B0%9C%EC%B9%9C%EB%8B%A4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnWcwG/btsAPWOx2fA/lxpD2oQKtHRSbkCWztksiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnWcwG/btsAPWOx2fA/lxpD2oQKtHRSbkCWztksiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnWcwG/btsAPWOx2fA/lxpD2oQKtHRSbkCWztksiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnWcwG%2FbtsAPWOx2fA%2FlxpD2oQKtHRSbkCWztksiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;610&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&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;문제 주소&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14658&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/14658&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700797181664&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;14658번: 하늘에서 별똥별이 빗발친다&quot; data-og-description=&quot;첫째 줄에 네 정수 N, M, L, K가 주어진다. (1 &amp;le; N, M &amp;le; 500,000, 1 &amp;le; L &amp;le; 100,000, 1 &amp;le; K &amp;le; 100) N은 별똥별이 떨어지는 구역의 가로길이, M은 세로길이, L은 트램펄린의 한 변의 길이, K는 별똥별의 수를 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14658&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14658&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcPUOl/hyUCeIYFt9/5ULHJD3tBSYMNWsEQqYMF1/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/14658&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14658&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcPUOl/hyUCeIYFt9/5ULHJD3tBSYMNWsEQqYMF1/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;14658번: 하늘에서 별똥별이 빗발친다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 네 정수 N, M, L, K가 주어진다. (1 &amp;le; N, M &amp;le; 500,000, 1 &amp;le; L &amp;le; 100,000, 1 &amp;le; K &amp;le; 100) N은 별똥별이 떨어지는 구역의 가로길이, M은 세로길이, L은 트램펄린의 한 변의 길이, K는 별똥별의 수를&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;h2 style=&quot;color: #000000; text-align: start;&quot; 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;1159&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc4unt/btsAPL7rICr/LOszsuSiue7rGsePK1c9H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc4unt/btsAPL7rICr/LOszsuSiue7rGsePK1c9H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc4unt/btsAPL7rICr/LOszsuSiue7rGsePK1c9H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc4unt%2FbtsAPL7rICr%2FLOszsuSiue7rGsePK1c9H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;619&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;619&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;문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 n, m을 통해 그려서 풀기에는 너무 큰 입력 범위이다. 따라서 모든 범위를 완전 탐색해서 구할 수는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;떨어지는 별똥별의 입력 범위는 1 &amp;lt;= 100이므로 이 값을 최대한 활용해서 해결해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 별똥별이 떨어질 때 만들어질 수 있는 가장 큰 사각형 범위는 두 별똥별이 경계에 위치해 있을 때다. 이를 사각형으로 그려보면 두 별똥별의 최소 x, y 값을 시작으로 할 때 가장 큰 사각형 범위가 그려진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 사각형 시작 좌표와 그릴 수 있는 최대 크기인 l까지의 사각형을 그려 포함되는 별똥별들을 찾아나가면 n^3 (n = 100)의 시간복잡도로 문제를 해결해 나갈 수 있다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700797103740&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys


def solve(n, m, l, k, arr):
    answer = 0
    for i in range(k):
        for j in range(k):
            cnt = 0

            # 두 별을 걸치는 가장 왼쪽 상단 좌표
            sx, sy = min(arr[i][0], arr[j][0]), min(arr[i][1], arr[j][1])

            for x, y in arr:
                # 구한 좌표의 최대 범위 별 개수 구하기
                if sx &amp;lt;= x &amp;lt;= sx + l and sy &amp;lt;= y &amp;lt;= sy + l:
                    cnt += 1
            answer = max(answer, cnt)

    return k - answer


def main():
    n, m, l, k = map(int, input().split())
    arr = []
    for _ in range(k):
        arr.append(list(map(int, input().split())))
    print(solve(n, m, l, k, arr))


if __name__ == '__main__':
    sys.setrecursionlimit(10 ** 5)
    input = sys.stdin.readline
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Kotlin&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700797279681&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedWriter
import java.io.OutputStreamWriter

fun main() = with(System.`in`.bufferedReader()) {
    val sout = BufferedWriter(OutputStreamWriter(System.out))

    var line = readLine().split(&quot; &quot;).map { it.toInt() }
    var l = line[2]
    var k = line[3]

    var arr = Array(k) {
        readLine().split(&quot; &quot;).map { it.toInt() }
    }

    sout.appendLine(solve(l, k, arr))
    sout.close()
}

fun solve(l: Int, k: Int, arr: Array&amp;lt;List&amp;lt;Int&amp;gt;&amp;gt;): String {
    var count = 0

    for (star1 in arr) {
        for (star2 in arr) {
            var sx = minOf(star1[0], star2[0])
            var sy = minOf(star1[1], star2[1])
            var cnt = 0

            for (star in arr) {
                if (sx &amp;lt;= star[0] &amp;amp;&amp;amp; star[0] &amp;lt;= sx + l &amp;amp;&amp;amp;
                    sy &amp;lt;= star[1] &amp;amp;&amp;amp; star[1] &amp;lt;= sy + l
                ) {
                    cnt += 1
                }
            }
            count = maxOf(count, cnt)
        }
    }

    return (k - count).toString()
}&lt;/code&gt;&lt;/pre&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;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZaNED/btsAO7JNwm3/OIt4yyaBpel3lrEkjjObbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZaNED/btsAO7JNwm3/OIt4yyaBpel3lrEkjjObbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZaNED/btsAO7JNwm3/OIt4yyaBpel3lrEkjjObbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZaNED%2FbtsAO7JNwm3%2FOIt4yyaBpel3lrEkjjObbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1156&quot; height=&quot;125&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>코틀린</category>
      <category>파이썬</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/131</guid>
      <comments>https://ddingmin00.tistory.com/entry/%EB%B0%B1%EC%A4%80%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%ED%8B%80%EB%A6%B0-14658%EB%B2%88-%ED%95%98%EB%8A%98%EC%97%90%EC%84%9C-%EB%B3%84%EB%98%A5%EB%B3%84%EC%9D%B4-%EB%B9%97%EB%B0%9C%EC%B9%9C%EB%8B%A4#entry131comment</comments>
      <pubDate>Fri, 24 Nov 2023 12:55:00 +0900</pubDate>
    </item>
    <item>
      <title>당근 SERVER 밋업 2회 참가 후기</title>
      <link>https://ddingmin00.tistory.com/entry/%EB%8B%B9%EA%B7%BC-SERVER-%EB%B0%8B%EC%97%85-2%ED%9A%8C-%EC%B0%B8%EA%B0%80-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://festa.io/events/4140&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://festa.io/events/4140&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698592712919&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;당근 SERVER 밋업 2회 | Festa!&quot; data-og-description=&quot;Festa에서 당신이 찾는 이벤트를 만나보세요.&quot; data-og-host=&quot;festa.io&quot; data-og-source-url=&quot;https://festa.io/events/4140&quot; data-og-url=&quot;https://festa.io/events/4140&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZpEdM/hyUnO31mA8/RFGmyNhNxOOCtzRG5E3ZCK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://festa.io/events/4140&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://festa.io/events/4140&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZpEdM/hyUnO31mA8/RFGmyNhNxOOCtzRG5E3ZCK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;당근 SERVER 밋업 2회 | Festa!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Festa에서 당신이 찾는 이벤트를 만나보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;festa.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;당근 SERVER 밋업 2회&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZqYV2/btszjCFtVsK/NLTBnj5DxKPvKTuBiJ5lR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZqYV2/btszjCFtVsK/NLTBnj5DxKPvKTuBiJ5lR1/img.png&quot; data-alt=&quot;당근 당근 굿즈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZqYV2/btszjCFtVsK/NLTBnj5DxKPvKTuBiJ5lR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZqYV2%2FbtszjCFtVsK%2FNLTBnj5DxKPvKTuBiJ5lR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1536&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;당근 당근 굿즈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버스가 늦어 살짝 늦게 도착하게 되었는데 FESTA로 발급받은 QR코드를 입력하여 입장할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입장해서는 물과 세션 정보가 담긴 이름표, 다양한 굿즈들을 받을 수 있었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히도 막 세션을 막 시작하려는 참이라 허겁지겁 자리 앉았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동아리 단위가 아니라 기업 단위의 세미나는 처음으로 참여하게 되어, 신입으로 취준하고 있는 내가 온전히 받아낼 수 있을까 걱정되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 생각보다 자유롭고 편안한 분위기에서 진행되었고, 당근이도 귀여웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한편에는 사진을 찍을 수 있는 부스? 같은 곳이 존재했는데, 같이 온 지인들과 사진도 찍었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억에 남거나, 공감하던 내용들을 정리해보려 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 달 동안 만든 서비스, 일 년 반 만에 전국 오픈하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당근 마켓의 모임 서비스를 담당하는 팀의 이야기였다. &quot;&lt;i&gt;핵심 가치를 위해 수단과 방법을 가리지 않고 개발한다&lt;/i&gt;.&quot;는 모토를 가지고 개발한 팀이다. 당근의 자유로운 개발 분위기를 느낄 수 있었던 문구였던 것 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API 명세서를 레포지토리에 관리하여 업데이트의 기록을 남길 수 있다는 이야기&lt;/li&gt;
&lt;li&gt;두 도메인을 합치면서 겪은&amp;nbsp;문제점과 해결 과정&lt;/li&gt;
&lt;li&gt;읽기 트래픽의 성능 개선을 위해 기간 별 증분 쿼리를 통한 쿼리 성능 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등등.. 다양한 이야기를 들을 수 있었다. 특히나 증분 쿼리에 관한 내용은 이전에 프로젝트를 진행하면서 대용량 데이터를 삽입하고, 응답 시간을 개선해 본 경험이 있었는데 그 과정에서 생각하지 못했던 부분이라 크게 와닿았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막에 해주신 말씀이 생각보다 간단해 보이는 것들이 수많은 고민의 산물이라는 말이 잘 느껴졌다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;당근페이 금융 거래 통합 테스트 개발 이야기&lt;/h2&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;단순히 하나의 도메인 내에서 작동하는 기능들의 테스트를 작성하는 데는 큰 문제가 없지만, 외부의 요인과 의존되는 부분의 테스트는 늘 고민되고 어려웠다. Mock을 적절히 활용한 이야기들을 들을 수 있었다.&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;그 외에도 DX에 대한 이야기, 모놀리식 서비스에서 MSA로 디컴프하기, 서킷 브레이커, 이벤트 소싱, 운영 서비스에서 설정 가능성 높이 개발하기 등등 다양한 이야기를 들을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히나 서킷 브레이커, 이벤트 소싱에 대해서는 접해보지 못한 개념들이었지만 쉽게 발표해 주셔서 공부해보고 싶은 마음이 생겼다. 이벤트 소싱은 다음 프로젝트에서 꼭 적용해보고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 얼마나 잘 개발했어요가 아니라 실제로 부딪혔던 문제들을 모두 이야기해 주면서 진행했던 밋업이라 좋은 경험이 되었던 것 같다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Diary &amp;amp; 후기</category>
      <category>당근</category>
      <category>밋업</category>
      <category>세미나</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/130</guid>
      <comments>https://ddingmin00.tistory.com/entry/%EB%8B%B9%EA%B7%BC-SERVER-%EB%B0%8B%EC%97%85-2%ED%9A%8C-%EC%B0%B8%EA%B0%80-%ED%9B%84%EA%B8%B0#entry130comment</comments>
      <pubDate>Sat, 11 Nov 2023 03:39:24 +0900</pubDate>
    </item>
    <item>
      <title>[백준/파이썬] 30023번 전구 상태 바꾸기</title>
      <link>https://ddingmin00.tistory.com/entry/%EB%B0%B1%EC%A4%80%ED%8C%8C%EC%9D%B4%EC%8D%AC-30023%EB%B2%88-%EC%A0%84%EA%B5%AC-%EC%83%81%ED%83%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFQ92/btszzCw0VN2/8IfBBUh7gGVoxt5mjaWot0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFQ92/btszzCw0VN2/8IfBBUh7gGVoxt5mjaWot0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFQ92/btszzCw0VN2/8IfBBUh7gGVoxt5mjaWot0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFQ92%2FbtszzCw0VN2%2F8IfBBUh7gGVoxt5mjaWot0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;610&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제 주소: &lt;a href=&quot;https://www.acmicpc.net/problem/30023&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/30023&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698768161085&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;30023번: 전구 상태 바꾸기&quot; data-og-description=&quot;$N$개의 전구가 일렬로 세워져 빛나고 있다. 각각의 전구는 빨간색, 초록색, 파란색 중 하나의 색으로 빛나고 있다. 지원이는 $N$개의 전구 중 연속한 세 전구를 선택한 후에 그 전구들의 상태를 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/30023&quot; data-og-url=&quot;https://www.acmicpc.net/problem/30023&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cg22iv/hyUnYF4dB9/XsPXsO4NI2ykKiZlKEXBj0/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/30023&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/30023&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cg22iv/hyUnYF4dB9/XsPXsO4NI2ykKiZlKEXBj0/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;30023번: 전구 상태 바꾸기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;$N$개의 전구가 일렬로 세워져 빛나고 있다. 각각의 전구는 빨간색, 초록색, 파란색 중 하나의 색으로 빛나고 있다. 지원이는 $N$개의 전구 중 연속한 세 전구를 선택한 후에 그 전구들의 상태를&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;h2 style=&quot;color: #000000; text-align: start;&quot; 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;1154&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GrFCO/btszxs9MkfE/956DBYZoPbmlNtl7oeJ6L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GrFCO/btszxs9MkfE/956DBYZoPbmlNtl7oeJ6L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GrFCO/btszxs9MkfE/956DBYZoPbmlNtl7oeJ6L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGrFCO%2Fbtszxs9MkfE%2F956DBYZoPbmlNtl7oeJ6L0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;196&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;196&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;문제 풀이&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전구를 시작 색의 경우의 수는 3가지이다.&lt;br /&gt;0122의 전구가 존재한다면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 012 &lt;br /&gt;2. 120 &lt;br /&gt;3. 201&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음의 경우의 수를 시작으로 0번째 전구와 동일하도록 끝까지 전구의 상태를 변경하여, 조건에 맞는다면 최솟값을 갱신해나간다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1698768119528&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import sys

input = sys.stdin.readline


# input
n = int(input())
arr = list(input().strip())
change = {'R': 'G', 'G': 'B', 'B': 'R'}

# func
def change_light(idx, arr):
    arr[idx], arr[idx + 1], arr[idx + 2] = change[arr[idx]], change[arr[idx + 1]], change[arr[idx + 2]]
    return arr


def solve(new_arr):
    count = 0

    # (1 ~ n - 2)까지의 전구를 0번째 전구와 동일한 색으로 맞춰주기
    for i in range(1, n - 2):
        while new_arr[0] != new_arr[i]:
            count += 1
            new_arr = change_light(i, new_arr)
    # 0번째, -1, -2번째 전구가 모두 동일하다면 모든 전구가 동일하다.
    if new_arr[0] == new_arr[-1] == new_arr[-2]:
        return count
    return float('inf')


# solve
answer = float('inf')

# 시작 경우의 수는 3가지
for i in range(3):
    answer = min(answer, solve(arr.copy()) + i)

    # 0, 1, 2 전구 돌리기
    arr = change_light(0, arr)

if answer == float('inf'):
    answer = -1
print(answer)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;제출 결과&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMaQon/btszy5zqTKP/hFhqWQuxmfzl0TfEnPc7lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMaQon/btszy5zqTKP/hFhqWQuxmfzl0TfEnPc7lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMaQon/btszy5zqTKP/hFhqWQuxmfzl0TfEnPc7lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMaQon%2Fbtszy5zqTKP%2FhFhqWQuxmfzl0TfEnPc7lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;254&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
그리디..&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>BOJ</category>
      <category>그리디</category>
      <category>파이썬</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/129</guid>
      <comments>https://ddingmin00.tistory.com/entry/%EB%B0%B1%EC%A4%80%ED%8C%8C%EC%9D%B4%EC%8D%AC-30023%EB%B2%88-%EC%A0%84%EA%B5%AC-%EC%83%81%ED%83%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0#entry129comment</comments>
      <pubDate>Wed, 1 Nov 2023 01:06:48 +0900</pubDate>
    </item>
    <item>
      <title>[HTTP] 쿠키와 쿠키를 삭제하는 응답 메시지 보내기</title>
      <link>https://ddingmin00.tistory.com/entry/HTTP-%EC%BF%A0%ED%82%A4%EC%99%80-%EC%BF%A0%ED%82%A4%EB%A5%BC-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EC%9D%91%EB%8B%B5-%EB%A9%94%EC%8B%9C%EC%A7%80-%EB%B3%B4%EB%82%B4%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;UI (3).jpg&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm0PDP/btso119DpHg/sLIA37GZgd07eN0nKvPJaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm0PDP/btso119DpHg/sLIA37GZgd07eN0nKvPJaK/img.jpg&quot; data-alt=&quot;쿠키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm0PDP/btso119DpHg/sLIA37GZgd07eN0nKvPJaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm0PDP%2Fbtso119DpHg%2FsLIA37GZgd07eN0nKvPJaK%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;610&quot; height=&quot;610&quot; data-filename=&quot;UI (3).jpg&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쿠키&lt;/figcaption&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;HTTP는 무상태를 기반으로 하는 프로토콜이다. 따라서 우리가 구현해야 하는 로그인을 구현해 사용자가 로그인을 하더라도, 이후 요청에서 마이페이지를 조회하는 요청이 오더라도 로그인 정보를 기록해두지 않아 누구의 마이페이지 인지 알 수 없다. 즉, 클라이언트가 다시 요청을 하면 서버는 이전 요청을 기억하지 못한다. &amp;rarr; 클라이언트와 유저는 상태를 유지하지 않는다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 과정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;홍길동이라는 클라이언트가 서버에게 로그인을 요청한다.&lt;/li&gt;
&lt;li&gt;로그인을 완료시킨 서버는 Set-Cookie 헤더를 통해 쿠키를 유저에게 전달한다.&lt;/li&gt;
&lt;li&gt;클라이언트의 웹 브라우저는 쿠키 저장소에 전달 받은 쿠키를 저장한다.&lt;/li&gt;
&lt;li&gt;로그인 이후에 웹 브라우저는 어떠한 요청을 수행하더라도 저장된 쿠키를 Cookie 헤더에 담아 전달한다.&lt;/li&gt;
&lt;li&gt;서버는 Cookie 헤더를 읽어 어떤 유저인지 알 수 있게 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서 사용되는 것이 세션 ID이다.&lt;/li&gt;
&lt;li&gt;세션 ID는 클라이언트의 로그인 요청 시 서버에서 만들어서 미리 저장한 뒤 이를 클라이언트에게 전달하고, 클라이언트는 이 세션 ID를 활용해 접속을 유지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;광고 정보를 트래킹 할 때 사용한다.&lt;/li&gt;
&lt;li&gt;쇼핑의 경우 장바구니와 같은 기능을 사용할 때 사용된다.&lt;/li&gt;
&lt;li&gt;사용자의 선호도와 설정을 기억해 개인화된 정보로 웹사이트를 제공한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 언어, 지역, 테마와 같은 정보를 쿠키에 담아 저장한 뒤 다음 방문에도 이를 적용하여 요청을 응답해 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키의 정보는 매번 요청 시마다 담겨 서버에 요청한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이는 서버에 트래픽을 추가로 유발하게 된다. 따라서 최소한의 정보만을 사용하도록 하는 것이 좋다. (세션 Id, 인증 토큰 관련된 로그인값 정도만 사용하는 것이 좋다.)&lt;/li&gt;
&lt;li&gt;로그인 정보 외에 필요한 정보에만 쿠키에 담아 요청해야 하는 정보는 웹 스토리지를 통해 전달하고, 필요에 따라 가져와서 사용하도록 구현하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;쿠키는 저장해두어야 하는 정보이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키를 사용하기 위해서는 서버에서 쿠키 데이터를 저장한 뒤 사용해야 한다. 이는 서버의 저장 공간에 부담이 갈 수 있다.&lt;/li&gt;
&lt;li&gt;유효 기간이 지난 쿠키를 클라이언트에서 자동으로 삭제되지 않는다. 이 쿠키를 삭제하기 위한 로직도 추가적으로 만들어 주어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;쿠키는 클라이언트에서 조작할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 쿠키를 만들어 전송하는 것은 서버이지만, 저장되는 곳은 사용자의 브라우저이기 때문에 사용자는 쿠키를 조작할 수 있다. 따라서 보안성을 생각해야 하며, 민감한 정보는 쿠키에 담지 않는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클라이언트 측면에서의 단점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키는 브라우저에 저장되는 데이터이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저마다 쿠키의 용량이 제한된다. 따라서 저장할 수 있는 정보가 제한되고, 쿠키의 용량이 커지면 브라우저 성능에 영향을 미칠 수 있다.&lt;/li&gt;
&lt;li&gt;쿠키는 유효 기간을 설정할 수 있다. 만약 이를 설정하지 않거나, 유효 기간이 지난 쿠키는 브라우저가 종료되기 전까지 삭제되지 않기 때문에 불필요한 데이터가 쌓이게 되는 문제가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;쿠키를 지원하지 않는 클라이언트가 존재할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일부 클라이언트는 쿠키를 비활성화하는 경우도 존재한다. 이 경우를 방지하기 위해 다른 대체 기능을 구현해 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;쿠키에 담기는 데이터&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;expires: 만료 날짜 데이터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만료 날짜를 지정하면 영속 쿠키로 해당 날짜까지 쿠키가 유지된다.&lt;/li&gt;
&lt;li&gt;만료 날짜를 생략하면 세션 쿠키로 브라우저 종료 시까지만 유지된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;max-age: 초 단위로 세팅하며 쿠키의 생명 주기를 지정한다.&lt;/li&gt;
&lt;li&gt;domain: 접근할 도메인을 지정한다.(&lt;a href=&quot;http://naver.com&quot;&gt;naver.com&lt;/a&gt;)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 도메인을 생략하면 해당 도메인에서만 접근할 수 있다.&lt;/li&gt;
&lt;li&gt;이 도메인을 입력하면 해당 도메인과 하위 도메인 모두 접근할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;path: 경로를 지정해 줄 수 있다.(/user) (일반적으로 &amp;ldquo;/&amp;rdquo; 루트 패스로 지정한다.)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정한 경로를 포함한 하위 경로에서만 접근할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;secure: 이 쿠키를 넣으면 https에서만 전송하고, 넣지 않으면 http https 모두 전송한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;쿠키를 삭제하는 방법!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿠키를 삭제되지 않아 꽤나 고생했다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;HTTP/1.1 302 Found
Set-Cookie: sid=3d51fac6-8e92-453b-aff9-e4cfeb422264; path=/
Location: /index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 메시지는 내가 쿠키를 설정할 때 전송된 HTTP 응답 메시지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트는 해당 메시지를 읽고, 쿠키로 sid의 값을 저장한 뒤 서버에게 요청마다 쿠키헤더에 담아 전송한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Cookie: sid=3d51fac6-8e92-453b-aff9-e4cfeb422264
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 매 요청마다 다음과 같은 헤더가 달려 전송되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;HTTP/1.1 302 Found
Set-Cookie: sid=3a717e59-8400-4847-b1d3-90cea2582f28; Expires=Thu, 01 Jan 2000 00:00:00 GMT;
Location: /index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 쿠키를 삭제시켜 주기 위해서는 Expires를 현재 or 과거 시간대로 두어 삭제시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 Max-age의 시간을 0으로 두어 삭제할 수 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 삭제되지 않았다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 다양한 방법을 시도했다. 먼저 Set-Cookie에 값을 빈 값이나, 다른 값으로 변경해보기도 하고, 상태 응답코드를 302가 되는 경우 리다렉트 때문에 쿠키가 삭제되지 않을 수 있다는 이야기도 있어 200 상태코드로 바꾸어해보기도 하였다. 하지만 캐시는 끝까지 삭제되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유를 열심히 찾아본 결과 브라우저에게 캐시 삭제를 강요할 수 없다는 이야기를 들었고, 내가 내린 판단은 브라우저가 브라우저를 닫을 때 일괄적으로 삭제된다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 주변분들의 도움을 받아 더 다양한 경우를 시도해 본 결과 문제는 Set-Cookie의 내용에 path=/ 부분이 빠진 것이었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론은 단 하나..&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;path=/ 빼먹지 말자..!!&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;HTTP/1.1 302 Found
Set-Cookie: sid=3a717e59-8400-4847-b1d3-90cea2582f28; Expires=Thu, 01 Jan 2000 00:00:00 GMT; path=/
Location: /index.html&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 삭제에 성공한 요청 메시지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[참고자료]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;김영한 님 MVC 2편 스프링 강의&lt;/p&gt;</description>
      <category>Study</category>
      <category>HTTP</category>
      <category>쿠키</category>
      <author>ddingmin00</author>
      <guid isPermaLink="true">https://ddingmin00.tistory.com/128</guid>
      <comments>https://ddingmin00.tistory.com/entry/HTTP-%EC%BF%A0%ED%82%A4%EC%99%80-%EC%BF%A0%ED%82%A4%EB%A5%BC-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EC%9D%91%EB%8B%B5-%EB%A9%94%EC%8B%9C%EC%A7%80-%EB%B3%B4%EB%82%B4%EA%B8%B0#entry128comment</comments>
      <pubDate>Thu, 27 Jul 2023 02:21:27 +0900</pubDate>
    </item>
  </channel>
</rss>