<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DB &amp;amp; AWS Knowledge</title>
    <link>https://dbknowledge.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 19:22:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>`O`</managingEditor>
    <image>
      <title>DB &amp;amp; AWS Knowledge</title>
      <url>https://tistory1.daumcdn.net/tistory/4606771/attach/bf0081ad17a147abb406e53a654d243a</url>
      <link>https://dbknowledge.tistory.com</link>
    </image>
    <item>
      <title>고가용성 (HA) 수준에 따른 장애 허용시간</title>
      <link>https://dbknowledge.tistory.com/221</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; 고가용성 (HA) 수준에 따른 장애 허용시간에 대하여 다룬다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;또한 이 페이지는 이전 게시글과 연관된 내용이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dbknowledge.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.06.08 - [DB 관련 지식/DB 연관 IT 개념] - 고가용성 (H.A - High Availability)&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. (&lt;b&gt;[] 로 표기&lt;/b&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.&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;AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.&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;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[HA 가용성에 따른 가용허용시간에 대해서 알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;HA(High Availability) 가용성에 따른 가용허용시간&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. HA(고가용성)의 의미&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;**고가용성(HA, High Availability)**는 시스템, 네트워크, 서비스가 장시간 동안 장애 없이 정상적으로 운영될 수 있는 능력을 의미합니다.&lt;/li&gt;
&lt;li&gt;가용성은 **정상 운영 시간(Uptime) / 전체 시간(Uptime + Downtime)**으로 계산하며, 퍼센트(%)로 표현합니다.&lt;/li&gt;
&lt;li&gt;산업 현장에서는 99%, 99.9%, 99.99%, 99.999% 등으로 SLA(서비스 수준 협약)를 명시합니다&lt;a href=&quot;https://www.stevenjlee.net/2020/06/28/%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EA%B0%80%EC%9A%A9%EC%84%B1-availability-%EA%B3%BC-%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1-high-availability/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dany-it.tistory.com/399&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 가용성 등급별 허용 장애(다운타임) 시간&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 표는 &lt;b&gt;가용성 퍼센트별 1년, 1개월, 1주, 1일 기준 허용 장애 시간&lt;/b&gt;을 정리한 것입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;가용성(%)&lt;/td&gt;
&lt;td&gt;1년 허용 다운타임&lt;/td&gt;
&lt;td&gt;1개월&lt;/td&gt;
&lt;td&gt;1주&lt;/td&gt;
&lt;td&gt;1일(24시간)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;36.53일&lt;/td&gt;
&lt;td&gt;73.05시간&lt;/td&gt;
&lt;td&gt;16.80시간&lt;/td&gt;
&lt;td&gt;2.40시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95.0&lt;/td&gt;
&lt;td&gt;18.26일&lt;/td&gt;
&lt;td&gt;36.53시간&lt;/td&gt;
&lt;td&gt;8.40시간&lt;/td&gt;
&lt;td&gt;1.20시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.0&lt;/td&gt;
&lt;td&gt;3.65일&lt;/td&gt;
&lt;td&gt;7.31시간&lt;/td&gt;
&lt;td&gt;1.68시간&lt;/td&gt;
&lt;td&gt;14.4분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.5&lt;/td&gt;
&lt;td&gt;1.83일&lt;/td&gt;
&lt;td&gt;3.65시간&lt;/td&gt;
&lt;td&gt;50.4분&lt;/td&gt;
&lt;td&gt;7.2분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.9&lt;/td&gt;
&lt;td&gt;8.77시간&lt;/td&gt;
&lt;td&gt;43.8분&lt;/td&gt;
&lt;td&gt;10.1분&lt;/td&gt;
&lt;td&gt;1.44분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.99&lt;/td&gt;
&lt;td&gt;52.6분&lt;/td&gt;
&lt;td&gt;4.38분&lt;/td&gt;
&lt;td&gt;1.01분&lt;/td&gt;
&lt;td&gt;8.64초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.999&lt;/td&gt;
&lt;td&gt;5.26분&lt;/td&gt;
&lt;td&gt;26.3초&lt;/td&gt;
&lt;td&gt;6.05초&lt;/td&gt;
&lt;td&gt;0.864초&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;99.9%&lt;/b&gt;: 1년에 약 8.77시간, 1개월에 43.8분, 1일에 1.44분까지 장애 허용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;99.99%&lt;/b&gt;: 1년에 52.6분, 1개월에 4.38분, 1일에 8.64초 허용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;99.999%(파이브 나인스)&lt;/b&gt;: 1년에 5분 15초, 1개월에 26.3초, 1일에 0.864초 허용&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://dany-it.tistory.com/399&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://roshancloudarchitect.me/understanding-sla-and-the-importance-of-99-99-and-99-999-availability-e3bb33f2684f&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://wikidocs.net/266746&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 실무 적용 및 참고사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SLA 설계&lt;/b&gt;: 서비스 중요도에 따라 목표 가용성(예: 99.9% 이상)을 설정하고, 이에 맞는 장애 허용시간을 SLA에 명시합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HA 시스템 설계&lt;/b&gt;: 허용 장애시간이 짧을수록(가용성 수치가 높을수록) 더 많은 이중화, 클러스터, 자동 복구 설계가 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용과 트레이드오프&lt;/b&gt;: 99.999% 이상을 달성하려면 비용과 기술적 복잡성이 크게 증가하므로, 비즈니스 중요도에 따라 적정 수준을 선택합니다&lt;a href=&quot;https://www.ibm.com/docs/en/powerha-aix/7.2.x?topic=aix-high-availability-versus-fault-tolerance&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://ascendantusa.com/2025/03/22/high-availability/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://docs.myq-solution.com/en/ovv/i/understanding-high-availability&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HA 가용성 수치가 높을수록 허용 장애시간은 극단적으로 짧아집니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;99.9%&lt;/b&gt;: 1년에 약 9시간, &lt;b&gt;99.99%&lt;/b&gt;: 1년에 약 1시간, &lt;b&gt;99.999%&lt;/b&gt;: 1년에 5분 이내만 장애 허용.&lt;/li&gt;
&lt;li&gt;SLA, HA 설계 시 반드시 목표 가용성에 따른 허용 장애시간을 명확히 산정해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 허용시간 산정은 시스템 전체 운영시간(365일 24시간) 기준입니다.&lt;/li&gt;
&lt;li&gt;계획된 점검(정기 점검 등)은 별도 산정할 수 있으니 SLA 세부 기준을 확인하세요&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://dany-it.tistory.com/399&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://wikidocs.net/266746&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 업계마다 목표로 삼는 가용성은 각기 다르지만, 일반적으로 99.99% (Four Nine) 이상의 가용성을 갖는것을 목표로 삼는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.stevenjlee.net/2020/06/28/%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EA%B0%80%EC%9A%A9%EC%84%B1-availability-%EA%B3%BC-%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1-high-availability/&quot;&gt;https://www.stevenjlee.net/2020/06/28/%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EA%B0%80%EC%9A%A9%EC%84%B1-availability-%EA%B3%BC-%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1-high-availability/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1&quot;&gt;https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dany-it.tistory.com/399&quot;&gt;https://dany-it.tistory.com/399&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://roshancloudarchitect.me/understanding-sla-and-the-importance-of-99-99-and-99-999-availability-e3bb33f2684f&quot;&gt;https://roshancloudarchitect.me/understanding-sla-and-the-importance-of-99-99-and-99-999-availability-e3bb33f2684f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wikidocs.net/266746&quot;&gt;https://wikidocs.net/266746&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/powerha-aix/7.2.x?topic=aix-high-availability-versus-fault-tolerance&quot;&gt;https://www.ibm.com/docs/en/powerha-aix/7.2.x?topic=aix-high-availability-versus-fault-tolerance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ascendantusa.com/2025/03/22/high-availability/&quot;&gt;https://ascendantusa.com/2025/03/22/high-availability/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.myq-solution.com/en/ovv/i/understanding-high-availability&quot;&gt;https://docs.myq-solution.com/en/ovv/i/understanding-high-availability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibinfo.co.kr/computer-tip-2/%EC%84%9C%EB%B2%84-%EC%9D%B4%EC%A4%91%ED%99%94ha-%EC%86%94%EB%A3%A8%EC%85%98%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC&quot;&gt;https://www.ibinfo.co.kr/computer-tip-2/%EC%84%9C%EB%B2%84-%EC%9D%B4%EC%A4%91%ED%99%94ha-%EC%86%94%EB%A3%A8%EC%85%98%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dbknowledge.tistory.com/63&quot;&gt;https://dbknowledge.tistory.com/63&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@swjtwin/HA%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1&quot;&gt;https://velog.io/@swjtwin/HA%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/aws/comments/xz45m5/what_is_the_difference_between_high_availability/&quot;&gt;https://www.reddit.com/r/aws/comments/xz45m5/what_is_the_difference_between_high_availability/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pingcap.com/article/what-is-high-availability-and-how-you-can-achieve/&quot;&gt;https://www.pingcap.com/article/what-is-high-availability-and-how-you-can-achieve/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://uptime.is&quot;&gt;https://uptime.is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ninjaone.com/blog/high-availability-vs-fault-tolerance/&quot;&gt;https://www.ninjaone.com/blog/high-availability-vs-fault-tolerance/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/think/topics/high-availability&quot;&gt;https://www.ibm.com/think/topics/high-availability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://us.sios.com/blog/availability-slas-ft-ha-and-dr-where-to-start/&quot;&gt;https://us.sios.com/blog/availability-slas-ft-ha-and-dr-where-to-start/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sunrise-min.tistory.com/entry/%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1-High-Availability&quot;&gt;https://sunrise-min.tistory.com/entry/%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1-High-Availability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/High_availability&quot;&gt;https://en.wikipedia.org/wiki/High_availability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zenduty.com/blog/uptime-vs-availability/&quot;&gt;https://zenduty.com/blog/uptime-vs-availability/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>DB 관련 지식/DB 연관 IT 개념</category>
      <category>kafka</category>
      <category>kafka운영</category>
      <category>retention</category>
      <category>데이터보존</category>
      <category>복제본</category>
      <category>분산처리</category>
      <category>세그먼트</category>
      <category>파티션</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/221</guid>
      <comments>https://dbknowledge.tistory.com/221#entry221comment</comments>
      <pubDate>Thu, 10 Jul 2025 02:52:07 +0900</pubDate>
    </item>
    <item>
      <title>Kafka server.property (config 설정) 관련 옵션들 - 2</title>
      <link>https://dbknowledge.tistory.com/220</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Kafka broker 들을 구성할 때, 튜닝을 고려 할 수 있는 server.property 옵션들에 대하여 다룬다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. (&lt;b&gt;[] 로 표기&lt;/b&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.&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;AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[Kafka&amp;nbsp;에서&amp;nbsp;auto.leader.rebalance.enable&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Kafka의 auto.leader.rebalance.enable&lt;/b&gt; 옵션은 카프카 클러스터 내에서 &lt;b&gt;파티션 리더(Leader)의 분포가 특정 브로커에 치우치는 불균형(leader skew)을 자동으로 해소하는 기능&lt;/b&gt;입니다. 이 옵션의 주요 목적과 동작 방식은 다음과 같습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 역할 및 필요성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;리더 분포 불균형(Leader Skew) 해소&lt;/b&gt;&lt;br /&gt;카프카의 각 파티션은 여러 브로커에 복제(replica)되지만, 실제로 데이터를 읽고 쓰는 역할(리더)은 한 브로커에만 집중됩니다.&lt;br /&gt;클러스터 운영 중 브로커 추가/삭제, 장애 복구 등으로 인해 특정 브로커에 리더가 몰리면, 해당 브로커에 과부하가 발생할 수 있습니다&lt;a href=&quot;https://velog.io/@tedigom/Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-Rebalance-%ED%95%98%EA%B8%B0&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 리더 재분배&lt;/b&gt;&lt;br /&gt;auto.leader.rebalance.enable=true로 설정하면, 백그라운드 스레드가 주기적으로 리더 분포 상태를 체크하고, 불균형이 감지되면 파티션 리더를 선호 리더(preferred leader)로 자동 재조정합니다&lt;a href=&quot;https://velog.io/@tedigom/Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-Rebalance-%ED%95%98%EA%B8%B0&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://mandykr.tistory.com/95&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://velog.io/@kidae92/Apache-Kafka-%EC%A3%BC%EC%9A%94-%EC%9A%94%EC%86%8C4Replication&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://maru-itdeveloper.tistory.com/82&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/msk/latest/developerguide/msk-default-configuration.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주기적 체크&lt;/b&gt;&lt;br /&gt;리더 분포 상태는 leader.imbalance.check.interval.seconds 설정(기본 300초, 환경에 따라 다름)마다 확인됩니다&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://mandykr.tistory.com/95&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://velog.io/@kidae92/Apache-Kafka-%EC%A3%BC%EC%9A%94-%EC%9A%94%EC%86%8C4Replication&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;불균형 기준&lt;/b&gt;&lt;br /&gt;특정 브로커에 리더가 전체 파티션의 leader.imbalance.per.broker.percentage(기본 10%) 이상 몰리면 리밸런싱이 트리거됩니다&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://velog.io/@kidae92/Apache-Kafka-%EC%A3%BC%EC%9A%94-%EC%9A%94%EC%86%8C4Replication&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;선호 리더(Preferred Leader) 복귀&lt;/b&gt;&lt;br /&gt;파티션의 첫 번째 replica가 &quot;선호 리더&quot;이며, 리밸런싱 시 이 preferred leader로 리더를 재선출합니다&lt;a href=&quot;https://velog.io/@tedigom/Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-Rebalance-%ED%95%98%EA%B8%B0&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://joochang.tistory.com/139&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://mandykr.tistory.com/95&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;
&lt;pre id=&quot;code_1752069350515&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;auto.leader.rebalance.enable=true 
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기타 참고사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;운영 편의성&lt;/b&gt;&lt;br /&gt;자동 리밸런싱을 통해 관리자의 수고를 줄일 수 있지만, 대규모 브로커 추가 등 특정 상황에서는 수동 리밸런싱(kafka-leader-election.sh 등)도 고려해야 합니다&lt;a href=&quot;https://velog.io/@tedigom/Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-Rebalance-%ED%95%98%EA%B8%B0&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비활성화 가능&lt;/b&gt;&lt;br /&gt;필요 시 이 옵션을 false로 두고, 리더 재분배를 수동으로 관리할 수도 있습니다&lt;span&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.0/html/using_amq_streams_on_rhel/assembly-managing-kafka-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약:&lt;/b&gt;&lt;br /&gt;auto.leader.rebalance.enable은 카프카 클러스터의 리더 역할이 특정 브로커에 몰리는 현상을 자동으로 감지&amp;middot;해결하여, 클러스터의 부하를 균등하게 분산하고 성능 저하 및 장애 위험을 줄이는 중요한 설정입니다&lt;a href=&quot;https://velog.io/@tedigom/Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-Rebalance-%ED%95%98%EA%B8%B0&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://mandykr.tistory.com/95&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://velog.io/@kidae92/Apache-Kafka-%EC%A3%BC%EC%9A%94-%EC%9A%94%EC%86%8C4Replication&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://maru-itdeveloper.tistory.com/82&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/msk/latest/developerguide/msk-default-configuration.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@tedigom/Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-Rebalance-%ED%95%98%EA%B8%B0&quot;&gt;https://velog.io/@tedigom/Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-Rebalance-%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot;&gt;https://yeon-kr.tistory.com/183&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joochang.tistory.com/139&quot;&gt;https://joochang.tistory.com/139&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.0/html/using_amq_streams_on_rhel/assembly-managing-kafka-str&quot;&gt;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.0/html/using_amq_streams_on_rhel/assembly-managing-kafka-str&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot;&gt;https://assu10.github.io/dev/2024/06/15/kafka-install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mandykr.tistory.com/95&quot;&gt;https://mandykr.tistory.com/95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://westlife0615.tistory.com/653&quot;&gt;https://westlife0615.tistory.com/653&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@kidae92/Apache-Kafka-%EC%A3%BC%EC%9A%94-%EC%9A%94%EC%86%8C4Replication&quot;&gt;https://velog.io/@kidae92/Apache-Kafka-%EC%A3%BC%EC%9A%94-%EC%9A%94%EC%86%8C4Replication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://maru-itdeveloper.tistory.com/82&quot;&gt;https://maru-itdeveloper.tistory.com/82&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/msk/latest/developerguide/msk-default-configuration.html&quot;&gt;https://docs.aws.amazon.com/ko_kr/msk/latest/developerguide/msk-default-configuration.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[delete.topic.enable 에 대해서 알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete.topic.enable은 &lt;b&gt;Kafka에서 토픽(topic) 삭제 기능의 활성화 여부를 제어하는 브로커 설정 옵션&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 내용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기능&lt;/b&gt;&lt;br /&gt;이 옵션이 true로 설정되어 있어야만, kafka-topics.sh --delete 명령을 통해 토픽을 실제로 삭제할 수 있습니다&lt;a href=&quot;https://jusunglee.tistory.com/entry/%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-Topic-delete&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/using_amq_streams_on_rhel/con-topic-deletion-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://knight76.tistory.com/entry/kafka-%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-%EA%B4%80%EB%A0%A8-%EC%98%88%EC%A0%9C&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yebali.tistory.com/69&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본값&lt;/b&gt;&lt;br /&gt;최신 Kafka 버전에서는 기본값이 true이지만, 일부 환경이나 과거 버전에서는 기본값이 false일 수 있습니다&lt;span&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/using_amq_streams_on_rhel/con-topic-deletion-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설정 위치&lt;/b&gt;&lt;br /&gt;브로커 설정 파일(server.properties)에 아래와 같이 추가합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752069491991&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete.topic.enable=true&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동작 방식&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;true : 토픽 삭제 명령 실행 시, 해당 토픽의 데이터와 메타데이터가 실제로 삭제됩니다.&lt;/li&gt;
&lt;li&gt;false : 삭제 명령을 내려도 토픽은 &quot;marked for deletion(삭제 예약)&quot; 상태로만 남고 실제로 삭제되지 않습니다. 이 상태에서는 토픽에 접근할 수 없지만, 디스크 공간은 회수되지 않고, 동일 이름의 토픽 재생성 등에도 문제가 발생할 수 있습니다&lt;a href=&quot;https://jusunglee.tistory.com/entry/%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-Topic-delete&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://deep-dive-dev.tistory.com/61&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://knight76.tistory.com/entry/kafka-%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-%EA%B4%80%EB%A0%A8-%EC%98%88%EC%A0%9C&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://starblood.tistory.com/entry/kafka-topic-%EC%82%AD%EC%A0%9C%EC%8B%9C-%EC%9C%A0%EC%9D%98%EC%82%AC%ED%95%AD&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://yebali.tistory.com/69&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의 사항&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정 변경 후에는 &lt;b&gt;Kafka 브로커를 재시작&lt;/b&gt;해야 적용됩니다&lt;a href=&quot;https://starblood.tistory.com/entry/kafka-topic-%EC%82%AD%EC%A0%9C%EC%8B%9C-%EC%9C%A0%EC%9D%98%EC%82%AC%ED%95%AD&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yebali.tistory.com/69&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://hyojaedev.tistory.com/38&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;토픽을 바라보는 커넥터나 컨슈머가 있을 경우, 삭제가 지연되거나 제대로 삭제되지 않을 수 있습니다&lt;span&gt;&lt;a href=&quot;https://seojeong-99.tistory.com/142&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;완전히 삭제되지 않은 경우, Zookeeper 쉘을 이용해 /brokers/topics/토픽이름 경로를 직접 삭제해야 할 수도 있습니다&lt;a href=&quot;https://jusunglee.tistory.com/entry/%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-Topic-delete&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://deep-dive-dev.tistory.com/61&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yebali.tistory.com/69&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://hyojaedev.tistory.com/38&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;delete.topic.enable=true여야 토픽 삭제가 정상적으로 동작합니다.&lt;/li&gt;
&lt;li&gt;이 옵션이 false면 삭제 명령은 &quot;예약&quot;만 하고 실제 삭제는 이루어지지 않습니다.&lt;/li&gt;
&lt;li&gt;설정 변경 후 브로커 재시작이 필요하며, 토픽 삭제가 안 될 때는 Zookeeper에서 직접 정리해야 할 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka에서 토픽 삭제를 원한다면, 반드시 delete.topic.enable=true를 확인하고 사용하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://seojeong-99.tistory.com/142&quot;&gt;https://seojeong-99.tistory.com/142&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jusunglee.tistory.com/entry/%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-Topic-delete&quot;&gt;https://jusunglee.tistory.com/entry/%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-Topic-delete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pinggoopark.tistory.com/entry/kafka-%EC%B9%B4%ED%94%84%EC%B9%B4%EC%97%90%EC%84%9C-%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&quot;&gt;https://pinggoopark.tistory.com/entry/kafka-%EC%B9%B4%ED%94%84%EC%B9%B4%EC%97%90%EC%84%9C-%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://deep-dive-dev.tistory.com/61&quot;&gt;https://deep-dive-dev.tistory.com/61&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/using_amq_streams_on_rhel/con-topic-deletion-str&quot;&gt;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/using_amq_streams_on_rhel/con-topic-deletion-str&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://knight76.tistory.com/entry/kafka-%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-%EA%B4%80%EB%A0%A8-%EC%98%88%EC%A0%9C&quot;&gt;https://knight76.tistory.com/entry/kafka-%ED%86%A0%ED%94%BD-%EC%82%AD%EC%A0%9C-%EA%B4%80%EB%A0%A8-%EC%98%88%EC%A0%9C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://starblood.tistory.com/entry/kafka-topic-%EC%82%AD%EC%A0%9C%EC%8B%9C-%EC%9C%A0%EC%9D%98%EC%82%AC%ED%95%AD&quot;&gt;https://starblood.tistory.com/entry/kafka-topic-%EC%82%AD%EC%A0%9C%EC%8B%9C-%EC%9C%A0%EC%9D%98%EC%82%AC%ED%95%AD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yebali.tistory.com/69&quot;&gt;https://yebali.tistory.com/69&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hyojaedev.tistory.com/38&quot;&gt;https://hyojaedev.tistory.com/38&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot;&gt;https://presentlee.tistory.com/12&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[num.partitions 에 대해서 알려주고 이에 따른 주의점과 파티션 개수 결정 기준에 도움이 되는 사항들을 알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;Kafka의 num.partitions란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**num.partitions**는 Kafka에서 &lt;b&gt;토픽을 생성할 때 기본적으로 생성되는 파티션의 개수&lt;/b&gt;를 의미합니다.&lt;br /&gt;파티션은 Kafka의 토픽 데이터를 물리적으로 분산 저장하는 단위로, &lt;b&gt;병렬 처리, 확장성, 메시지 순서 보장&lt;/b&gt; 등에 중요한 역할을 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽 생성 시 별도 지정이 없으면 브로커 설정의 num.partitions 값이 적용됩니다&lt;a href=&quot;https://codemia.io/knowledge-hub/path/kafka_create_topic_with_default_number_of_partitions&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://log-laboratory.tistory.com/226&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;각 파티션은 클러스터 내 여러 브로커에 분산되어 저장&amp;middot;관리됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;주의점 및 파티션 개수 결정 시 고려사항&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 파티션 개수와 병렬성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;병렬 소비의 한계&lt;/b&gt;: 한 컨슈머 그룹 내에서 동시에 병렬로 메시지를 처리할 수 있는 컨슈머 수는 파티션 개수와 동일합니다. 예를 들어, 10개의 파티션이 있으면 최대 10개의 컨슈머가 병렬로 처리할 수 있습니다&lt;a href=&quot;https://www.reddit.com/r/apachekafka/comments/xd5s95/number_of_partitions/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로듀서&amp;middot;컨슈머 처리량&lt;/b&gt;: 파티션이 많을수록 프로듀서와 컨슈머가 더 높은 처리량을 달성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 파티션 개수 결정 공식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기본 공식&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 파티션 수 = max(총 목표 처리량 &amp;divide; 단일 파티션 처리량(프로듀서), 총 목표 처리량 &amp;divide; 단일 파티션 처리량(컨슈머))&lt;/li&gt;
&lt;li&gt;예시: 컨슈머 1개가 초당 50MB를 처리할 수 있고, 전체 처리량이 1000MB/sec라면 최소 20개 파티션 필요&lt;a href=&quot;https://stackoverflow.com/questions/50271677/how-to-choose-the-no-of-partitions-for-a-kafka-topic&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.confluent.io/kafka/operations-tools/partition-determination.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 적절한 파티션 개수 산정 가이드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;병렬성&lt;/b&gt;: 컨슈머 그룹 내 동시 처리 수요에 맞게 파티션 수를 산정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브로커 수와 배수&lt;/b&gt;: 파티션 개수를 브로커 수의 배수로 설정하면 리더 분산이 고르게 이루어져 부하가 균등해집니다&lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/apachekafka/comments/r701jg/how_to_decide_number_of_partitions/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;향후 확장성&lt;/b&gt;: 미래 데이터 증가와 컨슈머 확장 가능성을 고려해 다소 넉넉하게 설정하는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메시지 순서 보장&lt;/b&gt;: 파티션 내에서는 메시지 순서가 보장되지만, 파티션을 늘리면 키 기반 메시지의 순서가 깨질 수 있으므로 주의해야 합니다&lt;a href=&quot;https://docs.confluent.io/kafka/operations-tools/partition-determination.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 주의해야 할 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;과도한 파티션 수의 부작용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 파티션은 별도의 파일 핸들, 메모리, 네트워크 리소스를 사용하므로, 너무 많은 파티션은 클러스터의 성능 저하, 메타데이터 관리 부담, 장애 발생 시 복구 시간 증가 등의 문제를 유발할 수 있습니다&lt;a href=&quot;https://www.datastreamhouse.com/blog/how-many-partitions-do-i-need-in-apache-kafka&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dattell.com/data-architecture-blog/kafka-optimization-how-many-partitions-are-needed/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;일반적으로 &lt;b&gt;브로커당 100개 내외, 클러스터 전체 10,000~200,000개 이내&lt;/b&gt;로 관리하는 것이 권장됩니다&lt;a href=&quot;https://www.datastreamhouse.com/blog/how-many-partitions-do-i-need-in-apache-kafka&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.confluent.io/kafka/operations-tools/partition-determination.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dattell.com/data-architecture-blog/kafka-optimization-how-many-partitions-are-needed/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파티션 수 변경의 제약&lt;/b&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;a href=&quot;https://docs.confluent.io/kafka/operations-tools/partition-determination.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 실무적 권장사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;작게 시작해서 점진적 확장&lt;/b&gt;: 처음에는 3~12개 정도로 시작하고, 필요에 따라 늘리는 것이 일반적입니다&lt;a href=&quot;https://www.reddit.com/r/apachekafka/comments/1goigd1/kafka_topics_partition_best_practices/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.datastreamhouse.com/blog/how-many-partitions-do-i-need-in-apache-kafka&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파티션 키 설계&lt;/b&gt;: 데이터가 특정 파티션에 몰리지 않도록 키 설계를 신중하게 해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모니터링 필수&lt;/b&gt;: 파티션별 크기, 소비 지연, 처리량 등을 지속적으로 모니터링하고 조정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;파티션 개수 결정 체크리스트&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;고려 항목설명 및 권장사항
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;컨슈머 병렬성&lt;/td&gt;
&lt;td&gt;필요한 동시 컨슈머 수 이상으로 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;브로커 수&lt;/td&gt;
&lt;td&gt;브로커 수의 배수로 맞추면 리더 분산에 유리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;처리량/성능&lt;/td&gt;
&lt;td&gt;단일 파티션 처리량을 측정해 공식 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;순서 보장&lt;/td&gt;
&lt;td&gt;키 기반 메시지라면 파티션 수 변경에 신중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;리소스 한계&lt;/td&gt;
&lt;td&gt;브로커당 100~200개, 클러스터 10,000~200,000개 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;미래 확장성&lt;/td&gt;
&lt;td&gt;데이터 증가, 컨슈머 확장 고려해 여유 있게 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;br /&gt;Kafka의 num.partitions는 토픽의 병렬성, 처리량, 확장성에 직접적인 영향을 미치는 핵심 설정입니다.&lt;br /&gt;너무 적으면 성능이 제한되고, 너무 많으면 클러스터 리소스와 관리에 부담이 커지니&lt;br /&gt;&lt;b&gt;처리량, 컨슈머 수, 브로커 수, 메시지 순서 보장, 향후 확장성&lt;/b&gt; 등을 종합적으로 고려해 신중히 결정해야 합니다&lt;a href=&quot;https://www.datastreamhouse.com/blog/how-many-partitions-do-i-need-in-apache-kafka&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://newrelic.com/kr/blog/best-practices/effective-strategies-kafka-topic-partitioning&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://stackoverflow.com/questions/50271677/how-to-choose-the-no-of-partitions-for-a-kafka-topic&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.confluent.io/kafka/operations-tools/partition-determination.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.reddit.com/r/apachekafka/comments/r701jg/how_to_decide_number_of_partitions/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://dattell.com/data-architecture-blog/kafka-optimization-how-many-partitions-are-needed/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://learn.conduktor.io/kafka/kafka-topics-choosing-the-replication-factor-and-partitions-count/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;13&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;※&lt;span&gt; 위에 게시된 데로 한번 늘린 토픽수는 줄일 수 없으니 신중하게 결정해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://codemia.io/knowledge-hub/path/kafka_create_topic_with_default_number_of_partitions&quot;&gt;https://codemia.io/knowledge-hub/path/kafka_create_topic_with_default_number_of_partitions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://log-laboratory.tistory.com/226&quot;&gt;https://log-laboratory.tistory.com/226&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/apachekafka/comments/xd5s95/number_of_partitions/&quot;&gt;https://www.reddit.com/r/apachekafka/comments/xd5s95/number_of_partitions/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&quot;&gt;https://github.com/AutoMQ/automq/wiki/Kafka-Partition:-All-You-Need-to-Know-&amp;amp;-Best-Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/50271677/how-to-choose-the-no-of-partitions-for-a-kafka-topic&quot;&gt;https://stackoverflow.com/questions/50271677/how-to-choose-the-no-of-partitions-for-a-kafka-topic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.confluent.io/kafka/operations-tools/partition-determination.html&quot;&gt;https://docs.confluent.io/kafka/operations-tools/partition-determination.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/&quot;&gt;https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/apachekafka/comments/r701jg/how_to_decide_number_of_partitions/&quot;&gt;https://www.reddit.com/r/apachekafka/comments/r701jg/how_to_decide_number_of_partitions/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.datastreamhouse.com/blog/how-many-partitions-do-i-need-in-apache-kafka&quot;&gt;https://www.datastreamhouse.com/blog/how-many-partitions-do-i-need-in-apache-kafka&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dattell.com/data-architecture-blog/kafka-optimization-how-many-partitions-are-needed/&quot;&gt;https://dattell.com/data-architecture-blog/kafka-optimization-how-many-partitions-are-needed/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/apachekafka/comments/1goigd1/kafka_topics_partition_best_practices/&quot;&gt;https://www.reddit.com/r/apachekafka/comments/1goigd1/kafka_topics_partition_best_practices/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://newrelic.com/kr/blog/best-practices/effective-strategies-kafka-topic-partitioning&quot;&gt;https://newrelic.com/kr/blog/best-practices/effective-strategies-kafka-topic-partitioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.conduktor.io/kafka/kafka-topics-choosing-the-replication-factor-and-partitions-count/&quot;&gt;https://learn.conduktor.io/kafka/kafka-topics-choosing-the-replication-factor-and-partitions-count/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/59114675/the-behavior-about-num-partitions-in-properties-file&quot;&gt;https://stackoverflow.com/questions/59114675/the-behavior-about-num-partitions-in-properties-file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot;&gt;https://presentlee.tistory.com/12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kafka.apache.org/documentation/&quot;&gt;https://kafka.apache.org/documentation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.redpanda.com/guides/kafka-tutorial-kafka-partition-strategy&quot;&gt;https://www.redpanda.com/guides/kafka-tutorial-kafka-partition-strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://strimzi.io/blog/2021/06/08/broker-tuning/&quot;&gt;https://strimzi.io/blog/2021/06/08/broker-tuning/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/58806232/what-is-the-ideal-number-of-partitions-in-kafka-topic&quot;&gt;https://stackoverflow.com/questions/58806232/what-is-the-ideal-number-of-partitions-in-kafka-topic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/50121042/kafka-is-our-number-of-partitions-insane&quot;&gt;https://stackoverflow.com/questions/50121042/kafka-is-our-number-of-partitions-insane&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[default.replication.factor 에 대해서 알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**default.replication.factor**는 Kafka 브로커의 설정 옵션 중 하나로, &lt;b&gt;자동 생성되는 토픽의 파티션 복제본(Replication) 개수의 기본값&lt;/b&gt;을 지정합니다.&lt;br /&gt;즉, 토픽을 명시적으로 만들 때 replication-factor를 지정하지 않거나, auto.create.topics.enable=true 상태에서 토픽이 자동 생성될 때 적용되는 복제본 개수입니다&lt;a href=&quot;https://hbase.tistory.com/218&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://firststep-de.tistory.com/43&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://velog.io/@ehdrms2034/%EC%B9%B4%ED%94%84%EC%B9%B4-2%EC%9E%A5-%EC%BB%A4%EB%A7%A8%EB%93%9C%EB%9D%BC%EC%9D%B8-%ED%88%B4&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://rockintuna.tistory.com/265&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;주요 설명&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Replication Factor란?&lt;/b&gt;&lt;br /&gt;각 파티션 데이터를 여러 브로커에 복제해 저장하는 개수입니다.&lt;br /&gt;예를 들어 replication factor가 3이라면, 각 파티션 데이터가 3개의 브로커에 저장됩니다&lt;a href=&quot;https://damdam-kim.tistory.com/17&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://xonmin.tistory.com/80&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-topic-replication/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;default.replication.factor의 기본값&lt;/b&gt;&lt;br /&gt;보통 1(복제 없음)이나 2~3(복제본 2~3개)로 설정됩니다.&lt;br /&gt;운영 환경에서는 장애 대비와 데이터 내구성을 위해 2 이상, 일반적으로 3을 권장합니다&lt;a href=&quot;https://xonmin.tistory.com/80&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-topic-replication/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://firststep-de.tistory.com/43&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설정 위치&lt;/b&gt;&lt;br /&gt;server.properties 파일에 아래와 같이 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752069997447&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;default.replication.factor=3&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동작 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령어로 토픽 생성 시 replication-factor를 지정하지 않으면 이 값이 적용됩니다.&lt;/li&gt;
&lt;li&gt;auto.create.topics.enable=true 상태에서 존재하지 않는 토픽에 메시지를 보내면, 이 값이 자동 적용되어 토픽이 생성됩니다&lt;a href=&quot;https://hbase.tistory.com/218&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://rockintuna.tistory.com/265&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;주의점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;브로커 수 제한&lt;/b&gt;&lt;br /&gt;replication factor는 반드시 클러스터 내 브로커 수 이하로만 설정해야 합니다.&lt;br /&gt;예: 브로커가 2대뿐인데 replication factor를 3으로 하면 토픽 생성이 실패합니다&lt;a href=&quot;https://xonmin.tistory.com/80&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://hbase.tistory.com/218&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디스크 사용량 증가&lt;/b&gt;&lt;br /&gt;복제본 수가 늘어나면 데이터가 여러 번 저장되므로 디스크 사용량이 배로 증가합니다.&lt;br /&gt;또한, 브로커 간 복제 트래픽과 리소스 사용도 늘어납니다&lt;a href=&quot;https://damdam-kim.tistory.com/17&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://xonmin.tistory.com/80&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-topic-replication/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복제본 관리&lt;/b&gt;&lt;br /&gt;복제본이 많을수록 장애 시 데이터 손실 위험이 줄어들지만, 리소스 부담도 커집니다.&lt;br /&gt;데이터 중요도에 따라 적절한 값을 선택하는 것이 중요합니다&lt;a href=&quot;https://damdam-kim.tistory.com/17&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://xonmin.tistory.com/80&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-topic-replication/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;복제본 개수 결정 기준 및 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;데이터 중요도&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중요 데이터: 3 이상 권장(장애 시 데이터 손실 최소화)&lt;/li&gt;
&lt;li&gt;비중요 데이터: 1~2도 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클러스터 브로커 수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;replication factor는 브로커 수 이하로만 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;운영 환경 표준&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 3을 가장 많이 사용(1개는 leader, 2개는 follower)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;내부 토픽 별도 설정&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;offsets.topic.replication.factor 등 내부 토픽 복제본도 별도 설정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리소스 고려&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복제본이 많을수록 디스크/네트워크/CPU 사용량이 증가함에 유의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;요약 표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;설정 값설명권장값/주의점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;default.replication.factor&lt;/td&gt;
&lt;td&gt;자동 생성 토픽의 기본 복제본 개수&lt;/td&gt;
&lt;td&gt;3(운영), 1(테스트)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;브로커 수&lt;/td&gt;
&lt;td&gt;replication factor &amp;le; 브로커 수&lt;/td&gt;
&lt;td&gt;브로커 수 미만 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;디스크/리소스 사용량&lt;/td&gt;
&lt;td&gt;복제본 수만큼 배로 증가&lt;/td&gt;
&lt;td&gt;리소스 한계 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 중요도&lt;/td&gt;
&lt;td&gt;중요할수록 높은 replication factor 권장&lt;/td&gt;
&lt;td&gt;3 이상 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정리:&lt;/b&gt;&lt;br /&gt;default.replication.factor는 Kafka에서 토픽 복제본의 기본값을 정하는 옵션으로,&lt;br /&gt;**데이터 내구성과 장애 대비를 위해 2~3 이상을 권장**하지만,&lt;br /&gt;**브로커 수와 리소스 한계를 반드시 고려**해 설정해야 합니다&lt;a href=&quot;https://damdam-kim.tistory.com/17&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://xonmin.tistory.com/80&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-topic-replication/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://hbase.tistory.com/218&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://firststep-de.tistory.com/43&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://damdam-kim.tistory.com/17&quot;&gt;https://damdam-kim.tistory.com/17&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://log-laboratory.tistory.com/226&quot;&gt;https://log-laboratory.tistory.com/226&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot;&gt;https://presentlee.tistory.com/12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xonmin.tistory.com/80&quot;&gt;https://xonmin.tistory.com/80&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-topic-replication/&quot;&gt;http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-topic-replication/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hbase.tistory.com/218&quot;&gt;https://hbase.tistory.com/218&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://firststep-de.tistory.com/43&quot;&gt;https://firststep-de.tistory.com/43&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/docs/ko/oala/1.3.7?topic=collection-configuring-apache-kafka-brokers&quot;&gt;https://www.ibm.com/docs/ko/oala/1.3.7?topic=collection-configuring-apache-kafka-brokers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@ehdrms2034/%EC%B9%B4%ED%94%84%EC%B9%B4-2%EC%9E%A5-%EC%BB%A4%EB%A7%A8%EB%93%9C%EB%9D%BC%EC%9D%B8-%ED%88%B4&quot;&gt;https://velog.io/@ehdrms2034/%EC%B9%B4%ED%94%84%EC%B9%B4-2%EC%9E%A5-%EC%BB%A4%EB%A7%A8%EB%93%9C%EB%9D%BC%EC%9D%B8-%ED%88%B4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rockintuna.tistory.com/265&quot;&gt;https://rockintuna.tistory.com/265&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[log.retension.ms,&amp;nbsp;log.retension.bytes,&amp;nbsp;log.segment.bytes,&amp;nbsp;log.roll.ms&amp;nbsp;&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;Kafka 로그 및 세그먼트 관련 주요 설정 설명&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. log.retention.ms&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;: 메시지(로그)를 최소한으로 보관할 시간을 밀리초(ms) 단위로 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본값&lt;/b&gt;: 7일(604800000ms)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작&lt;/b&gt;: 해당 시간이 지나면 로그 세그먼트가 삭제 대상이 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 예시&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;text&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4d4d4c;&quot;&gt;&lt;span style=&quot;color: #4d4d4c; text-align: right;&quot;&gt;&lt;span&gt;log.retention.ms=86400000 # 1일 보관 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의&lt;/b&gt;: -1로 설정하면 시간 제한 없이 무한 보관합니다. 시간 단위로는 log.retention.minutes, log.retention.hours도 사용 가능&lt;a href=&quot;https://deep-dive-dev.tistory.com/63&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://devfoxstar.github.io/mq/kafka-retention-ms/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/kafka_configuration_tuning/managing_logs_with_data_retention_policies&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. log.retention.bytes&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;: 파티션별로 보관할 로그의 최대 크기(바이트 단위)를 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본값&lt;/b&gt;: -1(무제한)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작&lt;/b&gt;: 파티션의 로그 크기가 이 값을 초과하면 오래된 세그먼트부터 삭제됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 예시&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;text&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4d4d4c;&quot;&gt;&lt;span style=&quot;color: #4d4d4c; text-align: right;&quot;&gt;&lt;span&gt;log.retention.bytes=1073741824 # 1GB 보관 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의&lt;/b&gt;: 파티션별로 적용되므로, 전체 토픽 보관 용량은 파티션 개수 &amp;times; log.retention.bytes로 계산해야 합니다&lt;a href=&quot;https://stackoverflow.com/questions/53039752/kafka-how-to-calculate-the-value-of-log-retention-byte&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://gunju-ko.github.io/kafka/2019/03/16/%EC%B9%B4%ED%94%84%EC%B9%B4%EA%B0%80%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94%EB%B0%A9%EB%B2%95.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. log.segment.bytes&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;: 하나의 로그 세그먼트(파일) 최대 크기를 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본값&lt;/b&gt;: 1GB(1073741824 bytes)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작&lt;/b&gt;: 세그먼트 파일이 이 크기에 도달하면 닫히고, 새로운 세그먼트가 생성됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 예시&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;text&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4d4d4c;&quot;&gt;&lt;span style=&quot;color: #4d4d4c; text-align: right;&quot;&gt;&lt;span&gt;log.segment.bytes=536870912 # 512MB &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의&lt;/b&gt;: 세그먼트가 많아지면 파일 핸들, 메타데이터 관리 부담이 커질 수 있습니다. 너무 작게 설정하면 오픈 파일 수가 급증할 수 있습니다&lt;a href=&quot;https://westlife0615.tistory.com/514&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.redpanda.com/guides/kafka-performance-kafka-logs&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://stackoverflow.com/questions/65507232/kafka-log-segment-bytes-vs-log-retention-hours&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. log.roll.ms&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;: 활성 세그먼트가 지정된 시간(ms) 이상 유지되면, 강제로 세그먼트를 닫고 새 세그먼트를 생성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본값&lt;/b&gt;: 7일(604800000ms)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작&lt;/b&gt;: 메시지 유입이 적어도, 이 시간이 지나면 세그먼트가 롤링(교체)됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 예시&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;text&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4d4d4c;&quot;&gt;&lt;span style=&quot;color: #4d4d4c; text-align: right;&quot;&gt;&lt;span&gt;log.roll.ms=3600000 # 1시간마다 세그먼트 롤링 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의&lt;/b&gt;: log.segment.bytes와 함께 세그먼트 롤링 조건을 결정합니다. 둘 중 하나라도 조건을 만족하면 롤링이 발생합니다&lt;a href=&quot;https://westlife0615.tistory.com/514&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.redpanda.com/guides/kafka-performance-kafka-logs&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://kafka.apache.org/30/generated/topic_config.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약 표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;설정명기본값의미/용도주의사항 및 팁
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;log.retention.ms&lt;/td&gt;
&lt;td&gt;604800000(7일)&lt;/td&gt;
&lt;td&gt;메시지 보관 최소 시간&lt;/td&gt;
&lt;td&gt;-1: 무제한, 시간 단위별 옵션 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;log.retention.bytes&lt;/td&gt;
&lt;td&gt;-1(무제한)&lt;/td&gt;
&lt;td&gt;파티션별 보관 최대 크기&lt;/td&gt;
&lt;td&gt;파티션 수에 따라 전체 용량 산정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;log.segment.bytes&lt;/td&gt;
&lt;td&gt;1073741824(1GB)&lt;/td&gt;
&lt;td&gt;세그먼트 파일 최대 크기&lt;/td&gt;
&lt;td&gt;파일 핸들, OS 한계 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;log.roll.ms&lt;/td&gt;
&lt;td&gt;604800000(7일)&lt;/td&gt;
&lt;td&gt;세그먼트 최대 유지 시간(롤링 주기)&lt;/td&gt;
&lt;td&gt;log.segment.bytes와 병행 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실무 적용 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;retention 설정&lt;/b&gt;: 데이터 보존 정책, 디스크 용량, 처리량에 따라 적절히 조합해 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;segment 설정&lt;/b&gt;: 파일 핸들 제한, 장애 복구 속도, 운영 환경에 맞게 조정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모니터링 필수&lt;/b&gt;: 세그먼트 수, 디스크 사용량, 메시지 보관 기간 등 지속적 체크 필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 네 가지 옵션을 적절히 조합하면 Kafka의 데이터 보관 정책과 성능을 효과적으로 관리할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://deep-dive-dev.tistory.com/63&quot;&gt;https://deep-dive-dev.tistory.com/63&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devfoxstar.github.io/mq/kafka-retention-ms/&quot;&gt;https://devfoxstar.github.io/mq/kafka-retention-ms/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/kafka_configuration_tuning/managing_logs_with_data_retention_policies&quot;&gt;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/kafka_configuration_tuning/managing_logs_with_data_retention_policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/53039752/kafka-how-to-calculate-the-value-of-log-retention-byte&quot;&gt;https://stackoverflow.com/questions/53039752/kafka-how-to-calculate-the-value-of-log-retention-byte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gunju-ko.github.io/kafka/2019/03/16/%EC%B9%B4%ED%94%84%EC%B9%B4%EA%B0%80%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94%EB%B0%A9%EB%B2%95.html&quot;&gt;https://gunju-ko.github.io/kafka/2019/03/16/%EC%B9%B4%ED%94%84%EC%B9%B4%EA%B0%80%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94%EB%B0%A9%EB%B2%95.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://westlife0615.tistory.com/514&quot;&gt;https://westlife0615.tistory.com/514&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.redpanda.com/guides/kafka-performance-kafka-logs&quot;&gt;https://www.redpanda.com/guides/kafka-performance-kafka-logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/65507232/kafka-log-segment-bytes-vs-log-retention-hours&quot;&gt;https://stackoverflow.com/questions/65507232/kafka-log-segment-bytes-vs-log-retention-hours&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kafka.apache.org/30/generated/topic_config.html&quot;&gt;https://kafka.apache.org/30/generated/topic_config.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://westlife0615.tistory.com/930&quot;&gt;https://westlife0615.tistory.com/930&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.metafor.kr/253&quot;&gt;https://blog.metafor.kr/253&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hojak99.tistory.com/681&quot;&gt;https://hojak99.tistory.com/681&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.conduktor.io/kafka/kafka-topic-configuration-log-retention/&quot;&gt;https://learn.conduktor.io/kafka/kafka-topic-configuration-log-retention/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.6/html/kafka_configuration_tuning/managing_kafka_logs_with_delete_and_compact_policies&quot;&gt;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.6/html/kafka_configuration_tuning/managing_kafka_logs_with_delete_and_compact_policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.confluent.io/t/what-happens-if-i-increase-log-segment-bytes/5845&quot;&gt;https://forum.confluent.io/t/what-happens-if-i-increase-log-segment-bytes/5845&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/197&quot;&gt;https://developnote-blog.tistory.com/197&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.baeldung.com/ops/kafka-log-segment-bytes-vs-log-retention-hours&quot;&gt;https://www.baeldung.com/ops/kafka-log-segment-bytes-vs-log-retention-hours&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.7/html/kafka_configuration_tuning/managing_kafka_logs_with_delete_and_compact_policies&quot;&gt;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.7/html/kafka_configuration_tuning/managing_kafka_logs_with_delete_and_compact_policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://soono-991.tistory.com/106&quot;&gt;https://soono-991.tistory.com/106&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/topic-configs.html&quot;&gt;https://docs.confluent.io/platform/current/installation/configuration/topic-configs.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[log&amp;nbsp;segment&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka에서 **log segment(로그 세그먼트)**란, &lt;b&gt;파티션 데이터를 실제로 저장하는 파일 단위&lt;/b&gt;를 의미합니다.&lt;br /&gt;Kafka의 저장 구조는 &quot;토픽 &amp;rarr; 파티션 &amp;rarr; 세그먼트&quot; 계층으로 이루어지며, 각 파티션의 데이터는 여러 개의 세그먼트 파일로 쪼개어 브로커의 로컬 디스크에 저장됩니다&lt;a href=&quot;https://colevelup.tistory.com/18&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://curiousjinan.tistory.com/entry/understanding-kafka-all-structure&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://hoing.io/archives/57594&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://teki.tistory.com/78&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;핵심 특징 및 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;세그먼트란?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 파티션에 저장되는 메시지들은 순차적으로 &lt;b&gt;세그먼트 파일&lt;/b&gt;에 기록됩니다.&lt;/li&gt;
&lt;li&gt;세그먼트 파일에는 메시지의 &lt;b&gt;키, 값, 오프셋, 메시지 크기 등&lt;/b&gt; 부가 정보까지 함께 저장됩니다&lt;a href=&quot;https://colevelup.tistory.com/18&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://hoing.io/archives/57594&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://etloveguitar.tistory.com/116&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://teki.tistory.com/78&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;세그먼트 파일의 이름은 해당 세그먼트에서 시작하는 &lt;b&gt;첫 번째 메시지의 오프셋&lt;/b&gt;으로 정해집니다&lt;span&gt;&lt;a href=&quot;https://teki.tistory.com/78&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세그먼트 파일 종류&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.log: 실제 메시지 데이터 저장&lt;/li&gt;
&lt;li&gt;.index: 오프셋과 물리적 위치 매핑 정보&lt;/li&gt;
&lt;li&gt;.timeindex: 오프셋과 타임스탬프 매핑 정보&lt;a href=&quot;https://teki.tistory.com/78&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;기타: 리더 에포크 정보 등 관리 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;세그먼트 관리 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;롤링(Rolling)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세그먼트 파일은 설정된 &lt;b&gt;최대 크기(log.segment.bytes, 기본 1GB)&lt;/b&gt; 또는 **최대 시간(log.roll.ms 등)**에 도달하면 닫히고, 새로운 세그먼트 파일이 생성됩니다&lt;a href=&quot;https://velog.io/@zndndn112/Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4-%EB%A1%9C%EA%B7%B8%EC%99%80-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://any-ting.tistory.com/166&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://hoing.io/archives/57594&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://teki.tistory.com/78&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;이 방식을 통해 파일 크기가 너무 커지거나, 관리가 어려워지는 것을 방지합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;삭제(Delete) 및 보존(Retention)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세그먼트는 &lt;b&gt;보관 기간(log.retention.ms/hours/minutes)&lt;/b&gt; 또는 **최대 크기(log.retention.bytes)**를 초과하면 오래된 세그먼트부터 삭제됩니다&lt;a href=&quot;https://velog.io/@zndndn112/Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4-%EB%A1%9C%EA%B7%B8%EC%99%80-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://any-ting.tistory.com/166&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://hoing.io/archives/57594&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;이로써 디스크 공간을 효율적으로 관리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컴팩션(Compaction)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보존 정책이 compact로 설정된 토픽의 경우, &lt;b&gt;동일 키에 대해 가장 최신 메시지만 남기고 이전 메시지는 세그먼트 내에서 제거&lt;/b&gt;합니다&lt;a href=&quot;https://velog.io/@zndndn112/Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4-%EB%A1%9C%EA%B7%B8%EC%99%80-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://colevelup.tistory.com/18&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://any-ting.tistory.com/166&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;대표적으로 __consumer_offsets 토픽이 이 방식을 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;세그먼트의 역할과 중요성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;효율적 대용량 데이터 관리&lt;/b&gt;: 세그먼트 단위로 데이터가 나뉘어 저장되기 때문에, 삭제&amp;middot;압축&amp;middot;복구 등 관리 작업이 효율적으로 이루어집니다&lt;span&gt;&lt;a href=&quot;https://curiousjinan.tistory.com/entry/understanding-kafka-all-structure&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;순차적 읽기/쓰기 최적화&lt;/b&gt;: Kafka는 세그먼트에 데이터를 순차적으로 추가(append-only)하므로, 디스크 I/O 성능이 뛰어납니다&lt;a href=&quot;https://curiousjinan.tistory.com/entry/understanding-kafka-all-structure&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://etloveguitar.tistory.com/116&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오프셋 기반 접근&lt;/b&gt;: 컨슈머는 세그먼트 파일에서 오프셋을 기반으로 원하는 메시지를 빠르게 조회할 수 있습니다&lt;a href=&quot;https://teki.tistory.com/78&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://velog.io/@dmsqo1403/Kafka-Segment&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;**log segment**는 Kafka 파티션 내 데이터를 저장하는 &lt;b&gt;기본 파일 단위&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;세그먼트는 크기 또는 시간 기준으로 분할&amp;middot;관리되며, 삭제/컴팩션 정책에 따라 오래된 데이터가 정리됩니다.&lt;/li&gt;
&lt;li&gt;세그먼트 구조 덕분에 Kafka는 대용량 메시지의 저장, 읽기, 삭제, 압축 등 다양한 작업을 효율적으로 수행할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@zndndn112/Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4-%EB%A1%9C%EA%B7%B8%EC%99%80-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8&quot;&gt;https://velog.io/@zndndn112/Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4-%EB%A1%9C%EA%B7%B8%EC%99%80-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://colevelup.tistory.com/18&quot;&gt;https://colevelup.tistory.com/18&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://any-ting.tistory.com/166&quot;&gt;https://any-ting.tistory.com/166&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://curiousjinan.tistory.com/entry/understanding-kafka-all-structure&quot;&gt;https://curiousjinan.tistory.com/entry/understanding-kafka-all-structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hoing.io/archives/57594&quot;&gt;https://hoing.io/archives/57594&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://etloveguitar.tistory.com/116&quot;&gt;https://etloveguitar.tistory.com/116&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://teki.tistory.com/78&quot;&gt;https://teki.tistory.com/78&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@dmsqo1403/Kafka-Segment&quot;&gt;https://velog.io/@dmsqo1403/Kafka-Segment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zeroco.tistory.com/105&quot;&gt;https://zeroco.tistory.com/105&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yeongchan1228.tistory.com/52&quot;&gt;https://yeongchan1228.tistory.com/52&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[min.insync.replicas&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;Kafka min.insync.replicas란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**min.insync.replicas**는 Kafka에서 &lt;b&gt;파티션의 리더와 팔로워 중 동기화(In-Sync) 상태를 유지해야 하는 최소 레플리카(replica) 개수&lt;/b&gt;를 지정하는 설정입니다.&lt;br /&gt;이 값보다 적은 수의 레플리카만 동기화되어 있으면, &lt;b&gt;프로듀서의 쓰기 요청이 거부&lt;/b&gt;되고, 메시지가 저장되지 않습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 개념 및 동작 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ISR(In-Sync Replicas)&lt;/b&gt;:&lt;br /&gt;리더와 팔로워 중, 최신 데이터를 모두 반영하고 있는 브로커 집합입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;min.insync.replicas&lt;/b&gt;:&lt;br /&gt;ISR에 포함되어 있어야 하는 최소 레플리카 수(리더 포함)를 의미합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;acks=all과의 연계&lt;/b&gt;:&lt;br /&gt;프로듀서가 acks=all로 메시지를 보낼 때, ISR의 개수가 min.insync.replicas 이상이어야만 메시지가 정상적으로 저장되고 ack가 반환됩니다&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/436&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://blog.2minutestreaming.com/p/kafka-acks-min-insync-replicas-explained&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://saay-hi.tistory.com/22&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시 시나리오&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;replication.factor=3, min.insync.replicas=2&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세 개의 브로커(리더+팔로워2)가 모두 동기화 상태라면 정상 동작.&lt;/li&gt;
&lt;li&gt;브로커 하나가 장애로 ISR이 2개만 남아도, 메시지 쓰기는 계속 가능.&lt;/li&gt;
&lt;li&gt;ISR이 1개(리더만 남음)로 줄어들면, 쓰기 요청이 거부되고 에러(NotEnoughReplicasException)가 발생&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/436&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://blog.2minutestreaming.com/p/kafka-acks-min-insync-replicas-explained&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://saay-hi.tistory.com/22&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정 목적 및 효과&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;데이터 내구성 보장&lt;/b&gt;&lt;br /&gt;최소한의 레플리카가 항상 최신 데이터를 보유하도록 강제해, 브로커 장애 시에도 데이터 손실을 방지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;운영 권장값&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 replication.factor=3, min.insync.replicas=2 조합을 많이 사용합니다.&lt;/li&gt;
&lt;li&gt;이 조합은 브로커 하나가 장애 나도 서비스가 중단되지 않으면서, 데이터 무손실을 보장할 수 있습니다&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/436&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://saay-hi.tistory.com/22&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;min.insync.replicas &amp;gt; ISR&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISR이 min.insync.replicas보다 적으면 쓰기 불가, 프로듀서에 에러 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;replication.factor와의 관계&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;min.insync.replicas는 replication.factor 이하로 설정해야 하며, 너무 높게 설정하면 브로커 장애 시 전체 쓰기가 중단될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;acks=all과 함께 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 무손실 보장이 필요하다면 반드시 acks=all과 함께 사용해야 효과가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약 표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;설정 예시동작 및 효과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;replication.factor=3&lt;br /&gt;min.insync.replicas=2&lt;/td&gt;
&lt;td&gt;브로커 1대 장애 시에도 쓰기 가능, 데이터 무손실 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replication.factor=3&lt;br /&gt;min.insync.replicas=3&lt;/td&gt;
&lt;td&gt;브로커 1대만 장애 나도 쓰기 불가(가용성 저하)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replication.factor=2&lt;br /&gt;min.insync.replicas=2&lt;/td&gt;
&lt;td&gt;브로커 1대 장애 시 쓰기 불가, 데이터 무손실 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;br /&gt;min.insync.replicas는 Kafka의 데이터 내구성과 무손실 보장을 위한 핵심 옵션입니다.&lt;br /&gt;적절한 값으로 설정하면 장애 상황에서도 데이터 손실 없이 안정적으로 메시지를 처리할 수 있습니다&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/436&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://blog.2minutestreaming.com/p/kafka-acks-min-insync-replicas-explained&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://saay-hi.tistory.com/22&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/436&quot;&gt;https://devlog-wjdrbs96.tistory.com/436&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.2minutestreaming.com/p/kafka-acks-min-insync-replicas-explained&quot;&gt;https://blog.2minutestreaming.com/p/kafka-acks-min-insync-replicas-explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://saay-hi.tistory.com/22&quot;&gt;https://saay-hi.tistory.com/22&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://songhayoung.github.io/2020/07/13/kafka/acks-replicas/&quot;&gt;https://songhayoung.github.io/2020/07/13/kafka/acks-replicas/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.conduktor.io/kafka/kafka-topic-configuration-min-insync-replicas/&quot;&gt;https://learn.conduktor.io/kafka/kafka-topic-configuration-min-insync-replicas/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/74921436/kafka-min-insync-replicas-replication-factor&quot;&gt;https://stackoverflow.com/questions/74921436/kafka-min-insync-replicas-replication-factor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bistros.tistory.com/152&quot;&gt;https://bistros.tistory.com/152&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xonmin.tistory.com/80&quot;&gt;https://xonmin.tistory.com/80&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sungjk.github.io/2023/05/13/kafka-not-enough-replicas.html&quot;&gt;https://sungjk.github.io/2023/05/13/kafka-not-enough-replicas.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kafka.apache.org/documentation/&quot;&gt;https://kafka.apache.org/documentation/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[message.max.bytes&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;message.max.bytes는 **Kafka 브로커에서 허용하는 단일 메시지(혹은 레코드 배치)의 최대 크기(바이트 단위)**를 지정하는 설정입니다.&lt;br /&gt;이 값보다 큰 메시지는 브로커에서 거부되어 저장되지 않습니다.&lt;/p&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;주요 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기본값&lt;/b&gt;: 약 1MB(1048588 bytes)&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://data-engineer-tech.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설정 위치&lt;/b&gt;: 브로커(server.properties) 전체에 적용되며, 토픽별로 max.message.bytes로 별도 지정도 가능합니다&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dejavuhyo.github.io/posts/kafka-send-large-message/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작동 방식&lt;/b&gt;: 프로듀서가 보낸 메시지(혹은 레코드 배치)가 이 값을 초과하면 브로커가 메시지를 거부하고 에러를 반환합니다&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://programmer-eun.tistory.com/101&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;압축 사용 시&lt;/b&gt;: 압축이 적용된 경우, 압축 후 크기가 기준이 됩니다&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dejavuhyo.github.io/posts/kafka-send-large-message/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;연관 설정 및 주의점&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;컴포넌트관련 설정설명 및 주의사항
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Producer&lt;/td&gt;
&lt;td&gt;max.request.size&lt;/td&gt;
&lt;td&gt;프로듀서가 한 번에 보낼 수 있는 최대 요청 크기(기본 1MB). 이 값도 함께 늘려야 함&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://programmer-eun.tistory.com/101&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broker&lt;/td&gt;
&lt;td&gt;message.max.bytes&lt;/td&gt;
&lt;td&gt;브로커가 허용하는 최대 메시지 크기. 프로듀서의 max.request.size보다 크거나 같아야 함&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://heodolf.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Topic&lt;/td&gt;
&lt;td&gt;max.message.bytes&lt;/td&gt;
&lt;td&gt;특정 토픽에만 별도로 최대 메시지 크기를 지정할 수 있음&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dejavuhyo.github.io/posts/kafka-send-large-message/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consumer&lt;/td&gt;
&lt;td&gt;fetch.max.bytes, max.partition.fetch.bytes&lt;/td&gt;
&lt;td&gt;컨슈머가 한 번에 가져올 수 있는 최대 데이터 크기. 이 값도 충분히 커야 함&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.7/html-single/kafka_configuration_tuning/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://any-ting.tistory.com/161&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설정 불일치 시 문제&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Producer의 max.request.size &amp;lt; Broker의 message.max.bytes &amp;lt; Consumer의 fetch.max.bytes&lt;/li&gt;
&lt;li&gt;이 순서로 설정되어야 대용량 메시지 송수신이 원활합니다&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://heodolf.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.7/html-single/kafka_configuration_tuning/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;실무 적용 및 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;대용량 메시지 사용 시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지, 대형 JSON 등 1MB를 초과하는 메시지를 쓸 경우, 위 모든 관련 설정을 동일하게 충분히 늘려줘야 합니다&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://programmer-eun.tistory.com/101&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;네트워크 및 리소스 영향&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메시지 크기가 커질수록 네트워크 지연, 브로커 및 컨슈머의 메모리 사용량, 장애 시 복구 시간 등이 증가할 수 있으니 주의가 필요합니다&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://data-engineer-tech.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오류 예시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RecordTooLargeException 등 메시지 크기 초과 관련 에러가 발생할 수 있습니다&lt;span&gt;&lt;a href=&quot;https://programmer-eun.tistory.com/101&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;**message.max.bytes**는 Kafka 브로커가 허용하는 단일 메시지(혹은 레코드 배치)의 최대 크기입니다.&lt;/li&gt;
&lt;li&gt;기본값은 약 1MB이며, 대용량 메시지 송수신 시 프로듀서, 브로커, 컨슈머의 관련 설정을 모두 일관성 있게 조정해야 합니다.&lt;/li&gt;
&lt;li&gt;값이 맞지 않으면 메시지 전송 실패, 에러 발생 등 문제가 생길 수 있습니다&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://heodolf.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://dejavuhyo.github.io/posts/kafka-send-large-message/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://programmer-eun.tistory.com/101&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://data-engineer-tech.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://any-ting.tistory.com/161&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;※&lt;span&gt; 이 값은 압축된 메시지의 크기를 기준으로 한다. 즉, 압축전 메시지가 이 값보다 크더라도 압축된 크기가 이 설정값보다 적다면, 메시지 전송이 여전히 가능하다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&quot;&gt;https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jiyun-dev.tistory.com/23&quot;&gt;https://jiyun-dev.tistory.com/23&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://heodolf.tistory.com/11&quot;&gt;https://heodolf.tistory.com/11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dejavuhyo.github.io/posts/kafka-send-large-message/&quot;&gt;https://dejavuhyo.github.io/posts/kafka-send-large-message/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://programmer-eun.tistory.com/101&quot;&gt;https://programmer-eun.tistory.com/101&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.7/html-single/kafka_configuration_tuning/index&quot;&gt;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.7/html-single/kafka_configuration_tuning/index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data-engineer-tech.tistory.com/11&quot;&gt;https://data-engineer-tech.tistory.com/11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC&quot;&gt;https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://any-ting.tistory.com/161&quot;&gt;https://any-ting.tistory.com/161&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Kafka, MSK, Kinesis/아키텍처 및 내부 구조</category>
      <category>kafka</category>
      <category>kafka운영</category>
      <category>retention</category>
      <category>데이터보존</category>
      <category>복제본</category>
      <category>분산처리</category>
      <category>세그먼트</category>
      <category>파티션</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/220</guid>
      <comments>https://dbknowledge.tistory.com/220#entry220comment</comments>
      <pubDate>Wed, 9 Jul 2025 23:30:36 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB document 관련 기본 조작 (CRUD) - 2</title>
      <link>https://dbknowledge.tistory.com/219</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; 이전 게시글에 이어 &lt;/span&gt;MongoDB 의 document 에 대한 CRUD 에 대하여 계속 다룬다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[+] &lt;a href=&quot;https://dbknowledge.tistory.com/218&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.07.03 - [MongoDB, AWS DocumentDB/아키텍처 및 내부 구조] - MongoDB document 관련 기본 조작 (CRUD) - 1&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. (&lt;b&gt;[] 로 표기&lt;/b&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.&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;AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.&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;마지막으로 이 페이지는 EC2 Amazon Linux 2023 에 설치된 기본 MongoDB 를 사용한다.&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[updateOne&amp;nbsp;와&amp;nbsp;updateMany&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;알려주고&amp;nbsp;RDBMS&amp;nbsp;의&amp;nbsp;update&amp;nbsp;와의&amp;nbsp;차이점을&amp;nbsp;알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px;&quot;&gt;1. updateOne과 updateMany란?&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;updateOne&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;조건에 일치하는 &lt;b&gt;첫 번째 도큐먼트 하나만&lt;/b&gt; 수정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;형식:&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1751564260547&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.collection.updateOne(조건, {$set: {수정할필드: 값}})&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞는 여러 도큐먼트가 있어도 &lt;b&gt;가장 먼저 찾은 한 개만&lt;/b&gt; 수정&lt;/li&gt;
&lt;li&gt;반환값: 수정된 도큐먼트 수, 매칭된 도큐먼트 수 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;updateMany&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;조건에 일치하는 &lt;b&gt;모든 도큐먼트&lt;/b&gt;를 한 번에 수정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;형식:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1751564278822&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.collection.updateMany(조건, {$set: {수정할필드: 값}})&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞는 모든 도큐먼트가 &lt;b&gt;동시에 수정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;반환값: 수정된 도큐먼트 수, 매칭된 도큐먼트 수 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;메서드예시 코드결과 설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;updateOne&lt;/td&gt;
&lt;td&gt;db.users.updateOne({age: 20}, {$set: {city: &quot;Seoul&quot;}})&lt;/td&gt;
&lt;td&gt;age가 20인 첫 번째 도큐먼트만 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updateMany&lt;/td&gt;
&lt;td&gt;db.users.updateMany({age: 20}, {$set: {city: &quot;Seoul&quot;}})&lt;/td&gt;
&lt;td&gt;age가 20인 모든 도큐먼트 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;$set&lt;/b&gt; 연산자를 사용하지 않으면, 해당 도큐먼트 전체가 덮어써질 수 있으니 주의해야 합니다&lt;a href=&quot;https://progdev.tistory.com/43&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dkkim2318.tistory.com/130&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-rdbms-update&quot; data-ke-size=&quot;size26&quot;&gt;2. RDBMS의 UPDATE와의 차이점&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분MongoDB (NoSQL)RDBMS (MySQL, Oracle 등)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터 구조&lt;/td&gt;
&lt;td&gt;Document 기반 (JSON/BSON)&lt;/td&gt;
&lt;td&gt;Table(Row/Column) 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updateOne&lt;/td&gt;
&lt;td&gt;조건에 맞는 첫 도큐먼트 1개만 수정&lt;/td&gt;
&lt;td&gt;WHERE 조건에 맞는 Row 1개만 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updateMany&lt;/td&gt;
&lt;td&gt;조건에 맞는 모든 도큐먼트 수정&lt;/td&gt;
&lt;td&gt;WHERE 조건에 맞는 모든 Row 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기본 동작&lt;/td&gt;
&lt;td&gt;$set 등 연산자 필요, 아니면 전체 도큐먼트 덮어씀&lt;/td&gt;
&lt;td&gt;SET 구문으로 컬럼 값만 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;트랜잭션/무결성&lt;/td&gt;
&lt;td&gt;기본적으로 약함 (ACID 보장 약함, 옵션에 따라 다름)&lt;/td&gt;
&lt;td&gt;ACID(원자성, 일관성, 고립성, 지속성) 강함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스키마&lt;/td&gt;
&lt;td&gt;유연(스키마 없음/동적)&lt;/td&gt;
&lt;td&gt;엄격(스키마 고정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대량 수정&lt;/td&gt;
&lt;td&gt;updateMany로 한 번에 처리&lt;/td&gt;
&lt;td&gt;UPDATE ... WHERE ...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 차이점 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;연산자 사용:&lt;/b&gt;&lt;br /&gt;MongoDB는 $set, $inc 등 연산자를 반드시 사용해야 부분 수정이 가능하며, 그렇지 않으면 전체 도큐먼트가 덮어써집니다.&lt;br /&gt;RDBMS는 SET 구문으로 컬럼만 수정합니다&lt;a href=&quot;https://progdev.tistory.com/43&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dkkim2318.tistory.com/130&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트랜잭션/무결성:&lt;/b&gt;&lt;br /&gt;RDBMS는 트랜잭션과 데이터 무결성 보장이 강력하지만, MongoDB는 기본적으로 약하며 옵션에 따라 다릅니다&lt;span&gt;&lt;a href=&quot;https://adjh54.tistory.com/257&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스키마 유연성:&lt;/b&gt;&lt;br /&gt;MongoDB는 스키마가 유연해 필드 추가/삭제가 자유롭지만, RDBMS는 스키마가 고정되어 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대량 처리:&lt;/b&gt;&lt;br /&gt;MongoDB의 updateMany, RDBMS의 UPDATE ... WHERE ... 모두 대량 수정이 가능하지만, MongoDB는 JSON 기반 문서 전체를 다루는 점이 다릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;3. 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;updateOne:&lt;/b&gt; 조건에 맞는 첫 도큐먼트 1개만 수정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;updateMany:&lt;/b&gt; 조건에 맞는 모든 도큐먼트 수정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RDBMS UPDATE와의 차이:&lt;/b&gt;&lt;br /&gt;연산자 사용 방식, 트랜잭션/무결성, 스키마 유연성 등에서 차이가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB의 update 계열 명령은 RDBMS와 유사하지만, &lt;b&gt;문서 지향적 구조와 연산자 사용 방식, 트랜잭션 특성&lt;/b&gt; 등에서 중요한 차이가 있으니 실무 적용 시 반드시 주의해야 합니다&lt;a href=&quot;https://progdev.tistory.com/43&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://dkkim2318.tistory.com/130&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://adjh54.tistory.com/257&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://progdev.tistory.com/43&quot;&gt;https://progdev.tistory.com/43&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dkkim2318.tistory.com/130&quot;&gt;https://dkkim2318.tistory.com/130&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adjh54.tistory.com/257&quot;&gt;https://adjh54.tistory.com/257&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updatemany/&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updatemany/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fletcher-seth.tistory.com/182&quot;&gt;https://fletcher-seth.tistory.com/182&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updateOne/&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updateOne/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://translate.google.com/translate?u=https%3A%2F%2Fwww.quora.com%2FWhat-is-the-difference-between-update-updateOne-and-updateMany-in-MongoDB&amp;amp;sl=en&amp;amp;tl=ko&amp;amp;client=srp&quot;&gt;https://translate.google.com/translate?u=https%3A%2F%2Fwww.quora.com%2FWhat-is-the-difference-between-update-updateOne-and-updateMany-in-MongoDB&amp;amp;sl=en&amp;amp;tl=ko&amp;amp;client=srp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bamtory29.tistory.com/entry/MongoDB-update%EC%99%80-%EA%B8%B0%EC%A1%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0&quot;&gt;https://bamtory29.tistory.com/entry/MongoDB-update%EC%99%80-%EA%B8%B0%EC%A1%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@woo94/Update%EB%A5%BC-%ED%95%98%EB%8A%94-4%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95&quot;&gt;https://velog.io/@woo94/Update%EB%A5%BC-%ED%95%98%EB%8A%94-4%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mozi.tistory.com/626&quot;&gt;https://mozi.tistory.com/626&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ MongoDB 는 RDBMS 보다 update 무결성이 약한 편이지만, 순서대로 들어오는 update 구문을 순차적으로 처리함으로써 가능한 ACID 를 보장하려고 한다.&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;b&gt;[replaceOne 을 통해 document 에 있는 기존 필드를 서브도큐먼트로 옮기는 예시를 보여줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB의 replaceOne은 &lt;b&gt;문서 전체를 새 문서로 완전히 대체&lt;/b&gt;하는 명령입니다. 기존 필드를 서브도큐먼트로 옮기려면, 원하는 구조로 새 문서를 만들어서 replaceOne의 두 번째 인자로 전달해야 합니다.&lt;/p&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;예시 상황&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기존 문서&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;
&lt;pre id=&quot;code_1751564773241&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;_id&quot;: ObjectId(&quot;...&quot;),
  &quot;name&quot;: &quot;Alice&quot;,
  &quot;age&quot;: 30,
  &quot;city&quot;: &quot;Seoul&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목표 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name, age를 profile이라는 서브도큐먼트로 이동&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;
&lt;pre id=&quot;code_1751564786449&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;_id&quot;: ObjectId(&quot;...&quot;),
  &quot;profile&quot;: {
    &quot;name&quot;: &quot;Alice&quot;,
    &quot;age&quot;: 30
  },
  &quot;city&quot;: &quot;Seoul&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;replaceone&quot; data-ke-size=&quot;size26&quot;&gt;replaceOne 사용 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751564818343&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.users.replaceOne(
  { _id: ObjectId(&quot;...&quot;) }, // 대상 문서 조건
  {
    _id: ObjectId(&quot;...&quot;),
    profile: {
      name: &quot;Alice&quot;,
      age: 30
    },
    city: &quot;Seoul&quot;
  }
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주의:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;replaceOne은 해당 문서를 &lt;b&gt;완전히 새 문서로 교체&lt;/b&gt;하므로, _id 필드를 반드시 포함해야 합니다.&lt;/li&gt;
&lt;li&gt;기존에 있던 다른 필드(예: city)도 새 문서에 명시적으로 포함해야 삭제되지 않습니다&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.replaceone/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/mongodb-replace-documents-using-mongoshell/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.prisma.io/dataguide/mongodb/managing-documents&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;활용 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 문서에 대해 반복적으로 구조를 바꿔야 한다면, 애플리케이션 코드(Python, Node.js 등)에서 기존 문서를 읽어 새 구조로 변환한 뒤 replaceOne을 반복 호출하는 방식이 일반적입니다.&lt;/li&gt;
&lt;li&gt;부분 수정만 원한다면 $set을 사용하는 updateOne/updateMany가 더 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약:&lt;/b&gt;&lt;br /&gt;replaceOne은 문서 전체를 새 구조로 대체하므로, 기존 필드를 서브도큐먼트로 옮기려면 새 문서에 원하는 구조를 직접 만들어서 사용해야 합니다.&lt;br /&gt;이때 _id와 유지할 모든 필드를 반드시 포함해야 데이터 손실이 없습니다&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.replaceone/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/mongodb-replace-documents-using-mongoshell/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.prisma.io/dataguide/mongodb/managing-documents&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.replaceone/&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.replaceone/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/mongodb-replace-documents-using-mongoshell/&quot;&gt;https://www.geeksforgeeks.org/mongodb-replace-documents-using-mongoshell/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.prisma.io/dataguide/mongodb/managing-documents&quot;&gt;https://www.prisma.io/dataguide/mongodb/managing-documents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://afsdzvcx123.tistory.com/entry/MongoDB-%EB%8F%84%ED%81%90%EB%A8%BC%ED%8A%B8-%EA%B0%B1%EC%8B%A0&quot;&gt;https://afsdzvcx123.tistory.com/entry/MongoDB-%EB%8F%84%ED%81%90%EB%A8%BC%ED%8A%B8-%EA%B0%B1%EC%8B%A0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/MONGO-%F0%9F%93%9A-%EB%AA%BD%EA%B3%A0%EB%94%94%EB%B9%84-%EC%BF%BC%EB%A6%AC-%EC%A0%95%EB%A6%AC&quot;&gt;https://inpa.tistory.com/entry/MONGO-%F0%9F%93%9A-%EB%AA%BD%EA%B3%A0%EB%94%94%EB%B9%84-%EC%BF%BC%EB%A6%AC-%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/drivers/java/sync/v4.9/usage-examples/replaceOne/&quot;&gt;https://www.mongodb.com/ko-kr/docs/drivers/java/sync/v4.9/usage-examples/replaceOne/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://programmingtilseungho.tistory.com/entry/MongoDB-%EC%BB%AC%EB%A0%89%EC%85%98%EC%97%90%EC%84%9C-field-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD-%EC%83%88%EB%A1%9C%EC%9A%B4-field-%EC%B6%94%EA%B0%80-%EA%B8%B0%EC%A1%B4-field-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&quot;&gt;https://programmingtilseungho.tistory.com/entry/MongoDB-%EC%BB%AC%EB%A0%89%EC%85%98%EC%97%90%EC%84%9C-field-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD-%EC%83%88%EB%A1%9C%EC%9A%B4-field-%EC%B6%94%EA%B0%80-%EA%B8%B0%EC%A1%B4-field-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kfdd6630.tistory.com/entry/MongoDB-Update%EA%B4%80%EB%A0%A8-%EC%B0%A8%EC%9D%B4%EC%A0%90&quot;&gt;https://kfdd6630.tistory.com/entry/MongoDB-Update%EA%B4%80%EB%A0%A8-%EC%B0%A8%EC%9D%B4%EC%A0%90&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dotnettutorials.net/lesson/replace-document-in-mongodb/&quot;&gt;https://dotnettutorials.net/lesson/replace-document-in-mongodb/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/22588236/how-to-add-an-extra-field-in-a-sub-document-in-mongodb&quot;&gt;https://stackoverflow.com/questions/22588236/how-to-add-an-extra-field-in-a-sub-document-in-mongodb&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 위에도 기술되었지만 RDBMS update 와는 다르게 set, $set 의 차이가 있으므로 상황에 따라 맞는 명령어를 쓰는게 좋다.&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;b&gt;[updateOne&amp;nbsp;시&amp;nbsp;_id&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;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB에서 updateOne을 사용할 때, &lt;b&gt;_id가 아닌 다른 필드&lt;/b&gt;에 대해 &lt;b&gt;unique 인덱스&lt;/b&gt;가 설정되어 있다면, 해당 필드 값이 중복될 경우 에러가 발생할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;예시 상황&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. unique 인덱스가 설정된 컬렉션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, email 필드에 unique 인덱스가 설정된 users 컬렉션이 있다고 가정합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;
&lt;pre id=&quot;code_1751565154967&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.users.createIndex({ email: 1 }, { unique: true })&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 기존 데이터&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4d4d4c;&quot;&gt;&lt;span style=&quot;color: #4d4d4c;&quot;&gt;&lt;span style=&quot;color: #4d4d4c; text-align: right;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1751565167615&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[
  { &quot;_id&quot;: 1, &quot;name&quot;: &quot;Alice&quot;, &quot;email&quot;: &quot;alice@example.com&quot; },
  { &quot;_id&quot;: 2, &quot;name&quot;: &quot;Bob&quot;,   &quot;email&quot;: &quot;bob@example.com&quot; }
]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. updateOne으로 중복 시도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 Bob의 이메일을 Alice와 동일하게 변경하려고 하면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751565194017&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;E11000 duplicate key error collection: test.users index: email_1 dup key: { email: &quot;alice@example.com&quot; }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 발생하는 에러&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DuplicateKeyError&lt;/b&gt; (E11000 duplicate key error)&lt;/li&gt;
&lt;li&gt;에러 메시지 예시:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;text&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4d4d4c;&quot;&gt;&lt;span style=&quot;color: #4d4d4c; text-align: right;&quot;&gt;&lt;span&gt;E11000 duplicate key error collection: test.users index: email_1 dup key: { email: &quot;alice@example.com&quot; } &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;unique 인덱스가 걸린 필드&lt;/b&gt;에 대해 updateOne으로 중복 값을 넣으려 하면,&lt;br /&gt;_id와 무관하게 &lt;b&gt;중복 키 에러&lt;/b&gt;가 발생합니다.&lt;/li&gt;
&lt;li&gt;이 에러는 데이터 무결성을 보장하기 위한 MongoDB의 동작입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;상황결과/에러 설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;_id 중복&lt;/td&gt;
&lt;td&gt;항상 에러 발생 (기본키 충돌)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unique 인덱스 필드 중복&lt;/td&gt;
&lt;td&gt;DuplicateKeyError 발생 (중복 키 인덱스 충돌)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무에서는 unique 인덱스가 걸린 필드의 중복 여부를 사전에 체크하거나, try-catch 등 예외 처리를 반드시 구현해야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MongoDB, AWS DocumentDB/아키텍처 및 내부 구조</category>
      <category>crud</category>
      <category>mongodb</category>
      <category>NoSQL</category>
      <category>replace</category>
      <category>Update</category>
      <category>데이터베이스</category>
      <category>몽고db</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/219</guid>
      <comments>https://dbknowledge.tistory.com/219#entry219comment</comments>
      <pubDate>Fri, 4 Jul 2025 02:54:45 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB document 관련 기본 조작 (CRUD) - 1</title>
      <link>https://dbknowledge.tistory.com/218</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; MongoDB 의 document 에 대한 CRUD 에 대하여 다룬다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p 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: #333333; text-align: start;&quot;&gt;&lt;span&gt;또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. (&lt;b&gt;[] 로 표기&lt;/b&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.&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;AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.&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;마지막으로 이 페이지는 EC2 Amazon Linux 2023 에 설치된 기본 MongoDB 를 사용한다.&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[MongoDB 의 InsertOne 과 InsertMany 에 대해서 알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB에서 &lt;b&gt;InsertOne&lt;/b&gt;과 &lt;b&gt;InsertMany&lt;/b&gt;는 컬렉션에 데이터를 삽입할 때 사용하는 대표적인 메서드입니다. 두 메서드의 차이와 특징을 아래와 같이 정리할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;insertone&quot; data-ke-size=&quot;size26&quot;&gt;InsertOne&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;컬렉션에 &lt;b&gt;단일(document 하나)&lt;/b&gt; 문서를 삽입할 때 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1751477311260&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.collection.insert_one({&quot;name&quot;: &quot;Alice&quot;, &quot;age&quot;: 25})&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;파라미터:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입할 문서(딕셔너리) 1개&lt;/li&gt;
&lt;li&gt;(선택) writeConcern: 데이터 쓰기 보장 수준 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반환값:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;InsertOneResult 객체 반환&lt;/li&gt;
&lt;li&gt;삽입된 문서의 _id 값은 inserted_id 속성에 저장됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;_id 필드를 지정하지 않으면 MongoDB가 자동으로 생성&lt;/li&gt;
&lt;li&gt;삽입 실패 시 예외 발생&lt;/li&gt;
&lt;li&gt;트랜잭션 내에서도 사용 가능&lt;a href=&quot;https://www.geeksforgeeks.org/mongodb/mongodb-insertone-method-db-collection-insertone/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.w3schools.com/python/python_mongodb_insert.asp&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://dev.to/parth_barochiya/how-to-use-mongodb-insertone-for-single-document-insertion-3n02&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://sparkbyexamples.com/mongodb/mongodb-insertone-insertmany-documents/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.w3resource.com/mongodb/mongodb-db-collection-insertone.php&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;insertmany&quot; data-ke-size=&quot;size26&quot;&gt;InsertMany&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;컬렉션에 &lt;b&gt;여러(document 여러 개)&lt;/b&gt; 문서를 한 번에 삽입할 때 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1751477338139&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.collection.insert_many([ {&quot;name&quot;: &quot;Bob&quot;, &quot;age&quot;: 30}, {&quot;name&quot;: &quot;Charlie&quot;, &quot;age&quot;: 22} ])&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;파라미터:&lt;/b&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;(선택) writeConcern: 데이터 쓰기 보장 수준 지정 가능&lt;/li&gt;
&lt;li&gt;(선택) ordered: 기본값 True. True면 순서대로 삽입, False면 일부 실패해도 나머지 계속 시도&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반환값:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;InsertManyResult 객체 반환&lt;/li&gt;
&lt;li&gt;삽입된 각 문서의 _id 값은 inserted_ids 리스트에 저장됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&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;_id 필드를 지정하지 않으면 각 문서마다 자동 생성&lt;/li&gt;
&lt;li&gt;일부 문서에서 오류 발생 시 BulkWriteError 예외 발생 가능&lt;/li&gt;
&lt;li&gt;트랜잭션 내에서도 사용 가능&lt;a href=&quot;https://www.w3resource.com/mongodb/mongodb-db-collection-insertmany.php&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/mongodb/mongodb-insertmany-method-db-collection-insertmany/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://sparkbyexamples.com/mongodb/mongodb-insertone-insertmany-documents/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;비교 표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;메서드명삽입 대상반환값주요 옵션특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;insert_one&lt;/td&gt;
&lt;td&gt;1개 문서&lt;/td&gt;
&lt;td&gt;InsertOneResult&lt;/td&gt;
&lt;td&gt;writeConcern&lt;/td&gt;
&lt;td&gt;단일 문서 삽입, _id 자동생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;insert_many&lt;/td&gt;
&lt;td&gt;여러 문서&lt;/td&gt;
&lt;td&gt;InsertManyResult&lt;/td&gt;
&lt;td&gt;writeConcern, ordered&lt;/td&gt;
&lt;td&gt;대량 삽입, 순서 제어 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;insert_one:&lt;/b&gt; 한 번에 하나의 문서만 삽입, 결과로 삽입된 문서의 _id 반환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;insert_many:&lt;/b&gt; 여러 문서를 한 번에 삽입, 결과로 각 문서의 _id 리스트 반환&lt;/li&gt;
&lt;li&gt;두 방법 모두 Python의 PyMongo, MongoDB Shell 등에서 동일한 원리로 사용됩니다&lt;a href=&quot;https://www.sarthaks.com/3477321/what-is-the-difference-between-insertone-and-insertmany-methods&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.w3schools.com/python/python_mongodb_insert.asp&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://sparkbyexamples.com/mongodb/mongodb-insertone-insertmany-documents/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.w3resource.com/mongodb/mongodb-db-collection-insertone.php&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/mongodb/mongodb-insertone-method-db-collection-insertone/&quot;&gt;https://www.geeksforgeeks.org/mongodb/mongodb-insertone-method-db-collection-insertone/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3schools.com/python/python_mongodb_insert.asp&quot;&gt;https://www.w3schools.com/python/python_mongodb_insert.asp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/parth_barochiya/how-to-use-mongodb-insertone-for-single-document-insertion-3n02&quot;&gt;https://dev.to/parth_barochiya/how-to-use-mongodb-insertone-for-single-document-insertion-3n02&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sparkbyexamples.com/mongodb/mongodb-insertone-insertmany-documents/&quot;&gt;https://sparkbyexamples.com/mongodb/mongodb-insertone-insertmany-documents/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3resource.com/mongodb/mongodb-db-collection-insertone.php&quot;&gt;https://www.w3resource.com/mongodb/mongodb-db-collection-insertone.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3resource.com/mongodb/mongodb-db-collection-insertmany.php&quot;&gt;https://www.w3resource.com/mongodb/mongodb-db-collection-insertmany.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/mongodb/mongodb-insertmany-method-db-collection-insertmany/&quot;&gt;https://www.geeksforgeeks.org/mongodb/mongodb-insertmany-method-db-collection-insertmany/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sarthaks.com/3477321/what-is-the-difference-between-insertone-and-insertmany-methods&quot;&gt;https://www.sarthaks.com/3477321/what-is-the-difference-between-insertone-and-insertmany-methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/&quot;&gt;https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.insertOne/&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.insertOne/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[위의 내용과 관련하여 _id 를 임의로 넣을 때, 주의 해야 할 사항]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB에서 _id 필드를 임의로 지정할 때 주의해야 할 사항은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;_id는 컬렉션 내에서 반드시 고유해야 함&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;_id는 MongoDB 컬렉션의 기본 키(primary key) 역할을 하며, 같은 값이 중복되면 삽입 시 duplicate key error가 발생합니다&lt;a href=&quot;https://lake-yoo.tistory.com/1&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.mongodb.com/community/forums/t/the-insert-with-id-value/173405&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;따라서 애플리케이션에서 직접 값을 지정할 경우, 100% 고유한 값을 생성해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;_id 타입과 값의 일관성 유지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적으로 MongoDB는 _id에 ObjectId 타입을 자동 생성하지만, 문자열(String), 숫자(Number) 등 다른 타입도 사용할 수 있습니다&lt;span&gt;&lt;a href=&quot;https://www.solarwinds.com/blog/what-is-mongodbs-id-field-and-how-to-use-it&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;다만, 타입이 혼재되면 쿼리나 인덱스 성능에 영향을 줄 수 있으니 일관성 있게 사용하는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중복 삽입 방지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 _id 값으로 문서를 삽입하려 하면 오류가 발생하므로, 업데이트가 필요한 경우 insert 대신 update 또는 upsert를 사용해야 합니다&lt;span&gt;&lt;a href=&quot;https://stackoverflow.com/questions/52030967/is-it-bad-practice-to-set-my-own-mongodb-id-from-a-unique-id-of-the-document&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;_id를 직접 지정하는 경우의 장단점&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점: 애플리케이션에서 이미 관리하는 고유 ID를 그대로 사용할 수 있어 별도의 인덱스 필드가 불필요해지고, 조회 시 효율적일 수 있음&lt;span&gt;&lt;a href=&quot;https://stackoverflow.com/questions/52030967/is-it-bad-practice-to-set-my-own-mongodb-id-from-a-unique-id-of-the-document&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;단점: 고유성 보장 책임이 개발자에게 있으며, 잘못 지정 시 데이터 무결성 문제가 발생할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;샤딩 환경에서 주의점&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;_id가 샤딩 키인 경우, 기본 ObjectId는 생성 시점 기준으로 정렬되어 특정 샤드에 부하가 집중될 수 있으므로 해시 샤딩을 권장합니다&lt;span&gt;&lt;a href=&quot;https://www.solarwinds.com/blog/what-is-mongodbs-id-field-and-how-to-use-it&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예외 처리 권장&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입 시 중복 _id 오류가 발생할 수 있으므로, 예외 처리를 통해 적절한 대응(예: 재시도, 업데이트 등)을 구현하는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;주의사항설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;고유성 보장&lt;/td&gt;
&lt;td&gt;_id 값은 컬렉션 내에서 반드시 유일해야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;타입 일관성&lt;/td&gt;
&lt;td&gt;_id 타입은 일관되게 사용 (ObjectId, String 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중복 삽입 시 오류 발생&lt;/td&gt;
&lt;td&gt;중복 _id 삽입 시 duplicate key error 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;직접 지정 시 책임&lt;/td&gt;
&lt;td&gt;고유성 보장과 관리 책임은 개발자에게 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;샤딩 환경 고려&lt;/td&gt;
&lt;td&gt;샤딩 시 해시 샤딩 권장, 기본 ObjectId는 순차적 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;예외 처리 구현 권장&lt;/td&gt;
&lt;td&gt;삽입 실패 시 적절한 예외 처리 및 대응 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lake-yoo.tistory.com/1&quot;&gt;https://lake-yoo.tistory.com/1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/community/forums/t/the-insert-with-id-value/173405&quot;&gt;https://www.mongodb.com/community/forums/t/the-insert-with-id-value/173405&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/&quot;&gt;https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.solarwinds.com/blog/what-is-mongodbs-id-field-and-how-to-use-it&quot;&gt;https://www.solarwinds.com/blog/what-is-mongodbs-id-field-and-how-to-use-it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/52030967/is-it-bad-practice-to-set-my-own-mongodb-id-from-a-unique-id-of-the-document&quot;&gt;https://stackoverflow.com/questions/52030967/is-it-bad-practice-to-set-my-own-mongodb-id-from-a-unique-id-of-the-document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@pest95/84%EC%9D%BC%EC%B0%A8-MongoDB-CRUD&quot;&gt;https://velog.io/@pest95/84%EC%9D%BC%EC%B0%A8-MongoDB-CRUD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/drivers/node/current/crud/pkFactory/&quot;&gt;https://www.mongodb.com/docs/drivers/node/current/crud/pkFactory/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/mongodb/comments/74a346/mongdb_best_practice_with_id/&quot;&gt;https://www.reddit.com/r/mongodb/comments/74a346/mongdb_best_practice_with_id/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jie0025.tistory.com/540&quot;&gt;https://jie0025.tistory.com/540&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/method/db.collection.insert/&quot;&gt;https://www.mongodb.com/docs/manual/reference/method/db.collection.insert/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[위의 내용과 관련하여 MongoDB 의 삽입 유효성을 알려주고 이와 관련하여 Document 크기 제한 및 Insert 제한 크기를 알려줘]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB에서 데이터 삽입(insert)과 관련된 &lt;b&gt;유효성(Validation)&lt;/b&gt;, &lt;b&gt;Document 크기 제한&lt;/b&gt;, &lt;b&gt;Insert 제한&lt;/b&gt;에 대해 아래와 같이 정리할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;1-mongodb--validation&quot; data-ke-size=&quot;size26&quot;&gt;1. MongoDB 삽입 유효성(Validation)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Schema Validation&lt;/b&gt;&lt;br /&gt;MongoDB는 기본적으로 유연한 스키마 구조를 가지지만, 컬렉션 단위로 **스키마 유효성 검사(Validation Rules)**를 설정할 수 있습니다.&lt;br /&gt;예를 들어, 특정 필드는 반드시 문자열이어야 하거나, 값의 범위가 정해져 있어야 하며, 필수 필드 여부도 지정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;삽입 시 유효성 검사&lt;/b&gt;&lt;br /&gt;스키마 유효성 규칙이 설정된 경우, 문서가 해당 규칙을 위반하면 삽입(insert)이나 갱신(update)이 거부됩니다.&lt;br /&gt;기본값은 위반 시 삽입/갱신이 &lt;b&gt;실패&lt;/b&gt;하고, 로그에 기록됩니다.&lt;br /&gt;(단, 옵션에 따라 경고만 남기고 허용할 수도 있음)&lt;a href=&quot;https://www.mongodb.com/docs/manual/core/schema-validation/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://dbschema.com/blog/mongodb/data-validation-rules/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;password 필드는 반드시 문자열&lt;/li&gt;
&lt;li&gt;item 필드는 특정 목록 내 값만 허용&lt;/li&gt;
&lt;li&gt;gpa 필드는 양수만 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-document&quot; data-ke-size=&quot;size26&quot;&gt;2. Document 크기 제한&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단일 Document 최대 크기&lt;/b&gt;&lt;br /&gt;MongoDB에서 **하나의 Document 크기는 최대 16MB(16,777,216 bytes)**입니다&lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/limits/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://thecodebuzz.com/mongodb-document-size-guidelines-and-best-practices/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/core/document/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제한 이유&lt;/b&gt;&lt;br /&gt;단일 문서가 과도하게 커지는 것을 방지하여, 성능 저하 및 메모리/네트워크 과부하를 막기 위함입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;16MB 초과 데이터 저장&lt;/b&gt;&lt;br /&gt;16MB를 초과하는 대용량 데이터(예: 이미지, 동영상 등)는 &lt;b&gt;GridFS&lt;/b&gt;라는 별도 API를 사용해 저장해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-insert&quot; data-ke-size=&quot;size26&quot;&gt;3. Insert(삽입) 제한&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;insertMany의 Document 수 제한&lt;/b&gt;&lt;br /&gt;한 번에 insertMany로 삽입할 수 있는 Document 수는 &lt;b&gt;최대 1000개&lt;/b&gt;입니다.&lt;br /&gt;1000개를 초과하면 내부적으로 1000개 단위로 나누어 처리합니다&lt;span&gt;&lt;a href=&quot;https://groups.google.com/g/mongodb-user/c/zMBdPK1fvlE&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;각 Document의 크기 제한&lt;/b&gt;&lt;br /&gt;insertMany로 여러 개를 넣더라도, &lt;b&gt;각 문서가 16MB를 넘을 수 없습니다&lt;/b&gt;.&lt;br /&gt;(즉, insertMany로 1000개를 넣더라도 각 문서는 16MB 이하여야 함)&lt;a href=&quot;https://www.mongodb.com/community/forums/t/how-does-the-data-size-limitation-work/154738&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://thecodebuzz.com/mongodb-document-size-guidelines-and-best-practices/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중첩(Depth) 제한&lt;/b&gt;&lt;br /&gt;BSON 문서의 중첩(객체/배열)은 &lt;b&gt;최대 100단계&lt;/b&gt;까지 허용됩니다&lt;span&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/limits/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;4. 삽입 유효성 및 제한 관련 정리 표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목제한/설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단일 Document 크기&lt;/td&gt;
&lt;td&gt;최대 16MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;insertMany 1회 최대&lt;/td&gt;
&lt;td&gt;1000개 Document (내부적으로 자동 분할)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Document 중첩 깊이&lt;/td&gt;
&lt;td&gt;최대 100단계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스키마 Validation&lt;/td&gt;
&lt;td&gt;컬렉션 단위로 JSON Schema 기반 유효성 검사 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유효성 위반 시&lt;/td&gt;
&lt;td&gt;기본적으로 삽입/갱신 거부, 옵션에 따라 경고만 허용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16MB 초과 데이터&lt;/td&gt;
&lt;td&gt;GridFS 사용 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입 시 스키마 유효성 검사를 적극 활용하면 데이터 품질과 일관성을 높일 수 있습니다.&lt;/li&gt;
&lt;li&gt;대용량 데이터는 반드시 GridFS 등 별도 저장 방식을 고려해야 하며, insertMany 등 대량 삽입 시에는 개수와 크기 제한을 항상 염두에 두어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/core/schema-validation/&quot;&gt;https://www.mongodb.com/docs/manual/core/schema-validation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dbschema.com/blog/mongodb/data-validation-rules/&quot;&gt;https://dbschema.com/blog/mongodb/data-validation-rules/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/limits/&quot;&gt;https://www.mongodb.com/docs/manual/reference/limits/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thecodebuzz.com/mongodb-document-size-guidelines-and-best-practices/&quot;&gt;https://thecodebuzz.com/mongodb-document-size-guidelines-and-best-practices/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/core/document/&quot;&gt;https://www.mongodb.com/docs/manual/core/document/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://groups.google.com/g/mongodb-user/c/zMBdPK1fvlE&quot;&gt;https://groups.google.com/g/mongodb-user/c/zMBdPK1fvlE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/community/forums/t/how-does-the-data-size-limitation-work/154738&quot;&gt;https://www.mongodb.com/community/forums/t/how-does-the-data-size-limitation-work/154738&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.xuchao.org/docs/mongodb/reference/limits.html&quot;&gt;https://www.xuchao.org/docs/mongodb/reference/limits.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/12550210/how-to-apply-constraints-in-mongodb&quot;&gt;https://stackoverflow.com/questions/12550210/how-to-apply-constraints-in-mongodb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/compass/current/validation/&quot;&gt;https://www.mongodb.com/docs/compass/current/validation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/core/schema-validation/specify-validation-level/&quot;&gt;https://www.mongodb.com/docs/manual/core/schema-validation/specify-validation-level/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://studio3t.com/knowledge-base/articles/mongodb-schema-validation/&quot;&gt;https://studio3t.com/knowledge-base/articles/mongodb-schema-validation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/12587217/mongodb-javascript-batch-insert-unique-constraint?rq=1&quot;&gt;https://stackoverflow.com/questions/12587217/mongodb-javascript-batch-insert-unique-constraint?rq=1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-schema-validation-in-mongodb&quot;&gt;https://www.digitalocean.com/community/tutorials/how-to-use-schema-validation-in-mongodb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/community/forums/t/increase-max-document-size-to-at-least-64mb/124424&quot;&gt;https://www.mongodb.com/community/forums/t/increase-max-document-size-to-at-least-64mb/124424&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@redjen/mongodb%EC%9D%98-16mb-%EC%95%85%EB%A7%88&quot;&gt;https://velog.io/@redjen/mongodb%EC%9D%98-16mb-%EC%95%85%EB%A7%88&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4667597/understanding-mongodb-bson-document-size-limit&quot;&gt;https://stackoverflow.com/questions/4667597/understanding-mongodb-bson-document-size-limit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/36042967/mongoose-insertmany-limit&quot;&gt;https://stackoverflow.com/questions/36042967/mongoose-insertmany-limit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/mongodb/comments/h0o06x/two_questions_regarding_mongodb_limits_16mb/&quot;&gt;https://www.reddit.com/r/mongodb/comments/h0o06x/two_questions_regarding_mongodb_limits_16mb/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[deleteOne 과 deleteMany 를 알려주고 이에 대한 예시를 보여줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px;&quot;&gt;deleteOne&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;지정한 조건에 &lt;b&gt;일치하는 첫 번째 문서 하나만 삭제&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞는 문서가 여러 개여도, 오직 하나만 삭제합니다.&lt;/li&gt;
&lt;li&gt;삭제된 문서가 없으면 아무 변화도 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;
&lt;pre id=&quot;code_1751477617414&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// age가 25인 첫 번째 문서만 삭제 db.users.deleteOne({ age: 25 })&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;deletemany&quot; data-ke-size=&quot;size26&quot;&gt;deleteMany&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;지정한 조건에 &lt;b&gt;일치하는 모든 문서를 삭제&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞는 문서가 0개면 아무 변화도 없습니다.&lt;/li&gt;
&lt;li&gt;조건에 맞는 문서가 여러 개면 모두 삭제됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시&lt;/h2&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751477634802&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// age가 25인 모든 문서를 삭제 db.users.deleteMany({ age: 25 })&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;요약 비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;메서드명삭제 대상삭제 개수
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;deleteOne&lt;/td&gt;
&lt;td&gt;조건에 맞는 첫 번째 문서&lt;/td&gt;
&lt;td&gt;최대 1개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deleteMany&lt;/td&gt;
&lt;td&gt;조건에 맞는 모든 문서&lt;/td&gt;
&lt;td&gt;0개 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[deleteMany 로 모든 도큐먼트를 삭제하는 방법과 이와 연관지어 drop 을 같이 알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;h2 id=&quot;1-deletemany&quot; data-ke-size=&quot;size26&quot;&gt;1. deleteMany로 모든 도큐먼트 삭제&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;deleteMany에 빈 조건({})을 주면 해당 컬렉션의 &lt;b&gt;모든 도큐먼트&lt;/b&gt;가 삭제됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컬렉션 구조(인덱스 등)는 그대로 남고, 데이터만 사라집니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시&lt;/h2&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751477740054&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// users 컬렉션의 모든 도큐먼트 삭제 db.users.deleteMany({})&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id=&quot;2-drop&quot; data-ke-size=&quot;size26&quot;&gt;2. drop으로 컬렉션 자체 삭제&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;br /&gt;drop()은 컬렉션 전체(데이터 + 인덱스 등 메타데이터 포함)를 완전히 삭제합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컬렉션 자체가 사라지므로, 이후에는 해당 컬렉션이 존재하지 않게 됩니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복구 불가&lt;/b&gt;에 유의해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시&lt;/h2&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751477753959&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// users 컬렉션 자체를 삭제 db.users.drop()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;차이점 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;방법데이터 삭제인덱스/스키마 삭제컬렉션 존재 여부
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;deleteMany({})&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;drop()&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;deleteMany({})&lt;/b&gt; : 모든 도큐먼트를 삭제하지만 컬렉션과 인덱스는 남아있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;drop()&lt;/b&gt; : 컬렉션 전체(데이터, 인덱스, 메타데이터 포함)를 완전히 삭제.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MongoDB, AWS DocumentDB/아키텍처 및 내부 구조</category>
      <category>crud</category>
      <category>delete</category>
      <category>DROP</category>
      <category>insert</category>
      <category>mongodb</category>
      <category>NoSQL</category>
      <category>데이터베이스</category>
      <category>몽고db</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/218</guid>
      <comments>https://dbknowledge.tistory.com/218#entry218comment</comments>
      <pubDate>Thu, 3 Jul 2025 02:38:11 +0900</pubDate>
    </item>
    <item>
      <title>Amazon Q CLI 를 자신의 Aurora Cluster 에 연결하기 (MCP)</title>
      <link>https://dbknowledge.tistory.com/217</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; Amazon Q CLI 를 자신의 Aurora&amp;nbsp;Cluster DB 에 MCP 개념으로 연결하는 과정을 기재한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p 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;이 페이지는 perplexity pro 를 통하여 확인 한 가이드 사항에 사용자가 더 이해하기 쉽게 추가 내용을 기재한다.&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;(Perplexity 가 아니더라도 자신이 사용하는 AI 솔루션을 유료 버전으로 사용한다면 설치 안내 과정은 비슷하게 안내 될 것이다.)&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;이 가이드는 Amazon Linux 2023 를 기준으로 설명된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한 필자가 AI 를 통하여 만든 가이드 또한 아래에 첨부한다. 이 가이드에 있는 명령어를 복사하여 Amazon Q CLI 를 구성 할 수 있다.&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;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ecfCnv/btsO1VCCZDr/tuUgtv8JxgUcbdoZuRSUFK/Amazon%20Q%20CLI%20MCP%20%EA%B5%AC%EC%84%B1%20%28Amazon%202023%29.txt?attach=1&amp;amp;knm=tfile.txt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Amazon Q CLI MCP 구성 (Amazon 2023).txt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #004030;&quot;&gt;&lt;span style=&quot;background-color: oklch(0.99 0.004 106.471);&quot;&gt;&lt;b&gt;Amazon Q CLI 설치 과정&lt;/b&gt;&lt;/span&gt;&lt;/span&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;- 먼저 Amazon Q Cli 를 설치하기 위해서는 확인 해야 할 사항이있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 아래와 같이 glibc 패키지가 설치되어 있는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot;&gt;또한 glibc 2.34 이상인지 확인한다. 2.34 미만이면 musl 버전을 사용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751386511405&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ldd --version

ldd (GNU libc) 2.34
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
[ec2-user@ip-10-0-1-202 ~]$ sudo dnf update
Last metadata expiration check: 6:59:59 ago on Tue Jul  1 06:35:04 2025.&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;- 그 다음 curl 과 unzip 이 설치되어 있는지 확인 후 필요시 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751386651472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo dnf update

Last metadata expiration check: 6:59:59 ago on Tue Jul  1 06:35:04 2025.
Dependencies resolved.
==================================================================================================================================
 Package                                    Architecture     Version                              Repository                 Size
==================================================================================================================================
Upgrading:
 amazon-linux-repo-s3                       noarch           2023.7.20250623-0.amzn2023           amazonlinux                16 k
 awscli-2                                   noarch           2.25.0-1.amzn2023.0.1                amazonlinux                12 M
 kernel-libbpf                              x86_64           6.12.31-35.92.amzn2023               amazonlinux               186 k
 kernel-livepatch-repo-s3                   noarch           2023.7.20250623-0.amzn2023           amazonlinux                16 k
 kernel-tools                               x86_64           6.12.31-35.92.amzn2023               amazonlinux               174 k
(...)

$ sudo dnf install curl unzip -y
Last metadata expiration check: 7:00:36 ago on Tue Jul  1 06:35:04 2025.
Package unzip-6.0-57.amzn2023.0.2.x86_64 is already installed.
Error:
Problem: problem with installed package curl-minimal-8.11.1-4.amzn2023.0.1.x86_64
(...)

# 필자의 EC2 에는 이미 amzn2023 curl 이 설치되어 있어서 curl 설치시 충돌이 일어나기에 필자의 테스트 환경에서는 이를 생략한다.&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;- 위와 같이 필요 패키지 및 프로그램을 설치했다면, 아래의 명령어를 그대로 사용하여 Amazon Q zip 을 다운로드 받을 디렉토리에&amp;nbsp; 다운로드 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751386777825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl --proto '=https' --tlsv1.2 -sSf &quot;https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip&quot; -o &quot;q.zip&quot;

#위의 사항은 Amazon Linux 2023 (x86_64 아키텍처) 에서만 사용가능한 명령어다. 만일 자신의 EC2 또는 OS 환경이 ARM (aarch64) 이면 아래의 명령어를 사용한다.

curl --proto '=https' --tlsv1.2 -sSf &quot;https://desktop-release.q.us-east-1.amazonaws.com/latest/q-aarch64-linux.zip&quot; -o &quot;q.zip&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;- 그 후, unzip 으로 압축을 푼 후, 설치를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751386854765&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ unzip q.zip
Archive:  q.zip
   creating: q/
  inflating: q/install.sh
  inflating: q/README
  inflating: q/BUILD-INFO
   creating: q/bin/
  inflating: q/bin/q
  inflating: q/bin/qterm
  inflating: q/bin/qchat

# 아래의 install 을 하면 AI 가 shell config 를 변경하도록 허용 할 지, login 은 어떤 계정을 사용할지 선택한다. 이 때, Amazon Q 를 pro 로 사용하는 사용자라면 pro 를 선택한다. 

$ ./q/install.sh
✔ Do you want q to modify your shell config (you will have to manually do this otherwise)? &amp;middot; Yes
? Select login method &amp;rsaquo;
❯ Use for Free with Builder ID
  Use with Pro license
(...)&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;- 위의 설정이 완료되면 아래와 같이 브라우저에서 사용하는 Amazon ID 를 login 하도록 요청받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안내 받은 링크를 통해 Amazon.com 로그인과 같이 로그인 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751387162321&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Confirm the following code in the browser
Code: SDWN-QSTK

Open this URL: https://view.awsapps.com/start/#/device?user_code=SDWN-QSTK&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;- 로그인이 정상적으로 되면 아래와 같이 Amazon Q 가 자신의 데이터가 접근하도록 허용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/67hTK/btsOZz0StPC/oWxFhniUUoCFwqEWsPBock/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/67hTK/btsOZz0StPC/oWxFhniUUoCFwqEWsPBock/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/67hTK/btsOZz0StPC/oWxFhniUUoCFwqEWsPBock/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F67hTK%2FbtsOZz0StPC%2FoWxFhniUUoCFwqEWsPBock%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;1033&quot; height=&quot;628&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-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_1751387318039&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Confirm the following code in the browser
Code: SDWN-QSTK

Open this URL: https://view.awsapps.com/start/#/device?user_code=SDWN-QSTK
Device authorized
Logged in successfully

#만일 이후에 login 을 다시 해야 하는 경우에는 아래의 명령어를 입력하면 된다.
(필자의 테스트 환경에서 이를 입력시 어떤 결과가 나오는지 미리 확인)

$q login
error: Already logged in, please logout with q logout first&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;- 그다음 Amazon Q 가 사용할 프로젝트 디렉토리를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751387575743&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 전역 설정 디렉토리 생성
mkdir -p ~/.aws/amazonq

# 또는 워크스페이스 설정 디렉토리 생성
mkdir -p .amazonq&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;- 이제 필자가 사용하는 Aurora MySQL Cluster 에 Amazon Q CLI 를 연동시키기 위해서 아래와 같이 &lt;span&gt;~/.aws/amazonq/mcp.json 파일을 만들고 아래의 내용을 기재한다. 여기서 사용자가 준비 해야 할 사항은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 연동시킬 Aurora Cluster&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Secret Manager 정보 (현재 Amazon Q 는 Aurora Cluster 등의 DB 접근시, 보안을 위하여&amp;nbsp; Secret Manager 를 통해서만 접속이 가능하다. 만일 기존에 user, PW 의 단순 login 을 사용했다면 관리자 계정을 기준으로 하는 Secret Manager 정보를 하나 만들고, 이를 Cluster 에 반영하도록 Cluster 를 수정 (Modify) 하면 된다. ARN 또한 Secret Manager 에서 확인 가능하다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- AWS Profile (필자는 default 로 사용하나, 이는 사용자마다 회사 규정등으로 인하여 정해진 profile 을 쓸 수 있다. 이에 맞춰쓴다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751387821901&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ vi ~/.aws/amazonq/mcp.json

{
  &quot;mcpServers&quot;: {
    &quot;awslabs.mysql-mcp-server&quot;: {
      &quot;command&quot;: &quot;uvx&quot;,
      &quot;args&quot;: [
        &quot;awslabs.mysql-mcp-server@latest&quot;,
        &quot;--resource_arn&quot;, &quot;arn:aws:rds:ap-northeast-2:(계정):db:(CLuster 명)&quot;,
        &quot;--secret_arn&quot;, &quot;arn:aws:secretsmanager:ap-northeast-2:(계정):secret:rds!cluster-b67dae33-bd0c-4cf7-8751-7b0099dde66d-ClYBVr&quot;,
        &quot;--database&quot;, &quot;test&quot;,
        &quot;--region&quot;, &quot;ap-northeast-2&quot;,
        &quot;--readonly&quot;, &quot;False&quot;
      ],
      &quot;env&quot;: {
        &quot;AWS_PROFILE&quot;: &quot;default&quot;,
        &quot;AWS_REGION&quot;: &quot;ap-northeast-2&quot;,
        &quot;FASTMCP_LOG_LEVEL&quot;: &quot;ERROR&quot;
      },
      &quot;disabled&quot;: false,
      &quot;autoApprove&quot;: []
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 만일 PostgreSQL 에 접속시에는 아래의 포맷을 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751388046553&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;awslabs.postgres-mcp-server&quot;: {
      &quot;command&quot;: &quot;uvx&quot;,
      &quot;args&quot;: [
        &quot;awslabs.postgres-mcp-server@latest&quot;,
        &quot;--resource_arn&quot;, &quot;arn:aws:rds:us-east-1:123456789012:cluster:your-cluster-name&quot;,
        &quot;--secret_arn&quot;, &quot;arn:aws:secretsmanager:us-east-1:123456789012:secret:your-secret-name&quot;,
        &quot;--database&quot;, &quot;your-database-name&quot;,
        &quot;--region&quot;, &quot;us-east-1&quot;,
        &quot;--readonly&quot;, &quot;True&quot;
      ],
      &quot;env&quot;: {
        &quot;AWS_PROFILE&quot;: &quot;your-aws-profile&quot;,
        &quot;AWS_REGION&quot;: &quot;us-east-1&quot;,
        &quot;FASTMCP_LOG_LEVEL&quot;: &quot;ERROR&quot;
      },
      &quot;disabled&quot;: false,
      &quot;autoApprove&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;- 그 후, Amazon CLI 가 정상적으로 실행되도록 마지막으로 python 및 종속 패키지 설치 확인을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751388133591&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Python 3.10 이상 설치 확인
python3 --version

# uv 설치 (Python 패키지 관리자)
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.bashrc&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;- 그 후, Amazon Q CLI 의 설치확인을 한다. Amazon Q 가 정상적으로 설치되었다면 CLI 또한 설치 되었을 가능성이 높으나 만일을 위하여 최종확인을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751388222811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo dnf install awscli -y

Last metadata expiration check: 7:27:44 ago on Tue Jul  1 06:35:04 2025.
Package awscli-2-2.25.0-1.amzn2023.0.1.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!&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;- 이제 Amazon Q CLI 가 RDS, Aurora Cluster 에 사용할 Data API 및 Secret Manager 를 사용하려면 아래와 같이 IAM 권한을 추가 해 줘야한다. 필자는 이를 신규 Policy 로 만들어서 사용중인 role 에 넣었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751388400702&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&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;rds-data:ExecuteStatement&quot;,
                &quot;rds-data:BatchExecuteStatement&quot;,
                &quot;rds-data:BeginTransaction&quot;,
                &quot;rds-data:CommitTransaction&quot;,
                &quot;rds-data:RollbackTransaction&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:rds:*:*:cluster:your-cluster-name&quot;
        },
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;secretsmanager:GetSecretValue&quot;,
                &quot;secretsmanager:DescribeSecret&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:secretsmanager:*:*:secret:your-secret-name&quot;
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czhZ7w/btsOZgHgttu/q804oRvEyZihpGgdgS7l0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czhZ7w/btsOZgHgttu/q804oRvEyZihpGgdgS7l0K/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czhZ7w/btsOZgHgttu/q804oRvEyZihpGgdgS7l0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczhZ7w%2FbtsOZgHgttu%2Fq804oRvEyZihpGgdgS7l0K%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;1526&quot; height=&quot;752&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그다음 아래 CLI 를 통하여 Aurora Cluster 에 사용할 Data API 를 활성화 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751388458334&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Aurora 클러스터의 Data API 활성화 (결과가 나오는지 까지 확인 필요)

$ aws rds modify-db-cluster \
    --db-cluster-identifier support-rds-aurora-mysql-test \
    --enable-http-endpoint \
    --region ap-northeast-2

{
    &quot;DBCluster&quot;: {
        &quot;AllocatedStorage&quot;: 1,
        &quot;AvailabilityZones&quot;: [
            &quot;ap-northeast-2b&quot;,
            &quot;ap-northeast-2a&quot;,
            &quot;ap-northeast-2d&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;- 여기까지가 설치과정이며, 이후에는 Amazon Q CLI 가 정상적으로 실행되는지 테스트 해 보면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751388678084&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$q

# Amazon Q 접속 후, tool 확인

/tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xhfzf/btsO0cjAqQY/A8eFHs9MtlU4K61OgVTc3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xhfzf/btsO0cjAqQY/A8eFHs9MtlU4K61OgVTc3k/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xhfzf/btsO0cjAqQY/A8eFHs9MtlU4K61OgVTc3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXhfzf%2FbtsO0cjAqQY%2FA8eFHs9MtlU4K61OgVTc3k%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;1046&quot; height=&quot;662&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon Q 에서는 영어가 기본 제공 언어이지만 AI 특성상 한국어도 인식한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751388816551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; 한국어 인식

&amp;gt; I can recognize and understand Korean text. You wrote &quot;한국어 인식&quot; which means &quot;Korean recognition&quot; or &quot;Korean language
recognition.&quot;

I'm able to communicate in Korean if you'd prefer to continue our conversation in Korean, or I can help you with any Korean-
related tasks you might have. What would you like assistance with?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7oKqG/btsOY2oU8jU/H7la6FBZrCmwwErw520JDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7oKqG/btsOY2oU8jU/H7la6FBZrCmwwErw520JDk/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7oKqG/btsOY2oU8jU/H7la6FBZrCmwwErw520JDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7oKqG%2FbtsOY2oU8jU%2FH7la6FBZrCmwwErw520JDk%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;1303&quot; height=&quot;142&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이제 우리가 위의 JSON 파일을 통해 인식시킨 Cluster 에 Amazon Q 가 접속하는지 확인 해 보자. 아래의 프롬프트를 작성하면 된다. (보안을 위해 필자의 cluster 명은 가렸다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBXq8/btsOZhGbBsO/HCLGpozoUkRlwTGDytPjf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBXq8/btsOZhGbBsO/HCLGpozoUkRlwTGDytPjf0/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBXq8/btsOZhGbBsO/HCLGpozoUkRlwTGDytPjf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBXq8%2FbtsOZhGbBsO%2FHCLGpozoUkRlwTGDytPjf0%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;1046&quot; height=&quot;662&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위와 같이 Amazon Q 가 접속이 가능해 지면 DB 작업 등도 요청 할 수 있다. 이 때, 아래에 보면 Amazon Q 가 DB 작업을 수행하도록 허용 하도록 한번 더 묻는데. 여기서 필자는 Amazon Q 가 계속 이후에도 작업을 하도록 t (trust) 로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwvsx9/btsO1Iu0R7T/4GkWp5qyngKUnVW5fZOxfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwvsx9/btsO1Iu0R7T/4GkWp5qyngKUnVW5fZOxfk/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwvsx9/btsO1Iu0R7T/4GkWp5qyngKUnVW5fZOxfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwvsx9%2FbtsO1Iu0R7T%2F4GkWp5qyngKUnVW5fZOxfk%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;1052&quot; height=&quot;662&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이후에 MCP 의 장점을 기술하겠지만, MCP 는 아래와 같이 사용자 환경에 맞춰 공개 AI 솔루션의 답변이외에 자체적인 조치도 취할 수있다. 예를 들어 필자가 사용하는 Amazon Linux 에는 MySQL Client 가 설치되어 있지 않아 실제 DB 작업을 할 수 없었지만, Amazon Q 에게 특정 작업을 요청하면서 Amazon Q 가 이를 확인 필요한 조치도 알아서 취할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IXp1s/btsOZlofjZs/WEOeU2IVv13cTbA7wsEBEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IXp1s/btsOZlofjZs/WEOeU2IVv13cTbA7wsEBEk/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IXp1s/btsOZlofjZs/WEOeU2IVv13cTbA7wsEBEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIXp1s%2FbtsOZlofjZs%2FWEOeU2IVv13cTbA7wsEBEk%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;1308&quot; height=&quot;800&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8EGvO/btsO0JajhPu/zbw0qjbZfqwIH6YbXRaGn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8EGvO/btsO0JajhPu/zbw0qjbZfqwIH6YbXRaGn0/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8EGvO/btsO0JajhPu/zbw0qjbZfqwIH6YbXRaGn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8EGvO%2FbtsO0JajhPu%2Fzbw0qjbZfqwIH6YbXRaGn0%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;1312&quot; height=&quot;815&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;815&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNTdF9/btsO0Wgaa54/leucR2znxu0d3HVwkyEalK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNTdF9/btsO0Wgaa54/leucR2znxu0d3HVwkyEalK/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNTdF9/btsO0Wgaa54/leucR2znxu0d3HVwkyEalK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNTdF9%2FbtsO0Wgaa54%2FleucR2znxu0d3HVwkyEalK%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;1312&quot; height=&quot;855&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;855&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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-origin-width=&quot;1307&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mG9Fa/btsO0JnSYB6/3f0dGqATBu4Y2cqwQaw1Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mG9Fa/btsO0JnSYB6/3f0dGqATBu4Y2cqwQaw1Ok/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mG9Fa/btsO0JnSYB6/3f0dGqATBu4Y2cqwQaw1Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmG9Fa%2FbtsO0JnSYB6%2F3f0dGqATBu4Y2cqwQaw1Ok%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;1307&quot; height=&quot;840&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 사용자가 SQL 및 명령어등을 직접 작성하지 않아도 Amazon Q CLI MCP 가 사용자의 환경에 맞춘 답변을 내놓 도록 할 수 있다.&lt;/p&gt;</description>
      <category>AWS 및 클라우드 지식/DB 이외 AWS 서비스, 클라우드 지식</category>
      <category>Ai</category>
      <category>amazonlinux2023</category>
      <category>amazonq</category>
      <category>Aurora</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>MCP</category>
      <category>mysql</category>
      <category>PostgreSQL</category>
      <category>RDS</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/217</guid>
      <comments>https://dbknowledge.tistory.com/217#entry217comment</comments>
      <pubDate>Wed, 2 Jul 2025 02:09:13 +0900</pubDate>
    </item>
    <item>
      <title>Kafka server.property (config 설정) 관련 옵션들 - 1</title>
      <link>https://dbknowledge.tistory.com/216</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Kafka broker 들을 구성할 때, 튜닝을 고려 할 수 있는 server.property 옵션들에 대하여 다룬다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. (&lt;b&gt;[] 로 표기&lt;/b&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.&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;AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot;&gt;[kafka server.properties 에서 자주 사용되는 옵션들을 알려줘]&lt;/span&gt;&lt;/b&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;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka 서버(브로커)에서 자주 사용되는 주요 옵션(properties)은 다음과 같다.&lt;/p&gt;
&lt;h2 id=&quot;kafka-server-properties&quot; data-ke-size=&quot;size26&quot;&gt;주요 Kafka Server Properties&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;옵션명타입기본값설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;broker.id&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;브로커의 고유 식별자. 클러스터 내 각 브로커마다 중복되지 않아야 함&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;listeners&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;PLAINTEXT://:9092&lt;/td&gt;
&lt;td&gt;브로커가 클라이언트 연결을 받을 수 있는 주소와 프로토콜 목록. 예: PLAINTEXT://:9092,SSL://:9093&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;advertised.listeners&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;클라이언트가 실제로 연결해야 하는 주소. 외부 클라이언트가 접근해야 할 경우 설정 필요&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;log.dirs&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;/tmp/kafka-logs&lt;/td&gt;
&lt;td&gt;메시지 데이터가 저장되는 디렉터리 경로. 여러 경로 지정 가능&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;num.network.threads&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;네트워크 요청을 처리하는 스레드 수&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;num.io.threads&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;디스크 I/O 처리 스레드 수&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;num.recovery.threads.per.data.dir&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;데이터 디렉터리마다 로그 복구에 사용되는 스레드 수&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;default.replication.factor&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;새로 생성되는 토픽의 기본 복제 인자. 보통 3으로 설정&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;num.partitions&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;새로 생성되는 토픽의 기본 파티션 수&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;log.retention.hours&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;168 (7일)&lt;/td&gt;
&lt;td&gt;로그(메시지)가 보관되는 최대 시간&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;log.segment.bytes&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;1073741824 (1GB)&lt;/td&gt;
&lt;td&gt;하나의 로그 세그먼트 파일의 최대 크기&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;zookeeper.connect&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;localhost:2181&lt;/td&gt;
&lt;td&gt;ZooKeeper 연결 정보. 클러스터 내 ZooKeeper 서버 목록&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;auto.create.topics.enable&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;존재하지 않는 토픽에 대한 생성을 자동으로 허용할지 여부&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;listeners&lt;/b&gt;와 &lt;b&gt;advertised.listeners&lt;/b&gt;는 클라이언트가 브로커에 접근하는 방식과 실제 연결 주소를 구분하여 설정할 때 중요하다&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;log.dirs&lt;/b&gt;는 여러 경로를 지정할 수 있어 데이터 저장 공간을 확장할 수 있다&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;num.network.threads&lt;/b&gt;, &lt;b&gt;num.io.threads&lt;/b&gt; 등은 브로커의 성능 튜닝에 자주 사용된다&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;default.replication.factor&lt;/b&gt;와 &lt;b&gt;num.partitions&lt;/b&gt;는 토픽의 내구성과 병렬 처리 능력에 영향을 준다&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;log.retention.hours&lt;/b&gt;와 &lt;b&gt;log.segment.bytes&lt;/b&gt;는 메시지 저장 정책을 결정한다&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 옵션들은 Kafka 브로커의 기본 동작, 성능, 내구성, 확장성에 큰 영향을 미친다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&quot;&gt;https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot;&gt;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&quot;&gt;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&quot;&gt;https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/tivoli-netcoolimpact/7.1.0?topic=source-kafka-configuration-properties-file&quot;&gt;https://www.ibm.com/docs/en/tivoli-netcoolimpact/7.1.0?topic=source-kafka-configuration-properties-file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot;&gt;https://presentlee.tistory.com/12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev-youngjun.tistory.com/177&quot;&gt;https://dev-youngjun.tistory.com/177&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kafka.apache.org/documentation/&quot;&gt;https://kafka.apache.org/documentation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/using_amq_streams_on_rhel/assembly-configuring-kafka-str&quot;&gt;https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/using_amq_streams_on_rhel/assembly-configuring-kafka-str&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.confluent.io/platform/current/kafka/dynamic-config.html&quot;&gt;https://docs.confluent.io/platform/current/kafka/dynamic-config.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ RDBMS 에서 파라미터 사용에 익숙하다면 이를 연상하여 읽으면 된다.&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;b&gt;[broker.id 가 필요한 이유]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;broker.id&lt;/b&gt;는 Kafka 클러스터 내에서 각 브로커를 고유하게 식별하기 위해 반드시 필요한 값이다. 클러스터에 여러 브로커가 존재할 때, 각 브로커가 자신만의 고유한 숫자 ID를 가져야만 클러스터 관리, 메타데이터 동기화, 장애 복구, 파티션 할당 등 다양한 작업에서 서로를 명확히 구분할 수 있다&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka101-broker&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 브로커가 새로 추가되거나 장애가 발생했을 때 클러스터는 broker.id를 기준으로 해당 브로커를 식별하고, 메타데이터(예: 컨트롤러 정보, 파티션 할당 상태 등)를 올바르게 관리한다&lt;a href=&quot;https://sjh9708.tistory.com/151&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://g-study.tistory.com/214&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt; 만약 broker.id가 중복되면 클러스터 내에서 브로커를 구분할 수 없게 되어 시스템 오류나 데이터 불일치가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면, &lt;b&gt;broker.id는 Kafka 클러스터의 안정적이고 일관성 있는 운영을 위해 각 브로커에 반드시 설정해야 하는 고유 식별자&lt;/b&gt;다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://always-kimkim.tistory.com/entry/kafka101-broker&quot;&gt;https://always-kimkim.tistory.com/entry/kafka101-broker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@jaymin_e/Kafka-Kafka-Brokers&quot;&gt;https://velog.io/@jaymin_e/Kafka-Kafka-Brokers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jh-labs.tistory.com/391&quot;&gt;https://jh-labs.tistory.com/391&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.naver.com/adamdoha/222183734423&quot;&gt;https://blog.naver.com/adamdoha/222183734423&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://assu10.github.io/dev/2024/06/15/kafka-install/&quot;&gt;https://assu10.github.io/dev/2024/06/15/kafka-install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot;&gt;https://presentlee.tistory.com/12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sjh9708.tistory.com/151&quot;&gt;https://sjh9708.tistory.com/151&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://g-study.tistory.com/214&quot;&gt;https://g-study.tistory.com/214&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cla9.tistory.com/169&quot;&gt;https://cla9.tistory.com/169&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yeon-kr.tistory.com/183&quot;&gt;https://yeon-kr.tistory.com/183&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;[listeners&amp;nbsp;가&amp;nbsp;필요한&amp;nbsp;이유와&amp;nbsp;advertised.listeners&amp;nbsp;와의&amp;nbsp;연관성]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;listeners&lt;/b&gt;는 Kafka 브로커가 실제로 클라이언트의 연결 요청을 수신하는 네트워크 인터페이스와 포트를 지정하는 설정이다. 즉, 브로커가 어느 IP 주소나 호스트, 그리고 어떤 포트에서 메시지를 받을지 결정한다. 예를 들어, listeners=PLAINTEXT://localhost:9092로 설정하면 브로커는 로컬호스트의 9092 포트에서 PLAINTEXT 프로토콜로 들어오는 연결을 받게 된다&lt;a href=&quot;https://blog.voidmainvoid.net/500&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://dortmoot.tistory.com/144&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://shinwusub.tistory.com/133&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정은 브로커가 클라이언트와 통신하기 위해 반드시 필요하다. 만약 listeners를 설정하지 않으면, 브로커는 외부에서 접근할 수 없게 된다&lt;span&gt;&lt;a href=&quot;https://dortmoot.tistory.com/144&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;advertised.listeners&lt;/b&gt;는 브로커가 클라이언트(프로듀서, 컨슈머, 다른 브로커 등)에게 자신의 위치를 알릴 때 사용하는 주소다. 클라이언트는 이 정보를 바탕으로 브로커에 접속한다. 특히, 브로커가 내부 네트워크와 외부 네트워크에서 서로 다른 주소로 접근해야 할 때(예: 내부에서는 사설 IP, 외부에서는 퍼블릭 IP 또는 도메인 사용), advertised.listeners를 통해 외부 클라이언트가 올바른 주소로 접속할 수 있게 해준다&lt;a href=&quot;https://blog.voidmainvoid.net/500&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://westlife0615.tistory.com/529&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://godekdls.github.io/Apache%20Kafka/broker-configuration/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;listeners=PLAINTEXT://192.168.1.10:9092&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;advertised.listeners=PLAINTEXT://kafka.example.com:9092&lt;/b&gt;&lt;br /&gt;이렇게 설정하면, 브로커는 내부 네트워크(192.168.1.10)에서 실제로 연결을 받지만, 클라이언트는 kafka.example.com 주소로 연결을 시도하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 설정의 연관성은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;listeners&lt;/b&gt;는 브로커가 실제로 바인딩하는 주소(수신 주소)다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;advertised.listeners&lt;/b&gt;는 클라이언트가 브로커에 접속할 때 사용할 주소(공개 주소)다.&lt;/li&gt;
&lt;li&gt;advertised.listeners를 따로 지정하지 않으면, listeners 설정이 클라이언트에게도 그대로 전달된다&lt;a href=&quot;https://blog.voidmainvoid.net/500&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://godekdls.github.io/Apache%20Kafka/broker-configuration/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 분리함으로써 내부/외부 네트워크, 프록시, 로드밸런서 등 다양한 환경에서 Kafka 클러스터를 유연하게 운영할 수 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.voidmainvoid.net/500&quot;&gt;https://blog.voidmainvoid.net/500&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dortmoot.tistory.com/144&quot;&gt;https://dortmoot.tistory.com/144&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shinwusub.tistory.com/133&quot;&gt;https://shinwusub.tistory.com/133&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://westlife0615.tistory.com/529&quot;&gt;https://westlife0615.tistory.com/529&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://godekdls.github.io/Apache%20Kafka/broker-configuration/&quot;&gt;https://godekdls.github.io/Apache%20Kafka/broker-configuration/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://parkcheolu.tistory.com/196&quot;&gt;https://parkcheolu.tistory.com/196&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sharplee7.tistory.com/144&quot;&gt;https://sharplee7.tistory.com/144&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://foulerback.tistory.com/26&quot;&gt;https://foulerback.tistory.com/26&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer-pi.tistory.com/388&quot;&gt;https://developer-pi.tistory.com/388&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bagbokman.tistory.com/16&quot;&gt;https://bagbokman.tistory.com/16&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&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; Kafka listeners 는 프로토콜, 호스트 이름, 포트 양식으로 접속 설정이 된다. 구버전은 단순 포트 설정으로만 설정이 가능했다.&lt;/span&gt;&lt;/span&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;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;[log.dirs 와 num.recovery.threads.per.data.dir 와의&amp;nbsp;연관성]&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;log.dirs&lt;/b&gt;와 &lt;b&gt;num.recovery.threads.per.data.dir&lt;/b&gt;는 모두 Kafka 브로커가 데이터를 저장하고 관리하는 데 중요한 역할을 하며, 서로 밀접하게 연관되어 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;log.dirs&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kafka가 메시지를 저장하는 로그 디렉터리(폴더) 경로를 지정한다.&lt;/li&gt;
&lt;li&gt;여러 경로를 쉼표로 구분해 입력할 수 있으며, 이 경우 데이터가 여러 디렉터리로 분산 저장된다&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://www.ibm.com/docs/ko/oala/1.3.8?topic=collection-configuring-apache-kafka-brokers&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://data-engineer-tech.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;num.recovery.threads.per.data.dir&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 로그 디렉터리(즉, log.dirs에 지정된 각 경로)마다 로그 복구(시작/종료 시 데이터 검증 및 동기화)에 사용할 수 있는 스레드(쓰레드) 개수를 지정한다&lt;a href=&quot;https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://www.ibm.com/docs/ko/oala/1.3.8?topic=collection-configuring-apache-kafka-brokers&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;예를 들어, log.dirs에 3개의 경로가 있고, num.recovery.threads.per.data.dir=4로 설정하면 총 12개의 스레드가 복구 작업에 사용될 수 있다(그러나 실제로는 복구 작업이 각 디렉터리별로 병렬로 이루어지므로, 복구 속도가 빨라질 수 있다).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;log.dirs에 지정된 디렉터리 개수가 많아질수록 num.recovery.threads.per.data.dir 값이 전체 복구 스레드 수에 미치는 영향이 커진다&lt;/b&gt;.&lt;br /&gt;이 두 설정은 함께 조정하여, 브로커 시작/종료 시 로그 복구 속도를 최적화할 수 있다.&lt;br /&gt;실제 운영 환경에서는 여러 디렉터리를 사용해 I/O 병목을 줄이고, 복구 스레드 수를 늘려 복구 시간을 단축하는 것이 일반적이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&quot;&gt;https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/docs/ko/oala/1.3.8?topic=collection-configuring-apache-kafka-brokers&quot;&gt;https://www.ibm.com/docs/ko/oala/1.3.8?topic=collection-configuring-apache-kafka-brokers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data-engineer-tech.tistory.com/11&quot;&gt;https://data-engineer-tech.tistory.com/11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95&quot;&gt;https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://strimzi.io/blog/2021/06/08/broker-tuning/&quot;&gt;https://strimzi.io/blog/2021/06/08/broker-tuning/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/53821671/kafka-broker-taking-too-long-to-come-up&quot;&gt;https://stackoverflow.com/questions/53821671/kafka-broker-taking-too-long-to-come-up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot;&gt;https://presentlee.tistory.com/12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marrrang.tistory.com/21&quot;&gt;https://marrrang.tistory.com/21&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/63544003/understanding-kafka-log-dirs&quot;&gt;https://stackoverflow.com/questions/63544003/understanding-kafka-log-dirs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.cloudera.com/runtime/7.3.1/kafka-managing/topics/kafka-manage-cli-logdir.html&quot;&gt;https://docs.cloudera.com/runtime/7.3.1/kafka-managing/topics/kafka-manage-cli-logdir.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;[auto.create.topics.enable&amp;nbsp;&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;더&amp;nbsp;알려줘]&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;auto.create.topics.enable&lt;/b&gt;는 Kafka 브로커의 중요한 설정 중 하나로, 존재하지 않는 토픽에 대해 메시지를 전송하거나 읽으려고 할 때 해당 토픽을 자동으로 생성할지 여부를 결정한다. 기본값은 true로, 별도로 지정하지 않으면 자동 생성이 활성화된다&lt;a href=&quot;https://ydeer.tistory.com/311&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://rockintuna.tistory.com/265&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 옵션의 주요 특징과 주의점은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자동 생성 동작&lt;/b&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;자동 생성되는 토픽의 파티션 수와 복제 인자(replication factor)는 각각 num.partitions, default.replication.factor 설정값을 따른다&lt;a href=&quot;https://ydeer.tistory.com/311&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://rockintuna.tistory.com/265&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;편의성 vs 관리&lt;/b&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;운영 환경에서는 원치 않는 토픽이 생성되어 불필요한 리소스를 소모하거나, 잘못된 설정(파티션 수, 복제 인자 등)으로 성능에 영향을 줄 수 있으므로 false로 설정하는 것이 권장된다&lt;a href=&quot;https://rockintuna.tistory.com/265&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://devidea.tistory.com/85&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://kjyun.tistory.com/142&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 및 관리 영향&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 생성된 토픽이 많아지면 브로커의 메타데이터 관리 부담이 커지고, 불필요한 파티션 증가로 인해 컨슈머의 데이터 읽기 지연(latency)이 발생할 수 있다&lt;a href=&quot;https://devidea.tistory.com/85&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://kjyun.tistory.com/142&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;복제 인자나 파티션 수가 기본값(1)으로 설정될 경우, 장애 내구성이나 병렬 처리 성능이 떨어질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관리 팁&lt;/b&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;자동 생성 기능을 끄고 싶다면 auto.create.topics.enable=false로 설정하면 된다&lt;a href=&quot;https://kjyun.tistory.com/142&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://heodolf.tistory.com/11&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면, &lt;b&gt;auto.create.topics.enable&lt;/b&gt;는 Kafka의 편의성을 높여주지만, 운영 안정성과 성능을 위해 신중히 사용해야 하는 옵션이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ydeer.tistory.com/311&quot;&gt;https://ydeer.tistory.com/311&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rockintuna.tistory.com/265&quot;&gt;https://rockintuna.tistory.com/265&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devidea.tistory.com/85&quot;&gt;https://devidea.tistory.com/85&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/azure/hdinsight/kafka/apache-kafka-auto-create-topics&quot;&gt;https://learn.microsoft.com/ko-kr/azure/hdinsight/kafka/apache-kafka-auto-create-topics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95&quot;&gt;https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kjyun.tistory.com/142&quot;&gt;https://kjyun.tistory.com/142&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://snowturtle93.github.io/posts/%EC%B9%B4%ED%94%84%EC%B9%B4-%ED%94%84%EB%A1%9C%EB%93%80%EC%84%9C/&quot;&gt;https://snowturtle93.github.io/posts/%EC%B9%B4%ED%94%84%EC%B9%B4-%ED%94%84%EB%A1%9C%EB%93%80%EC%84%9C/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC&quot;&gt;https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://presentlee.tistory.com/12&quot;&gt;https://presentlee.tistory.com/12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://heodolf.tistory.com/11&quot;&gt;https://heodolf.tistory.com/11&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Kafka, MSK, Kinesis/아키텍처 및 내부 구조</category>
      <category>kafka</category>
      <category>kafka복구</category>
      <category>kafka설정</category>
      <category>kafka운영</category>
      <category>kafka튜닝</category>
      <category>serverproperties</category>
      <category>복구</category>
      <category>분산메시징</category>
      <category>튜닝</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/216</guid>
      <comments>https://dbknowledge.tistory.com/216#entry216comment</comments>
      <pubDate>Tue, 1 Jul 2025 03:10:45 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB shell 사용방법 및 관련 명령어 - 2</title>
      <link>https://dbknowledge.tistory.com/215</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; 이전 게시글에 이어 &lt;/span&gt;MongoDB 를 사용하기 위해 필요한 MongoDB shell 사용방법 및 관련 명령어에 대하여 다룬&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&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: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;[+] &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://dbknowledge.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.06.14 - [분류 전체보기] - MongoDB shell 사용방법 및 관련 명령어 - 1&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. (&lt;b&gt;[] 로 표기&lt;/b&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.&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;AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.&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;마지막으로 이 페이지는 EC2 Amazon Linux 2023 에 설치된 기본 MongoDB 를 사용한다.&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Mongoshrc.js 파일을 이용한 MongoDB 접속시 표기되는 프롬프트 커스토마이징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB 는 mongoshrc.js 를 이용하여 아래 예시와 같이 mongoshell 의 프롬프트 환경또한 커스토마이징 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750092057907&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#아래의 구문을 추가하여 mongosh 의 prompt 에서 현재 명령어가 수행되는 시간을 표기

$vi ~/.mongoshrc.js

prompt = function() {
        return (new Date())+&quot;&amp;gt; &quot;;
};

$ mongosh 127.0.0.1:27017
Current Mongosh Log ID: 685046103fe32ebbe069e327
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&amp;amp;serverSelectionTimeoutMS=2000&amp;amp;appName=mongosh+2.5.2
Using MongoDB:          8.0.10
Using Mongosh:          2.5.2

For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/

------
   The server generated these startup warnings when booting
   2025-06-16T14:19:15.343+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2025-06-16T14:19:15.344+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile
   2025-06-16T14:19:15.344+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile
   2025-06-16T14:19:15.344+00:00: We suggest setting the contents of sysfsFile to 0.
   2025-06-16T14:19:15.344+00:00: vm.max_map_count is too low
------

Hello, you're looking particulary intelligent today!
Mon Jun 16 2025 16:28:00 GMT+0000 (Coordinated Universal Time)&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;Shell 에서 다중 코드 및 객체 블록등을 작성할 때, 아래 줄을 작성 중, 윗줄에서 오타등을 수정하는 건 매우 번거롭다. 이 때 사용할 수 있는데 editor 다. editor 는 아래와 같은 순서로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750092992939&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Mongo shell 사용

# 어떤 editor 를 사용할 지 설정

test&amp;gt; config.set(&quot;editor&quot;, &quot;vi&quot;)

# Editor 가 저장될 경로 설정

test&amp;gt; EDITOR=&quot;/home/ec2-user/&quot;
/home/ec2-user/

# 특정 변수를 설정

test&amp;gt; var wap = db.books.findOne({title: &quot;War and Peace&quot;});

# 해당 변수값을 editor 에서 편집

test&amp;gt; edit wap
Opening an editor...

# vi 편집기에서 나오면 해당 변수 값이 shell 에 재반영 된다.

test&amp;gt; wap = null&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;특정 커맨드창에서 version 등의 단어들은 명령어 수행과 연관된 경우 예약어인 경우가 많다. MongoDB 에서 또한 이를 고려해야하는데 이는 사용자가 version 이라는 collection 을 만들면 아래의 기존 예약어와 충돌이 발생할수 있기 때문이다. 이때는 MongoDB 의 함수를 사용해야한다. (아래 예시이외에 여러 함수들은 AI 검색을 사용하면 편리하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750093594941&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# version 이라는 collection 에 접근시, 이는 기존 예약어와 충돌된다.

test&amp;gt; db.version
[Function: version] AsyncFunction {
  apiVersions: [ 0, 0 ],
  returnsPromise: true,
  serverVersions: [ '0.0.0', '999.999.999' ],
  topologies: [ 'ReplSet', 'Sharded', 'LoadBalanced', 'Standalone' ],
  returnType: { type: 'unknown', attributes: {} },
  deprecated: false,
  platforms: [ 'Compass', 'Browser', 'CLI' ],
  isDirectShellCommand: false,
  acceptsRawInput: false,
  shellCommandCompleter: undefined,
  help: [Function (anonymous)] Help
}

# getCollection 이라는 함수를 통해 version collection 에 접근

test&amp;gt; db.getCollection(&quot;version&quot;);
test.version&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;Array (배열) 를 통해 유효하지 않은 collection 명을 피할 수도 있다. 또한 Mongo shell 은 Javascript 편집기 기능도 있으므로, 이를 이용해 아래의 반복문을 통해 Array 에 있는 collection 만 조회 할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750093784630&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test&amp;gt; var collections = [&quot;posts&quot;,&quot;comments&quot;,&quot;authors&quot;]

test&amp;gt; for (var i in collections) {
... print(db.blog[collections[i]]);
... }
test.blog.posts
test.blog.comments
test.blog.authors&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;접근하려는 collection 의 이름이 조회하기 힘든 명칭일 시, 아래와 같은 wildcard 등을 이용한 검색을 이용 할 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1750093848754&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test&amp;gt; var name = &quot;@#&amp;amp;!&quot;

test&amp;gt; db[name].find()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>MongoDB, AWS DocumentDB/아키텍처 및 내부 구조</category>
      <category>Collection</category>
      <category>javascript</category>
      <category>mongodb</category>
      <category>Shell</category>
      <category>WildCard</category>
      <category>몽고디비</category>
      <category>자바스크립트</category>
      <category>콜렉션</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/215</guid>
      <comments>https://dbknowledge.tistory.com/215#entry215comment</comments>
      <pubDate>Tue, 17 Jun 2025 02:12:53 +0900</pubDate>
    </item>
    <item>
      <title>Kafka Broker 설치 방법</title>
      <link>https://dbknowledge.tistory.com/214</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; Zookeeper 설치 이후, Kafka Broker&amp;nbsp;를 설치하는 방법에 대하여 다룬다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Kafka Broker 설치는 Zookeeper 설치가 먼저 선행 되어야 하기에 아래의 게시글을 먼저 참조 및 수행 후, 이 게시글을 확인하는 것을 권장한다.&lt;/p&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://dbknowledge.tistory.com/211&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.06.13 - [Kafka, MSK, Kinesis/아키텍처 및 내부 구조] - Zookeeper 설치 방법 - 기본설치&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[2] &lt;a href=&quot;https://dbknowledge.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.06.15 - [Kafka, MSK, Kinesis/아키텍처 및 내부 구조] - Zookeeper 설치 방법 - 앙상블 (ensemble) 구성&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;필자는 AWS EC2 Linux 2 기준으로 Kafka 를 설치한다.&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;b&gt;Kafka 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Zookeeper 를 설치했다면 이제 Kafka 를 설치할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka 는 아래의 링크에서 설치할 버전을 고르면 된다.&lt;/p&gt;
&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://kafka.apache.org/downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kafka.apache.org/downloads&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;- 여기서 필자는 Scala 2.13.0 - Kafka 3.9.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-origin-width=&quot;1516&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5lt6f/btsODqBvPhR/9XTpshggWh1HPnH5sEqClk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5lt6f/btsODqBvPhR/9XTpshggWh1HPnH5sEqClk/img.png&quot; data-alt=&quot;출처 : 본인 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5lt6f/btsODqBvPhR/9XTpshggWh1HPnH5sEqClk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5lt6f%2FbtsODqBvPhR%2F9XTpshggWh1HPnH5sEqClk%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;1516&quot; height=&quot;935&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;935&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 본인 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Kakfa 는 JVM 기반에서 작동하는 Scala 언어로 만들어졌다.&lt;/p&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 에서 Zookeeper 와 유사하게 wget 으로 다운로드 및 tar 로 압축을 푼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(필자는 ec2-user home directory 에 이를 설치 및 구성을 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750008997679&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ wget https://dlcdn.apache.org/kafka/3.9.1/kafka_2.13-3.9.1.tgz
--2025-06-15 17:00:49--  https://dlcdn.apache.org/kafka/3.9.1/kafka_2.13-3.9.1.tgz
Resolving dlcdn.apache.org (dlcdn.apache.org)... 151.101.2.132, 2a04:4e42::644
Connecting to dlcdn.apache.org (dlcdn.apache.org)|151.101.2.132|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 122110298 (116M) [application/x-gzip]
Saving to: &amp;lsquo;kafka_2.13-3.9.1.tgz&amp;rsquo;

100%[========================================================================================&amp;gt;] 122,110,298  316MB/s   in 0.4s

2025-06-15 17:00:50 (316 MB/s) - &amp;lsquo;kafka_2.13-3.9.1.tgz&amp;rsquo; saved [122110298/122110298]

$ tar -xzf kafka_2.13-3.9.1.tgz&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;- kafka 의 log 를 보관할 디렉토리를 임의로 생성 후, kafka 디렉토리에 있는 bin 디렉토리에서 아래의 명령어로 kafka daemon 을 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750009294839&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# log 디렉토리 생성

$ mkdir /tmp/kafka-logs
 
# bin 디렉토리에서 daemon 기동
 
$ sh /home/ec2-user/kafka_2.13-3.9.1/bin/kafka-server-start.sh \
&amp;gt; -daemon /home/ec2-user/kafka_2.13-3.9.1/config/server.properties

# kafka 기동유무 확인

$ ps -ef | grep kafka

ec2-user 20794     1  4 17:06 pts/1    00:00:06 /usr/java/jdk-17.0.2//bin/java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -XX:MaxInlineLevel=15 -Djava.awt.headless=true -Xlog:gc*:file=/home/ec2-user/kafka_2.13-3.9.1/bin/../logs/kafkaServer-gc.log:time,tags:filecount=10,filesize=100M -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dkafka.logs.dir=/home/ec2-user/kafka_2.13-3.9.1/bin/../logs -Dlog4j.configuration=file:/home/ec2-user/kafka_2.13-3.9.1/bin/../config/log4j.properties -cp /home/ec2-user/kafka_2.13-3.9.1/bin/../libs/activation-1.1.1.jar:/home/ec2-user/kafka_2.13-3.9.1/bin/../libs/aopalliance-repack
(...)&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;- Kafka 기동을 확인하면 아래 명령어들을 수행하여 topic 을 생성하고, 메시지를 기록해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750009529376&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# bin 디렉토리에서 해당 명령어로 Topic 생성

sh kafka-topics.sh --bootstrap-server localhost:9092 \
&amp;gt; --create --replication-factor 1 --partitions 1 --topic test

Created topic test.

# 메시지 기입, 기입 후 ctrl + c 로 빠져나오기가 가능

sh kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
&amp;gt;Test Message 1
&amp;gt;Test Message 2
^C

# 작성한 메시지 읽기

sh kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
Test Message 1
Test Message 2
^C
Processed a total of 2 messages&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Kafka, MSK, Kinesis/아키텍처 및 내부 구조</category>
      <category>Broker</category>
      <category>consumer</category>
      <category>jvm</category>
      <category>kafka</category>
      <category>producer</category>
      <category>scala</category>
      <category>브로커</category>
      <category>카프카</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/214</guid>
      <comments>https://dbknowledge.tistory.com/214#entry214comment</comments>
      <pubDate>Mon, 16 Jun 2025 02:46:29 +0900</pubDate>
    </item>
    <item>
      <title>Zookeeper 설치 방법 - 앙상블 (ensemble) 구성</title>
      <link>https://dbknowledge.tistory.com/213</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; Kafka 를 설치하기 위해 필요한 zookeeper 를 앙상블 (ensemble) 클러스터 단위로 설치하는 방법에 대해서 다룬다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;이 게시글은 아래의 게시글에 이어지는 글이기에 이전 글을 먼저 읽는 것을 권장한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[+] &lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://dbknowledge.tistory.com/211&quot;&gt;2025.06.13 - [Kafka, MSK, Kinesis/아키텍처 및 내부 구조] - Zookeeper 설치 방법 - 기본설치&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Zookeeper 의 기본설치 방법을 확인했다면 이제 실제 운영환경에서의 Zookeeper 의 고가용성도 고려 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Zookeeper 는 이를 앙상블 (ensemble) 이라는 클러스터 개념으로 구현한다. 이에 대한 정보는 AI 검색을 하면 더 상세한 정보를 확인 해 볼 수 있다.&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[Zookeeper 앙상블에 대해서 알려줘]&lt;/b&gt;&lt;/h3&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;h2 id=&quot;zookeeper-ensemble&quot; data-ke-size=&quot;size26&quot;&gt;ZooKeeper 앙상블(Ensemble)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ZooKeeper 앙상블&lt;/b&gt;은 여러 대의 ZooKeeper 서버가 하나의 클러스터를 이루어 동작하는 구조를 의미합니다. 이 구조는 고가용성(HA)과 데이터 일관성을 보장하기 위해 사용됩니다. 앙상블 내의 ZooKeeper 서버들은 서로 복제(replication) 및 동기화(synchronization)를 하며, 분산 시스템의 신뢰성과 안정성을 높입니다&lt;a href=&quot;https://westlife0615.tistory.com/487&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yooloo.tistory.com/102&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://sungchul-p.github.io/zookeeper-on-k8s&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 특징 및 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Leader-Follower 구조&lt;/b&gt;&lt;br /&gt;앙상블에는 반드시 한 대의 Leader와 여러 대의 Follower가 존재합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Leader: 모든 쓰기(Write), 업데이트(Update), 삭제(Delete) 요청을 처리합니다.&lt;/li&gt;
&lt;li&gt;Follower: Leader의 복제본 역할을 하며, 주로 읽기(Read) 요청을 처리하고 Leader의 명령에 따라 데이터를 동기화합니다&lt;a href=&quot;https://westlife0615.tistory.com/487&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://sungchul-p.github.io/zookeeper-on-k8s&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://jh-labs.tistory.com/391&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리더 선출(Leader Election)&lt;/b&gt;&lt;br /&gt;서버가 시작되면 자동으로 리더 선출 과정이 진행됩니다. 리더가 장애가 나면 나머지 서버 중 하나가 새로운 리더로 선출됩니다&lt;a href=&quot;https://westlife0615.tistory.com/487&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://sungchul-p.github.io/zookeeper-on-k8s&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쿼럼(Quorum) 기반 합의&lt;/b&gt;&lt;br /&gt;ZooKeeper 앙상블은 과반수(쿼럼) 이상의 서버가 동작해야 쓰기 작업이 가능합니다. 예를 들어, 3대 앙상블이면 2대 이상이 살아 있어야 정상 동작합니다&lt;a href=&quot;https://yooloo.tistory.com/102&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jh-labs.tistory.com/391&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/583580&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;홀수 개 서버 권장&lt;/b&gt;&lt;br /&gt;쿼럼 구조상 서버 수는 홀수(3, 5, 7...)로 구성하는 것이 일반적입니다. 짝수로 구성해도 되지만, 장애 허용 범위와 쿼럼 계산상 효율이 떨어집니다&lt;a href=&quot;https://data-engineer-tech.tistory.com/8&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://mr-spock.tistory.com/58&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yooloo.tistory.com/102&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://jh-labs.tistory.com/391&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;앙상블의 동작 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;쓰기(Write) 요청&lt;/b&gt;:&lt;br /&gt;모든 쓰기 요청은 리더에게 전달되어, 리더가 팔로워들에게 제안(Propose) 후 과반수(쿼럼) 이상의 승인(ACK)을 받으면 커밋(Commit)합니다. 이 과정에서 데이터 일관성이 보장됩니다&lt;span&gt;&lt;a href=&quot;https://sungchul-p.github.io/zookeeper-on-k8s&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;읽기(Read) 요청&lt;/b&gt;:&lt;br /&gt;팔로워 서버에서도 읽기 요청을 처리할 수 있으나, 강한 일관성이 필요한 경우 리더를 통해 읽기도 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장애 허용&lt;/b&gt;:&lt;br /&gt;예를 들어 3대 앙상블이면 1대가 장애 나도 2대가 살아 있으면 정상 동작합니다. 5대면 2대까지 장애 허용&lt;a href=&quot;https://yooloo.tistory.com/102&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/583580&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ZooKeeper 앙상블 구성 예시&lt;/h2&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749997806275&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tickTime=2000 
dataDir=/data 
clientPort=2181 
initLimit=10 
syncLimit=5 
server.1=zk01:2888:3888 
server.2=zk02:2888:3888 
server.3=zk03:2888:3888&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 서버는 고유한 myid(1, 2, 3 등)를 부여받아야 하며, 설정 파일에 서버 정보를 명시합니다&lt;a href=&quot;https://namsick96.github.io/zookeper/zookeeper-ensemble-start-withaws/&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://cornswrold.tistory.com/527&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ZooKeeper 앙상블의 활용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Kafka, HBase, ClickHouse&lt;/b&gt; 등 다양한 분산 시스템에서 메타데이터 관리, 클러스터 상태 동기화 등에 필수적으로 사용됩니다&lt;a href=&quot;https://sungchul-p.github.io/zookeeper-on-k8s&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://jh-labs.tistory.com/391&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;앙상블이 구성되어 있으면 한 대의 ZooKeeper 서버가 장애 나더라도 서비스가 중단되지 않고 지속적으로 동작할 수 있습니다&lt;span&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/583580&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ZooKeeper 앙상블은 여러 대의 ZooKeeper 서버로 구성된 클러스터&lt;/li&gt;
&lt;li&gt;Leader-Follower 구조, 리더 선출, 쿼럼 기반 합의 방식&lt;/li&gt;
&lt;li&gt;서버 수는 홀수로 구성 권장(최소 3대)&lt;/li&gt;
&lt;li&gt;고가용성, 장애 허용, 데이터 일관성 보장&lt;/li&gt;
&lt;li&gt;Kafka 등 다양한 분산 시스템에서 필수적으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앙상블 구조 덕분에 ZooKeeper는 분산 환경에서 신뢰성과 안정성을 확보할 수 있으며, 실제 운영 환경에서는 반드시 앙상블로 구성하는 것이 표준입니다&lt;a href=&quot;https://westlife0615.tistory.com/487&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://yooloo.tistory.com/102&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://sungchul-p.github.io/zookeeper-on-k8s&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jh-labs.tistory.com/391&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/583580&quot; data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://westlife0615.tistory.com/487&quot;&gt;https://westlife0615.tistory.com/487&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data-engineer-tech.tistory.com/8&quot;&gt;https://data-engineer-tech.tistory.com/8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mr-spock.tistory.com/58&quot;&gt;https://mr-spock.tistory.com/58&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yooloo.tistory.com/102&quot;&gt;https://yooloo.tistory.com/102&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sungchul-p.github.io/zookeeper-on-k8s&quot;&gt;https://sungchul-p.github.io/zookeeper-on-k8s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://namsick96.github.io/zookeper/zookeeper-ensemble-start-withaws/&quot;&gt;https://namsick96.github.io/zookeper/zookeeper-ensemble-start-withaws/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jh-labs.tistory.com/391&quot;&gt;https://jh-labs.tistory.com/391&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cornswrold.tistory.com/527&quot;&gt;https://cornswrold.tistory.com/527&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@moon_happy/%EC%A3%BC%ED%82%A4%ED%8D%BC%EB%8A%94-%EB%AD%98%EA%B9%8C&quot;&gt;https://velog.io/@moon_happy/%EC%A3%BC%ED%82%A4%ED%8D%BC%EB%8A%94-%EB%AD%98%EA%B9%8C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/583580&quot;&gt;https://d2.naver.com/helloworld/583580&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;※ Quorum 은 AWS Aurora Cluster 의 장애 관리 logic 에도 쓰이는 개념이므로 Aurora Cluster 도 같이 이용하는 사용자라면 같이 알아 두면 좋다.&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;※ 앙상블은 합의 프로토콜로 운영됨에 따라 이와 연관되는 성능을 고려 시, 9대 이내의 서버로 구성되는 것이 권장된다. (출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;O'REILLY - '카프카 핵심 가이드'&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;※ 위의 예시는 3대의 서버로 앙상블을 구성 하는 예시며, 이때 사용되는 config 명령문은 server.{x}={hostname}:{peerPort}:{leaderPort} 로 정의된다. 이 때, x 는 서버ID, hostname 은 서버의 호스트명 또는 IP 주소, peerPort 는 각 서버간 통신을 할 때 사용할 TCP port, leaderPort 는 리더를 선출하는 데 사용할 TCP port 번호다. 이 때, client 는 clientPort 에 지정된 port 만 사용해도 되지만 앙상블 구성 서버들은 이 3개의 port 를 모두 사용 할 수 있어야 한다.&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;※ 모든 앙상블 서버의 dataDir 디렉토리에는 myid 라는 이름의 파일에 각 서버 ID 번호를 가지고 있어야하며 이를 통해 앙상블간 통신이 가능하다.&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;실제 운영환경에서는 3개의 독립적인 서버에 zookeeper 를 설치해 이를 구현하나, 테스트환경에서는 한대의 서버 또는 클라우드 instance 에 아래의 방법으로 구현 할 수 있다.&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1대의 EC2 에 3개의 node 로 앙상블 구현하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 아래와 같이 3개의 node 가 이용될 data 디렉토리, zoo.cfg, myid 를 구성해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749996710853&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각 node 가 사용할 data 디렉토리 생성, 필자는 /home/ec2-user/ 디렉토리에 생성한다.

$ mkdir zookeeper1
$ mkdir zookeeper2
$ mkdir zookeeper3

# 기본 설치에서 사용했던 zoo.cfg 를 각 디렉토리에 복사 후, 각 환경에 맞게 수정한다.

$ cp zoo.cfg ~/zookeeper1/zoo.cfg
$ cp zoo.cfg ~/zookeeper2/zoo.cfg
$ cp zoo.cfg ~/zookeeper3/zoo.cfg

# 각 노드의 zoo.cfg 를 수정시, 한대의 ec2 에서 모든 node 를 구성하려면 아래와 같이 dataDir, clientPort 및 통신 Port 가 달라야한다.

[zookeeper1 - zoo.cfg]

tickTime=2000
dataDir=/home/ec2-user/zookeeper1/data
clientPort=2181
initLimit=20
syncLimit=5
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

[zookeeper2 - zoo.cfg]

tickTime=2000
dataDir=/home/ec2-user/zookeeper2/data
clientPort=2182
initLimit=20
syncLimit=5
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

[zookeeper3 - zoo.cfg]

tickTime=2000
dataDir=/home/ec2-user/zookeeper3/data
clientPort=2183
initLimit=20
syncLimit=5
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

# 각 data directory 에 myid 파일 생성및 ID 를 순차적으로 1,2,3 을 부여 (이 번호는 사용자가 임의로 지정 가능)


$cat ~/zookeeper1/data/myid
1
$cat ~/zookeeper2/data/myid
2
$cat ~/zookeeper3/data/myid
3&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;해당 사항을 작성하면 이제 순차적으로 아래의 명령어들로 각 node 를 실행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749997073142&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$cd  ~/apache-zookeeper-3.8.4-bin/bin

$ sh zkServer.sh start /home/ec2-user/zookeeper1/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/zookeeper1/zoo.cfg
Starting zookeeper ... STARTED
$ sh zkServer.sh start /home/ec2-user/zookeeper2/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/zookeeper2/zoo.cfg
Starting zookeeper ... STARTED
$ sh zkServer.sh start /home/ec2-user/zookeeper3/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/zookeeper3/zoo.cfg
Starting zookeeper ... STARTED&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3개의 node 가 모두 실행되면 이전 게시글의 test 과정 처럼 telnet 을 통해 접속을 수행 및 Mode 가 leader 인지, follower 인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749997165268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ telnet localhost 2181
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 2024-02-12 22:16 UTC
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: follower
Node count: 5
Connection closed by foreign host.

$ telnet localhost 2182
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 2024-02-12 22:16 UTC
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: leader
Node count: 5
Proposal sizes last/min/max: -1/-1/-1
Connection closed by foreign host.

$ telnet localhost 2183
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 2024-02-12 22:16 UTC
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: follower
Node count: 5
Connection closed by foreign host.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Kafka, MSK, Kinesis/아키텍처 및 내부 구조</category>
      <category>EC2</category>
      <category>Ensemble</category>
      <category>ha</category>
      <category>kafka</category>
      <category>node</category>
      <category>quorum</category>
      <category>zookeeper</category>
      <category>앙상블</category>
      <category>쿼럼</category>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/213</guid>
      <comments>https://dbknowledge.tistory.com/213#entry213comment</comments>
      <pubDate>Sun, 15 Jun 2025 23:22:45 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB shell 사용방법 및 관련 명령어 - 1</title>
      <link>https://dbknowledge.tistory.com/212</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; MongoDB 를 사용하기 위해 필요한 MongoDB shell 사용방법 및 관련 명령어에 대하여 다룬다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p 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: #333333; text-align: start;&quot;&gt;&lt;span&gt;또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. (&lt;b&gt;[] 로 표기&lt;/b&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.&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;AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.&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;마지막으로 이 페이지는 EC2 Amazon Linux 2023 에 설치된 기본 MongoDB 를 사용한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;EC2 Amazon Linux 2023 에 MongoDB 를 설치하는 방법은 아래의 링크를 참조한다.&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;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/tutorial/install-mongodb-on-amazon/#std-label-install-mdb-community-amazon-linux&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/tutorial/install-mongodb-on-amazon/#std-label-install-mdb-community-amazon-linux&lt;/a&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MongoDB shell 을 통한 MongoDB 접속시 사용하는 기본 명령어&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MongoDB 는 아래의 명령어로 기본접속이 가능하다&lt;/p&gt;
&lt;pre id=&quot;code_1749876866176&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Mongo host(host명):30000(port, MongoDB 의 기본 port 는 27017 이다.)/test(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;- 위의 명령어 없이 기본 shell 로만 대화형 인터페이스로만 들어갈수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1749877174865&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mongo --nodb&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;- 위의 상태로만 접속을 해도 shell 에서 아래의과정으로 mongod 에 접속이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1749877536722&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; conn = new Mongo(&quot;127.0.0.1:27017&quot;)
mongodb://127.0.0.1:27017/?directConnection=true&amp;amp;serverSelectionTimeoutMS=2000
&amp;gt; db = conn.getDB(&quot;test&quot;)
test
test&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;- 다른 프로그램과 마찬가지로 MongoDB 도 help 를 사용 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1749879471346&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test&amp;gt; help

  Shell Help:

    log                                        'log.info(&amp;lt;msg&amp;gt;)': Write a custom info/warn/error/fatal/debug message to the log file
                                               'log.getPath()': Gets a path to the current log file

    use                                        Set current database
    show                                       'show databases'/'show dbs': Print a list of all available databases
                                               'show collections'/'show tables': Print a list of all collections for current database
                                               'show profile': Prints system.profile information
                                               'show users': Print a list of all users for current database
                                               'show roles': Print a list of all roles for current database
                                               'show log &amp;lt;type&amp;gt;': log for current connection, if type is not set uses 'global'
                                               'show logs': Print all logs
    exit                                       Quit the MongoDB shell with exit/exit()/.exit
    quit                                       Quit the MongoDB shell with quit/quit()
    Mongo                                      Create a new connection and return the Mongo object. Usage: new Mongo(URI, options [optional])
    connect                                    Create a new connection and return the Database object. Usage: connect(URI, username [optional], password [optional])
    it                                         result of the last line evaluated; use to further iterate
    version                                    Shell version
    load                                       Loads and runs a JavaScript file into the current shell environment
    enableTelemetry                            Enables collection of anonymous usage data to improve the mongosh CLI
    disableTelemetry                           Disables collection of anonymous usage data to improve the mongosh CLI
    passwordPrompt                             Prompts the user for a password
    sleep                                      Sleep for the specified number of milliseconds
    print                                      Prints the contents of an object to the output
    printjson                                  Alias for print()
    convertShardKeyToHashed                    Returns the hashed value for the input using the same hashing function as a hashed index.
    cls                                        Clears the screen like console.clear()
    isInteractive                              Returns whether the shell will enter or has entered interactive mode

  For more information on usage: https://mongodb.com/docs/manual/reference/method&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&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;- 추가로 help 옆에 명령어를 추가로 붙이면, DB 단위, collection 단위로 help 명령어를 확인 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1749880659191&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test&amp;gt; db.help()

  Database Class:

    getMongo                                   Returns the current database connection
    getName                                    Returns the name of the DB
    getCollectionNames                         Returns an array containing the names of all collections in the current database.
    getCollectionInfos                         Returns an array of documents with collection information, i.e. collection name and options, for the current database.
    runCommand                                 Runs an arbitrary command on the database.
    adminCommand                               Runs an arbitrary command against the admin database.
    aggregate                                  Runs a specified admin/diagnostic pipeline which does not require an underlying collection.
    getSiblingDB                               Returns another database without modifying the db variable in the shell environment.
    getCollection                              Returns a collection or a view object that is functionally equivalent to using the db.&amp;lt;collectionName&amp;gt;.
    dropDatabase                               Removes the current database, deleting the associated data files.
    createUser                                 Creates a new user for the database on which the method is run. db.createUser() returns a duplicate user error if the user already exists on the database.
    updateUser                                 Updates the user&amp;rsquo;s profile on the database on which you run the method. An update to a field completely replaces the previous field&amp;rsquo;s values. This includes updates to the user&amp;rsquo;s roles array.
    changeUserPassword                         Updates a user&amp;rsquo;s password. Run the method in the database where the user is defined, i.e. the database you created the user.
    logout                                     Ends the current authentication session. This function has no effect if the current session is not authenticated.
    dropUser                                   Removes the user from the current database.
    dropAllUsers                               Removes all users from the current database.
    auth                                       Allows a user to authenticate to the database from within the shell.
    grantRolesToUser                           Grants additional roles to a user.
    revokeRolesFromUser                        Removes a one or more roles from a user on the current database.
    getUser                                    Returns user information for a specified user. Run this method on the user&amp;rsquo;s database. The user must exist on the database on which the method runs.
    getUsers                                   Returns information for all the users in the database.
    createCollection                           Create new collection
    createEncryptedCollection                  Creates a new collection with a list of encrypted fields each with unique and auto-created data encryption keys (DEKs). This is a utility function that internally utilises ClientEnryption.createEncryptedCollection.
    createView                                 Create new view
    createRole                                 Creates a new role.
    updateRole                                 Updates the role&amp;rsquo;s profile on the database on which you run the method. An update to a field completely replaces the previous field&amp;rsquo;s values.
    dropRole                                   Removes the role from the current database.
    dropAllRoles                               Removes all roles from the current database.
    grantRolesToRole                           Grants additional roles to a role.
    revokeRolesFromRole                        Removes a one or more roles from a role on the current database.
    grantPrivilegesToRole                      Grants additional privileges to a role.
    revokePrivilegesFromRole                   Removes a one or more privileges from a role on the current database.
(...)

test&amp;gt; db.foo.help()

  Collection Class:

    aggregate                                  Calculates aggregate values for the data in a collection or a view.
    bulkWrite                                  Performs multiple write operations with controls for order of execution.
    count                                      Returns the count of documents that would match a find() query for the collection or view.
    countDocuments                             Returns the count of documents that match the query for a collection or view.
    deleteMany                                 Removes all documents that match the filter from a collection.
    deleteOne                                  Removes a single document from a collection.
    distinct                                   Finds the distinct values for a specified field across a single collection or view and returns the results in an array.
    estimatedDocumentCount                     Returns the count of all documents in a collection or view.
    find                                       Selects documents in a collection or view.
    findAndModify                              Modifies and returns a single document.
    findOne                                    Selects documents in a collection or view.
    renameCollection                           Renames a collection.
    findOneAndDelete                           Deletes a single document based on the filter and sort criteria, returning the deleted document.
    findOneAndReplace                          Modifies and replaces a single document based on the filter and sort criteria.
    findOneAndUpdate                           Updates a single document based on the filter and sort criteria.
    insert                                     Inserts a document or documents into a collection.
    insertMany                                 Inserts multiple documents into a collection.
    insertOne                                  Inserts a document into a collection.
    isCapped                                   Checks if a collection is capped
    remove                                     Removes documents from a collection.
    replaceOne                                 Replaces a single document within the collection based on the filter.
    update                                     Modifies an existing document or documents in a collection.
    updateMany                                 Updates all documents that match the specified filter for a collection.
    updateOne                                  Updates a single document within the collection based on the filter.
    compactStructuredEncryptionData            Compacts structured encryption data
    convertToCapped                            calls {convertToCapped:'coll', size:maxBytes}} command
    createIndexes                              Creates one or more indexes on a collection
    createIndex                                Creates one index on a collection
    ensureIndex                                Creates one index on a collection
    getIndexes                                 Returns an array that holds a list of documents that identify and describe the existing indexes on the collection.
    getIndexSpecs                              Alias for getIndexes. Returns an array that holds a list of documents that identify and describe the existing indexes on the collection.
    getIndices                                 Alias for getIndexes. Returns an array that holds a list of documents that identify and describe the existing indexes on the collection.
    getIndexKeys                               Return an array of key patterns for indexes defined on collection
    dropIndexes                                Drops the specified index or indexes (except the index on the _id field) from a collection.
    dropIndex                                  Drops or removes the specified index from a collection.
    totalIndexSize                             Reports the total size used by the indexes on a collection.
    reIndex                                    Rebuilds all existing indexes on a collection.
    getDB                                      Get current database.
    getMongo                                   Returns the Mongo object.
    dataSize                                   This method provides a wrapper around the size output of the collStats (i.e. db.collection.stats()) command.
    storageSize                                The total amount of storage allocated to this collection for document storage.
    totalSize                                  The total size in bytes of the data in the collection plus the size of every index on the collection.
    drop                                       Removes a collection or view from the database.
    exists                                     Returns collection infos if the collection exists or null otherwise.
    getFullName                                Returns the name of the collection prefixed with the database name.
    getName                                    Returns the name of the collection.
(...)&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;- Javascript file 을 만들어서 sh 명령문에 바로 적용 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1749881202771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#scrip1.js 파일 생성

print(&quot;I am script1.js&quot;)

# mongosh 에 바로 수행

$ mongosh script1.js
I am script1.js&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;- 아래와 같이 host,port,db 를 명시하여 적용 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1749881423373&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mongosh 127.0.0.1:27017/test script1.js
I am script1.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Shell 안에서 바로 파일을 load 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1749881914211&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;test&amp;gt; load(&quot;script1.js&quot;)
I am script1.js
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;- 스크립트를 만들 때, shell 에서 사용하는 명령어를 Javascript 로 변환 해야 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, show db 는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;javascript&lt;span&gt; 파일에서는 db.get.Mongo().getDBs() 로 변환해서 작성해야한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Javascript&lt;span&gt; &lt;/span&gt;&lt;/span&gt;파일이 위치한 경로와 실제 mongosh 를 수행하는 경로가 다를 시, 절대경로를 입력하면 다른 경로에 있는 Javascript&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 파일을 load 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1749882367360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test&amp;gt; load(&quot;/home/ec2-user/script1.js&quot;)
I am script1.js
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;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Linux 등에서 프로그램을 실행 시, 임의로 시작 문구를 만들 수 있는 것 처럼 MongoDB 도 시작 문구를 만들 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1749883184501&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ vi .mongoshrc.js

var compliment = [&quot;attractive&quot;, &quot;intelligent&quot;, &quot;like Batman&quot;];
var index = Math.floor(Math.random()*3);

print(&quot;Hello, you're looking particulary &quot;+compliment[index]+&quot; today!&quot;);

#작성 후 Mongosh 실행행

$ mongosh
Current Mongosh Log ID: 684d191a3094095ba169e327
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&amp;amp;serverSelectionTimeoutMS=2000&amp;amp;appName=mongosh+2.5.2
Using MongoDB:          8.0.10
Using Mongosh:          2.5.2

For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/

------
   The server generated these startup warnings when booting
   2025-06-14T05:33:28.794+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2025-06-14T05:33:28.794+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile
   2025-06-14T05:33:28.794+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile
   2025-06-14T05:33:28.794+00:00: We suggest setting the contents of sysfsFile to 0.
   2025-06-14T05:33:28.794+00:00: vm.max_map_count is too low
------

Hello, you're looking particulary attractive today!&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>
      <author>`O`</author>
      <guid isPermaLink="true">https://dbknowledge.tistory.com/212</guid>
      <comments>https://dbknowledge.tistory.com/212#entry212comment</comments>
      <pubDate>Sat, 14 Jun 2025 15:51:23 +0900</pubDate>
    </item>
  </channel>
</rss>