<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>나를 찾는 아이</title>
    <link>https://trend21c.tistory.com/</link>
    <description>Simple is the best, Go to basic</description>
    <language>ko</language>
    <pubDate>Tue, 9 Jun 2026 13:35:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>나를찾는아이</managingEditor>
    <image>
      <title>나를 찾는 아이</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2052C4374EBA448A26</url>
      <link>https://trend21c.tistory.com</link>
    </image>
    <item>
      <title>mcp 서버로 xcode를 사용하기</title>
      <link>https://trend21c.tistory.com/2410</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;codex, claude code, gemini-cli 와 같이 cli를 통해 ios 어플리케이션을 위한 코드 작업을 할때 &lt;a href=&quot;https://developer.apple.com/documentation/xcode/giving-external-agents-access-to-xcode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;xcode mcp&lt;/a&gt;를 사용하여 xcode 바깥에서 앱을 빌드하거나 xcode에서 가능한 여러 액션들을 수행할 수 있습니다&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-filename=&quot;스크린샷 2026-05-02 오후 8.51.29.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgpe3m/dJMcaa6eNjm/JsWhlMz8OhFdqgEiY1Kzp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgpe3m/dJMcaa6eNjm/JsWhlMz8OhFdqgEiY1Kzp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgpe3m/dJMcaa6eNjm/JsWhlMz8OhFdqgEiY1Kzp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgpe3m%2FdJMcaa6eNjm%2FJsWhlMz8OhFdqgEiY1Kzp1%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;1668&quot; height=&quot;1402&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.51.29.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1402&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;xcode - settings - Intelligence 설정에서&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;Model Context Protocol 설정을 찾을 수 있으며&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;클로드코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777722785038&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude mcp add --transport stdio xcode -- xcrun mcpbridge&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777722792814&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;codex mcp add xcode -- xcrun mcpbridge&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;gemini&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777722809391&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gemini mcp add xcode-tools xcrun mcpbridge&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;위의 명령어로 mcp 설정이 가능하며&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;해당 설정으로 mcp를 등록하고 난 다음에는 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;그리고 이후에 cli를 통해 claude code, codex, gemini 어떤것이든 실행하시면&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-filename=&quot;스크린샷 2026-05-02 오후 8.54.57.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyzuT0/dJMcabqydl9/fYAgLsODjg8Whlgv6CWa00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyzuT0/dJMcabqydl9/fYAgLsODjg8Whlgv6CWa00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyzuT0/dJMcabqydl9/fYAgLsODjg8Whlgv6CWa00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyzuT0%2FdJMcabqydl9%2FfYAgLsODjg8Whlgv6CWa00%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;612&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.54.57.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;612&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;mcp가 활성화되면서 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;cli 접근을 허용하시면 이후에는 cli를 통해 xcode mcp를 사용하여 여러 명령어를 수행이 가능합니다&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;혹시 mcp도 등록하고 cli를 실행했는데 해당 퍼미션 허용 창이 나타나지 않는다면&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.56.34.png&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QVJF8/dJMcahK3Kkv/phzFzunnQBGtQZ6d7UPGd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QVJF8/dJMcahK3Kkv/phzFzunnQBGtQZ6d7UPGd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QVJF8/dJMcahK3Kkv/phzFzunnQBGtQZ6d7UPGd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQVJF8%2FdJMcahK3Kkv%2FphzFzunnQBGtQZ6d7UPGd0%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;1660&quot; height=&quot;956&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.56.34.png&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;956&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;xcode - settings - Locations에서 Command Line Tools에서 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;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>Agent</category>
      <category>AI</category>
      <category>MCP</category>
      <category>Xcode</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2410</guid>
      <comments>https://trend21c.tistory.com/2410#entry2410comment</comments>
      <pubDate>Sun, 3 May 2026 21:57:44 +0900</pubDate>
    </item>
    <item>
      <title>xcode 26.3에서 gemini 를 provider model로 등록하기</title>
      <link>https://trend21c.tistory.com/2409</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;xcode 26.3 부터는 강력한 &lt;a href=&quot;https://www.apple.com/newsroom/2026/02/xcode-26-point-3-unlocks-the-power-of-agentic-coding/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;에이전틱 코딩&lt;/a&gt;이 가능해졌습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.05.33.png&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;1156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RNbY3/dJMcadhzKE7/9vG94fq4eeZQLqvqKKxIKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RNbY3/dJMcadhzKE7/9vG94fq4eeZQLqvqKKxIKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RNbY3/dJMcadhzKE7/9vG94fq4eeZQLqvqKKxIKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRNbY3%2FdJMcadhzKE7%2F9vG94fq4eeZQLqvqKKxIKK%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;1628&quot; height=&quot;1156&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.05.33.png&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;1156&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;여러분이 쓰시던 vscode, antigravity, cursor 처럼 ai가 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;해당 업데이트를 사용하시려면&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도 최신버전으로 업데이트 해야하고,&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;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;최신 버전의 xcode를 설치하시면 xcode - settings - intelligence 설정을 통해서 gpt나 claude의 경우 빌트인되어있어 매우 쉽게 적용이 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api 사용이나 계정 사용 모두 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌트인은 gpt와 claude만 되어있지만 커스텀한 chat provider를 설정할수 있어, 그외 다른 ai model을 사용하거나 local llm도 설정이 가능합니다&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;gemini를 설정하기 위해서는 다음과 같이 설정하시면 됩니다&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-filename=&quot;스크린샷 2026-05-02 오후 8.35.12.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rF6t9/dJMcagZD3DT/6wdfOw7tuqdbhL3dicqkXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rF6t9/dJMcagZD3DT/6wdfOw7tuqdbhL3dicqkXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rF6t9/dJMcagZD3DT/6wdfOw7tuqdbhL3dicqkXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrF6t9%2FdJMcagZD3DT%2F6wdfOw7tuqdbhL3dicqkXK%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;982&quot; height=&quot;796&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.35.12.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;796&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;URL : &lt;a href=&quot;https://generativelanguage.googleapis.com/v1beta/openai&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://generativelanguage.googleapis.com/v1beta/openai&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API Key : &lt;a href=&quot;https://aistudio.google.com/api-keys&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aistudio.google.com/api-keys&lt;/a&gt; 여기서 새로운 키를 발급받거나 기존 api 키를 사용하시면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그외 나머지 API Key Header는 기본값으로 두시면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.35.50.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;1386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm3Tve/dJMcabD36VN/RKbxUK6NPANmuQJ1degNIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm3Tve/dJMcabD36VN/RKbxUK6NPANmuQJ1degNIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm3Tve/dJMcabD36VN/RKbxUK6NPANmuQJ1degNIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm3Tve%2FdJMcabD36VN%2FRKbxUK6NPANmuQJ1degNIK%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;1254&quot; height=&quot;1386&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.35.50.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;1386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 설정을 마무리하면, 사용가능한 모델이 주루룩 나타나고 필요한 모델만 체크를 하시면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 3.1 Pro Preview 이렇게만 설정해도 충분할것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.37.06.png&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boZQcH/dJMcahYzAuv/XkXZ3hcPigsWol4d60RI7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boZQcH/dJMcahYzAuv/XkXZ3hcPigsWol4d60RI7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boZQcH/dJMcahYzAuv/XkXZ3hcPigsWol4d60RI7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboZQcH%2FdJMcahYzAuv%2FXkXZ3hcPigsWol4d60RI7K%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;934&quot; height=&quot;848&quot; data-filename=&quot;스크린샷 2026-05-02 오후 8.37.06.png&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;848&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;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>Agent</category>
      <category>gemini</category>
      <category>Xcode</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2409</guid>
      <comments>https://trend21c.tistory.com/2409#entry2409comment</comments>
      <pubDate>Sat, 2 May 2026 20:38:55 +0900</pubDate>
    </item>
    <item>
      <title>지하철에 노트북을 두고 내렸어요</title>
      <link>https://trend21c.tistory.com/2408</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지하철역에서 노트북이 든 가방을 선반 위에 올려 놓고 깜빡 잊고 무심코 내려버렸습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말씀드리면 노트북을 무사히 찾았습니다&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;h3 data-ke-size=&quot;size23&quot;&gt;앗! 노트북을 두고 내렸다는 사실을 인지하다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경험이 처음이라 GPT에 물어보았습니다&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;h3 data-ke-size=&quot;size23&quot;&gt;유실물센터에 연락하다&lt;/h3&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;1577-1234&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;그래서 통합 유실물 센터에 전화를 했는데 20분이 넘어도 연락이 되지 않는 거예요.&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한없이 기다렸던 유실물센터와 달리 바로 전화를 받았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 어디행을 탔는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 무슨역에서 내렸는지&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;
&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 5호선 마천행을 탔던터라 마천역(02-6311-5601)에 전화를 걸었습니다&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;h3 data-ke-size=&quot;size23&quot;&gt;역무원은 확인해보고 연락을 주신다고 하셨고, 하염없이 전화를 기다리다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 세상에 선반위에 있는 가방에 누가 관심이 있나 싶기도하고, 설마 대한민국에서 자전거가 아닌 가방을 가져갔을까 싶기도했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;담당자에게 전화가 왔는데 청소하시는분들께서 아무것도 발견하지 못했다고 얘기해주셨습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;경찰민원24로&lt;/h3&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;a href=&quot;https://minwon24.police.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://minwon24.police.go.kr/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1774527691273&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;경찰민원24&quot; data-og-description=&quot;현재 접속 사용자가 많아 대기중이며, 잠시만 기다리시면 자동 접속됩니다.&quot; data-og-host=&quot;minwon24.police.go.kr&quot; data-og-source-url=&quot;https://minwon24.police.go.kr/&quot; data-og-url=&quot;https://minwon24.police.go.kr/main.do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nzHgw/dJMb81GWXZG/QSgfeJPZBx9N68MlQHJI1K/img.png?width=1100&amp;amp;height=440&amp;amp;face=699_175_790_274,https://scrap.kakaocdn.net/dn/oGy62/dJMb9aKEQVk/g0otU4jm0GiCjwLu500UkK/img.png?width=1100&amp;amp;height=440&amp;amp;face=709_202_972_287&quot;&gt;&lt;a href=&quot;https://minwon24.police.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://minwon24.police.go.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nzHgw/dJMb81GWXZG/QSgfeJPZBx9N68MlQHJI1K/img.png?width=1100&amp;amp;height=440&amp;amp;face=699_175_790_274,https://scrap.kakaocdn.net/dn/oGy62/dJMb9aKEQVk/g0otU4jm0GiCjwLu500UkK/img.png?width=1100&amp;amp;height=440&amp;amp;face=709_202_972_287');&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;경찰민원24&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;minwon24.police.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역무원은 경찰민원24에 분실물이 다른곳에 접수되었다면 올라올거라고 얘기를 해주셨어요&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-filename=&quot;스크린샷 2026-03-26 오후 9.22.22.png&quot; data-origin-width=&quot;2510&quot; data-origin-height=&quot;1576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FfNCN/dJMcadOT7d1/ZyuMQpMLjXtZDf4Sb3xOgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FfNCN/dJMcadOT7d1/ZyuMQpMLjXtZDf4Sb3xOgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FfNCN/dJMcadOT7d1/ZyuMQpMLjXtZDf4Sb3xOgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFfNCN%2FdJMcadOT7d1%2FZyuMQpMLjXtZDf4Sb3xOgK%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;2510&quot; height=&quot;1576&quot; data-filename=&quot;스크린샷 2026-03-26 오후 9.22.22.png&quot; data-origin-width=&quot;2510&quot; data-origin-height=&quot;1576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 자기 전까지 제 노트북 가방이 올라왔는지 습득물 검색을 해서 보았는데 올라오지 않았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매우 실망한 마음으로 자고 일어나서 다음날 아침 에 분실물 조회를 해보니 두둥!&lt;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 게시물을 올린곳이 제가 전화한곳과 반대방향 종점인 방화역에 있었더라구요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국에 방화역에 가서 물건을 찾았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 물건임을 확인시켜드리기 위해 노트북의 비밀번호를 입력하여 잠금이 풀리는것 보여드렸습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;궁금한점이 왜 마천에서 못찾고 방화에서 찾았는지 여쭈보았는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;
&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;</description>
      <category>일상</category>
      <category>경찰민원24</category>
      <category>노트북</category>
      <category>분실물</category>
      <category>지하철</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2408</guid>
      <comments>https://trend21c.tistory.com/2408#entry2408comment</comments>
      <pubDate>Thu, 26 Mar 2026 21:29:18 +0900</pubDate>
    </item>
    <item>
      <title>취득세 똑똑하게 무이자할부로 카드로 납부하자</title>
      <link>https://trend21c.tistory.com/2405</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;취득세 카드로 납부 가능하다는 사실 알고 계셨나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 무이자 할부까지 가능합니다&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;/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;a href=&quot;https://etax.seoul.go.kr/CardEvntAction.tran?workcd=notice&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://etax.seoul.go.kr/CardEvntAction.tran?workcd=notice&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1746450271435&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;ETAX 카드 무이자 이벤트 | 서울시ETAX&quot; data-og-description=&quot;&amp;gt; 조회납부 &amp;gt; 회원납부 --&amp;gt; 제목 □ 신용카드 무이자 할부 안내 (종합) 관련부서 ETAX 지방세(자동차세,재산세 등), 세외수입(대부료, 사용료, 과태료, 상하수도요금 등) 신용카드 무이자 할부 서비&quot; data-og-host=&quot;etax.seoul.go.kr&quot; data-og-source-url=&quot;https://etax.seoul.go.kr/CardEvntAction.tran?workcd=notice&quot; data-og-url=&quot;https://etax.seoul.go.kr/CardEvntAction.tran?workcd=notice&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://etax.seoul.go.kr/CardEvntAction.tran?workcd=notice&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://etax.seoul.go.kr/CardEvntAction.tran?workcd=notice&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ETAX 카드 무이자 이벤트 | 서울시ETAX&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt; 조회납부 &amp;gt; 회원납부 --&amp;gt; 제목 □ 신용카드 무이자 할부 안내 (종합) 관련부서 ETAX 지방세(자동차세,재산세 등), 세외수입(대부료, 사용료, 과태료, 상하수도요금 등) 신용카드 무이자 할부 서비&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;etax.seoul.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 카드사마다 제공하는 혜택을 확인할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-27 오후 12.23.36.png&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQlYM3/btsNLSTFGVT/kga8RsZ5YVVFkRrgxoK8t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQlYM3/btsNLSTFGVT/kga8RsZ5YVVFkRrgxoK8t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQlYM3/btsNLSTFGVT/kga8RsZ5YVVFkRrgxoK8t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQlYM3%2FbtsNLSTFGVT%2Fkga8RsZ5YVVFkRrgxoK8t1%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;1340&quot; height=&quot;1712&quot; data-filename=&quot;스크린샷 2025-04-27 오후 12.23.36.png&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;1712&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;제가 경험했던 시기에 가장 좋은 혜택은 NH카드였습니다&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;6개월 무이자 할부였습니다&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;취득세 납부를 위해 임시적으로 한도를 상향할 수 있습니다&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;NH카드의 경우 임시한도 상향을 위해 NH농협 영업점에 방문을 해야합니다&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;/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;/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;영업점에 방문하여 취득세 납부를 위해 목적별 한도 상향을 요청하면 업무를 처리해줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심사가 필요하다고 하나&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저의 경우는 당일에 바로 상향된것을 앱을 통해 확인할 수 있었습니다&lt;/p&gt;
&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;취득세 납부는 서울의 경우 stax 앱을 통해 가능합니다&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;a href=&quot;https://play.google.com/store/apps/details?id=com.shinhan.stax&amp;amp;hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/store/apps/details?id=com.shinhan.stax&amp;amp;hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1746451131801&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;서울시 세금납부 - 서울시 STAX - Google Play 앱&quot; data-og-description=&quot;STAX는 &amp;quot;모바일용 서울시 ETAX&amp;quot;입니다. 서울시민의 편리한 세금납부를 위한 생활솔루션 STAX&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.shinhan.stax&amp;amp;hl=ko&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.shinhan.stax&amp;amp;hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cewvHy/hyYPnH4wZP/s3q1WlcFKzbFtTBI2mhV7K/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/chFNW3/hyYL9LtH8m/xD76KDv2mf2LDaFz1AhJw0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/bvYQkS/hyYRyI4HQj/KBxSnzoad4koCy7Y58ClSK/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.shinhan.stax&amp;amp;hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.shinhan.stax&amp;amp;hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cewvHy/hyYPnH4wZP/s3q1WlcFKzbFtTBI2mhV7K/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/chFNW3/hyYL9LtH8m/xD76KDv2mf2LDaFz1AhJw0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/bvYQkS/hyYRyI4HQj/KBxSnzoad4koCy7Y58ClSK/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240');&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;서울시 세금납부 - 서울시 STAX - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;STAX는 &quot;모바일용 서울시 ETAX&quot;입니다. 서울시민의 편리한 세금납부를 위한 생활솔루션 STAX&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EC%84%B8%EA%B8%88%EB%82%A9%EB%B6%80-%EC%84%9C%EC%9A%B8%EC%8B%9C-stax/id1445541058&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apps.apple.com/kr/app/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EC%84%B8%EA%B8%88%EB%82%A9%EB%B6%80-%EC%84%9C%EC%9A%B8%EC%8B%9C-stax/id1445541058&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1746451137359&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;&amp;lrm;서울시 세금납부 - 서울시 STAX&quot; data-og-description=&quot;&amp;lrm;[자세히 알아보기] 1) 서울시 세금납부에서 납부가능한 세금 - 지방세 : 취득세, 지방소득세, 레저세, 주민세, 자동차세, 재산세, 등록면허세 - 세외수입 : 벌금/과징금(과태료), 사용료, 수수료, &quot; data-og-host=&quot;apps.apple.com&quot; data-og-source-url=&quot;https://apps.apple.com/kr/app/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EC%84%B8%EA%B8%88%EB%82%A9%EB%B6%80-%EC%84%9C%EC%9A%B8%EC%8B%9C-stax/id1445541058&quot; data-og-url=&quot;https://apps.apple.com/kr/app/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EC%84%B8%EA%B8%88%EB%82%A9%EB%B6%80-%EC%84%9C%EC%9A%B8%EC%8B%9C-stax/id1445541058&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dfXsyQ/hyYRyh0g3e/q7i6C894C4kcTz0HX2Tzs0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cjNrMR/hyYRxKazDz/sFmvg9lS76w8K3iBxKNMZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EC%84%B8%EA%B8%88%EB%82%A9%EB%B6%80-%EC%84%9C%EC%9A%B8%EC%8B%9C-stax/id1445541058&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://apps.apple.com/kr/app/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EC%84%B8%EA%B8%88%EB%82%A9%EB%B6%80-%EC%84%9C%EC%9A%B8%EC%8B%9C-stax/id1445541058&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dfXsyQ/hyYRyh0g3e/q7i6C894C4kcTz0HX2Tzs0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cjNrMR/hyYRxKazDz/sFmvg9lS76w8K3iBxKNMZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lrm;서울시 세금납부 - 서울시 STAX&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lrm;[자세히 알아보기] 1) 서울시 세금납부에서 납부가능한 세금 - 지방세 : 취득세, 지방소득세, 레저세, 주민세, 자동차세, 재산세, 등록면허세 - 세외수입 : 벌금/과징금(과태료), 사용료, 수수료,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;apps.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전 블로그들을 보니 공인인증서가 필요하다고 하던데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공인인증서 없이 민간인증서(카카오톡, 네이버 등)으로도 취득세 납부가 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;분할 납부시에는 &quot;일부납부&quot; 신청에 체크를 하고 원하는 금액을 입력한 뒤에 납부를 하면 되고&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;맨 마지막에는 &quot;일부납부&quot;를 체크하지 않고 나머지 금액을 결제하게 되면&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;/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;</description>
      <category>정보</category>
      <category>NH카드</category>
      <category>무이자할부</category>
      <category>취득세</category>
      <category>카드</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2405</guid>
      <comments>https://trend21c.tistory.com/2405#entry2405comment</comments>
      <pubDate>Mon, 5 May 2025 22:11:39 +0900</pubDate>
    </item>
    <item>
      <title>sqs+lambda maximum concurrency</title>
      <link>https://trend21c.tistory.com/2404</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aws.amazon.com/ko/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744261215594&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;Introducing maximum concurrency of AWS Lambda functions when using Amazon SQS as an event source | Amazon Web Services&quot; data-og-description=&quot;This blog post is written by Solutions Architects John Lee and Jeetendra Vaidya. AWS Lambda now provides a way to control the maximum number of concurrent functions invoked by Amazon SQS as an event source. You can use this feature to control the concurren&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/&quot; data-og-url=&quot;https://aws.amazon.com/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HBaSu/hyYFDcD9FW/HhI5KzFMwh07iAyouYxFo1/img.png?width=1068&amp;amp;height=630&amp;amp;face=0_0_1068_630,https://scrap.kakaocdn.net/dn/bMnovW/hyYEJYC2Rk/kdoumu5WNw7Ne3khdYL0Zk/img.png?width=1068&amp;amp;height=630&amp;amp;face=0_0_1068_630,https://scrap.kakaocdn.net/dn/b4qPva/hyYFFBw3aA/ggWRh3oPt1OdX9hYRksnV0/img.png?width=879&amp;amp;height=1024&amp;amp;face=0_0_879_1024&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HBaSu/hyYFDcD9FW/HhI5KzFMwh07iAyouYxFo1/img.png?width=1068&amp;amp;height=630&amp;amp;face=0_0_1068_630,https://scrap.kakaocdn.net/dn/bMnovW/hyYEJYC2Rk/kdoumu5WNw7Ne3khdYL0Zk/img.png?width=1068&amp;amp;height=630&amp;amp;face=0_0_1068_630,https://scrap.kakaocdn.net/dn/b4qPva/hyYFFBw3aA/ggWRh3oPt1OdX9hYRksnV0/img.png?width=879&amp;amp;height=1024&amp;amp;face=0_0_879_1024');&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;Introducing maximum concurrency of AWS Lambda functions when using Amazon SQS as an event source | Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This blog post is written by Solutions Architects John Lee and Jeetendra Vaidya. AWS Lambda now provides a way to control the maximum number of concurrent functions invoked by Amazon SQS as an event source. You can use this feature to control the concurren&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 2.01.22.png&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfxbgn/btsNgpqMoBf/LrULqJTkXreg6drbjA4KJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfxbgn/btsNgpqMoBf/LrULqJTkXreg6drbjA4KJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfxbgn/btsNgpqMoBf/LrULqJTkXreg6drbjA4KJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfxbgn%2FbtsNgpqMoBf%2FLrULqJTkXreg6drbjA4KJ0%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;1554&quot; height=&quot;926&quot; data-filename=&quot;스크린샷 2025-04-10 오후 2.01.22.png&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;926&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;sqs와 lambda의 조합은 엄청난 양의 작업도 빠르게 병렬로 수행시키는 좋은 방법입니다.&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;sqs에 메시지를 발행하기만 하면 메시지를 수신하여 lambda 함수가 실행되기 때문에 매우 직관적입니다&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;하지만 너무 많은 lambda 함수가 실행되어서 실제 서비스에 부정적인 영향을 주는 경우가 발생할수 있습니다&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;lambda 함수는 해당 함수에서 호출하는 대상 서비스의 허용량을 알지 못하기 때문에&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;이때 maximum concurrency 를 사용하면 lambda 함수의 동시 실행 갯수를 조정할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 2.03.01.png&quot; data-origin-width=&quot;1504&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J7oK4/btsNeSH1Do8/wMBnM722D11ntk6hbFKCCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J7oK4/btsNeSH1Do8/wMBnM722D11ntk6hbFKCCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J7oK4/btsNeSH1Do8/wMBnM722D11ntk6hbFKCCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ7oK4%2FbtsNeSH1Do8%2FwMBnM722D11ntk6hbFKCCK%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;1504&quot; height=&quot;894&quot; data-filename=&quot;스크린샷 2025-04-10 오후 2.03.01.png&quot; data-origin-width=&quot;1504&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정한 갯수를 넘어가지 않기 때문에 좀더 안정적으로 메시지를 소비할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 2.06.37.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qY9B3/btsNgoZK8Jt/5Mt0kxQtzuwm3UiW5Crmr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qY9B3/btsNgoZK8Jt/5Mt0kxQtzuwm3UiW5Crmr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qY9B3/btsNgoZK8Jt/5Mt0kxQtzuwm3UiW5Crmr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqY9B3%2FbtsNgoZK8Jt%2F5Mt0kxQtzuwm3UiW5Crmr0%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;798&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2025-04-10 오후 2.06.37.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;282&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;2~1,000까지 값을 지정가능하며&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;serverless의 설정으로는 이렇게 설정할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744261178463&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;functions:
  onlyOneOrTwo:
    handler: handler.preprocess
    events:
      - sqs:
          arn: arn:aws:sqs:region:XXXXXX:myQueue
          maximumConcurrency: 250&lt;/code&gt;&lt;/pre&gt;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>AWS</category>
      <category>concurrency</category>
      <category>Lambda</category>
      <category>SQS</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2404</guid>
      <comments>https://trend21c.tistory.com/2404#entry2404comment</comments>
      <pubDate>Thu, 10 Apr 2025 14:07:28 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트 5.5 이상 써야하는 이유</title>
      <link>https://trend21c.tistory.com/2403</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트의 버전이 올라가면 갈수록 타입 추론이 좋아집니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트 5.5 미만에서는 filter를 통해 undefined를 걸러냈더라도&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;undefined가 걸러졌는지 추론을 하지 못합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741852314739&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function makeBirdCalls(countries: string[]) {
  // birds: (Bird | undefined)[]
  const birds = countries
    .map(country =&amp;gt; nationalBirds.get(country))
    .filter(bird =&amp;gt; bird !== undefined);
  for (const bird of birds) {
    bird.sing();  // error: 'bird' is possibly 'undefined'.
  }
}&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;타입스크립트 5.5 부터는 filter를 통해 걸러진 값들을 정확히 추론합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741852322877&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function makeBirdCalls(countries: string[]) {
  // birds: Bird[]
  const birds = countries
    .map(country =&amp;gt; nationalBirds.get(country))
    .filter(bird =&amp;gt; bird !== undefined);
  for (const bird of birds) {
    bird.sing();  // ok!
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741852412372&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;Documentation - TypeScript 5.5&quot; data-og-description=&quot;TypeScript 5.5 Release Notes&quot; data-og-host=&quot;www.typescriptlang.org&quot; data-og-source-url=&quot;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html&quot; data-og-url=&quot;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dKtuUv/hyYrZOoUHT/8pam6uOphTh5bqXxekcfpk/img.png?width=1723&amp;amp;height=1080&amp;amp;face=0_0_1723_1080&quot;&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dKtuUv/hyYrZOoUHT/8pam6uOphTh5bqXxekcfpk/img.png?width=1723&amp;amp;height=1080&amp;amp;face=0_0_1723_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;Documentation - TypeScript 5.5&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TypeScript 5.5 Release Notes&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.typescriptlang.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>javascript</category>
      <category>TypeScript</category>
      <category>추론</category>
      <category>타입스크립트</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2403</guid>
      <comments>https://trend21c.tistory.com/2403#entry2403comment</comments>
      <pubDate>Mon, 17 Mar 2025 17:55:13 +0900</pubDate>
    </item>
    <item>
      <title>aws-sdk v2를 사용하는 오래된 lambda 함수를 node 18에서 사용하기</title>
      <link>https://trend21c.tistory.com/2402</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-13 오후 4.40.16.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xIj2G/btsMH8dO7jC/y4z50653iE3zvbSCKyD6NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xIj2G/btsMH8dO7jC/y4z50653iE3zvbSCKyD6NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xIj2G/btsMH8dO7jC/y4z50653iE3zvbSCKyD6NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxIj2G%2FbtsMH8dO7jC%2Fy4z50653iE3zvbSCKyD6NK%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;1026&quot; height=&quot;796&quot; data-filename=&quot;스크린샷 2025-03-13 오후 4.40.16.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;796&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;2025년 시점에서 이제 더이상 nodejs 16을 사용하는 람다 함수를 생성할수 없습니다&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;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741851665317&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;Lambda runtimes - AWS Lambda&quot; data-og-description=&quot;Lambda runtimes Lambda supports multiple languages through the use of runtimes. A runtime provides a language-specific environment that relays invocation events, context information, and responses between Lambda and the function. You can use runtimes that &quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported&quot; data-og-url=&quot;https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Lambda runtimes - AWS Lambda&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Lambda runtimes Lambda supports multiple languages through the use of runtimes. A runtime provides a language-specific environment that relays invocation events, context information, and responses between Lambda and the function. You can use runtimes that&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-13 오후 4.41.14.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/INyRb/btsMJc7Dxah/knpKTiqndFnh7MrWIbqrtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/INyRb/btsMJc7Dxah/knpKTiqndFnh7MrWIbqrtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/INyRb/btsMJc7Dxah/knpKTiqndFnh7MrWIbqrtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FINyRb%2FbtsMJc7Dxah%2FknpKTiqndFnh7MrWIbqrtk%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;2064&quot; height=&quot;490&quot; data-filename=&quot;스크린샷 2025-03-13 오후 4.41.14.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;490&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;nodejs 18 버전도 2025년 10월부터는 생성이 불가합니다&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;nodejs 16 -&amp;gt; 18 버전의 람다에서 드라마틱한 변화가 있는데요&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;aws-sdk v2는 16 버전까지만 포함되어있고,&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;nodejs 18 버전에서는 aws-sdk v2가 포함되지 않고 v3 버전이 포함됩니다&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;그렇기 때문에 nodejs16 기반으로 만든 lambda 함수를 사용하고 있는 분들은 aws-sdk v3를 사용하여 업데이트를 하는 방법이 가장 좋겠습니다만,&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;그럴 여력이 없다면 임시로 런타임만 nodejs 18을 사용하되, aws-sdk v2를 빌드에 포함시키는 방법을 사용할수 있습니다&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;serverless를 사용하신다면 nodejs 18 런타임으로 배포할수 있도록 아래의 패키지를 해당 버전으로 업데이트 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741851943177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;serverless&quot;: &quot;3.25.0&quot;
&quot;serverless-bundle&quot;: &quot;6.1.0&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;그리고 dependency에 aws-sdk 2 버전대를 포함하면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Lambda</category>
      <category>nodejs</category>
      <category>serverless</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2402</guid>
      <comments>https://trend21c.tistory.com/2402#entry2402comment</comments>
      <pubDate>Fri, 14 Mar 2025 17:47:14 +0900</pubDate>
    </item>
    <item>
      <title>typeorm 엔터티의 enum 순환 참조</title>
      <link>https://trend21c.tistory.com/2401</link>
      <description>&lt;pre id=&quot;code_1741848656777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TypeORMError: Column &quot;xxx&quot; of Entity &quot;xxx&quot; is defined as enum, but missing &quot;enum&quot; or &quot;enumName&quot; properties.&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;2개 이상의 엔터티가 하나의 enum 타입을 공유하여 사용하고 있을때,&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;그리고 enum 타입이 하나의 엔터티 파일에 함께 선언되어있을 경우&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;해결 방법은 간단합니다&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;enum 타입을 엔터티와 별도의 파일로 분리하면 됩니다&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>BACKEND</category>
      <category>Entity</category>
      <category>enum</category>
      <category>typeorm</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2401</guid>
      <comments>https://trend21c.tistory.com/2401#entry2401comment</comments>
      <pubDate>Thu, 13 Mar 2025 15:52:40 +0900</pubDate>
    </item>
    <item>
      <title>구글플레이 개인개발자 인증하기</title>
      <link>https://trend21c.tistory.com/2400</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오래 방치해둔 구글플레이 계정에 들어가보았더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정이 정지되었더라구요&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;/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;이걸 어떻게 해야하나 하고 여러 가지 문서를 시도해보았습니다&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;근데 다 안되더라구요&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://support.google.com/googleplay/android-developer/answer/15633622&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://support.google.com/googleplay/android-developer/answer/15633622&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741000191797&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;Google Play Developer Verification: Required documents by country and region - South Korea - Play Console 고객센터&quot; data-og-description=&quot;도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요&quot; data-og-host=&quot;support.google.com&quot; data-og-source-url=&quot;https://support.google.com/googleplay/android-developer/answer/15633622&quot; data-og-url=&quot;https://support.google.com/googleplay/android-developer/answer/15633622&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://support.google.com/googleplay/android-developer/answer/15633622&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://support.google.com/googleplay/android-developer/answer/15633622&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Google Play Developer Verification: Required documents by country and region - South Korea - Play Console 고객센터&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;support.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Individuals&amp;nbsp;and&amp;nbsp;authorized&amp;nbsp;representatives&amp;nbsp;need&amp;nbsp;their&amp;nbsp;mobile&amp;nbsp;phone&amp;nbsp;to&amp;nbsp;complete&amp;nbsp;identity&amp;nbsp;verification&amp;nbsp;via&amp;nbsp;their&amp;nbsp;mobile&amp;nbsp;carrier.&lt;br /&gt;&lt;br /&gt;Individuals&amp;nbsp;are&amp;nbsp;also&amp;nbsp;required&amp;nbsp;to&amp;nbsp;submit&amp;nbsp;a&amp;nbsp;proof&amp;nbsp;of&amp;nbsp;address&amp;nbsp;document&amp;nbsp;as&amp;nbsp;part&amp;nbsp;of&amp;nbsp;the&amp;nbsp;verification&amp;nbsp;program.&amp;nbsp;Address&amp;nbsp;documents&amp;nbsp;must&amp;nbsp;list&amp;nbsp;the&amp;nbsp;individual's&amp;nbsp;name&amp;nbsp;and&amp;nbsp;address&amp;nbsp;as&amp;nbsp;it&amp;nbsp;appears&amp;nbsp;on&amp;nbsp;their&amp;nbsp;profile.&amp;nbsp;Acceptable&amp;nbsp;address&amp;nbsp;documents&amp;nbsp;include:&lt;br /&gt;&lt;br /&gt;Government&amp;nbsp;issued&amp;nbsp;photo&amp;nbsp;ID&amp;nbsp;with&amp;nbsp;address&amp;nbsp;listed&lt;br /&gt;Utility&amp;nbsp;bill&amp;nbsp;for&amp;nbsp;electricity,&amp;nbsp;water,&amp;nbsp;gas,&amp;nbsp;internet,&amp;nbsp;cable&amp;nbsp;TV&lt;br /&gt;Insurance&amp;nbsp;statement&amp;nbsp;(home&amp;nbsp;insurance,&amp;nbsp;health&amp;nbsp;insurance,&amp;nbsp;and&amp;nbsp;so&amp;nbsp;on)&lt;br /&gt;Credit&amp;nbsp;card&amp;nbsp;or&amp;nbsp;bank&amp;nbsp;statement&lt;/p&gt;</description>
      <category>스마트폰/안드로이드</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2400</guid>
      <comments>https://trend21c.tistory.com/2400#entry2400comment</comments>
      <pubDate>Mon, 3 Mar 2025 20:11:53 +0900</pubDate>
    </item>
    <item>
      <title>hasura를 이용하여 graphQL 순식간에 뚝딱하고 만드는방법</title>
      <link>https://trend21c.tistory.com/2397</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hasura.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hasura.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738030992846&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;Universal data access layer for next-gen apps and AI&quot; data-og-description=&quot;The fastest and simplest way to build, run, govern, and evolve a high-quality API layer on all your data.&quot; data-og-host=&quot;hasura.io&quot; data-og-source-url=&quot;https://hasura.io/&quot; data-og-url=&quot;https://hasura.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cFXEjK/hyX7Wj2lXj/Ck0afv70GF2kHc8c1NGfNK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/vrQRP/hyX4pIcZaB/OQtypOPHySVXayZeUCvra1/img.png?width=514&amp;amp;height=240&amp;amp;face=0_0_514_240,https://scrap.kakaocdn.net/dn/1NqdR/hyX4u3MrY9/ovk7qnlBtCnKP8xietCKPK/img.png?width=514&amp;amp;height=240&amp;amp;face=0_0_514_240&quot;&gt;&lt;a href=&quot;https://hasura.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hasura.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cFXEjK/hyX7Wj2lXj/Ck0afv70GF2kHc8c1NGfNK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/vrQRP/hyX4pIcZaB/OQtypOPHySVXayZeUCvra1/img.png?width=514&amp;amp;height=240&amp;amp;face=0_0_514_240,https://scrap.kakaocdn.net/dn/1NqdR/hyX4u3MrY9/ovk7qnlBtCnKP8xietCKPK/img.png?width=514&amp;amp;height=240&amp;amp;face=0_0_514_240');&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;Universal data access layer for next-gen apps and AI&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The fastest and simplest way to build, run, govern, and evolve a high-quality API layer on all your data.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hasura.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hasura는 내가 가지고 있는 데이터에 대한 API 레이어를 만들어주는 역할을 합니다&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;좀더 쉽게 설명하자면 여러분이 postgres 데이터베이스와 그 안에 데이터를 가지고 있다고 할때&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;데이터베이스에 담긴 데이터를 조회, 추가, 삭제하는 graphQL API를 자동으로 생성합니다&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;여러분이 특정 데이터베이스에 기반하여 단순한 CRUD가 필요하다면&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;hasura를 설치하고 데이터베이스와 연결하여 손쉽게 코드한줄 작성하지 않고 graphQL API 레이어를 생성할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-28 오전 11.28.05.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIG7xD/btsL2BzwiSa/fhz5Yc4RvP3x2QV2zaKRKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIG7xD/btsL2BzwiSa/fhz5Yc4RvP3x2QV2zaKRKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIG7xD/btsL2BzwiSa/fhz5Yc4RvP3x2QV2zaKRKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIG7xD%2FbtsL2BzwiSa%2Ffhz5Yc4RvP3x2QV2zaKRKk%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;1576&quot; height=&quot;606&quot; data-filename=&quot;스크린샷 2025-01-28 오전 11.28.05.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분이 가지고 있는 테이블에 기반하여 직관적인 graphQL API를 이용할수 있습니다&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;harua를 직접 설치형으로 사용하는 2.x 버전은 도커를 이용하여 쉽게 설정이 가능합니다&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;a href=&quot;https://hasura.io/docs/2.0/getting-started/docker-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hasura.io/docs/2.0/getting-started/docker-simple/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737438969884&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;Quickstart with Docker | Hasura GraphQL Docs&quot; data-og-description=&quot;Get started with Hasura using Docker&quot; data-og-host=&quot;hasura.io&quot; data-og-source-url=&quot;https://hasura.io/docs/2.0/getting-started/docker-simple/&quot; data-og-url=&quot;https://hasura.io/docs/2.0/getting-started/docker-simple/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rktil/hyX4nJdxlh/LZdUbuvPKD82PeG9TCBJP1/img.png?width=1536&amp;amp;height=909&amp;amp;face=0_0_1536_909&quot;&gt;&lt;a href=&quot;https://hasura.io/docs/2.0/getting-started/docker-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hasura.io/docs/2.0/getting-started/docker-simple/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rktil/hyX4nJdxlh/LZdUbuvPKD82PeG9TCBJP1/img.png?width=1536&amp;amp;height=909&amp;amp;face=0_0_1536_909');&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;Quickstart with Docker | Hasura GraphQL Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Get started with Hasura using Docker&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hasura.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;pre id=&quot;code_1737439008928&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  graphql-engine:
    image: hasura/graphql-engine:v2.20.0
    ports:
      - &quot;8080:8080&quot;
    restart: always
    environment:
      ## postgres database to store Hasura metadata
      HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## this env var can be used to add the above postgres database to Hasura as a data source. this can be removed/updated based on your needs
      PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## enable the console served by server
      HASURA_GRAPHQL_ENABLE_CONSOLE: &quot;true&quot; # set to &quot;false&quot; to disable console
      ## enable debugging mode. It is recommended to disable this in production
      HASURA_GRAPHQL_DEV_MODE: &quot;true&quot;
      HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
      ## uncomment next line to run console offline (i.e load console assets from server instead of CDN)
      # HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets
      ## uncomment next line to set an admin secret
      # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
    depends_on:
      - postgres&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;그리고 지금은 data-connector-agent를 사용할수 있는 버전의 docker compose 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738031724980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  postgres:
    image: postgres:15
    restart: always
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgrespassword
  graphql-engine:
    image: hasura/graphql-engine:v2.42.0
    ports:
      - &quot;8080:8080&quot;
    restart: always
    environment:
      ## postgres database to store Hasura metadata
      HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## this env var can be used to add the above postgres database to Hasura as a data source. this can be removed/updated based on your needs
      PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## enable the console served by server
      HASURA_GRAPHQL_ENABLE_CONSOLE: &quot;true&quot; # set to &quot;false&quot; to disable console
      ## enable debugging mode. It is recommended to disable this in production
      HASURA_GRAPHQL_DEV_MODE: &quot;true&quot;
      HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
      ## uncomment next line to run console offline (i.e load console assets from server instead of CDN)
      # HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets
      ## uncomment next line to set an admin secret
      # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
      HASURA_GRAPHQL_METADATA_DEFAULTS: '{&quot;backend_configs&quot;:{&quot;dataconnector&quot;:{&quot;athena&quot;:{&quot;uri&quot;:&quot;http://data-connector-agent:8081/api/v1/athena&quot;},&quot;mariadb&quot;:{&quot;uri&quot;:&quot;http://data-connector-agent:8081/api/v1/mariadb&quot;},&quot;mysql8&quot;:{&quot;uri&quot;:&quot;http://data-connector-agent:8081/api/v1/mysql&quot;},&quot;oracle&quot;:{&quot;uri&quot;:&quot;http://data-connector-agent:8081/api/v1/oracle&quot;},&quot;snowflake&quot;:{&quot;uri&quot;:&quot;http://data-connector-agent:8081/api/v1/snowflake&quot;}}}}'
    depends_on:
      data-connector-agent:
        condition: service_healthy
  data-connector-agent:
    image: hasura/graphql-data-connector:v2.42.0
    restart: always
    ports:
      - 8081:8081
    environment:
      QUARKUS_LOG_LEVEL: ERROR # FATAL, ERROR, WARN, INFO, DEBUG, TRACE
      ## https://quarkus.io/guides/opentelemetry#configuration-reference
      QUARKUS_OPENTELEMETRY_ENABLED: &quot;false&quot;
      ## QUARKUS_OPENTELEMETRY_TRACER_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
    healthcheck:
      test: [&quot;CMD&quot;, &quot;curl&quot;, &quot;-f&quot;, &quot;http://localhost:8081/api/v1/athena/health&quot;]
      interval: 5s
      timeout: 10s
      retries: 5
      start_period: 5s
volumes:
  db_data:&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;hasura는 기본 지원으로 postgres, mssql, bigquery를 지원하고 있는데&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;기본 지원이 되지 않더라도 data-connector-agent를 통해 모든 종류의 데이터 소스에서도 데이터를 가져올수 있는 기능을 제공하고 있습니다&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;hasura에서는 내부에서 다양한 설정들을 통해 graphQL을 좀더 풍부하게 사용할수 있습니다&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;1:n, n:m 관계를 설정하고 노출시키고자 하는 테이블과 컬럼을 정의할 수 있습니다&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;hasura에서 아쉬운 부분중의 하나는 메타데이터를 docker의 환경변수 형태로 주입할수 있는 방법이 없더라구요&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;다만 메타데이터의 export, import 기능을 제공하고 있어서,&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;팀단위에서 메타데이터를 공유할때는 export, import 기능을 사용하여야 합니다&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;a href=&quot;https://hasura.io/docs/2.0/migrations-metadata-seeds/manage-metadata/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hasura.io/docs/2.0/migrations-metadata-seeds/manage-metadata/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737439026245&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;Manage Metadata | Hasura GraphQL Docs&quot; data-og-description=&quot;Manage Hasura Server Metadata&quot; data-og-host=&quot;hasura.io&quot; data-og-source-url=&quot;https://hasura.io/docs/2.0/migrations-metadata-seeds/manage-metadata/&quot; data-og-url=&quot;https://hasura.io/docs/2.0/migrations-metadata-seeds/manage-metadata/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PXUrj/hyX4rLCDLb/KyQTGukto6QQNRCkX8t3EK/img.png?width=1398&amp;amp;height=1048&amp;amp;face=0_0_1398_1048&quot;&gt;&lt;a href=&quot;https://hasura.io/docs/2.0/migrations-metadata-seeds/manage-metadata/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hasura.io/docs/2.0/migrations-metadata-seeds/manage-metadata/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PXUrj/hyX4rLCDLb/KyQTGukto6QQNRCkX8t3EK/img.png?width=1398&amp;amp;height=1048&amp;amp;face=0_0_1398_1048');&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;Manage Metadata | Hasura GraphQL Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Manage Hasura Server Metadata&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hasura.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 네비게이션에서 settings 메뉴를 통해 import, export 기능을 확인할수 있습니다&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-filename=&quot;스크린샷 2025-01-21 오후 2.57.27.png&quot; data-origin-width=&quot;2854&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxl6ZX/btsLVvlyKnH/mVZpQnW3R1CH2BS7fcvX61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxl6ZX/btsLVvlyKnH/mVZpQnW3R1CH2BS7fcvX61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxl6ZX/btsLVvlyKnH/mVZpQnW3R1CH2BS7fcvX61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxl6ZX%2FbtsLVvlyKnH%2FmVZpQnW3R1CH2BS7fcvX61%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;2854&quot; height=&quot;1232&quot; data-filename=&quot;스크린샷 2025-01-21 오후 2.57.27.png&quot; data-origin-width=&quot;2854&quot; data-origin-height=&quot;1232&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;hasura는 매우 손쉽게 graphQL API 레이어를 생성해줍니다&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;내부의 백오피스에서 사용하는 API를 개발하는 용도로 개발자의 공수를 줄여줄 수 있습니다&lt;/p&gt;</description>
      <category>WEB2.0/웹서비스소개</category>
      <category>API</category>
      <category>graphQL</category>
      <category>hasur</category>
      <category>postgres</category>
      <category>PostgreSQL</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2397</guid>
      <comments>https://trend21c.tistory.com/2397#entry2397comment</comments>
      <pubDate>Fri, 31 Jan 2025 12:46:07 +0900</pubDate>
    </item>
    <item>
      <title>postgresql docker 활용하기</title>
      <link>https://trend21c.tistory.com/2396</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hub.docker.com/_/postgres&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hub.docker.com/_/postgres&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737012233629&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;postgres - Official Image | Docker Hub&quot; data-og-description=&quot;Note: the description for this image is longer than the Hub length limit of 25000, so has been trimmed. The full description can be found at https://github.com/docker-library/docs/tree/master/postgres/README.md⁠. See also docker/hub-feedback#238⁠ and d&quot; data-og-host=&quot;hub.docker.com&quot; data-og-source-url=&quot;https://hub.docker.com/_/postgres&quot; data-og-url=&quot;https://hub.docker.com/_/postgres&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://hub.docker.com/_/postgres&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hub.docker.com/_/postgres&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;postgres - Official Image | Docker Hub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Note: the description for this image is longer than the Hub length limit of 25000, so has been trimmed. The full description can be found at https://github.com/docker-library/docs/tree/master/postgres/README.md⁠. See also docker/hub-feedback#238⁠ and d&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hub.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postgres를 도커를 이용하여 사용하는데 있어서 필요한 유용한 내용들을 정리해보았습니다&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_1737012247457&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres&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;공식 postgres 도커 이미지를 이용하여 필수 환경변수인 POSTGRES_PASWORD만 지정하면 매우 손쉽게 컨테이너 실행이 가능합니다&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;POSTGRES_PASWORD에 지정된 비밀번호를 사용하며,&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;기본값으로 사용자이름과 db명은 postgres가 사용됩니다&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;pre id=&quot;code_1737012257411&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:

  db:
    image: postgres
    restart: always
    # set shared memory limit when using docker-compose
    shm_size: 128mb
    # or set shared memory limit when deploy via swarm stack
    #volumes:
    #  - type: tmpfs
    #    target: /dev/shm
    #    tmpfs:
    #      size: 134217728 # 128*2^20 bytes = 128Mb
    environment:
      POSTGRES_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080&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;공식 예제에는 adminer라는 UI도구를 함께 설치하여  사용하는 예제가 있네요&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_1737012293682&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Use postgres/example user/password credentials
version: '3.9'

services:

  db:
    image: postgres
    restart: always
    # set shared memory limit when using docker-compose
    shm_size: 128mb
    # or set shared memory limit when deploy via swarm stack
    #volumes:
    #  - type: tmpfs
    #    target: /dev/shm
    #    tmpfs:
    #      size: 134217728 # 128*2^20 bytes = 128Mb
    environment:
      POSTGRES_PASSWORD: example

  pgadmin:
    image: dpage/pgadmin4
    restart: always
    environment:
        - PGADMIN_DEFAULT_EMAIL=admin@admin.com
        - PGADMIN_DEFAULT_PASSWORD=pgadmin4
    ports:
      - '5050:80'
    depends_on:
      - db&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;널리 알려진 pgadmin을 통해서도 위와 같이 구성할수 있습니다&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;pgadmin에서 사용가능한 환경변수는 다음과 같습니다&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;a href=&quot;https://www.pgadmin.org/docs/pgadmin4/8.13/container_deployment.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.pgadmin.org/docs/pgadmin4/8.13/container_deployment.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737438797440&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;Container Deployment &amp;mdash; pgAdmin 4 8.13 documentation&quot; data-og-description=&quot;There are various tags that you can select from to get the version of pgAdmin that you want, using a command such as this if you&amp;rsquo;re using Docker: PostgreSQL Utilities The PostgreSQL utilities pg_dump, pg_dumpall, pg_restore and psql are included in the c&quot; data-og-host=&quot;www.pgadmin.org&quot; data-og-source-url=&quot;https://www.pgadmin.org/docs/pgadmin4/8.13/container_deployment.html&quot; data-og-url=&quot;https://www.pgadmin.org/docs/pgadmin4/8.13/container_deployment.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.pgadmin.org/docs/pgadmin4/8.13/container_deployment.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.pgadmin.org/docs/pgadmin4/8.13/container_deployment.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Container Deployment &amp;mdash; pgAdmin 4 8.13 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;There are various tags that you can select from to get the version of pgAdmin that you want, using a command such as this if you&amp;rsquo;re using Docker: PostgreSQL Utilities The PostgreSQL utilities pg_dump, pg_dumpall, pg_restore and psql are included in the c&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.pgadmin.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;pre id=&quot;code_1737438840857&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  pgadmin:
    image: dpage/pgadmin4
    restart: always
    volumes:
      - ./pgadmin4/servers.json:/pgadmin4/servers.json&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;/pgadmin4/servers.json 파일로 다음과 같은 파일을 마운트하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737438886521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// servers.json
{
  &quot;Servers&quot;: {
    &quot;1&quot;: {
      &quot;Name&quot;: &quot;postgres&quot;,
      &quot;Group&quot;: &quot;Servers&quot;,
      &quot;Port&quot;: 5432,
      &quot;Username&quot;: &quot;postgres&quot;,
      &quot;Host&quot;: &quot;postgres&quot;,
      &quot;SSLMode&quot;: &quot;prefer&quot;,
      &quot;MaintenanceDB&quot;: &quot;postgres&quot;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;servers.json 파일을 읽어 기본 커넥션에 등록을 해둡니다&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;다만 비밀번호는 UI상에서 저장을 해야합니다&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;postgres 에 가장 흔히 사용되는 환경변수는 다음과 같습니다&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;POSTGRES_PASSWORD : 비밀번호(필수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POSTGRES_USER : 유저명(없으면 postgres 가 기본값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POSTGRES_DB : 디비명(없으면 POSTGRES_USER에서 지정한 값이 사용됨)&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;DB를 세팅했으니, 초기 스키마를 생성하고, 필요한 데이터를 넣는 작업이 필요할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737012399659&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# seed.sql
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(100) UNIQUE
);

INSERT INTO users (name, email) VALUES
  ('Alpha', 'alpha@example.com'),
  ('Beta', 'beta@example.com'),
  ('Gamma', 'gamma@example.com');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정은 여러가지 방법을 이용할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;psql 명령어를 사용하여 실행할 수 있고, 직접 js 파일을 만들어 코드를 통해 주입해도 됩니다&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;postgres 도커이미지는&amp;nbsp;/docker-entrypoint-initdb.d 해당 경로의 sh 파일 및 sql 파일을 컨테이너 생성 후에 실행합니다&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;그러니 원하는 작업이 있다면 해당 경로로 파일을 COPY를 한다면 손쉽게 sql 파일을 실행시킬수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737012453184&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# syntax=docker/dockerfile:1
FROM postgres:latest
COPY seed.sql /docker-entrypoint-initdb.d/&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;p data-ke-size=&quot;size16&quot;&gt;컨테이너가 중지되어도 데이터를 잃지 않으려면 volumes을 구성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737012472654&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  db:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: my_postgres_db
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: mysecretpassword
      POSTGRES_DB: sampledb
    ports:
      - &quot;5432:5432&quot;
    volumes:
      - data_sql:/var/lib/postgresql/data   # Persistent data storage

volumes:
  data_sql:&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;volumes 설정을 통해 컨테이너가 중지되더라도 데이터는 그대로 보존할수 있습니다&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;이 볼륨도 삭제를 원하다면 down 명령어 실행시 -v 옵션을 통해 볼륨까지 삭제가 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 도커컴포즈 환경을 실행해봅시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737012502822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose up -d --build&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;명령어 차이는 없습니다&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;postgres 컨테이너의 생성이 바로 healthy를 의미하는것은 아닙니다&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;진정한 healthcheck를 위해 pg_isready 명령어를 사용할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737012542026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
        restart: true
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: postgres
    healthcheck:
      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}&quot;]
      interval: 10s
      retries: 5
      start_period: 30s
      timeout: 10s&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;healthcheck를 통해 원하는 healthcheck 방법 및 옵션을 설정할수 있으며,&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;이는 compose 내에서 depens_on 옵션을 통해 의존관계와 더불어 의존관계의 condition까지 추가 체크할수 있습니다&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;condition 값은 다음과 같습니다&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;service_started : (기본값)서비스가 시작됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service_healthy : healthcheck가 성공함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service_completed_successfully : 서비스가 성공적으로 완료됨&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>WEB2.0/프로그래밍</category>
      <category>compose</category>
      <category>docker</category>
      <category>healthcheck</category>
      <category>postgres</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2396</guid>
      <comments>https://trend21c.tistory.com/2396#entry2396comment</comments>
      <pubDate>Tue, 21 Jan 2025 17:44:52 +0900</pubDate>
    </item>
    <item>
      <title>pnpm workspace 사용하기</title>
      <link>https://trend21c.tistory.com/2395</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;npm의 workspace처럼 pnpm에서도 workspace를 지원하여 모노레포를 구성할수 있습니다&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;pnpm-workspace.yaml 파일을 생성하여 다음 코드를 작성하는것으로 워크스페이스를 사용할수 있습니다&lt;/p&gt;
&lt;pre id=&quot;code_1737185182235&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;packages:
  # specify a package in a direct subdir of the root
  - 'my-app'
  # all packages in direct subdirs of packages/
  - 'packages/*'
  # all packages in subdirs of components/
  - 'components/**'
  # exclude packages that are inside test directories
  - '!**/test/**'&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;여기서 언급된 패키지들이 workspace로 구성됩니다&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;root 프로젝트의 package.json의 명령어를 사용하기 위해서는 아래의 명령어를 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737010849540&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm -w &amp;lt;command&amp;gt;&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;root 프로젝트의 커맨드를 사용합니다&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;--workspace-root 의 약자입니다&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;root 프로젝트가 아닌 다른 프로젝트의 명령어를 실행하기 위해서는 아래의 명령어를 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737010909591&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm --filter &amp;lt;패키지선택자&amp;gt; &amp;lt;command&amp;gt;&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;--filter 옵션에서 사용가능한 패키지 선택자는 다양한 조합으로 사용할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737010992788&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm --filter &quot;@babel/core&quot; test
pnpm --filter &quot;@babel/*&quot; test
pnpm --filter &quot;*core&quot; test&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;a href=&quot;https://pnpm.io/filtering&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pnpm.io/filtering&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737011015507&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;Filtering | pnpm&quot; data-og-description=&quot;Filtering allows you to restrict commands to specific subsets of packages.&quot; data-og-host=&quot;pnpm.io&quot; data-og-source-url=&quot;https://pnpm.io/filtering&quot; data-og-url=&quot;https://pnpm.io/filtering&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLcxlH/hyX4zWmPo7/wFyK539EmKdk5te7DpOd11/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/caULwB/hyX4y4eze7/BkH9UXQLKjSUuCkO5sKKf0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://pnpm.io/filtering&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pnpm.io/filtering&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLcxlH/hyX4zWmPo7/wFyK539EmKdk5te7DpOd11/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/caULwB/hyX4y4eze7/BkH9UXQLKjSUuCkO5sKKf0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&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;Filtering | pnpm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Filtering allows you to restrict commands to specific subsets of packages.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pnpm.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;패키지 설치는 --filter 옵션을 이용하거나 -w 옵션을 이용하여 설치하시면 됩니다&lt;/p&gt;
&lt;pre id=&quot;code_1737011104416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm --filter &amp;lt;패키지선택자&amp;gt; add &amp;lt;pkg&amp;gt;
pnpm add &amp;lt;pkg&amp;gt; -w&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;혹시 모노레포의 모든 명령어를 한번에 실행하고 싶으시다면 -r 옵션을 이용할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737010923096&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm -r &amp;lt;command&amp;gt;&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;recursive 옵션입니다&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;예를 들어 test 명령어를 모든 패키지에 설정해놓았다면&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;한번의 명령어를 통해 내부의 모든 프로젝트의 test 명령어가 수행됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>pnpm</category>
      <category>workspace</category>
      <category>모노레포</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2395</guid>
      <comments>https://trend21c.tistory.com/2395#entry2395comment</comments>
      <pubDate>Mon, 20 Jan 2025 17:30:38 +0900</pubDate>
    </item>
    <item>
      <title>npm / yarn 에서 pnpm으로 이사하기</title>
      <link>https://trend21c.tistory.com/2394</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;거의 대부분의 프로젝트를 pnpm으로 이사하는 중입니다&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;pnpm으로 이사하기 어렵지 않습니다&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;package.json에 다음과 같이 작성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737010608188&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;scripts&quot;: {
  &quot;preinstall&quot;: &quot;npx only-allow pnpm&quot;, 
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실수로 pnpm이 아닌 다른 종류의 패키지매니저를 사용하여 의존성 설치를 할 수 없도록 합니다&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;pre id=&quot;code_1737010619417&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm import&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;yarn.lock 또는 package-lock.json 을 통해 pnpm-lock.yaml을 생성합니다&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;pnpm-lock.yaml 파일이 생성되었다면 이제 yarn.lock이나 package-lock.json은 필요가 없어졌습니다 과감하게 지웁니다&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_1737010709719&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm 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;&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;pnpm import, install 과정에서 의미있는 정보를 얻게되는 경우도 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;널리 알려진 이름으로는 유령 의존성이라고 하는데&lt;/p&gt;
&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;예를 들어 내가 이용하는 프로젝트에 A패키지를 사용하고 있습니다&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;이 A 패키지는 내부적으로 B 패키지를  의존하고 있습니다&lt;br /&gt;&lt;br /&gt;npm,&amp;nbsp;yarn에서는&amp;nbsp;package.json에&amp;nbsp;A패키지가 명시되어있다면,&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;A패키지가 B패키지를 의존하고 있으므로,&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;B패키지를 package.json에 명시되어있지 않더라도 사용할수 있습니다&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;/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;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 pnpm은 의존성을 호이스팅 하지 않습니다.&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;직접 의존하는 패키지가 있다면 package.json에 직접 의존성을 표시해야합니다&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;그래서 pnpm으로 전환하는 과정에서 몰랐던 의존관계를 파악할수 있게되는 경우가 있습니다&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;pnpm으로 오세요~&lt;/p&gt;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>nodejs</category>
      <category>NPM</category>
      <category>pnpm</category>
      <category>yarn</category>
      <category>패키지매니저</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2394</guid>
      <comments>https://trend21c.tistory.com/2394#entry2394comment</comments>
      <pubDate>Sat, 18 Jan 2025 16:24:36 +0900</pubDate>
    </item>
    <item>
      <title>여행용 맥세이프 보조배터리 찾으세요?</title>
      <link>https://trend21c.tistory.com/2392</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;여행용 맥세이프 보조배터리를 구입했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Essager 제품의 보조배터리입니다&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;Essager에서 usb케이블, 보조배터리, 충전기, usb허브 등등 다양한 전자제품이 나옵니다&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;알리에서 약 $12 정도를 주고 구입했습니다&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;요즘 환율이 올라서 18000원쯤 하겠네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3627 크게.jpeg&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o0Ywn/btsLACkMlT3/uvRypLtKXovlRO2oHWLzE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o0Ywn/btsLACkMlT3/uvRypLtKXovlRO2oHWLzE0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o0Ywn/btsLACkMlT3/uvRypLtKXovlRO2oHWLzE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo0Ywn%2FbtsLACkMlT3%2FuvRypLtKXovlRO2oHWLzE0%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;1272&quot; height=&quot;762&quot; data-filename=&quot;IMG_3627 크게.jpeg&quot; data-origin-width=&quot;1272&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽이 샤오미 P05ZM 모델의 맥세이프 보조배터리고&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;우측이 essager의 보조배터리 입니다&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;샤오미 제품은 3~4만원 정도 하는데 essager 제품이 절반가격입니다&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;두개 모두 20W 무선충전, 5000mAh 스펙을 가지고 있습니다&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-filename=&quot;IMG_3765.jpg&quot; data-origin-width=&quot;3728&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqSLob/btsL2zhpH5t/0Ak8uZzHMUwoIafokkO8oK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqSLob/btsL2zhpH5t/0Ak8uZzHMUwoIafokkO8oK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqSLob/btsL2zhpH5t/0Ak8uZzHMUwoIafokkO8oK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqSLob%2FbtsL2zhpH5t%2F0Ak8uZzHMUwoIafokkO8oK%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;3728&quot; height=&quot;1050&quot; data-filename=&quot;IMG_3765.jpg&quot; data-origin-width=&quot;3728&quot; data-origin-height=&quot;1050&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;essager가 좀더 얇고 작습니다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3628 크게.jpeg&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p3DEt/btsLx2ywup3/9XpzlMaF6T7EuIClwahuJK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p3DEt/btsLx2ywup3/9XpzlMaF6T7EuIClwahuJK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p3DEt/btsLx2ywup3/9XpzlMaF6T7EuIClwahuJK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp3DEt%2FbtsLx2ywup3%2F9XpzlMaF6T7EuIClwahuJK%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;1274&quot; height=&quot;797&quot; data-filename=&quot;IMG_3628 크게.jpeg&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒷면은 이렇습니다&lt;/p&gt;
&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;1~2년 전에 샤오미 보조배터리를 구입해서 썼는데 여행용으로 굉장히 만족스러웠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보조배터리가 하나더 필요해서 알리에서 essager 제품을 구입했는데&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;맥세이프 보조배터리 필요하시다면 essager 제품도 한번 고려해보세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보</category>
      <category>ESSAGER</category>
      <category>맥세이프</category>
      <category>보조배터리</category>
      <category>샤오미</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2392</guid>
      <comments>https://trend21c.tistory.com/2392#entry2392comment</comments>
      <pubDate>Fri, 3 Jan 2025 12:37:04 +0900</pubDate>
    </item>
    <item>
      <title>typeorm migration 적용하기</title>
      <link>https://trend21c.tistory.com/2393</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://typeorm.io/migrations&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://typeorm.io/migrations&lt;/a&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;typeorm도 migration 기능을 제공해주고 있습니다&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;migration을 통하여 DB 스키마의 변경내역도 코드를 이용하여 관리할 수 있으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD 등에서 자동화된 migration 프로세스를 도입할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735460207561&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typeorm migration:run -- -d path-to-datasource-config&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;migration:run 명령어를 통해 migration 을 실행시킬수 있습니다&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_1735460232685&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { MigrationInterface, QueryRunner } from &quot;typeorm&quot;

export class PostRefactoringTIMESTAMP implements MigrationInterface {
    async up(queryRunner: QueryRunner): Promise&amp;lt;void&amp;gt; {
        await queryRunner.query(
            `ALTER TABLE &quot;post&quot; RENAME COLUMN &quot;title&quot; TO &quot;name&quot;`,
        )
    }

    async down(queryRunner: QueryRunner): Promise&amp;lt;void&amp;gt; {
        await queryRunner.query(
            `ALTER TABLE &quot;post&quot; RENAME COLUMN &quot;name&quot; TO &quot;title&quot;`,
        ) // reverts things made in &quot;up&quot; method
    }
}&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;migration 파일은 up과 down의 메서드로 이루어져있습니다&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;up은 migration이 실행될때 실행되며,&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;down은 migration이 롤백(revert) 될때 실행됩니다&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;migration 파일은 js도 가능하고 ts도 가능합니다&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;단 ts를 실행하기 위해서는 ts-node가 필요합니다&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_1735460335322&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# commonjs
npx typeorm-ts-node-commonjs migration:run -- -d path-to-datasource-config

#esm
npx typeorm-ts-node-esm migration:run -- -d path-to-datasource-config&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;typeorm에서 제공하는 commonjs용, esm용 명령어가 있긴한데&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;해당 명령어는 아쉽게도 tsconfig path를 읽지 못함&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;tsconfig의 alias path 등을 활용하시는 분들이라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 명령어를 설정하셔야 합니다&lt;/p&gt;
&lt;pre id=&quot;code_1735285778972&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    ...
    &quot;typeorm&quot;: &quot;ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js&quot;,
    &quot;migration:create&quot;: &quot;pnpm run typeorm migration:create&quot;,
    &quot;migration:run&quot;: &quot;pnpm run typeorm migration:run -d ./typeorm.config.ts&quot;,
    &quot;migration:revert&quot;: &quot;pnpm run typeorm migration:revert -d ./typeorm.config.ts&quot;,
    &quot;migration:show&quot;: &quot;pnpm run typeorm migration:show -d ./typeorm.config.ts&quot;,
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BACKEND/NODEJS</category>
      <category>Migration</category>
      <category>nodejs</category>
      <category>ORM</category>
      <category>typeorm</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2393</guid>
      <comments>https://trend21c.tistory.com/2393#entry2393comment</comments>
      <pubDate>Thu, 2 Jan 2025 09:20:20 +0900</pubDate>
    </item>
    <item>
      <title>대륙의 또한번의 실수, 다얼유 마우스</title>
      <link>https://trend21c.tistory.com/2388</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저는&amp;nbsp;로지텍&amp;nbsp;G304&amp;nbsp;애용자였습니다&lt;br /&gt;&lt;br /&gt;그런데&amp;nbsp;생각보다&amp;nbsp;로지텍&amp;nbsp;더블클릭&amp;nbsp;문제가&amp;nbsp;고질적입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 제품은 2년이 채 안되어서 더블클릭 문제가 발생합니다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그래서 부담없이 사용할 마우스를 찾아보자해서 찾아보았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘에 다얼유 마우스가 가볍고 좋다고 하더라구요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알리에서 구입했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6FFA3A48C956-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biLAFI/btsLAD42HE2/DztjeaKmtG0bpuw0Ntl501/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biLAFI/btsLAD42HE2/DztjeaKmtG0bpuw0Ntl501/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biLAFI/btsLAD42HE2/DztjeaKmtG0bpuw0Ntl501/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiLAFI%2FbtsLAD42HE2%2FDztjeaKmtG0bpuw0Ntl501%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;1170&quot; height=&quot;488&quot; data-filename=&quot;IMG_6FFA3A48C956-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코인 할인이 큰 폭으로 될때&lt;/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;2만원도 안되는 매우 저렴한 가격으로 구입할수 있었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로지텍 G304에 비해 절반 가격입니다&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;심지어 4K도 지원한다고합니다&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;알리에서 코인은 모으기는 어렵지 않습니다&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;매일 출석으로 20개~70개 정도를 모을수 있는데요&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3623 크게.jpeg&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANpPz/btsLABlRWnf/Ke64F0zXjmWvSArtYRkwK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANpPz/btsLABlRWnf/Ke64F0zXjmWvSArtYRkwK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANpPz/btsLABlRWnf/Ke64F0zXjmWvSArtYRkwK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FANpPz%2FbtsLABlRWnf%2FKe64F0zXjmWvSArtYRkwK0%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;960&quot; height=&quot;1280&quot; data-filename=&quot;IMG_3623 크게.jpeg&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성품은 마우스 외에도 케이블과 수신기가 있습니다&lt;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3624 크게.jpeg&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bna9Fr/btsLyba8tqT/C63zvjgKvMoPxZtcnwha5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bna9Fr/btsLyba8tqT/C63zvjgKvMoPxZtcnwha5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bna9Fr/btsLyba8tqT/C63zvjgKvMoPxZtcnwha5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbna9Fr%2FbtsLyba8tqT%2FC63zvjgKvMoPxZtcnwha5k%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;767&quot; height=&quot;1112&quot; data-filename=&quot;IMG_3624 크게.jpeg&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;1112&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;설명서를 보니 무선 리시버가 1K, 4K 짜리 구분되어서 포함되어있던거군요&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;좀더 큰 녀석이 4K 짜리 리시버입니다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3555 크게.jpeg&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;869&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lKLZo/btsLz0T1Lum/QT5t9Jgs8pjOgh8MgTNV0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lKLZo/btsLz0T1Lum/QT5t9Jgs8pjOgh8MgTNV0K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lKLZo/btsLz0T1Lum/QT5t9Jgs8pjOgh8MgTNV0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlKLZo%2FbtsLz0T1Lum%2FQT5t9Jgs8pjOgh8MgTNV0K%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;686&quot; height=&quot;869&quot; data-filename=&quot;IMG_3555 크게.jpeg&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 일반 블루투스 연결도 가능합니다&lt;/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;마우스 후면 좌측에 BT를 선택하고 우측의 BT 버튼을 꾹 누르면 페어링 준비가 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-12-26-22-04-12.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zV4hN/btsLAVkaxG1/jFBwilTYVIFM6E3KVZPZ6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zV4hN/btsLAVkaxG1/jFBwilTYVIFM6E3KVZPZ6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zV4hN/btsLAVkaxG1/jFBwilTYVIFM6E3KVZPZ6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzV4hN%2FbtsLAVkaxG1%2FjFBwilTYVIFM6E3KVZPZ6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;218&quot; data-filename=&quot;KakaoTalk_Photo_2024-12-26-22-04-12.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;218&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3556 크게.jpeg&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/44LoP/btsLAZmzwLj/dhEL0DHjUaz8kb13O0OtJK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/44LoP/btsLAZmzwLj/dhEL0DHjUaz8kb13O0OtJK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/44LoP/btsLAZmzwLj/dhEL0DHjUaz8kb13O0OtJK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F44LoP%2FbtsLAZmzwLj%2FdhEL0DHjUaz8kb13O0OtJK%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;738&quot; height=&quot;663&quot; data-filename=&quot;IMG_3556 크게.jpeg&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;663&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;케이블 연결은 usb-c 타입니다&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;제품소개를 해보자면&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;G304의 그립감을 좋아하는 분이라면 당연히 좋아할 그립감입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게다가 경량입니다&lt;/p&gt;
&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;로지텍 G304가 99g&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;다얼유 55g&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;그립감도 G304에 뒤지지 않고, 무게는 오히려 가볍습니다&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;게다가 AA배터리를 넣는게 아니라 충전하는 방식인것도 마음에 듭니다&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;/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;굉장히 저렴한 가격의 마우스입니다 강추합니다 코인할인할때 꼭 사세요&lt;/p&gt;</description>
      <category>정보</category>
      <category>A950g</category>
      <category>g304</category>
      <category>다얼유</category>
      <category>로지텍</category>
      <category>마우스</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2388</guid>
      <comments>https://trend21c.tistory.com/2388#entry2388comment</comments>
      <pubDate>Mon, 30 Dec 2024 11:25:27 +0900</pubDate>
    </item>
    <item>
      <title>맥용 4k 32인치 모니터 강추 주연테크 V32UE-E</title>
      <link>https://trend21c.tistory.com/2389</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;예전의 저는 모니터는 DELL, LG, 삼성 제품 말고는 구입해본적이 없었더랬죠&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;그런데 어느날 즐겨보는 잇섭의 채널에서 말도 안되는 미친 가성비의 4K 모니터로 주연테크 제품이 소개된것을 보았습니다&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;벌써 어느덧 3년전 이야기군요&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-filename=&quot;스크린샷 2024-12-24 오후 11.04.07.png&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biPBMX/btsLwdHcdwy/R9MYwKEtqZn1BfQkTWcc7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biPBMX/btsLwdHcdwy/R9MYwKEtqZn1BfQkTWcc7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biPBMX/btsLwdHcdwy/R9MYwKEtqZn1BfQkTWcc7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiPBMX%2FbtsLwdHcdwy%2FR9MYwKEtqZn1BfQkTWcc7K%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;1748&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2024-12-24 오후 11.04.07.png&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도&amp;nbsp;옛날사람이라&amp;nbsp;주연테크가&amp;nbsp;언제적&amp;nbsp;주연테크인거지&amp;nbsp;라는&amp;nbsp;생각이&amp;nbsp;들었습니다&lt;br /&gt;&lt;br /&gt;그런데 잇섭의 리뷰가 너무 좋더라구요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;당시에 30만원도 안되는 가격에 주연테크의 32인치 4K 모니터를 구입했고,&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;특히나 PD충전까지 가능한 매력은 주연테크 모니터에 대한 새로운 인식을 심어주었습니다&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;최근 4k 32인치 모니터를 구입하려고 했는데,&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;그래서 뭘살까 다나와에서 검색을 해보았습니다&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-filename=&quot;스크린샷 2024-12-24 오후 10.57.53.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KOVPU/btsLyGncRTQ/L2sWxI45hNgbnoeqkasp70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KOVPU/btsLyGncRTQ/L2sWxI45hNgbnoeqkasp70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KOVPU/btsLyGncRTQ/L2sWxI45hNgbnoeqkasp70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKOVPU%2FbtsLyGncRTQ%2FL2sWxI45hNgbnoeqkasp70%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;1646&quot; height=&quot;944&quot; data-filename=&quot;스크린샷 2024-12-24 오후 10.57.53.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색조건 항목은 다음과 같습니다&lt;/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;32인치 4K 모니터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20만원에서 40만원 가격대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 포함해야하는것이 USB PD 지원&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;USB PD 지원이 핵심입니다&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;USB PD 지원이 된다는 것이 사용할때 얼마나 편하냐면&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;맥과 모니터를 USB-C 케이블로만 연결하면 된다는 것입니다&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;/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;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;2024년 끝자락에도 해당 조건으로 검색결과는 많지 않군요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-24 오후 10.57.32.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JU9QQ/btsLxrYE3rd/R91ZDKbLOiw9al2Dhjk5kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JU9QQ/btsLxrYE3rd/R91ZDKbLOiw9al2Dhjk5kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JU9QQ/btsLxrYE3rd/R91ZDKbLOiw9al2Dhjk5kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJU9QQ%2FbtsLxrYE3rd%2FR91ZDKbLOiw9al2Dhjk5kK%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;1882&quot; height=&quot;1142&quot; data-filename=&quot;스크린샷 2024-12-24 오후 10.57.32.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;1142&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;삼성 M7과 주연테크 제품입니다&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;가격은 4만원 정도 차이가 납니다&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;둘다 PD 충전 최대 65W를 지원합니다&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;삼성 M7 제품은 스마트티비용도로 영상 감상용으로 더 많이 사용하는것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 예전에 주연테크 모니터에서 만족스러웠던 경험이 있기에 이번에도 주연테크 제품을 골랐습니다&lt;/p&gt;
&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-24 오후 10.59.06.png&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXamT/btsLwJFuJZO/xoXnAgRUawauY23taS5Kg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXamT/btsLwJFuJZO/xoXnAgRUawauY23taS5Kg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXamT/btsLwJFuJZO/xoXnAgRUawauY23taS5Kg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXamT%2FbtsLwJFuJZO%2FxoXnAgRUawauY23taS5Kg0%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;1770&quot; height=&quot;1446&quot; data-filename=&quot;스크린샷 2024-12-24 오후 10.59.06.png&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 중요한 부분입니다&lt;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3621 중간.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Cv4S/btsLA0y0wHa/2cmFenvI2PcMyw6wQUOvIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Cv4S/btsLA0y0wHa/2cmFenvI2PcMyw6wQUOvIk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Cv4S/btsLA0y0wHa/2cmFenvI2PcMyw6wQUOvIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Cv4S%2FbtsLA0y0wHa%2F2cmFenvI2PcMyw6wQUOvIk%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;640&quot; height=&quot;480&quot; data-filename=&quot;IMG_3621 중간.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3618 중간.jpeg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WubQj/btsLxPzqcVB/3idZK6agv06aIquxN7VRQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WubQj/btsLxPzqcVB/3idZK6agv06aIquxN7VRQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WubQj/btsLxPzqcVB/3idZK6agv06aIquxN7VRQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWubQj%2FbtsLxPzqcVB%2F3idZK6agv06aIquxN7VRQ1%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;500&quot; height=&quot;470&quot; data-filename=&quot;IMG_3618 중간.jpeg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;470&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3619 중간.jpeg&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo9Aft/btsLxjU8puT/5aQ857RkuZFybQqSXzeGGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo9Aft/btsLxjU8puT/5aQ857RkuZFybQqSXzeGGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo9Aft/btsLxjU8puT/5aQ857RkuZFybQqSXzeGGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo9Aft%2FbtsLxjU8puT%2F5aQ857RkuZFybQqSXzeGGk%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;597&quot; height=&quot;472&quot; data-filename=&quot;IMG_3619 중간.jpeg&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;472&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3620 중간.jpeg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPkND5/btsLAyvTv8U/577Jfe8JlpEaBUU2Ee2XG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPkND5/btsLAyvTv8U/577Jfe8JlpEaBUU2Ee2XG1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPkND5/btsLAyvTv8U/577Jfe8JlpEaBUU2Ee2XG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPkND5%2FbtsLAyvTv8U%2F577Jfe8JlpEaBUU2Ee2XG1%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;489&quot; height=&quot;442&quot; data-filename=&quot;IMG_3620 중간.jpeg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;442&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;모니터 뒷부분에 HDMI, DP, USB-C, USB-B, USB-A 2개 단자가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USB-C 케이블로 맥과 연결하고, USB-A 단자 2개로 마우스나 키보드 연결에 사용해도 좋습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3616.PNG&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VqoUE/btsLxDEBi8o/S1IOqcxYB4D6jzhyOIGqn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VqoUE/btsLxDEBi8o/S1IOqcxYB4D6jzhyOIGqn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VqoUE/btsLxDEBi8o/S1IOqcxYB4D6jzhyOIGqn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVqoUE%2FbtsLxDEBi8o%2FS1IOqcxYB4D6jzhyOIGqn1%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;1298&quot; data-filename=&quot;IMG_3616.PNG&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물가가 오르긴 올랐습니다&lt;/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;가격은 329,000원입니다&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;예전 주연테크 32인치 모니터는 검은색이었는데 이번에는 흰색이네요&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;&lt;a href=&quot;https://link.coupang.com/a/b6xQ8r&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://link.coupang.com/a/b6xQ8r&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735048985310&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;주연테크 4K UHD USB Type C 65W FreeSync HDR 모니터 화이트 - 게이밍 모니터 | 쿠팡&quot; data-og-description=&quot;쿠팡에서 4.4 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 14 제품도 바로 쿠팡에서 확인할 수 있습니다.&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://link.coupang.com/a/b6xQ8r&quot; data-og-url=&quot;https://www.coupang.com/vp/products/8371427332?vendorItemId=89606616519&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cHfxe5/hyXOre8m7w/C7uJhRvjXBsp39FrxJxIz1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/do299k/hyXOobDXKC/bcgAKYRg7MGqxIODXkh7C1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492&quot;&gt;&lt;a href=&quot;https://link.coupang.com/a/b6xQ8r&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://link.coupang.com/a/b6xQ8r&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cHfxe5/hyXOre8m7w/C7uJhRvjXBsp39FrxJxIz1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/do299k/hyXOobDXKC/bcgAKYRg7MGqxIODXkh7C1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492');&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;주연테크 4K UHD USB Type C 65W FreeSync HDR 모니터 화이트 - 게이밍 모니터 | 쿠팡&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;쿠팡에서 4.4 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 14 제품도 바로 쿠팡에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보</category>
      <category>32인치모니터</category>
      <category>4K모니터</category>
      <category>맥용모니터</category>
      <category>모니터</category>
      <category>주연테크</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2389</guid>
      <comments>https://trend21c.tistory.com/2389#entry2389comment</comments>
      <pubDate>Sat, 28 Dec 2024 13:03:32 +0900</pubDate>
    </item>
    <item>
      <title>aws batch 작업 결과를 sns 알림받기</title>
      <link>https://trend21c.tistory.com/2387</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://trend21c.tistory.com/2384&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://trend21c.tistory.com/2384&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735128606480&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;aws batch 따라하기&quot; data-og-description=&quot;AWS Batch는 우리 개발자들이 흔히 알고 있는 바로 그 배치입니다&amp;nbsp;AWS&amp;nbsp;Batch를&amp;nbsp;사용하면&amp;nbsp;업계&amp;nbsp;전반의&amp;nbsp;개발자,&amp;nbsp;과학자,&amp;nbsp;엔지니어가&amp;nbsp;수십만&amp;nbsp;개의&amp;nbsp;배치&amp;nbsp;컴퓨팅&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;실행하는&amp;nbsp;&quot; data-og-host=&quot;trend21c.tistory.com&quot; data-og-source-url=&quot;https://trend21c.tistory.com/2384&quot; data-og-url=&quot;https://trend21c.tistory.com/2384&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOky37/hyXOncSnL1/g4wBHhc1sKKe3HrrdQkWwK/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/izheR/hyXOjaqQ4P/cwXuybK3KMGecYjb8ZDo1k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/c5pWOP/hyXOqHocut/hCYj4F28m9ddFMTpHDkc9K/img.png?width=2716&amp;amp;height=1608&amp;amp;face=0_0_2716_1608&quot;&gt;&lt;a href=&quot;https://trend21c.tistory.com/2384&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://trend21c.tistory.com/2384&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOky37/hyXOncSnL1/g4wBHhc1sKKe3HrrdQkWwK/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/izheR/hyXOjaqQ4P/cwXuybK3KMGecYjb8ZDo1k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/c5pWOP/hyXOqHocut/hCYj4F28m9ddFMTpHDkc9K/img.png?width=2716&amp;amp;height=1608&amp;amp;face=0_0_2716_1608');&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;aws batch 따라하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS Batch는 우리 개발자들이 흔히 알고 있는 바로 그 배치입니다&amp;nbsp;AWS&amp;nbsp;Batch를&amp;nbsp;사용하면&amp;nbsp;업계&amp;nbsp;전반의&amp;nbsp;개발자,&amp;nbsp;과학자,&amp;nbsp;엔지니어가&amp;nbsp;수십만&amp;nbsp;개의&amp;nbsp;배치&amp;nbsp;컴퓨팅&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;실행하는&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;trend21c.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전의 포스팅을 따라하여 aws batch 작업을 생성하실 수 있습니다&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;batch를 생성하긴했는데, batch의 결과를 받아보고 싶습니다&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;eventbridge를 통해 batch와 관련된 이벤트에 대한 알림을 받아볼 수 있도록 규칙을 생성해보겠습니다&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;eventbridge 메뉴를 선택하여 규칙생성을 선택합니다&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;그리고 규칙 유형에서 &quot;이벤트 패턴이 있는 규칙&quot;을 선택합니다&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-filename=&quot;스크린샷 2024-12-14 오후 4.15.55.png&quot; data-origin-width=&quot;2422&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drY2fG/btsLkcNpB9r/gs4MraWtdfTDA8zKgqvQ9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drY2fG/btsLkcNpB9r/gs4MraWtdfTDA8zKgqvQ9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drY2fG/btsLkcNpB9r/gs4MraWtdfTDA8zKgqvQ9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrY2fG%2FbtsLkcNpB9r%2Fgs4MraWtdfTDA8zKgqvQ9k%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;2422&quot; height=&quot;1360&quot; data-filename=&quot;스크린샷 2024-12-14 오후 4.15.55.png&quot; data-origin-width=&quot;2422&quot; data-origin-height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후의 이벤트 패턴 작성을 통해서&lt;/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;batch와 관련된 패턴을 입력하여, 여러 이벤트중에서 배치작업과 관련된 이벤트만 수신하도록 하려고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.53.48.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;1342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ojWZ/btsLzqYXo2m/EZr6IouKrARktO0qKuskw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ojWZ/btsLzqYXo2m/EZr6IouKrARktO0qKuskw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ojWZ/btsLzqYXo2m/EZr6IouKrARktO0qKuskw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ojWZ%2FbtsLzqYXo2m%2FEZr6IouKrARktO0qKuskw0%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;1926&quot; height=&quot;1342&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.53.48.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;1342&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;AWS서비스 - Batch - 모든 이벤트를 선택하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734178662231&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;source&quot;: [
    &quot;aws.batch&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;이렇게 json 형태의 패턴이 완성됩니다&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;이 패턴은 선택한 그대로 batch의 모든 이벤트를 수신하는 패턴입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.55.12.png&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGtiFa/btsLx1S5h8F/i8ipVeHS1XGOXEwKddllQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGtiFa/btsLx1S5h8F/i8ipVeHS1XGOXEwKddllQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGtiFa/btsLx1S5h8F/i8ipVeHS1XGOXEwKddllQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGtiFa%2FbtsLx1S5h8F%2Fi8ipVeHS1XGOXEwKddllQK%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;1930&quot; height=&quot;970&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.55.12.png&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;970&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;batch job의 상태가 변경되는 이벤트만 수신하려는 경우&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;AWS 이벤트 - Batch - Batch Job State Change를 선택하면&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;여기서 발전시켜서 state 변경중에서 실패한 이벤트만 매칭하기 위해서는&lt;/p&gt;
&lt;pre id=&quot;code_1734178696868&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;detail-type&quot;: [
    &quot;Batch Job State Change&quot;
  ],
  &quot;source&quot;: [
    &quot;aws.batch&quot;
  ],
  &quot;detail&quot;: {
    &quot;status&quot;: [
      &quot;FAILED&quot;
    ]
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 입력할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;a href=&quot;https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_sns_reg_rule.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_sns_reg_rule.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735478413297&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;자습서: 이벤트 규칙 등록 - AWS Batch&quot; data-og-description=&quot;이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_sns_reg_rule.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_sns_reg_rule.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_sns_reg_rule.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_sns_reg_rule.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자습서: 이벤트 규칙 등록 - AWS Batch&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;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.56.58.png&quot; data-origin-width=&quot;1990&quot; data-origin-height=&quot;1154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ATMOn/btsLw61UnQf/8oVgPRxCxpe0W6KzyPCplK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ATMOn/btsLw61UnQf/8oVgPRxCxpe0W6KzyPCplK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ATMOn/btsLw61UnQf/8oVgPRxCxpe0W6KzyPCplK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FATMOn%2FbtsLw61UnQf%2F8oVgPRxCxpe0W6KzyPCplK%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;1990&quot; height=&quot;1154&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.56.58.png&quot; data-origin-width=&quot;1990&quot; data-origin-height=&quot;1154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 대상 선택을 통해 앞서 설정한 이벤트 패턴과 매칭되는 경우 어떻게 처리할지 대상을 지정할 수 있습니다&lt;/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;여기서 SNS 토픽을 선택하여 SNS를 통해 여러 알림을 받을 수도 있고,&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;lambda를 통해 특정 작업을 실행 시킬수도 있습니다&lt;/p&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>Batch</category>
      <category>EventBridge</category>
      <category>SNS</category>
      <category>알림</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2387</guid>
      <comments>https://trend21c.tistory.com/2387#entry2387comment</comments>
      <pubDate>Fri, 27 Dec 2024 11:02:01 +0900</pubDate>
    </item>
    <item>
      <title>aws batch를 cron 처럼 주기적으로 실행하기</title>
      <link>https://trend21c.tistory.com/2386</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://trend21c.tistory.com/2384&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://trend21c.tistory.com/2384&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735128619244&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;aws batch 따라하기&quot; data-og-description=&quot;AWS Batch는 우리 개발자들이 흔히 알고 있는 바로 그 배치입니다&amp;nbsp;AWS&amp;nbsp;Batch를&amp;nbsp;사용하면&amp;nbsp;업계&amp;nbsp;전반의&amp;nbsp;개발자,&amp;nbsp;과학자,&amp;nbsp;엔지니어가&amp;nbsp;수십만&amp;nbsp;개의&amp;nbsp;배치&amp;nbsp;컴퓨팅&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;실행하는&amp;nbsp;&quot; data-og-host=&quot;trend21c.tistory.com&quot; data-og-source-url=&quot;https://trend21c.tistory.com/2384&quot; data-og-url=&quot;https://trend21c.tistory.com/2384&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOky37/hyXOncSnL1/g4wBHhc1sKKe3HrrdQkWwK/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/izheR/hyXOjaqQ4P/cwXuybK3KMGecYjb8ZDo1k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/c5pWOP/hyXOqHocut/hCYj4F28m9ddFMTpHDkc9K/img.png?width=2716&amp;amp;height=1608&amp;amp;face=0_0_2716_1608&quot;&gt;&lt;a href=&quot;https://trend21c.tistory.com/2384&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://trend21c.tistory.com/2384&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOky37/hyXOncSnL1/g4wBHhc1sKKe3HrrdQkWwK/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/izheR/hyXOjaqQ4P/cwXuybK3KMGecYjb8ZDo1k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/c5pWOP/hyXOqHocut/hCYj4F28m9ddFMTpHDkc9K/img.png?width=2716&amp;amp;height=1608&amp;amp;face=0_0_2716_1608');&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;aws batch 따라하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS Batch는 우리 개발자들이 흔히 알고 있는 바로 그 배치입니다&amp;nbsp;AWS&amp;nbsp;Batch를&amp;nbsp;사용하면&amp;nbsp;업계&amp;nbsp;전반의&amp;nbsp;개발자,&amp;nbsp;과학자,&amp;nbsp;엔지니어가&amp;nbsp;수십만&amp;nbsp;개의&amp;nbsp;배치&amp;nbsp;컴퓨팅&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;실행하는&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;trend21c.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws batch를 만드는 것을 이전의 과정을 통해서 진행해보았습니다&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;/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;이전에는 cloudwatch에서 이 작업을 할 수 있었던것 같은데&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;이제는 정식 명칭이 새로 eventbridge로 생긴것 같네요&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;Amazon EventBridge 메뉴로 접속하여 규칙 생성을 선택합니다&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;이 작업 역시 준비물이 필요합니다&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;eventbridge가 batch의 submitjob을 실행할 수 있는 권한을 가진 역할을 생성해야 합니다&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;IAM을 통해서 SchedulerExecutionRole 이름의 역할을 생성합니다&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;pre id=&quot;code_1734178118382&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Principal&quot;: {
                &quot;Service&quot;: &quot;scheduler.amazonaws.com&quot;
            },
            &quot;Action&quot;: &quot;sts:AssumeRole&quot;
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 AWSBatchServiceEventTargetRole 권한을 추가합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734178157518&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;batch:SubmitJob&quot;
            ],
            &quot;Resource&quot;: &quot;*&quot;
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 권한을 앞으로 생성할 규칙에 지정할 예정입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 규칙 생성으로 돌아가 진행해봅시다&lt;/p&gt;
&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;1단계 일정 세부정보 지정입니다&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-filename=&quot;스크린샷 2024-12-14 오후 9.11.04.png&quot; data-origin-width=&quot;2544&quot; data-origin-height=&quot;1576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LVS81/btsLjVd3FJo/PFwSrjep1gSIU2ExdjPB01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LVS81/btsLjVd3FJo/PFwSrjep1gSIU2ExdjPB01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LVS81/btsLjVd3FJo/PFwSrjep1gSIU2ExdjPB01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLVS81%2FbtsLjVd3FJo%2FPFwSrjep1gSIU2ExdjPB01%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;2544&quot; height=&quot;1576&quot; data-filename=&quot;스크린샷 2024-12-14 오후 9.11.04.png&quot; data-origin-width=&quot;2544&quot; data-origin-height=&quot;1576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름을 작성하고, 일정 패턴을 지정합니다&lt;/p&gt;
&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 9.11.24.png&quot; data-origin-width=&quot;1964&quot; data-origin-height=&quot;1468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beIUyw/btsLklDrSY1/HwvLkSsWy8BhZfuTllYP31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beIUyw/btsLklDrSY1/HwvLkSsWy8BhZfuTllYP31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beIUyw/btsLklDrSY1/HwvLkSsWy8BhZfuTllYP31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeIUyw%2FbtsLklDrSY1%2FHwvLkSsWy8BhZfuTllYP31%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;1964&quot; height=&quot;1468&quot; data-filename=&quot;스크린샷 2024-12-14 오후 9.11.24.png&quot; data-origin-width=&quot;1964&quot; data-origin-height=&quot;1468&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;Cron 기반 일정을 선택하면&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;우리가 cron 표현식 사용하던것처럼 일정을 입력할 수 있습니다&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;Cron 표현식을 입력해 넣으면, 앞으로 어떤 시각에 실행되는지 예제가 보여집니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 9.12.11.png&quot; data-origin-width=&quot;2536&quot; data-origin-height=&quot;1274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VQ1ce/btsLjk6zeya/Q371EtnQEYq61bMbinBYak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VQ1ce/btsLjk6zeya/Q371EtnQEYq61bMbinBYak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VQ1ce/btsLjk6zeya/Q371EtnQEYq61bMbinBYak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVQ1ce%2FbtsLjk6zeya%2FQ371EtnQEYq61bMbinBYak%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;2536&quot; height=&quot;1274&quot; data-filename=&quot;스크린샷 2024-12-14 오후 9.12.11.png&quot; data-origin-width=&quot;2536&quot; data-origin-height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 이 일정을 기반으로 어떤 작업을 실행할지 대상을 선택합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 API를 선택하여 API 찾기를 통해&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;AWS Batch - SubmitJob을 순서대로 선택합니다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 9.12.35.png&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rUDtq/btsLjEQ8LSR/MfcwYlvPaaBqKIe3DNqRcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rUDtq/btsLjEQ8LSR/MfcwYlvPaaBqKIe3DNqRcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rUDtq/btsLjEQ8LSR/MfcwYlvPaaBqKIe3DNqRcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrUDtq%2FbtsLjEQ8LSR%2FMfcwYlvPaaBqKIe3DNqRcK%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;1980&quot; height=&quot;1360&quot; data-filename=&quot;스크린샷 2024-12-14 오후 9.12.35.png&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;1360&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;json 형태로 submitjob의 구체적인 내용을 지정할 수 있습니다&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;각각의 항목에 내가 이미 만들었던, 작업정의이름(JobDefinition), 작업이름(JobName), 작업대기열(JobQueue) 이름을 적어넣습니다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 4.20.05.png&quot; data-origin-width=&quot;2318&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EU8lP/btsLiMCwwr9/DqKKk3H3xZZ8la52pd5t1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EU8lP/btsLiMCwwr9/DqKKk3H3xZZ8la52pd5t1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EU8lP/btsLiMCwwr9/DqKKk3H3xZZ8la52pd5t1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEU8lP%2FbtsLiMCwwr9%2FDqKKk3H3xZZ8la52pd5t1k%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;2318&quot; height=&quot;1598&quot; data-filename=&quot;스크린샷 2024-12-14 오후 4.20.05.png&quot; data-origin-width=&quot;2318&quot; data-origin-height=&quot;1598&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;일정이 계속 실패할때 재시도정책과 DLQ를 지정할 수도 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.27.35.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIbxGZ/btsLzqSakF9/p46eASqHddtfZEjjXmrIo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIbxGZ/btsLzqSakF9/p46eASqHddtfZEjjXmrIo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIbxGZ/btsLzqSakF9/p46eASqHddtfZEjjXmrIo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIbxGZ%2FbtsLzqSakF9%2Fp46eASqHddtfZEjjXmrIo1%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;1926&quot; height=&quot;722&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.27.35.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;722&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;EventBridge Scheduler가 AWS batch에 job을 submit 할수 있도록 역할을 지정해야합니다&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;기존 역할 중에 우리가 이미 앞서 만들었던 SchedulerExecutionRole을 선택합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.27.45.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7oAUl/btsLwnJXQpx/rRILOXFhXyehRcUOX9ATiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7oAUl/btsLwnJXQpx/rRILOXFhXyehRcUOX9ATiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7oAUl/btsLwnJXQpx/rRILOXFhXyehRcUOX9ATiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7oAUl%2FbtsLwnJXQpx%2FrRILOXFhXyehRcUOX9ATiK%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;1512&quot; height=&quot;706&quot; data-filename=&quot;스크린샷 2024-12-25 오후 9.27.45.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 모든 설정이 끝입니다&lt;/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;지정된 일정에 맞춰 aws batch가 실행되는 것을 확인할 수 있습니다&lt;/p&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>Batch</category>
      <category>CloudWatch</category>
      <category>cron</category>
      <category>EventBridge</category>
      <category>Scheduler</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2386</guid>
      <comments>https://trend21c.tistory.com/2386#entry2386comment</comments>
      <pubDate>Thu, 26 Dec 2024 10:37:00 +0900</pubDate>
    </item>
    <item>
      <title>aws batch 따라하기</title>
      <link>https://trend21c.tistory.com/2384</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Batch는 우리 개발자들이 흔히 알고 있는 바로 그 배치입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AWS&amp;nbsp;Batch를&amp;nbsp;사용하면&amp;nbsp;업계&amp;nbsp;전반의&amp;nbsp;개발자,&amp;nbsp;과학자,&amp;nbsp;엔지니어가&amp;nbsp;수십만&amp;nbsp;개의&amp;nbsp;배치&amp;nbsp;컴퓨팅&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;실행하는&amp;nbsp;동시에&amp;nbsp;컴퓨팅&amp;nbsp;리소스를&amp;nbsp;최적화하여&amp;nbsp;결과&amp;nbsp;분석&amp;nbsp;및&amp;nbsp;문제&amp;nbsp;해결에&amp;nbsp;집중할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기능을&amp;nbsp;제공합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 홈페이지에서는 이런게 설명이되어있는데요&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;활용 예로 DNA 시퀀싱, 트랜스코딩과 같은 것들이 설명되어있습니다&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;aws batch는 ecs를 통해 실행되고 ecs를 통해 실행된 인프라 리소스에 대한 청구만이 발생합니다&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;실제로 aws batch를 구성하면 내가 직접 생성하지 않았지만&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;aws batch를 통해 생성된 ecs 클러스터가 있는 것을 확인할 수 있습니다&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;AWS Batch를 이용하여 항상 실행되는 인스턴스를 유지하지 않으면서도 배치를 실행하는 작업을 해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;AWS 배치는 크게 다음과 같은 구성요소로 되어있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨팅환경&lt;/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;그리고 바로 이 스택의 위에 개별 작업(task)이라는것이 존재합니다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컴퓨팅환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 10.57.50.png&quot; data-origin-width=&quot;2736&quot; data-origin-height=&quot;1540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/belx7j/btsLiWkFtcN/XfMj1CRf6kZP0O2h2zivg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/belx7j/btsLiWkFtcN/XfMj1CRf6kZP0O2h2zivg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/belx7j/btsLiWkFtcN/XfMj1CRf6kZP0O2h2zivg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbelx7j%2FbtsLiWkFtcN%2FXfMj1CRf6kZP0O2h2zivg1%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;2736&quot; height=&quot;1540&quot; data-filename=&quot;스크린샷 2024-12-14 오전 10.57.50.png&quot; data-origin-width=&quot;2736&quot; data-origin-height=&quot;1540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 작업이 실행될때 사용되는 ecs 컨테이너의 인스턴스 타입, 네트워크 구성 등을 만들어 놓는 곳입니다&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;/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: #333333; text-align: start;&quot;&gt;이후에 만들게될&lt;span&gt;&amp;nbsp;&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;/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;fargate 형식을 쓸지 ec2 타입을 쓸지, 혹은 spot 인스턴스 타입을 쓰고있는 작업 대기열을 쓸지 골라 쓰면 되겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨팅 환경은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fargate&lt;/li&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;EKS&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세개의 환경 중에 골라서 만들 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 시작되어야하는 경우 fargate를 선택하고, 높은 수준의 처리량이 필요한 경우에 ec2를 선택하는 등의 약간의 가이드 정도가 있긴한데 여러분이 원하는 종류로 선택하시면 되겠습니다&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-filename=&quot;스크린샷 2024-12-14 오전 10.58.20.png&quot; data-origin-width=&quot;2764&quot; data-origin-height=&quot;1204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B8VpZ/btsLkbgCVeP/gEIkP1yYkFrZsjGU6SddDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B8VpZ/btsLkbgCVeP/gEIkP1yYkFrZsjGU6SddDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B8VpZ/btsLkbgCVeP/gEIkP1yYkFrZsjGU6SddDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB8VpZ%2FbtsLkbgCVeP%2FgEIkP1yYkFrZsjGU6SddDk%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;2764&quot; height=&quot;1204&quot; data-filename=&quot;스크린샷 2024-12-14 오전 10.58.20.png&quot; data-origin-width=&quot;2764&quot; data-origin-height=&quot;1204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;컴퓨팅 환경에서 스팟인스턴스도 사용이 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 6.03.33.png&quot; data-origin-width=&quot;1832&quot; data-origin-height=&quot;1358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Duss1/btsLjrYFt38/sOgsNrk3NCJoCVnBQOBBuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Duss1/btsLjrYFt38/sOgsNrk3NCJoCVnBQOBBuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Duss1/btsLjrYFt38/sOgsNrk3NCJoCVnBQOBBuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDuss1%2FbtsLjrYFt38%2FsOgsNrk3NCJoCVnBQOBBuK%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;1832&quot; height=&quot;1358&quot; data-filename=&quot;스크린샷 2024-12-14 오후 6.03.33.png&quot; data-origin-width=&quot;1832&quot; data-origin-height=&quot;1358&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;EC2 환경을 설정하고, 스팟인스턴스 사용을 체크하면 추가로 여러가지를 선택할 수 있는데&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;br /&gt;&lt;br /&gt;실행할 작업이 없을때는 인스턴스를 종료하기 위해 최소 vCPU를 0으로 설정할수 있습니다&lt;br /&gt;&lt;br /&gt;인스턴스 유형에서 optimal은 최적의 인스턴스 유형을 자동으로 골라 사용합니다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치가&amp;nbsp; 긴 시간 동작하지 않는다면 spot으로 충분합니다&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-filename=&quot;스크린샷 2024-12-14 오전 10.58.33.png&quot; data-origin-width=&quot;2716&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6WryK/btsLij8GCvC/1NKzLJdmHARZxTW6ZZRqrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6WryK/btsLij8GCvC/1NKzLJdmHARZxTW6ZZRqrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6WryK/btsLij8GCvC/1NKzLJdmHARZxTW6ZZRqrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6WryK%2FbtsLij8GCvC%2F1NKzLJdmHARZxTW6ZZRqrK%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;2716&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-14 오전 10.58.33.png&quot; data-origin-width=&quot;2716&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 구성 이후에는 배치가 실행되는 리소스의 네트워크 설정도 필요합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.02.37.png&quot; data-origin-width=&quot;2950&quot; data-origin-height=&quot;1600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgLz95/btsLjuHPlmS/EOWfxlHCZRvFBCkIfCguRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgLz95/btsLjuHPlmS/EOWfxlHCZRvFBCkIfCguRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgLz95/btsLjuHPlmS/EOWfxlHCZRvFBCkIfCguRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgLz95%2FbtsLjuHPlmS%2FEOWfxlHCZRvFBCkIfCguRK%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;2950&quot; height=&quot;1600&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.02.37.png&quot; data-origin-width=&quot;2950&quot; data-origin-height=&quot;1600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 컴퓨팅 환경을 만들었으니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨팅 환경을 사용할 작업 대기열을 만들어야 합니다&lt;/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;작업 대기열도 마찬가지로 fargate, ec2, eks 중에 선택할 수 있습니다&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-filename=&quot;스크린샷 2024-12-14 오후 6.06.53.png&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BAfCF/btsLisj5rch/JofkqKgUOX0URhFb2V5Bqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BAfCF/btsLisj5rch/JofkqKgUOX0URhFb2V5Bqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BAfCF/btsLisj5rch/JofkqKgUOX0URhFb2V5Bqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBAfCF%2FbtsLisj5rch%2FJofkqKgUOX0URhFb2V5Bqk%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;1894&quot; height=&quot;1358&quot; data-filename=&quot;스크린샷 2024-12-14 오후 6.06.53.png&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 대기열에서 선택한 유형과 같은 종류의 컴퓨팅 환경을 연결할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 대기열이 ec2 라면 컴퓨팅 환경도 ec2만 선택이 가능합니다&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;&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;작업 정의를 설정하기 전에 작업정의 전에서 미리 만들어두어야 할 역할이 있습니다&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;aws batch는 ECS를 활용한다고 말씀드렸는데요&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;그렇기 때문에 aws batch가 ecs 를 통해 작업을 실행할 수 있도록 관련 권한을 가지고 있는 역할을 설정해야합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.16.11.png&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sXkb5/btsLj1rDYQc/vbkRwJbn6wXMMztD2dYsGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sXkb5/btsLj1rDYQc/vbkRwJbn6wXMMztD2dYsGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sXkb5/btsLj1rDYQc/vbkRwJbn6wXMMztD2dYsGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsXkb5%2FbtsLj1rDYQc%2FvbkRwJbn6wXMMztD2dYsGk%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;2360&quot; height=&quot;1610&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.16.11.png&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1610&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;IAM에서 역할을 생성합니다&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;엔터티 유형에 AWS 서비스를 선택하고 Elastic Container Service를 선택, 사용 사례로 Elastic Container Service Task를 선택합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.16.18.png&quot; data-origin-width=&quot;2986&quot; data-origin-height=&quot;1064&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lzlZR/btsLjlYFD0O/Ccw7kADWdGqVKfLhvTFWd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lzlZR/btsLjlYFD0O/Ccw7kADWdGqVKfLhvTFWd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lzlZR/btsLjlYFD0O/Ccw7kADWdGqVKfLhvTFWd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlzlZR%2FbtsLjlYFD0O%2FCcw7kADWdGqVKfLhvTFWd0%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;2986&quot; height=&quot;1064&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.16.18.png&quot; data-origin-width=&quot;2986&quot; data-origin-height=&quot;1064&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;그리고 권한에 AmazonECSTaskExecutionRolePolicy를 검색하여 추가합니다&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-filename=&quot;스크린샷 2024-12-14 오전 11.16.28.png&quot; data-origin-width=&quot;2950&quot; data-origin-height=&quot;1556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mklcw/btsLju19Fvi/Oo15LkpA5chu3OSGRKhXkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mklcw/btsLju19Fvi/Oo15LkpA5chu3OSGRKhXkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mklcw/btsLju19Fvi/Oo15LkpA5chu3OSGRKhXkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMklcw%2FbtsLju19Fvi%2FOo15LkpA5chu3OSGRKhXkk%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;2950&quot; height=&quot;1556&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.16.28.png&quot; data-origin-width=&quot;2950&quot; data-origin-height=&quot;1556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신뢰관계에 아래와 같이 입력합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734174834787&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Sid&quot;: &quot;&quot;,
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Principal&quot;: {
                &quot;Service&quot;: &quot;ecs-tasks.amazonaws.com&quot;
            },
            &quot;Action&quot;: &quot;sts:AssumeRole&quot;
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할 이름으로 ecsTaskExecutionRole 으로 설정하고 저장합니다&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;그리고 준비물이 하나더 있습니다&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;aws batch는 ECR에 저장된 이미지를 기반으로 합니다&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;그래서 작업 정의시에 ECR에 저장된 레포지토리 URI를 입력해야합니다&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;ECR에 컨테이너 이미지를 업로드하는 방법은 아래의 링크를 참고하세요&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;a href=&quot;https://trend21c.tistory.com/2385&quot;&gt;https://trend21c.tistory.com/2385&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734836222727&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;ECR에 도커 이미지 푸시하기&quot; data-og-description=&quot;AWS의 컨테이너 레지스트리에 도커 이미지를 푸시해보겠습니다&amp;nbsp;ECR에 푸시한 도커 이미지는 다양한 곳에서 사용될수 있습니다&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이미지의 레포지토리 이름을 지정합니다 namespace/repo-name과 같&quot; data-og-host=&quot;trend21c.tistory.com&quot; data-og-source-url=&quot;https://trend21c.tistory.com/2385&quot; data-og-url=&quot;https://trend21c.tistory.com/2385&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6yWim/hyXOiB4WcQ/JSdX4BZdKBNE3SAwR47mlk/img.png?width=800&amp;amp;height=522&amp;amp;face=0_0_800_522,https://scrap.kakaocdn.net/dn/bm2io5/hyXOhDcq3n/yArBM099k78Q9JoXXGBm7k/img.png?width=800&amp;amp;height=522&amp;amp;face=0_0_800_522,https://scrap.kakaocdn.net/dn/dPGSKD/hyXOlMj2rq/xkVzfjCiGl275zoaIUb3l0/img.png?width=2482&amp;amp;height=1620&amp;amp;face=0_0_2482_1620&quot;&gt;&lt;a href=&quot;https://trend21c.tistory.com/2385&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://trend21c.tistory.com/2385&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6yWim/hyXOiB4WcQ/JSdX4BZdKBNE3SAwR47mlk/img.png?width=800&amp;amp;height=522&amp;amp;face=0_0_800_522,https://scrap.kakaocdn.net/dn/bm2io5/hyXOhDcq3n/yArBM099k78Q9JoXXGBm7k/img.png?width=800&amp;amp;height=522&amp;amp;face=0_0_800_522,https://scrap.kakaocdn.net/dn/dPGSKD/hyXOlMj2rq/xkVzfjCiGl275zoaIUb3l0/img.png?width=2482&amp;amp;height=1620&amp;amp;face=0_0_2482_1620');&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;ECR에 도커 이미지 푸시하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS의 컨테이너 레지스트리에 도커 이미지를 푸시해보겠습니다&amp;nbsp;ECR에 푸시한 도커 이미지는 다양한 곳에서 사용될수 있습니다&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이미지의 레포지토리 이름을 지정합니다 namespace/repo-name과 같&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;trend21c.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;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;이제 준비물 &quot;IAM 역할&quot;과 &quot;ECR 이미지&quot; 두개를 갖췄습니다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.03.46.png&quot; data-origin-width=&quot;2802&quot; data-origin-height=&quot;1526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6mZeM/btsLjcHwR5U/8ekGizD7sHW8Fy1KIX1oO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6mZeM/btsLjcHwR5U/8ekGizD7sHW8Fy1KIX1oO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6mZeM/btsLjcHwR5U/8ekGizD7sHW8Fy1KIX1oO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6mZeM%2FbtsLjcHwR5U%2F8ekGizD7sHW8Fy1KIX1oO0%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;2802&quot; height=&quot;1526&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.03.46.png&quot; data-origin-width=&quot;2802&quot; data-origin-height=&quot;1526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업정의는 말 그대로 배치에 대한 것을 정의합니다&lt;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.16.43.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;1350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bejuv0/btsLiKdBDEO/5JF9SXPzNKrdkF5IRZogV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bejuv0/btsLiKdBDEO/5JF9SXPzNKrdkF5IRZogV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bejuv0/btsLiKdBDEO/5JF9SXPzNKrdkF5IRZogV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbejuv0%2FbtsLiKdBDEO%2F5JF9SXPzNKrdkF5IRZogV1%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;1760&quot; height=&quot;1350&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.16.43.png&quot; data-origin-width=&quot;1760&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;작업 정의의 실행 역할에서 우리가 이전에 만들었던 ecsTaskExecutionRole을 선택하면 됩니다&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-filename=&quot;스크린샷 2024-12-14 오전 11.17.23.png&quot; data-origin-width=&quot;2846&quot; data-origin-height=&quot;1444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKYG5n/btsLiELxuFc/eAaqTMzmWkdkI1GRRF1WW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKYG5n/btsLiELxuFc/eAaqTMzmWkdkI1GRRF1WW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKYG5n/btsLiELxuFc/eAaqTMzmWkdkI1GRRF1WW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKYG5n%2FbtsLiELxuFc%2FeAaqTMzmWkdkI1GRRF1WW0%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;2846&quot; height=&quot;1444&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.17.23.png&quot; data-origin-width=&quot;2846&quot; data-origin-height=&quot;1444&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;ECR 이미지 URI를 입력하고&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;로깅에서는 awslogs를 선택하여 cloudwatch로 로그가 전송되도록 설정할 수 있습니다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 이제 배치를 실행할 준비가 다 되었네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업을 만들어 봅시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.18.21.png&quot; data-origin-width=&quot;2804&quot; data-origin-height=&quot;1562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b84l5H/btsLiUf3fdE/YS6V4Q4jOCfXYfbtMKoVak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b84l5H/btsLiUf3fdE/YS6V4Q4jOCfXYfbtMKoVak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b84l5H/btsLiUf3fdE/YS6V4Q4jOCfXYfbtMKoVak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb84l5H%2FbtsLiUf3fdE%2FYS6V4Q4jOCfXYfbtMKoVak%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;2804&quot; height=&quot;1562&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.18.21.png&quot; data-origin-width=&quot;2804&quot; data-origin-height=&quot;1562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름은 구별용도로 작성하시면 되고&lt;/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;작업이 어떻게 실행되는지에 대한 정의와, 어떤 컴퓨팅환경을 통해 실행될지에 대한 내용이 서로 분리되어 구성되어 있다는 것을 다시금 알 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.18.27.png&quot; data-origin-width=&quot;2092&quot; data-origin-height=&quot;1298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do6LD6/btsLjTAuMUj/23JZYzjd0zB8ETeaUG41B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do6LD6/btsLjTAuMUj/23JZYzjd0zB8ETeaUG41B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do6LD6/btsLjTAuMUj/23JZYzjd0zB8ETeaUG41B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo6LD6%2FbtsLjTAuMUj%2F23JZYzjd0zB8ETeaUG41B0%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;2092&quot; height=&quot;1298&quot; data-filename=&quot;스크린샷 2024-12-14 오전 11.18.27.png&quot; data-origin-width=&quot;2092&quot; data-origin-height=&quot;1298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 정의의 값을 재정의 할 수 있습니다&lt;/p&gt;
&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;배치가 실행되지 않고 계속 runnable 상태에서 멈춰있는 경우가 있는데요&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;vcpu 2개, 메모리 4기가로 설정하니 정상적으로 잘 동작했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.54.04.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1Mje/btsLi0gbwXu/kKtHdFunRsVo8gkgKxM1Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1Mje/btsLi0gbwXu/kKtHdFunRsVo8gkgKxM1Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1Mje/btsLi0gbwXu/kKtHdFunRsVo8gkgKxM1Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1Mje%2FbtsLi0gbwXu%2FkKtHdFunRsVo8gkgKxM1Z0%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;1116&quot; height=&quot;966&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.54.04.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;966&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;이렇게 GUI를 이용하거나 CLI를 이용하여 작업을 생성하는 것으로 배치를 실행할수 있게 되었습니다&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;배치가 완료되거나 실패할때 알림을 주고 싶기도하고,&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;cronjob처럼 배치를 정해진 시간에 실행하도록 하고 싶기도한데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두가지는 다음 포스팅에서 이어서 작성해볼께요&lt;/p&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>Batch</category>
      <category>cron</category>
      <category>ECS</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2384</guid>
      <comments>https://trend21c.tistory.com/2384#entry2384comment</comments>
      <pubDate>Mon, 23 Dec 2024 13:00:11 +0900</pubDate>
    </item>
    <item>
      <title>면접관이 면접자가 되어 느낀것들(인사팀 보아라)</title>
      <link>https://trend21c.tistory.com/2380</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이직을 준비하게 되었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 모든 커리어가 지인의 추천에 의해서 자연스럽게 이직을 하였었는데&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;/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;이번기회를 통해 제 스스로 면접자가 되어 다른 회사의 채용 절차를 살펴보는 기회가 되었습니다&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;/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;/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;/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;커피챗신청이 공개적으로 열려있는곳들이 있었습니다&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;/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;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;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;
&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;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;일부 회사에서는 20년전 채용 사이트 같은것을 운영하고 있었는데&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;증명사진도 첨부하고, 학력이나 경력도 하나씩 입력해야하고, 주어진 질문에도 1000자이내로 답해야하는 그런 곳도 있었습니다&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;/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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코딩테스트/과제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서류 전형이후에는 코딩테스트로 유명한 서비스인 프로그래머스를 통해 코딩테스트 전형을 진행하는 회사가 꽤 많았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 코딩테스트에 회의적인 편입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;일부 회사는 정말 문제도 이해하기 힘든 고난이도의 알고리즘 문제가 나왔는데&lt;span&gt;&amp;nbsp;&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;/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;코딩테스트 문제를 GPT에 물어봐서 풀 수도 있으니, 이것이 GPT 활용역량을 테스트하는건지 알고리즘 역량을 테스트하는건지 애매 한것도 있습니다(물론 각 회사는 GPT를 사용하지 말라고 합니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;코딩테스트 전형을 해보면서 차라리 과제를 주는곳이 더 합리적인것 같다고 생각이 다시 들었고,&lt;br /&gt;&lt;br /&gt;결과적으로 봤을때도 전체 과정이 긍정적이었던 회사들은 모두 코테전형이 없었던 회사였습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;/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;면접관들이 모두 노트북을 챙겨와서 면접 내용을 기록하면서 질답을 나누는 방식입니다&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;/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;/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;면접관에게 꼭 하고 싶은말이 있는데요&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;please, be kind.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;검증도 좋지만 간혹 검증이라는것에 지나치게 몰두하는게 아닌가 싶습니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앞으로 함께 일할 동료를 뽑는건데 공격적이거나, 비아냥거리거나, 무시하는 태도는 회사에 대한 먹칠과 동시에,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지원자의 회사에 대한 정을 떼놓는 일입니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저도 특히 한곳에서는 불쾌쪽에 가까운 경험을 하였는데, 이 불쾌한 경험을 인사팀에 전달할까 하다가,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오히려 전달하지 않아서 그렇게 그 회사가 망하는 편이 더 잔인한방법으로 보여 전달하지 않기로 하였습니다&lt;/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;지원자의 이력서를 보고, 적절한 질문을 준비하는것도 좋은 인상을 남기는 방법입니다&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;경력이 이미 10년이 넘었는데 &quot;제네릭이 무엇입니까?&quot; 질문은 대상에 맞는 질문인가 예의가 없어보이기도 합니다&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시간을 넘는곳이 많습니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;직무면접의 경우도 특정 시나리오를 제시하여 어떻게 문제를 해결하는지를 묻는 곳들이 있는데&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보통 자사의 서비스 구조와 비슷한 시나리오를 예제로 만들어 구현방법이나, 문제점 등을 묻는 곳들이 있습니다&lt;/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시간내에 끝나기 어렵습니다&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;컬처핏의 경우, 구성원 인터뷰를 추가로 하는곳도 있고, 대표 인터뷰만 하는곳들도 있습니다&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;구성원 인터뷰가 추가된 컬처핏 면접의 경우 거의 2시간이나 되는 인터뷰를 진행하게 됩니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;긴장도 한 상태인데다가, 말을 하도 많이 하다보니, 모든 체력과 집중력이 소모되는 느낌입니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;면접 전에 체력 관리가 필요합니다, 그리고 당을 미리 채워두시는것이 좋습니다&lt;/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;/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;2차면접이라고 불리는 컬쳐핏면접까지 끝나면 이후에 레퍼런스체크를 요구하는 회사들이 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 2명가량의 전 직장 동료의 연락처를 전달하게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비공개 레퍼런스체크를 하다가 걸린 곳이 있었는데&lt;/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;/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;각 회사의 전체 채용 과정을 살펴보면서 다시 한번 내가 면접관으로 참여했던  채용에 대해서 생각해보는 시간이 되었습니다&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;정리하자면 회사 인사팀에서는 채용에 있어서 이 부분들을 염두하시는게 좋겠습니다&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 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;2주가 넘도록 회신이 없는 태도는 이 회사가 인재를 중요하게 여기고 있는가라는 의문이 들게 합니다&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개월이 넘도록 회신을 받지 못한곳도 있습니다 제법이름이 알려진 회사임에도 불구하구요&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;또는 다음 절차 과정이 2주정도 씩이나 되는 텀을 가지고 있는 곳도 있었는데요&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;왜 다음 절차가 2주뒤에 시작해야하는지 이해하기 어렵습니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다른 지원자와 비교하면서 간을 보고있다 정도로 느껴집니다&lt;/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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫인상은 매우 중요합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 응답해주세요, 관심갖고 있다는 느낌을 전달할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;
&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;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;지원과정은 최대한 단순하게&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래야 많이 지원합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트, 과제 정말 필요한가 고민해보고 진행하세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&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>정보</category>
      <category>면접</category>
      <category>인사</category>
      <category>채용</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2380</guid>
      <comments>https://trend21c.tistory.com/2380#entry2380comment</comments>
      <pubDate>Thu, 19 Dec 2024 13:28:37 +0900</pubDate>
    </item>
    <item>
      <title>transactional outbox 패턴</title>
      <link>https://trend21c.tistory.com/2383</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://microservices.io/patterns/data/transactional-outbox.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://microservices.io/patterns/data/transactional-outbox.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734061904276&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;Microservices Pattern: Pattern: Transactional outbox&quot; data-og-description=&quot;First, write the message/event to a database OUTBOX table as part of the transaction that updates business objects, and then publish it to a message broker.&quot; data-og-host=&quot;microservices.io&quot; data-og-source-url=&quot;https://microservices.io/patterns/data/transactional-outbox.html&quot; data-og-url=&quot;http://microservices.io/patterns/data/transactional-outbox.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/choiKD/hyXKwAm3O7/CliLwokurKx1it6zbzfclK/img.png?width=1298&amp;amp;height=461&amp;amp;face=0_0_1298_461,https://scrap.kakaocdn.net/dn/cwKZ0Y/hyXOhasYMr/ll3eFDvw9sj0guYCOfgoBK/img.jpg?width=720&amp;amp;height=903&amp;amp;face=0_0_720_903,https://scrap.kakaocdn.net/dn/dWN0bt/hyXKnQXi3a/saNSuAiIZQiTvLKMKyvKC0/img.png?width=1377&amp;amp;height=445&amp;amp;face=0_0_1377_445&quot;&gt;&lt;a href=&quot;https://microservices.io/patterns/data/transactional-outbox.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://microservices.io/patterns/data/transactional-outbox.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/choiKD/hyXKwAm3O7/CliLwokurKx1it6zbzfclK/img.png?width=1298&amp;amp;height=461&amp;amp;face=0_0_1298_461,https://scrap.kakaocdn.net/dn/cwKZ0Y/hyXOhasYMr/ll3eFDvw9sj0guYCOfgoBK/img.jpg?width=720&amp;amp;height=903&amp;amp;face=0_0_720_903,https://scrap.kakaocdn.net/dn/dWN0bt/hyXKnQXi3a/saNSuAiIZQiTvLKMKyvKC0/img.png?width=1377&amp;amp;height=445&amp;amp;face=0_0_1377_445');&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;Microservices Pattern: Pattern: Transactional outbox&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;First, write the message/event to a database OUTBOX table as part of the transaction that updates business objects, and then publish it to a message broker.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;microservices.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로서비스 패턴중에 transactional outbox 패턴으로 불리는 유명한 패턴입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 outbox는 보낼편지함을 의미합니다&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;그래서 transactional outbox를 굳이 해석하자면 &quot;트랜잭션처리가 가능한 보낼편지함&quot; 이라고 할까요&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ReliablePublication.png&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vy0rY/btsLg7NVqmn/HqOc6adlsP8LQDV1ofOwrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vy0rY/btsLg7NVqmn/HqOc6adlsP8LQDV1ofOwrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vy0rY/btsLg7NVqmn/HqOc6adlsP8LQDV1ofOwrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvy0rY%2FbtsLg7NVqmn%2FHqOc6adlsP8LQDV1ofOwrk%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;1298&quot; height=&quot;461&quot; data-filename=&quot;ReliablePublication.png&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 그림을 살펴보면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Order Service로 어떠한 요청이 왔을때 Order Service는 트랜잭션을 통해 ORDER 테이블과 OUTBOX 테이블에 모두 작업을 수행합니다&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;그리고 Message Relay가 OUTBOX 테이블을 읽고 Message Broker로 발행하는 모습을 볼 수 있습니다&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;이 패턴은 왜 필요할까요?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;트랜잭션 아웃박스 패턴은 단일 작업에 데이터베이스 쓰기 작업과 메시지 또는 이벤트 알림이 모두 포함된 경우에 분산 시스템에서 발생하는 이중 쓰기 작업 문제를 해결합니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 마이크로서비스가 데이터베이스에 데이터를 저장하고 메시지를 전송하여 다른 시스템에 알려야하는 경우가 이에 해당합니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 업데이트 후 마이크로서비스가 이벤트 알림을 보내는 경우 데이터 일관성과 신뢰성을 보장하기 위해 이 두 작업이 원자적으로 실행되어야 합니다.&lt;/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;일관성을 유지하기 위해 데이터베이스를 업데이트하고, 메시지를 보내는 순서를 유지해야합니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;트랜잭션의 중간에서 메시지를 보내는 것은 신뢰를 떨어뜨립니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734071998032&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function createFlight() {
  // 트랜잭션 시작
  
  // 데이터베이스에 항공권예약정보 저장
  
  // 예악완료 메시지 발행  
  
  // 트랜잭션 커밋실패 ❌ 실패하였음에도 예약완료 메시지가 이미 발행되었음
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;트랜잭션이 반드시 커밋성공하리라는 보장이 없기 때문입니다&lt;/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;pre id=&quot;code_1734074159012&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function createFlight() {
  // 트랜잭션 시작
  
  // 데이터베이스에 항공권예약정보 저장
  
  // 트랜잭션 커밋  
  
  // 예악완료 메시지 전송 실패 ❌ 데이터는 저장되었으나 메시지가 발행되지 않음
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;비슷하게 커밋이후에 메시지를 보내는것 역시 메시지 발송 전에 에러가 발생하지 않으리라는 보장이 없습니다&lt;/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;데이터베이스 업데이트는 성공했지만, 이벤트 알림이 실패할 경우 시스템이 일관되지 않은 상태가 될 수 있습니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 업데이트에 실패했는데, 이벤트 알림이 전송되면 이 또한 시스템의 신뢰성에 영향을 미칠수 있습니다&lt;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;outbox-1.png&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lTQmc/btsLhoIB2dZ/3Hf9fsXynxd1m3KC0kkbaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lTQmc/btsLhoIB2dZ/3Hf9fsXynxd1m3KC0kkbaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lTQmc/btsLhoIB2dZ/3Hf9fsXynxd1m3KC0kkbaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlTQmc%2FbtsLhoIB2dZ%2F3Hf9fsXynxd1m3KC0kkbaK%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;1171&quot; height=&quot;377&quot; data-filename=&quot;outbox-1.png&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/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;aws 문서에도 나와있는 유즈케이스를 살펴보겠습니다&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. 항공편 서비스가 데이터베이스에 데이터를 쓰고 결제 서비스에 이벤트 알림을 보냅니다.&lt;br /&gt;&lt;br /&gt;2. 메시지 브로커가 메시지와 이벤트를 결제 서비스에 전달하여 결제를 요청합니다. 만약 메시지 브로커에 장애가 발생하면 결제 서비스가 업데이트를 수신할 수 없습니다.&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;여기서 데이터베이스 업데이트에 성공하였는데, 메시지 발행이 되지 않아 결제서비스에 요청을 할수 없게되는 상황과&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스에 업데이트의 커밋이 실패하였음에도 불구하고 메시지 발행이 되어 결제서비스에 예약되지 않은 결제 요청을 하게되는 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모두 발생할수 있습니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스의 업데이트와 메시지브로커에세 메시지를 전송하는것을 원자적으로 처리할수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 트랜잭션이 커밋된다면 메시지는 반드시 전송되어야하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ReliablePublication.png&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgbsRv/btsLg78fps1/UQduTMdfvfhkdHM85xJA40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgbsRv/btsLg78fps1/UQduTMdfvfhkdHM85xJA40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgbsRv/btsLg78fps1/UQduTMdfvfhkdHM85xJA40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgbsRv%2FbtsLg78fps1%2FUQduTMdfvfhkdHM85xJA40%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;1298&quot; height=&quot;461&quot; data-filename=&quot;ReliablePublication.png&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시보면 이 패턴은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sender : 메시지를 보내는 서비스&lt;/li&gt;
&lt;li&gt;database : 비즈니스 엔터티와 message outbox를 저장하는 데이터베이스&lt;/li&gt;
&lt;li&gt;message outbox : RDB의 경우 보내져야할 메시지를 저장하는 테이블, nosql 데이터베이스라면, outbox는 데이터베이스 레코드의 속성&lt;/li&gt;
&lt;li&gt;message relay : outbox에 저장된 메시지를 메시지 브로커로 보냄&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구성됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 구성에서는 트랜잭션이 커밋되어야지만 OUTBOX 테이블에 데이터가 저장이 되었을것이기 때문에 원자성을 보장하게 됩니다&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;OUTBOX 테이블에는 다음과 같은 필드들이 필요할 수 있습니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;id : 메시지id&lt;/li&gt;
&lt;li&gt;payload : json 형태 메시지&lt;/li&gt;
&lt;li&gt;messageType : 메시지종류&lt;/li&gt;
&lt;li&gt;isProcessed : 처리여부&lt;/li&gt;
&lt;li&gt;isProcessing 처리중여부&lt;/li&gt;
&lt;li&gt;isSequential : 순서보장필요여부&lt;/li&gt;
&lt;li&gt;metadata : traceId 등&lt;/li&gt;
&lt;li&gt;reservedAt&lt;/li&gt;
&lt;li&gt;expiredAt&lt;/li&gt;
&lt;li&gt;createdAt&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;중복 메시지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;message relay는 아마도 같은 메시지를 한번 이상 발생할 가능성이 있습니다&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;결과적으로 message consumer는 멱등성을 보장해야 합니다&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;이미 처리된 message의 id를 트래킹하는 방법으로 멱등성을 보장할 수 있습니다&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스에서 데이터베이스를 업데이트 하는 순서와 동일한 순서로 메시지나 이벤트를 전송해야합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 순서가 올바르지 않은 경우에, 주문이 접수되지도 않았는데 취소 요청을 먼저 처리하려고 한다거나 하는 문제가 발생할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 isSequential 같은 플래그를 통해 반드시 특정 노드에서만 실행되어야 하는 메시지임을 표시해 줄 수 있습니다&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;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;여러 노드가 outbox 테이블을 배타적으로 읽을 필요가 있는데&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;mysql에서는 SELECT FOR UPDATE를 통해 해당 row에 lock을 통해 다른 트랜잭션에 의해 접근되는 것을 막을수 있습니다&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;h3 data-ke-size=&quot;size23&quot;&gt;트랜잭션이 없는 nosql의 저장소를 사용하는 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 트랜잭션이 없는 nosql의 경우는 레코드의 속성을 outbox 처럼 활용합니다.&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;이렇게 json 형태의 document가 있다면 outbox 필드를 사용하여 유사하게 구현할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734073163191&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  id: &quot;1254234&quot;,
  departureAirport: &quot;ICN&quot;,
  arrivalAirport: &quot;NRT&quot;,
  departureDateTime: &quot;2024-12-01T12:00:00Z&quot;
  arrivalDateTime:: &quot;2024-12-04T12:00:00Z&quot;
  ...
  outbox: {
    ...
  }
}&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;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734061962887&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;트랜잭션 아웃박스 패턴 - AWS 규범적 지침&quot; data-og-description=&quot;이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1KH0e/hyXOeSlwXC/cdbzMOqrPbNU9mRXK5D7z1/img.png?width=1280&amp;amp;height=498&amp;amp;face=0_0_1280_498,https://scrap.kakaocdn.net/dn/ZDjFo/hyXKjOyNCX/tBv9TezLzFRuzbJExx5h51/img.png?width=1280&amp;amp;height=493&amp;amp;face=0_0_1280_493,https://scrap.kakaocdn.net/dn/4iqUS/hyXOmv4yTf/BvdWWsP18zwMqownmnSrQK/img.png?width=1144&amp;amp;height=529&amp;amp;face=0_0_1144_529&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1KH0e/hyXOeSlwXC/cdbzMOqrPbNU9mRXK5D7z1/img.png?width=1280&amp;amp;height=498&amp;amp;face=0_0_1280_498,https://scrap.kakaocdn.net/dn/ZDjFo/hyXKjOyNCX/tBv9TezLzFRuzbJExx5h51/img.png?width=1280&amp;amp;height=493&amp;amp;face=0_0_1280_493,https://scrap.kakaocdn.net/dn/4iqUS/hyXOmv4yTf/BvdWWsP18zwMqownmnSrQK/img.png?width=1144&amp;amp;height=529&amp;amp;face=0_0_1144_529');&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;트랜잭션 아웃박스 패턴 - AWS 규범적 지침&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;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws의 공식 문서에도 트랜잭션 아웃박스 패턴이 설명되어있습니다&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;그 내용으로 message relay의 구현으로는 두가지 패턴이 있습니다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;polling publisher 패턴 : outbox 테이블을 폴링(RDS를 사용한 예)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;outbox-6.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIkNHv/btsLiM9oz9K/IKQtIL8ORMKGwCjGsjC5WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIkNHv/btsLiM9oz9K/IKQtIL8ORMKGwCjGsjC5WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIkNHv/btsLiM9oz9K/IKQtIL8ORMKGwCjGsjC5WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIkNHv%2FbtsLiM9oz9K%2FIKQtIL8ORMKGwCjGsjC5WK%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;529&quot; data-filename=&quot;outbox-6.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;529&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;p data-ke-size=&quot;size16&quot;&gt;transaction log tailing 패턴 : outbox 테이블의 변경 데이터를 캡쳐(DynamoDB 스트림을 활용한 예)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;outbox-8.png&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIIqNB/btsLhh3VMQp/knPH5Iq44F7E9rQbQdkSG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIIqNB/btsLhh3VMQp/knPH5Iq44F7E9rQbQdkSG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIIqNB/btsLhh3VMQp/knPH5Iq44F7E9rQbQdkSG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIIqNB%2FbtsLhh3VMQp%2FknPH5Iq44F7E9rQbQdkSG1%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;962&quot; height=&quot;484&quot; data-filename=&quot;outbox-8.png&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 분들도 분산환경에서 상황에 맞게 요긴하게 시도해보셨으면 합니다&lt;/p&gt;</description>
      <category>BACKEND</category>
      <category>분산</category>
      <category>원자성</category>
      <category>트랜잭션아웃박스패턴</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2383</guid>
      <comments>https://trend21c.tistory.com/2383#entry2383comment</comments>
      <pubDate>Tue, 17 Dec 2024 17:18:40 +0900</pubDate>
    </item>
    <item>
      <title>ECR에 도커 이미지 푸시하기</title>
      <link>https://trend21c.tistory.com/2385</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS의 컨테이너 레지스트리에 도커 이미지를 푸시해보겠습니다&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;ECR에 푸시한 도커 이미지는 다양한 곳에서 사용될수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.21.27.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWWbSI/btsLjU7jkbi/Epjhk6X43i7bkrwZzekUZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWWbSI/btsLjU7jkbi/Epjhk6X43i7bkrwZzekUZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWWbSI/btsLjU7jkbi/Epjhk6X43i7bkrwZzekUZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWWbSI%2FbtsLjU7jkbi%2FEpjhk6X43i7bkrwZzekUZ0%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;2482&quot; height=&quot;1620&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.21.27.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1620&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;이미지의 레포지토리 이름을 지정합니다 namespace/repo-name과 같은 형식입니다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.22.05.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1064&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boJyoA/btsLjSPaNfO/enKYjk1aDVkHZgM0tC038K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boJyoA/btsLjSPaNfO/enKYjk1aDVkHZgM0tC038K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boJyoA/btsLjSPaNfO/enKYjk1aDVkHZgM0tC038K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboJyoA%2FbtsLjSPaNfO%2FenKYjk1aDVkHZgM0tC038K%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;2540&quot; height=&quot;1064&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.22.05.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1064&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성을 하게 되면 이미지 레포지토리가 생성됩니다&lt;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.22.20.png&quot; data-origin-width=&quot;2542&quot; data-origin-height=&quot;1384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOlonI/btsLjKwTzzf/pn0tjx87KHEJ70TEloH8Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOlonI/btsLjKwTzzf/pn0tjx87KHEJ70TEloH8Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOlonI/btsLjKwTzzf/pn0tjx87KHEJ70TEloH8Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOlonI%2FbtsLjKwTzzf%2Fpn0tjx87KHEJ70TEloH8Ik%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;2542&quot; height=&quot;1384&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.22.20.png&quot; data-origin-width=&quot;2542&quot; data-origin-height=&quot;1384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레포지토리만 생성된 상태고 아직 업로드가 되지 않은 상태입니다&lt;/p&gt;
&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.22.28.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWF9O/btsLiLjkZRC/yg5sryd2dgSgZikkFcJo50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWF9O/btsLiLjkZRC/yg5sryd2dgSgZikkFcJo50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWF9O/btsLiLjkZRC/yg5sryd2dgSgZikkFcJo50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWF9O%2FbtsLiLjkZRC%2Fyg5sryd2dgSgZikkFcJo50%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;1598&quot; height=&quot;1420&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.22.28.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상세하게 명령어가 설명되어있습니다&lt;/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;1. 먼저 인증 토큰을 받는 과정입니다 &lt;a href=&quot;https://aws.amazon.com/ko/cli/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;aws-cli&lt;/a&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;ecr에 이미지를 푸시하기 위한 아래의 IAM 정책을 사용하셔도 됩니다&lt;/p&gt;
&lt;pre id=&quot;code_1734177880750&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;ecr:CompleteLayerUpload&quot;,
                &quot;ecr:UploadLayerPart&quot;,
                &quot;ecr:InitiateLayerUpload&quot;,
                &quot;ecr:BatchCheckLayerAvailability&quot;,
                &quot;ecr:PutImage&quot;,
                &quot;ecr:BatchGetImage&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:ecr:ap-northeast-2:xxxxxxxxx:repository/hello/world&quot;
        },
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: &quot;ecr:GetAuthorizationToken&quot;,
            &quot;Resource&quot;: &quot;*&quot;
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734175897249&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin xxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com
# Login Succeeded&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Login Succeeded 라는 메시지와 함께 인증 토큰이 내부에 저장되었습니다&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;이제 ecr로 이미지를 푸시할 준비가 되었습니다&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;2. 도커 이미지를 빌드합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734176010988&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t hello/world .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;레포지토리 이름과 동일한 이름으로 이미지를 빌드합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이미지에 태그를 지정합니다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734176047615&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker tag myname/hello:latest xxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/hello/world:latest&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;4. 이미지를 aws로 푸시합니다&lt;/p&gt;
&lt;pre id=&quot;code_1734176118698&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker push xxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/hello/world:latest&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.28.07.png&quot; data-origin-width=&quot;1966&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm1Gb9/btsLiHuyqzt/55oYSeEMue31cFA1JJbgUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm1Gb9/btsLiHuyqzt/55oYSeEMue31cFA1JJbgUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm1Gb9/btsLiHuyqzt/55oYSeEMue31cFA1JJbgUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm1Gb9%2FbtsLiHuyqzt%2F55oYSeEMue31cFA1JJbgUK%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;1966&quot; height=&quot;490&quot; data-filename=&quot;스크린샷 2024-12-14 오후 8.28.07.png&quot; data-origin-width=&quot;1966&quot; data-origin-height=&quot;490&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;푸시가 완료되면 ECR에 이미지 정보가 표시됩니다&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;이렇게 푸시한 이미지는 ecs, codebuilde, batch 등 무궁무진하게 활용될 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>docker</category>
      <category>ECR</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2385</guid>
      <comments>https://trend21c.tistory.com/2385#entry2385comment</comments>
      <pubDate>Mon, 16 Dec 2024 12:38:30 +0900</pubDate>
    </item>
    <item>
      <title>mongodb의 변경스트림(changeStream)</title>
      <link>https://trend21c.tistory.com/2382</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/changeStreams/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/changeStreams/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734060675014&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;Change Streams - MongoDB 매뉴얼 v8.0&quot; data-og-description=&quot;변경 스트림을 통해 애플리케이션은 사전에 복잡한 방식 및 수동으로 oplog를 테일링하는 위험 없이 실시간 데이터 변경에 액세스할 수 있습니다. 애플리케이션은 변경 스트림을 사용하여 단일 &quot; data-og-host=&quot;www.mongodb.com&quot; data-og-source-url=&quot;https://www.mongodb.com/ko-kr/docs/manual/changeStreams/&quot; data-og-url=&quot;https://www.mongodb.com/ko-kr/docs/manual/changeStreams/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hWILT/hyXOex2wYH/GbQQ54736fv9QcZKSE46kk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/cMAi6I/hyXKk0X56U/qdIrz2RvmorahuIw6PuyHk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/changeStreams/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.mongodb.com/ko-kr/docs/manual/changeStreams/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hWILT/hyXOex2wYH/GbQQ54736fv9QcZKSE46kk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/cMAi6I/hyXKk0X56U/qdIrz2RvmorahuIw6PuyHk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Change Streams - MongoDB 매뉴얼 v8.0&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;변경 스트림을 통해 애플리케이션은 사전에 복잡한 방식 및 수동으로 oplog를 테일링하는 위험 없이 실시간 데이터 변경에 액세스할 수 있습니다. 애플리케이션은 변경 스트림을 사용하여 단일&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.mongodb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p 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;mongodb 5.1 부터 변경스트림이 더 효율적으로 리소스를 사용하고 더 빠르게 동작한다고 합니다&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;변경스트림을 통해 어플리케이션이 수동으로 oplog를 테일링하지 않고도 실시간 데이터 변경에 접근할수 있습니다&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;여기서의 데이터 변경사항은 코드로 변경하거나, cli를 통해 변경하거나 gui를 통해 변경한 모든 데이터를 말합니다&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;a href=&quot;https://microservices.io/patterns/data/transactional-outbox.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;transactional-outbox&lt;/a&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;변경스트림은 replica set 과 샤딩된 클러스터에서 사용할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mongodb가 단독실행되는 환경에서는 변경스트림을 사용할수 없습니다&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;a href=&quot;https://www.mongodb.com/ko-kr/cloud/atlas/register&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.mongodb.com/ko-kr/cloud/atlas/register&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734061270330&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MongoDB Atlas&quot; data-og-description=&quot;MongoDB Atlas를 무료로 체험해보세요. 애플리케이션 데이터 플랫폼의 핵심 요소인 멀티 클라우드 데이터베이스 서비스를 통해 데이터를 사용하여 더욱 빠르고 손쉽게 구축할 수 있습니다.&quot; data-og-host=&quot;www.mongodb.com&quot; data-og-source-url=&quot;https://www.mongodb.com/ko-kr/cloud/atlas/register&quot; data-og-url=&quot;https://www.mongodb.com/ko-kr/cloud/atlas/register&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bisbLV/hyXOogl6dj/JrVa7skd0gukpqi8uealA1/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/cloud/atlas/register&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.mongodb.com/ko-kr/cloud/atlas/register&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bisbLV/hyXOogl6dj/JrVa7skd0gukpqi8uealA1/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB Atlas&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB Atlas를 무료로 체험해보세요. 애플리케이션 데이터 플랫폼의 핵심 요소인 멀티 클라우드 데이터베이스 서비스를 통해 데이터를 사용하여 더욱 빠르고 손쉽게 구축할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.mongodb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mongodb의 클라우드플랫폼인 atlas에서 무료 계정을 만들어 사용하는 방법도 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 활용할 수 있습니다&lt;/p&gt;
&lt;pre id=&quot;code_1734061235166&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.collection.watch()
db.watch()&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;다음은 inventory 컬렉션의 변경 이벤트를 수신하는 예입니다&lt;/p&gt;
&lt;pre id=&quot;code_1734060905167&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const collection = db.collection('inventory');
const changeStream = collection.watch();
changeStream.on('change', next =&amp;gt; {
  // process next document
});&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;a href=&quot;https://mongoosejs.com/docs/change-streams.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mongoose&lt;/a&gt;에서도 당연히 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734061853206&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Person = mongoose.model('Person', new mongoose.Schema({ name: String }));

// Create a change stream. The 'change' event gets emitted when there's a
// change in the database. Print what the change stream emits.
Person.watch().
  on('change', data =&amp;gt; console.log(data));

// Insert a doc, will trigger the change stream handler above
await Person.create({ name: 'Axl Rose' });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 어렵지 않습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;changeStream은 EventEmitter를 확장한 방식입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경스트림을 구성할때 파이프라인을 사용하여 변경스트림의 출력을 제어할수도 있습니다&lt;/p&gt;
&lt;pre id=&quot;code_1734060990433&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const pipeline = [
  { $match: { 'fullDocument.username': 'alice' } },
  { $addFields: { newField: 'this is an added field!' } }
];
const collection = db.collection('inventory');
const changeStream = collection.watch(pipeline);
changeStream.on('change', next =&amp;gt; {
  // process next document
});&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;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;pre id=&quot;code_1734061114809&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
   &quot;_id&quot;: {
      &quot;_data&quot;: &quot;82635019A0000000012B042C0100296E5A1004AB1154ACACD849A48C61756D70D3B21F463C6F7065726174696F6E54797065003C696E736572740046646F63756D656E744B65790046645F69640064635019A078BE67426D7CF4D2000004&quot;
    },
    &quot;operationType&quot;: &quot;insert&quot;,
    &quot;clusterTime&quot;: Timestamp({ &quot;t&quot;: 1666193824, &quot;i&quot;: 1 }),
    &quot;collectionUUID&quot;: new UUID(&quot;ab1154ac-acd8-49a4-8c61-756d70d3b21f&quot;),
    &quot;wallTime&quot;: ISODate(&quot;2022-10-19T15:37:04.604Z&quot;),
    &quot;fullDocument&quot;: {
       &quot;_id&quot;: ObjectId(&quot;635019a078be67426d7cf4d2&quot;'),
       &quot;name&quot;: &quot;Giovanni Verga&quot;
    },
    &quot;ns&quot;: {
       &quot;db&quot;: &quot;test&quot;,
       &quot;coll&quot;: &quot;names&quot;
    },
    &quot;documentKey&quot;: {
       &quot;_id&quot;: ObjectId(&quot;635019a078be67426d7cf4d2&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;여기에 포함된 _id 값은 재개 토큰(resume token)이라고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값을 어떻게 사용하냐면 앱을 중지하고 다시 실행한다음에 중지한 부분부터 이후의 업데이트를 받기 위해서 사용됩니다&lt;/p&gt;
&lt;pre id=&quot;code_1734061100036&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const collection = db.collection('inventory');
const changeStream = collection.watch();
let newChangeStream;
changeStream.once('change', next =&amp;gt; {
  const resumeToken = changeStream.resumeToken;
  changeStream.close();
  newChangeStream = collection.watch([], { resumeAfter: resumeToken });
  newChangeStream.on('change', next =&amp;gt; {
    processChange(next);
  });
});&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;watch의 옵션으로 resumeAfter 값에 resumeToken을 전달하면&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;/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;다만 내부적으로 oplog를 테일링 하는 방식이기 때문에 oplog가 존재하지 않는다면 수신되지 않는다고 하네요&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;변경스트림을 이용해서 CDC에서 사용하는것과 같이 ETL이나, 도메인간 동기화, 협업기능, 알림등을 구현할때 유용해보입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 사용예를 더 가져오려고 했는데 생각보다 자료는 많지 않네요&lt;/p&gt;</description>
      <category>BACKEND</category>
      <category>CDC</category>
      <category>changestream</category>
      <category>mongo</category>
      <category>MongoDB</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2382</guid>
      <comments>https://trend21c.tistory.com/2382#entry2382comment</comments>
      <pubDate>Fri, 13 Dec 2024 12:50:13 +0900</pubDate>
    </item>
    <item>
      <title>mac에서 mongdb 실행 오류 발생할때</title>
      <link>https://trend21c.tistory.com/2381</link>
      <description>&lt;pre id=&quot;code_1733991771985&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services start mongodb-community@8.0&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;맥에서 새 버전의 mongodb를 설치하고 실행명령어를 입력하였는데 성공적으로 시작이 되었다고는 하는데&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;mongosh도 접속이 안되고 compass에서도 접속이 되지 않습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733991851533&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services list&lt;/code&gt;&lt;/pre&gt;
&lt;p 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;mongodb-community&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;error&lt;/span&gt;&amp;nbsp;&amp;nbsp;15872&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;pre id=&quot;code_1733991889966&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail -f $(brew --prefix)/var/log/mongodb/mongo.log&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;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733991904477&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{&quot;t&quot;:{&quot;$date&quot;:&quot;2024-12-12T17:09:35.670+09:00&quot;},&quot;s&quot;:&quot;I&quot;,  &quot;c&quot;:&quot;CONTROL&quot;,  &quot;id&quot;:23138,   &quot;ctx&quot;:&quot;initandlisten&quot;,&quot;msg&quot;:&quot;Shutting down&quot;,&quot;attr&quot;:{&quot;exitCode&quot;:62}}&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;에러코드가 62번인것 같네요&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;docker가 아니라 brew를 통해서 두가지 버전을 설치할수는 없는것 같습니다&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733992078674&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services stop mongodb-community@8.0
brew uninstall mongodb-community@8.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 저장된 데이터와 로그도 삭제합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733992123605&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rm -rf $(brew --prefix)/var/mongodb/*
rm -rf $(brew --prefix)/var/log/mongodb/*&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;pre id=&quot;code_1733992163164&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install mongodb-community@8.0
brew services start mongodb-community@8.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 접속 성공입니다&lt;/p&gt;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>MongoDB</category>
      <category>mongosh</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2381</guid>
      <comments>https://trend21c.tistory.com/2381#entry2381comment</comments>
      <pubDate>Thu, 12 Dec 2024 17:29:53 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트의 초과속성체크(excess property checks)를 알고 계셨나요?</title>
      <link>https://trend21c.tistory.com/2379</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트의 초과속성체크 알고 계셨나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733192618532&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface SquareConfig {
  color?: string;
  width?: number;
}
 
function createSquare(config: SquareConfig): { color: string; area: number } {
  return {
    color: config.color || &quot;red&quot;,
    area: config.width ? config.width * config.width : 20,
  };
}
 
let mySquare = createSquare({ colour: &quot;red&quot;, width: 100 });&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;createSquare에 인자로 전달되는 SquareConfig 타입에는 color와 width 속성이 optional하게 존재합니다&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;그런데 이 코드에서는 color 대신에 오타로 colour가 전달된것을 볼 수 있습니다&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;color 속성은 optional이라 color 속성이 전달되지 않았어도 되지 않나 싶은데요&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-03 오전 11.23.53.png&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mEG0i/btsK5tCcfck/PZ3oJrskCatJ9SbKckkFwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mEG0i/btsK5tCcfck/PZ3oJrskCatJ9SbKckkFwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mEG0i/btsK5tCcfck/PZ3oJrskCatJ9SbKckkFwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmEG0i%2FbtsK5tCcfck%2FPZ3oJrskCatJ9SbKckkFwk%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;1596&quot; height=&quot;706&quot; data-filename=&quot;스크린샷 2024-12-03 오전 11.23.53.png&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;706&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;createSquare의 인자에서 color 대신에 colour로 타이핑되었습니다&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;width의 속성은 호환되고, color 속성이 존재하지 않고, 의미없는 colour 프로퍼티가 있기에&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;타입스크립트에서 object literal은 특별한 취급을 받고 이를 다른 변수에 할당하려고 할때 초과속성체크를 거치게됩니다&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;만약 object literal에서 해당 타입이 가지고 있지 않은 프러퍼티를 가지고 있을때 에러를 발생시킵니다&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;만약 colour로 전달한것이 의도였다면 이 코드에서 에러를 발생시키지 않도록 할 수 없을까요?&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;pre id=&quot;code_1733192928149&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 발생하지 않습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 colour 프로퍼티가 의도적이었다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733192962744&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface SquareConfig {
  color?: string;
  width?: number;
  [propName: string]: unknown;
}&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;SquareConfig 타입을 이렇게 고치는, 차라리 이 방법이 더 나을수 있습니다&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;그런데 이 방법을 사용하면 너무 많은 종류의 프로퍼티가 가능하다는 점도 좋지 않습니다&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;pre id=&quot;code_1733193038931&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let squareOptions = { colour: &quot;red&quot;, width: 100 };
let mySquare = createSquare(squareOptions);&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;에러를 억누르기 위해서 다른 변수에 이 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;에러가 발생하지 않습니다&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;이 방법으로 동작하긴하겠지만 squareOptions와 SquareConfig의 공통속성인 width가 있을때까지만 에러 없이 동작하고,&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;만약 공통의 프로퍼티가 존재하지 않고 colour 프로퍼티만 존재한다면 에러가 발생하게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-03 오전 11.34.11.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PNre4/btsK5nIWjwu/GSQQYRO3AK2M2HOOkvPxM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PNre4/btsK5nIWjwu/GSQQYRO3AK2M2HOOkvPxM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PNre4/btsK5nIWjwu/GSQQYRO3AK2M2HOOkvPxM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPNre4%2FbtsK5nIWjwu%2FGSQQYRO3AK2M2HOOkvPxM0%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;1240&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2024-12-03 오전 11.34.11.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇듯 대부분의 정의되지 않는 추가적인 속성은 실제로 버그일 확률이 높습니다&lt;/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;/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;이 경우에도 마찬가지로 color와 colour 프로퍼티를 createSquare에 전달하려고 한다면&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;SquareConfig 타입의 정의를 바꿔야합니다&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;신선도(freshness)라는 용어로도 표현하는데&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;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/2/objects.html#excess-property-checks&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.typescriptlang.org/docs/handbook/2/objects.html#excess-property-checks&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>freshness</category>
      <category>TypeScript</category>
      <category>신선도</category>
      <category>잉여속성체크</category>
      <category>초과속성체크</category>
      <category>타입스크립트</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2379</guid>
      <comments>https://trend21c.tistory.com/2379#entry2379comment</comments>
      <pubDate>Thu, 5 Dec 2024 12:06:23 +0900</pubDate>
    </item>
    <item>
      <title>jest를 통해 테스트대역 파헤치기</title>
      <link>https://trend21c.tistory.com/2378</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;테스트대역(test double) 을 위키피디아에서 찾아보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A test double is software used in software test automation that satisfies a dependency so that the test need not depend on production code&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;테스트더블은 소프트웨어 테스트 자동화에서 사용되는 소프트웨어로서, 테스트가 프로덕션 코드에 의존할 필요 없도록 의존성을 만족시킵니다&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;테스트가 프로덕션 코드에 의존할 필요가 없다는 말이 무엇인지 살펴볼까요&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;/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;테스트가 실행될때마다, 파일이 생성/수정/삭제되고, 데이터베이스 역시 마찬가지며, 외부 서비스를 호출하고(때에 따라 호출마다 비용이 발생할수도 있습니다), 이메일이나 문자메시지를 발송하게 됩니다(이것도 돈이죠)&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;여기서 말하는 대역은 대역폭을 의미하는 그 대역이 아니라, 스턴트맨을 의미하는 그 대역입니다&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;제가 임의의 설명을 덧붙였지만 사람마다 조금씩 해석이 다를 수 있습니다&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dummy : 아무런 동작을 하지 않음&lt;/li&gt;
&lt;li&gt;stub : 지정한 값만 반환함&lt;/li&gt;
&lt;li&gt;fake : 테스트에 적합하도록 기능을 구현(예, 상용 데이터베이스를 대체하는 인메모리형 데이터베이스같은)&lt;/li&gt;
&lt;li&gt;mock : 기대하는 출력을 위해 실제 동작을 흉내냄&lt;/li&gt;
&lt;li&gt;spy : 실제와 똑같이 호출하고, 호출을 추적함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 테스트대역을 의미하는 다양한 용어들이 있긴합니다만&lt;/p&gt;
&lt;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;사실 의미상 엄격하게 차이가 있지는 않으므로 큰 차이를 두지 않고 mock으로 통일하기도 합니다&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;jest를 이용하여 여러 테스트대역을 만들어보겠습니다&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;mock, stub&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일시스템의 동작을 흉내내는 mock을 사용한 테스트입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733298600157&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

jest.mock('fs');

describe('listFilesInDirectorySync', () =&amp;gt; {
  const MOCK_FILE_INFO = {
    '/path/to/file1.js': 'console.log(&quot;file1 contents&quot;);',
    '/path/to/file2.txt': 'file2 contents',
  };

  beforeEach(() =&amp;gt; {
    // Set up some mocked out file info before each test
    require('fs').__setMockFiles(MOCK_FILE_INFO);
  });

  test('includes all files in the directory in the summary', () =&amp;gt; {
    const FileSummarizer = require('../FileSummarizer');
    const fileSummary =
      FileSummarizer.summarizeFilesInDirectorySync('/path/to');

    expect(fileSummary.length).toBe(2);
  });
});&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;jest 공식문서에도 나와있는 테스트 코드입니다&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;고정된 반환값을 만든다는 의미에서 stub이라고도 부를수 있습니다&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;h3 data-ke-size=&quot;size23&quot;&gt;stub, dummy&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정한 값을 반환하는 의미에서 stub이라고도 부를수 있고, 외부에 호출하는 동작을 하지 않는 의미에서 dummy라고도 부를수 있는 테스트대역입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733190213099&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const axios = require('axios');

class Users {
  static all() {
    return axios.get('/users.json');
  }
}

module.exports = Users;


const Users = require('../users');
const axios = require('axios');

jest.mock('axios');

describe('Users', () =&amp;gt; {
  it('should return users', async () =&amp;gt; {
    axios.get.mockResolvedValueOnce([{ name: 'kevin' }]);

    await expect(Users.all()).resolves.toEqual([{ name: 'kevin' }]);
  });
});&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;User 클래스의 all 메서드를 모킹하여 외부의 요청없이 결과값을 흉내내어서 전달받아 테스트를 수행합니다&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;h3 data-ke-size=&quot;size23&quot;&gt;fake&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬스토리지를 흉내낸 인메모리형태의 로컬스토리지 가짜 구현체입니다&lt;/p&gt;
&lt;pre id=&quot;code_1733190327797&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class FakeLocalStorage {
  constructor() {
    this.store = {};
  }

  clear() {
    this.store = {};
  }

  getItem(key) {
    return this.store[key] || null;
  }

  setItem(key, value) {
    this.store[key] = String(value);
  }

  removeItem(key) {
    delete this.store[key];
  }
}&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;실제 localStorage를 사용하지 않지만 마치 localStorage를 사용하는것처럼 테스트코드를 작성할수 있습니다&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;spy&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제와 똑같이 동작하지만, 호출을 추적할수 있는 spy 입니다&lt;/p&gt;
&lt;pre id=&quot;code_1733298747641&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const video = {
  play() {
    // play something
    return true;
  },
};

test('plays video', () =&amp;gt; {
  const spy = jest.spyOn(video, 'play');
  const isPlaying = video.play();

  expect(spy).toHaveBeenCalled();
  expect(isPlaying).toBe(true);
});&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;원본의 play() 메서드가 수행되었으며, play 함수가 호출되었는지 검사할수 있습니다&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;jest에서 spy의 재미난점중의 하나는 spy가 jest.fn의 문법적인 설탕이라는 점입니다&lt;/p&gt;
&lt;pre id=&quot;code_1733190653879&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  spyOn(object: any, methodName: any, accessType?: string): any {
    if (accessType) {
      return this._spyOnProperty(object, methodName, accessType);
    }

    if (typeof object !== 'object' &amp;amp;&amp;amp; typeof object !== 'function') {
      throw new Error(
        'Cannot spyOn on a primitive value; ' + this._typeOf(object) + ' given',
      );
    }

    const original = object[methodName];

    if (!this.isMockFunction(original)) {
      if (typeof original !== 'function') {
        throw new Error(
          'Cannot spy the ' +
            methodName +
            ' property because it is not a function; ' +
            this._typeOf(original) +
            ' given instead',
        );
      }

      object[methodName] = this._makeComponent({type: 'function'}, () =&amp;gt; {
        object[methodName] = original;
      });

      object[methodName].mockImplementation(function() {
        return original.apply(this, arguments);
      });
    }

    return object[methodName];
  }&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;spyOn의 코드를 살펴보면&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;기존의 original 구현체를 저장해두고, jest.fn을 이용하여 기존의 함수를 모킹하고, 원래의 함수를 실행하도록 하고&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;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>fake</category>
      <category>jest</category>
      <category>Mock</category>
      <category>spy</category>
      <category>stub</category>
      <category>testing</category>
      <category>테스트</category>
      <category>테스트코드</category>
      <category>테스팅</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2378</guid>
      <comments>https://trend21c.tistory.com/2378#entry2378comment</comments>
      <pubDate>Wed, 4 Dec 2024 16:54:11 +0900</pubDate>
    </item>
    <item>
      <title>더 작은 컨테이너 이미지를 만드는 매직</title>
      <link>https://trend21c.tistory.com/2377</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 어플리케이션은 언어나 종류에 상관없이 빌드타임, 런타임 이렇게 두종류의 의존성이 존재합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 당연하게도 빌드타임의 의존성이 런타임보다 훨씬 많고, 크고, 복잡합니다&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;컨테이너환경에서 빌드를 하는것은 이제는 너무 흔한 전략입니다&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;br /&gt;&lt;br /&gt;그리고 컨테이너를 통해 앱을 실행하는 것도 이제는 사실상의 표준입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;그러나 빌드와 앱실행은 완전히 다른 종류의 요구사항과 문제가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그렇기 때문에 빌드와 런타임 이미지는 분리될수 있으며, 분리해야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고, 배포용 이미지에 linter, 컴파일도구, devtool까지도 포함되는 경우가 있습니다&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;아래의 Dockerfile은 흔하게 우리가 볼수 있는 nodejs 프로젝트를 도커화한 파일입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732284957245&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM node:lts-slim

WORKDIR /app
COPY . .

RUN npm ci
RUN npm run build

ENV NODE_ENV=production
EXPOSE 3000

CMD [&quot;node&quot;, &quot;/app/.output/index.mjs&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node:lts-slim 이미지는 debian:slim 이미지 위에 node, npm, yarn 이 설치되어 있습니다&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;이 docker 파일을 기반으로 이미지를 빌드하는 경우&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;OS + node(npm, yarn) + 소스코드 + node_modules + 빌드output&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;/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-filename=&quot;스크린샷 2024-11-22 오후 11.34.49.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pbimK/btsKVv7tRzy/2x4PNBhbinDXEuGsJVfYH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pbimK/btsKVv7tRzy/2x4PNBhbinDXEuGsJVfYH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pbimK/btsKVv7tRzy/2x4PNBhbinDXEuGsJVfYH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpbimK%2FbtsKVv7tRzy%2F2x4PNBhbinDXEuGsJVfYH1%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;456&quot; height=&quot;562&quot; data-filename=&quot;스크린샷 2024-11-22 오후 11.34.49.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;562&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;node_modules 사이즈가 얼마나 큰지 짐작을 해볼까요&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;예를 들어 nuxt3 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;프레임워크를 이용하여&amp;nbsp;&lt;/span&gt;기본 프로젝트를 생성하고 위의 dockerfile과 같은 구성으로 이미지를 빌드했다면&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;그 최종이미지에는 500MB나 되는 node_modules 파일들이 포함되게 됩니다&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;이렇게 뚱뚱한 이유는 npm ci 단계에서 production과 development용 모든 의존성이 설치되기 때문입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 어떻게 이미지를 줄여볼 수 있을까요?&lt;/p&gt;
&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;바로 멀티스테이지(multi-stage) 빌드를 활용하는 것입니다&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;docker는 단계별 빌드를 지원합니다&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;빌드스테이지와 런타임스테이지를 구분한 dockerfile을 살펴보시죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732285282372&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 빌드스테이지
FROM node:lts-slim AS build

WORKDIR /app
COPY . .

RUN npm ci
RUN npm run build

# 런타임스테이지
FROM node:lts-slim AS runtime

WORKDIR /app
COPY --from=build /app/.output .

ENV NODE_ENV=production
EXPOSE 3000

CMD [&quot;node&quot;, &quot;/app/.output/index.mjs&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 단계를 빌드와 런타임으로 구분할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732285863019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;COPY --from=&amp;lt;stage&amp;gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 11.36.52.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mSL4v/btsKSE6H5Qi/wC2xwohYD4bZ19FlTtVkf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mSL4v/btsKSE6H5Qi/wC2xwohYD4bZ19FlTtVkf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mSL4v/btsKSE6H5Qi/wC2xwohYD4bZ19FlTtVkf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmSL4v%2FbtsKSE6H5Qi%2FwC2xwohYD4bZ19FlTtVkf0%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;1116&quot; height=&quot;634&quot; data-filename=&quot;스크린샷 2024-11-22 오후 11.36.52.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 여러분이 만든 최종 배포될 이미지에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미니멀한 OS와, nodejs 런타임, 그리고 빌드 아티팩트만 존재하게 되어 최소한의 사이즈를 유지할수 있습니다&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;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;a href=&quot;https://labs.iximiuz.com/tutorials/docker-multi-stage-builds&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://labs.iximiuz.com/tutorials/docker-multi-stage-builds&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB2.0/프로그래밍</category>
      <category>docker</category>
      <category>Node</category>
      <category>nodejs</category>
      <category>도커</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2377</guid>
      <comments>https://trend21c.tistory.com/2377#entry2377comment</comments>
      <pubDate>Fri, 22 Nov 2024 23:38:20 +0900</pubDate>
    </item>
    <item>
      <title>querystring을 통해 배열도 받을수 있나요?</title>
      <link>https://trend21c.tistory.com/2375</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;querystring을 통해 배열을 받을수 있는 방법은 여러가지가 있습니다&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;예를 들어서 여러개의 카테고리 정보를 받는 path가 있다고 가정해봅시다&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;aaa.com?category_name=food&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;그런데 category_name 이라는 변수명으로 여러개의 카테고리 정보를 받고 싶은경우에 어떻게 할수 있을까요?&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;1. 콤마 또는 다른 구분자를 이용해 값을 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723184238968&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aaa.com?category_name=food,health,beauty&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;이런식으로 category_name으로 값을 콤마나 기타 다른 구분자를 이용해 값을 받은뒤에&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;h2 data-ke-size=&quot;size26&quot;&gt;2. 동일한 이름을 사용해 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723184265786&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aaa.com?category_name=food&amp;amp;category_name=health&amp;amp;category_name=beauty&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;이렇게 같은 category_name을 반복적으로 열거합니다&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;h2 data-ke-size=&quot;size26&quot;&gt;3. 이름 + 브라켓을 이용해 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723184278692&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aaa.com?category_name[]=food&amp;amp;category_name[]=health&amp;amp;category_name[]=beauty&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;이름뒤에 [] 표시를 더하여 값을 열거하여 category_name이라는 이름으로 배열을 받을수 있습니다&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;총 3가지의 방법을 설명해드렸는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 프레임워크에서는 2번 또는 3번 방법을 지원하지 않는 경우도 있을수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 대부분의 모던 프레임워크들에서는 이 방법을 지원하고 있습니다&lt;/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;nodejs의 express에서는 1,2,3번 모두 사용가능한데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2,3번의 경우 원소가 하나밖에 없는 경우 string 타입으로, 원소가 2개 이상일때 배열 타입으로 전달됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 타입으로 구분할 필요가 있습니다&lt;/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;openapi 규격에서는 이를 지원할까요?&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;openapi에서는 1번의 경우 사용자가 하나의 input 안에 여러개의 입력값을 직접 구분자를 이용해 열거해야하는데&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;2, 3의 경우는 explode 속성을 이용하여 명확하게 표시가 가능합니다&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;a href=&quot;https://petstore3.swagger.io/#/pet/findPetsByStatus&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://petstore3.swagger.io/#/pet/findPetsByStatus&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-09 오후 3.16.33.png&quot; data-origin-width=&quot;2884&quot; data-origin-height=&quot;1088&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XG5TH/btsI0GQVP9B/ePrqmuAEiZS4EBkTesqoS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XG5TH/btsI0GQVP9B/ePrqmuAEiZS4EBkTesqoS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XG5TH/btsI0GQVP9B/ePrqmuAEiZS4EBkTesqoS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXG5TH%2FbtsI0GQVP9B%2FePrqmuAEiZS4EBkTesqoS0%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;2884&quot; height=&quot;1088&quot; data-filename=&quot;스크린샷 2024-08-09 오후 3.16.33.png&quot; data-origin-width=&quot;2884&quot; data-origin-height=&quot;1088&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 개별 원소를 하나씩 입력할수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BACKEND</category>
      <category>array</category>
      <category>openapi</category>
      <category>querystring</category>
      <category>배열</category>
      <category>쿼리</category>
      <category>쿼리스트링</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2375</guid>
      <comments>https://trend21c.tistory.com/2375#entry2375comment</comments>
      <pubDate>Tue, 13 Aug 2024 16:21:01 +0900</pubDate>
    </item>
    <item>
      <title>USB PD 충전기 2종 추천</title>
      <link>https://trend21c.tistory.com/2374</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;USB PD는 Power Delivery라고 하는데요&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;USB 케이블을 통해 USB 단자를 가진 기기에 전력을 공급하는 규약입니다&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;일반인이 쉽게 이해하기에는 USB 충전기라고 생각하시면 됩니다&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;/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;게다가 초고속 충전정도는 지원해야겠죠?&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;그래서 적당한 2개 제품을 추천해볼까 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두제품 모두 중국의 Toocki 브랜드의 제품입니다&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;그중에서도 Toocki 제품은 저렴한 가격에도 불구하고 준수한 품질로 유명합니다&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;Toocki&amp;nbsp;67W&amp;nbsp;PPS&amp;nbsp;PD.3.0&amp;nbsp;c타입&amp;nbsp;3포트&amp;nbsp;멀티&amp;nbsp;초고속&amp;nbsp;충전기&amp;nbsp;어댑터&amp;nbsp;CtoC타입&amp;nbsp;100w&amp;nbsp;초고속&amp;nbsp;충전케이블&lt;br /&gt;&lt;a href=&quot;https://link.coupang.com/a/bM5lj8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://link.coupang.com/a/bM5lj8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723183343732&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;Toocki 67W PPS PD.3.0 c타입 3포트 멀티 초고속 충전기 어댑터 CtoC타입 100w 초고속 충전케이블 - 휴대폰&quot; data-og-description=&quot;현재 별점 4.8점, 리뷰 9,521개를 가진 Toocki 67W PPS PD.3.0 c타입 3포트 멀티 초고속 충전기 어댑터 CtoC타입 100w 초고속 충전케이블! 지금 쿠팡에서 더 저렴하고 다양한 휴대폰/액세서리 제품들을 확인&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://link.coupang.com/a/bM5lj8&quot; data-og-url=&quot;https://www.coupang.com/vp/products/6888402395?vendorItemId=83716468206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvgUvp/hyWKJ1Scih/7T99xgPt2Qan1qcvNQarYk/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/toTwe/hyWKC9vOwl/6gRIlKWFqWKthMVEaLGoR0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230&quot;&gt;&lt;a href=&quot;https://link.coupang.com/a/bM5lj8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://link.coupang.com/a/bM5lj8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvgUvp/hyWKJ1Scih/7T99xgPt2Qan1qcvNQarYk/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/toTwe/hyWKC9vOwl/6gRIlKWFqWKthMVEaLGoR0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&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;Toocki 67W PPS PD.3.0 c타입 3포트 멀티 초고속 충전기 어댑터 CtoC타입 100w 초고속 충전케이블 - 휴대폰&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;현재 별점 4.8점, 리뷰 9,521개를 가진 Toocki 67W PPS PD.3.0 c타입 3포트 멀티 초고속 충전기 어댑터 CtoC타입 100w 초고속 충전케이블! 지금 쿠팡에서 더 저렴하고 다양한 휴대폰/액세서리 제품들을 확인&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 제품은 접지는 되지 않는 제품입니다 하지만 매우 컴팩트한 사이즈가 인상적입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 c타입 포트와 1개의 a 타입 포트 총 3개를 지원합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;67W를 지원하기 때문에 스마트폰 고속충전은 물론 노트북까지 무난하게 충전히 가능합니다&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;예전에는 9000원대도 구입가능했는데 요즘에 9000원대는 잘 안보이고&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;10000원~ 15000원정도에 구입하실수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Toocki&amp;nbsp;GaN&amp;nbsp;PPS&amp;nbsp;67W&amp;nbsp;3포트&amp;nbsp;접지형&amp;nbsp;디스플레이&amp;nbsp;c타입&amp;nbsp;초고속&amp;nbsp;멀티&amp;nbsp;충전기&lt;br /&gt;&lt;a href=&quot;https://link.coupang.com/a/bM5k8E&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://link.coupang.com/a/bM5k8E&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723183499847&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;Toocki GaN PPS 67W 3포트 접지형 디스플레이 c타입 초고속 멀티 충전기 - 휴대폰/액세서리 | 쿠팡&quot; data-og-description=&quot;현재 별점 4.8점, 리뷰 583개를 가진 Toocki GaN PPS 67W 3포트 접지형 디스플레이 c타입 초고속 멀티 충전기! 지금 쿠팡에서 더 저렴하고 다양한 휴대폰/액세서리 제품들을 확인해보세요.&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://link.coupang.com/a/bM5k8E&quot; data-og-url=&quot;https://www.coupang.com/vp/products/8112477728?vendorItemId=88775055350&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3bpNT/hyWOl54GnR/ahZBK4dqSXaxQOUhJHnofk/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/4iyOl/hyWKHpq4Of/WlkX0xNQiO4qCm2tQ09FDK/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230&quot;&gt;&lt;a href=&quot;https://link.coupang.com/a/bM5k8E&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://link.coupang.com/a/bM5k8E&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3bpNT/hyWOl54GnR/ahZBK4dqSXaxQOUhJHnofk/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/4iyOl/hyWKHpq4Of/WlkX0xNQiO4qCm2tQ09FDK/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&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;Toocki GaN PPS 67W 3포트 접지형 디스플레이 c타입 초고속 멀티 충전기 - 휴대폰/액세서리 | 쿠팡&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;현재 별점 4.8점, 리뷰 583개를 가진 Toocki GaN PPS 67W 3포트 접지형 디스플레이 c타입 초고속 멀티 충전기! 지금 쿠팡에서 더 저렴하고 다양한 휴대폰/액세서리 제품들을 확인해보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 추천입니다 이제품은 접지가 되는 제품입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선제품과 동일하게 67W의 규격과 2개의 C타입 포트, 1개의 A타입 포트를 지원합니다&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;이 제품은 접지가 되는 제품으로 현재 몇 W가 제공되고 있는지 LED로 표시도 됩니다&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;가격은 17000~25000원 가격대에서 구입하시는게 적정해보입니다&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;접지가 필요한 이유중에 하나는&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보</category>
      <category>PD</category>
      <category>Toocki</category>
      <category>충전기</category>
      <author>나를찾는아이</author>
      <guid isPermaLink="true">https://trend21c.tistory.com/2374</guid>
      <comments>https://trend21c.tistory.com/2374#entry2374comment</comments>
      <pubDate>Sat, 10 Aug 2024 16:07:48 +0900</pubDate>
    </item>
  </channel>
</rss>