<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>하하호홓</title>
    <link>https://secr.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 30 Jul 2026 07:45:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>설 연수</managingEditor>
    <image>
      <title>하하호홓</title>
      <url>https://tistory1.daumcdn.net/tistory/912708/attach/0dd81ff4900b4b88a386b9c24277fd03</url>
      <link>https://secr.tistory.com</link>
    </image>
    <item>
      <title>패스트캠퍼스 The RED : 성능의 神: 궁극의 성능 튜닝과 트러블슈팅 by 이상민 완강 후기</title>
      <link>https://secr.tistory.com/613</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2024년, 패스트캠퍼스의 &quot;&lt;a href=&quot;https://fastcampus.co.kr/dev_red_lsm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;궁극의 성능 튜닝과 트러블슈팅&lt;/a&gt;&quot; 강의를 수강하면서 백엔드 엔지니어로서 한 단계 도약할 수 있었다. &lt;br /&gt;실무에서 맞닥뜨리는 다양한 성능 문제를 해결하기 위한 체계적인 접근법을 배우며 성장을 이루었다고 생각한다.&lt;br /&gt;어떤 부분에서 도움을 얻었는지 후기와 배운점, 앞으로의 목표를 적어보고자 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2016&quot; data-origin-height=&quot;1368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJMb3/btsLkb8UZX5/U6sganGzIxavKcbC4xAmmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJMb3/btsLkb8UZX5/U6sganGzIxavKcbC4xAmmK/img.png&quot; data-alt=&quot;강의와 함께 제공되는 교육과정 소개서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJMb3/btsLkb8UZX5/U6sganGzIxavKcbC4xAmmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJMb3%2FbtsLkb8UZX5%2FU6sganGzIxavKcbC4xAmmK%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;568&quot; height=&quot;385&quot; data-origin-width=&quot;2016&quot; data-origin-height=&quot;1368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;강의와 함께 제공되는 교육과정 소개서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4d1vp/btsLiHuE772/F104fydyNc3kpNipUoA5m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4d1vp/btsLiHuE772/F104fydyNc3kpNipUoA5m1/img.png&quot; data-alt=&quot;성능 지표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4d1vp/btsLiHuE772/F104fydyNc3kpNipUoA5m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4d1vp%2FbtsLiHuE772%2FF104fydyNc3kpNipUoA5m1%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;524&quot; height=&quot;2268&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;완강 후기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 강의는 성능 저하의 주요 병목 지점을 이해하고, 이를 해결하기 위한 다양한 툴과 방법론을 다룬다. 특히 JVM, GC, Scouter, Whatap 등 실무에서 자주 사용하는 도구들을 활용해 문제를 진단하고 최적화하는 방법을 심도 있게 배울 수 있다. 강사님이 제시한 실제 사례와 문제 해결 과정은 이론에만 그치지 않고 현업에 바로 적용할 수 있도록 구성되어 있는 점이 좋았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;강의 중 가장 인상 깊었던 부분은 성능 병목을 분석할 때 단순히 CPU나 메모리 사용량만 보는 것이 아니라, 서비스 특성에 맞는 지표를 정의하고 이를 바탕으로 문제를 해결하는 접근법이다. 이 과정을 통해 업무에서 어떤 문제를 우선적으로 해결해야 할지 우선순위를 명확히 설정할 수 있게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;수강 후 달라진 점&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;트러블슈팅:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; JVM 및 GC 로그를 분석하는 방법을 알게 되었고, 문제 원인을 파악할 수 있게 되었다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;시스템 성능 최적화:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 병목 구간을 찾아 개선할 수 있게 되었다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;성능 테스트:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; JMH와 Gatling을 활용해 사전 성능 테스트를 진행할 수 있게 되어, 배포 후 문제 발생 가능성을 줄일 수 있게 되었다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IFpnB/btsLkhOFHu3/csdJ39Hke9WRJ72JSEvNe1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IFpnB/btsLkhOFHu3/csdJ39Hke9WRJ72JSEvNe1/img.gif&quot; data-is-animation=&quot;true&quot; data-origin-height=&quot;267&quot; data-origin-width=&quot;480&quot; data-widthpercent=&quot;50&quot; height=&quot;236&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; id=&quot;kEditorPhotosEditingImage-3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IFpnB/btsLkhOFHu3/csdJ39Hke9WRJ72JSEvNe1/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIFpnB%2FbtsLkhOFHu3%2FcsdJ39Hke9WRJ72JSEvNe1%2Fimg.gif&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;480&quot; height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uhdRs/btsLjcASZNH/tVPbFJBqry2YV2ugP9Pf11/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uhdRs/btsLjcASZNH/tVPbFJBqry2YV2ugP9Pf11/img.gif&quot; style=&quot;width: 49.4186%;&quot; height=&quot;267&quot; data-widthpercent=&quot;50&quot; data-is-animation=&quot;true&quot; data-origin-height=&quot;267&quot; data-origin-width=&quot;480&quot; id=&quot;kEditorPhotosEditingImage-4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uhdRs/btsLjcASZNH/tVPbFJBqry2YV2ugP9Pf11/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuhdRs%2FbtsLjcASZNH%2FtVPbFJBqry2YV2ugP9Pf11%2Fimg.gif&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;480&quot; height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;성능확인, 성능 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;앞으로의 목표&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;강의에서 배운 내용을 실무에 적용 및 성능 개선 문화를 확산시키고자 한다. 그리고 강의에서 다룬 도구들을 활용하여 대규모 트래픽 처리와 관련된 프로젝트에서 성과를 내는 것이 목표이다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;본 게시물은 패스트캠퍼스 수강 후기 이벤트 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Back-End</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/613</guid>
      <comments>https://secr.tistory.com/613#entry613comment</comments>
      <pubDate>Sun, 15 Dec 2024 11:24:45 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 &amp;quot;백엔드 개발자를 위한 한 번에 끝내는 대용량 데이터 &amp;amp; 트래픽 처리&amp;quot; 완강 후기</title>
      <link>https://secr.tistory.com/612</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;대용량 트래픽을 다루려면, 대용량 트래픽을 다루는 기술을 알아야 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스에서 &quot;백엔드 개발자를 위한 한 번에 끝내는 대용량 데이터 &amp;amp; 트래픽 처리 강의&quot;를 완강했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1577&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJmjRT/btsBXJVjCjT/oi2Aa3fVvNV29aVNLeJJXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJmjRT/btsBXJVjCjT/oi2Aa3fVvNV29aVNLeJJXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJmjRT/btsBXJVjCjT/oi2Aa3fVvNV29aVNLeJJXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJmjRT%2FbtsBXJVjCjT%2Foi2Aa3fVvNV29aVNLeJJXk%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;1577&quot; height=&quot;883&quot; data-origin-width=&quot;1577&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSPUkV/btsBYcvOcxl/MR0biZkKTQI2I3hOzkYwyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSPUkV/btsBYcvOcxl/MR0biZkKTQI2I3hOzkYwyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSPUkV/btsBYcvOcxl/MR0biZkKTQI2I3hOzkYwyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSPUkV%2FbtsBYcvOcxl%2FMR0biZkKTQI2I3hOzkYwyK%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;1398&quot; height=&quot;890&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 이 강의는 대규모 트래픽를 다루는 회사에서 주로 사용하는 기술인 MySQL, Kafka, MongoDB, Redis를 다루며,&lt;br /&gt;이커머스 프로젝트를 통해 현업의 이커머스가 어떻게 구성되어있는지, 어떻게 일하는지 배울 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 현업에서 실제 대규모 트래픽을 다루는 강사님들로부터 이론부터 실습, 그리고 노하우까지 학습해볼 수 있었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl9zJM/btsBQrIhTDU/BgNNRjwxAH6VfihfQwd3Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl9zJM/btsBQrIhTDU/BgNNRjwxAH6VfihfQwd3Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl9zJM/btsBQrIhTDU/BgNNRjwxAH6VfihfQwd3Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl9zJM%2FbtsBQrIhTDU%2FBgNNRjwxAH6VfihfQwd3Kk%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;452&quot; height=&quot;587&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3vuhp/btsBT3GHryz/m1RIIqAGAydIF4saM3q3kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3vuhp/btsBT3GHryz/m1RIIqAGAydIF4saM3q3kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3vuhp/btsBT3GHryz/m1RIIqAGAydIF4saM3q3kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3vuhp%2FbtsBT3GHryz%2Fm1RIIqAGAydIF4saM3q3kk%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;434&quot; height=&quot;374&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 플랫폼, 특히 패캠에서도 여러 강의를 수강해봤지만 기술 4개를 묶어서 이 가격에 판매하는건 가성비가 미쳤다고 생각한다.&lt;br /&gt;(나는 시간이 돈이라고 생각하기 때문에, 삽질을 안하고 노하우를 습득했으니 돈을 벌었다고 본다..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 강의를 수강한 후, 단순 어플리케이션 기능구현에만 집중하는것이 아니라&lt;br /&gt;대규모트래픽이 들어올 수 있다고 가정하고 만약의 상황에 대비하는 마음가짐을 갖게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효율적인 데이터베이스 설계(MySQL), 유연함(MongoDB), 서버의 부하를 낮추는 방법(Redis), 트래픽 처리량을 늘리는법(Kafka)에 대한 자신감이 생겼고&lt;br /&gt;단순 기술습득뿐만 아니라, 왜 필요한지 왜 이것이 해결방안인지를 알게되어 다음세대의 기술이 등장해도 쉽게 습득해볼 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 기술이든 결국 문제가 있었고, 그 문제를 해결하기 위해 등장했기 마련인데, 이 강의를 통해서 문제해결에 대한 자신감을 얻은 느낌..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주니어건 시니어건 안봤다면 추천해주고 싶은 강의였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 개발자라면 최소 한번이상 봐야하는 강의라고 생각한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 게시물은 패스트캠퍼스 수강 후기 이벤트 참여를 위해 작성되었습니다.&lt;/p&gt;</description>
      <category>Back-End</category>
      <category>Kafka</category>
      <category>mongodb</category>
      <category>MYSQL</category>
      <category>Redis</category>
      <category>패스트캠퍼스</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/612</guid>
      <comments>https://secr.tistory.com/612#entry612comment</comments>
      <pubDate>Wed, 13 Dec 2023 21:02:28 +0900</pubDate>
    </item>
    <item>
      <title>ThreadLocal</title>
      <link>https://secr.tistory.com/611</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648356735567&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;스프링 핵심 원리 - 고급편 - 인프런 | 강의&quot; data-og-description=&quot;스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., - 강의 소개 | 인프런...&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard&quot; data-og-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qs1Cu/hyNPNEyJko/Z24kdxf7WD9acVtVRvTSl0/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/bBPVjI/hyNPLfGEOC/6AC0zdIviEGs3BroGt9kck/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/FKmHV/hyNPL03ut1/OEH9UEN9Y1J0qrTui0nhK0/img.png?width=850&amp;amp;height=600&amp;amp;face=0_0_850_600&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qs1Cu/hyNPNEyJko/Z24kdxf7WD9acVtVRvTSl0/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/bBPVjI/hyNPLfGEOC/6AC0zdIviEGs3BroGt9kck/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/FKmHV/hyNPL03ut1/OEH9UEN9Y1J0qrTui0nhK0/img.png?width=850&amp;amp;height=600&amp;amp;face=0_0_850_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스프링 핵심 원리 - 고급편 - 인프런 | 강의&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., - 강의 소개 | 인프런...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링프레임워크를 사용하다보면 멤버변수를 선언해서 여러메서드에서 활용하도록 구현하는 개발자들을 종종 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링빈은 싱글톤으로 생성되기때문에, &lt;br /&gt;멀티쓰레드 환경에서 싱글톤의 멤버변수를 각 쓰레드들이 쓰고 지우고 하다보면 데이터가 엉켜서 버그를 유발하는 원인이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ThreadLocal은 해당 쓰레드만이 접근할 수 있는 저장소를 말한다.&lt;br /&gt;각 쓰레드마다 별도의 내부 저장소를 갖게되며, 같은 인스턴스의 ThreadLocal 멤버변수를 다른 쓰레드가 접근해도 문제가 발생하지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6nzPc/btrxqaxfzDU/hTKJRkC0rYESVxKAgPT3nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6nzPc/btrxqaxfzDU/hTKJRkC0rYESVxKAgPT3nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6nzPc/btrxqaxfzDU/hTKJRkC0rYESVxKAgPT3nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6nzPc%2FbtrxqaxfzDU%2FhTKJRkC0rYESVxKAgPT3nk%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;1726&quot; height=&quot;852&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wtXRR/btrxu8SKer7/weQtBYHIKf7TMxNsTL61zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wtXRR/btrxu8SKer7/weQtBYHIKf7TMxNsTL61zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wtXRR/btrxu8SKer7/weQtBYHIKf7TMxNsTL61zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwtXRR%2Fbtrxu8SKer7%2FweQtBYHIKf7TMxNsTL61zk%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;1732&quot; height=&quot;858&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW9Cur/btrxt1TQbBR/xBSIbmpHqpzQdGXq1MOq1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW9Cur/btrxt1TQbBR/xBSIbmpHqpzQdGXq1MOq1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW9Cur/btrxt1TQbBR/xBSIbmpHqpzQdGXq1MOq1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW9Cur%2Fbtrxt1TQbBR%2FxBSIbmpHqpzQdGXq1MOq1K%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;1732&quot; height=&quot;854&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용방법&lt;/h3&gt;
&lt;pre id=&quot;code_1648356585402&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ThreadLocal&amp;lt;String&amp;gt; nameStore = new ThreadLocal&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 쓰레드가 ThreadLocal을 사용하고 난 뒤, 저장된값을 제거해주어야 한다.&lt;br /&gt;필히 remove를 호출하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1738&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sqB1z/btrxwAhas7f/s0FQUGnbdd6vmPdkNCL9G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sqB1z/btrxwAhas7f/s0FQUGnbdd6vmPdkNCL9G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sqB1z/btrxwAhas7f/s0FQUGnbdd6vmPdkNCL9G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsqB1z%2FbtrxwAhas7f%2Fs0FQUGnbdd6vmPdkNCL9G0%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;1738&quot; height=&quot;918&quot; data-origin-width=&quot;1738&quot; data-origin-height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csZBGT/btrxjoh6Cqz/KUKET82x5EtRuk44UsoBu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csZBGT/btrxjoh6Cqz/KUKET82x5EtRuk44UsoBu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csZBGT/btrxjoh6Cqz/KUKET82x5EtRuk44UsoBu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsZBGT%2Fbtrxjoh6Cqz%2FKUKET82x5EtRuk44UsoBu0%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;1734&quot; height=&quot;928&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfH6fc/btrxlDr2elN/1XP95Inpo10Rpbfdr4LjLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfH6fc/btrxlDr2elN/1XP95Inpo10Rpbfdr4LjLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfH6fc/btrxlDr2elN/1XP95Inpo10Rpbfdr4LjLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfH6fc%2FbtrxlDr2elN%2F1XP95Inpo10Rpbfdr4LjLk%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;1730&quot; height=&quot;918&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Back-End/Java</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/611</guid>
      <comments>https://secr.tistory.com/611#entry611comment</comments>
      <pubDate>Sun, 27 Mar 2022 13:52:38 +0900</pubDate>
    </item>
    <item>
      <title>MySQL-jOOQ BigDecimal 캐스팅 다루기</title>
      <link>https://secr.tistory.com/610</link>
      <description>&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;오류&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 사례&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적정금액일때는 잘 계산되던 프로그램이 숫자범위가 커지자 합계금액이 틀어지는 오류 발생.&lt;br /&gt;(숫자 한계범위 초과)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 원인파악&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형변환을 위해 BigDecimal로 타입캐스팅을 하고 있었음&lt;/p&gt;
&lt;pre id=&quot;code_1648281090049&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ENTITY.COL1.subtract(ENTITY.COL2))
  .cast(BigDecimal.class).as(&quot;잔액&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.cast(BigDecimal.class)으로 발생하는 문제: 숫자 범위초과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.cast(BigDecimal.class)코드 SQL문법으로 다음과 같이 렌더링된다.&lt;/p&gt;
&lt;pre id=&quot;code_1648281166022&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cast(? as decimal)&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;decimal&lt;span&gt;의 기본값은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;decimal(10)과 같다&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;cast(? as decimal(10))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 10자리 정수까지만 처리가 가능하다는 의미로 이해하면 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;100억 미만까지 표현가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MySQL피셜&lt;/p&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://dev.mysql.com/doc/refman/8.0/en/precision-math-decimal-characteristics.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/precision-math-decimal-characteristics.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html&quot;&gt;https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html&lt;/a&gt;&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;span&gt;10자리를 초과하는 정수&lt;/span&gt;의 경우, &lt;span&gt;9999999999&lt;/span&gt;가 리턴된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;	/**
	 |------------------|------------------|-------------------|-------------------|--------------------------|
	 |?                 |?                 |cast(? as decimal) |cast(? as decimal) |cast(? as decimal(30, 5)) |
	 |------------------|------------------|-------------------|-------------------|--------------------------|
	 |10000000000.11111 |10000000000.11111 |9999999999         |9999999999         |10000000000.11111         |
	 |------------------|------------------|-------------------|-------------------|--------------------------|
	 * */
	@Test
	void decimalCast() {
		final BigDecimal bigDecimalValue = BigDecimal.valueOf(1_00000_00000.11111); // 11자리 정수 + 5자리 소수점
		final double doubleValue = 1_00000_00000.11111;// 11자리 정수 + 5자리 소수점
		final var fetchOne = dslContext.select(
				DSL.value(bigDecimalValue),
				DSL.value(doubleValue).coerce(BigDecimal.class),
				DSL.value(bigDecimalValue).cast(BigInteger.class),
				DSL.value(bigDecimalValue).cast(BigDecimal.class),
				DSL.value(bigDecimalValue).cast(SQLDataType.DECIMAL.precision(30, 5))
		).fetchOne();

		// 형변환 X
		assertThat(fetchOne.component1())
				.as(&quot;캐스팅 안한 결과: 값이 그대로 출력된다.&quot;)
				.isEqualByComparingTo(bigDecimalValue);

		// decimal의 default: decimal(10)
		assertThat(fetchOne.component3())
				.as(&quot;BigInteger =&amp;gt; cast(? as decimal): 소수점이 버려지고, 10자리 정수로 값이 변경된다.&quot;)
				.isEqualByComparingTo(BigInteger.valueOf((long) 9999999999.0));
		assertThat(fetchOne.component4())
				.as(&quot;BigDecimal =&amp;gt; cast(? as decimal): 소수점이 버려지고, 10자리 정수로 값이 변경된다.&quot;)
				.isEqualByComparingTo(BigDecimal.valueOf((long) 9999999999.0));
	}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DataType의 정수,소수점 범위 지정해서 캐스팅하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BigDecimal의 경우, 캐스팅할때 DataType으로 범위를 설정해야 오류를 방지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;// &amp;lt;Z&amp;gt; Field&amp;lt;Z&amp;gt; cast(DataType&amp;lt;Z&amp;gt; type);
DSL.value(bigDecimalValue).cast(SQLDataType.DECIMAL.precision(30, 5))&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;	/**
	 |------------------|------------------|-------------------|-------------------|--------------------------|
	 |?                 |?                 |cast(? as decimal) |cast(? as decimal) |cast(? as decimal(30, 5)) |
	 |------------------|------------------|-------------------|-------------------|--------------------------|
	 |10000000000.11111 |10000000000.11111 |9999999999         |9999999999         |10000000000.11111         |
	 |------------------|------------------|-------------------|-------------------|--------------------------|
	 * */
	@Test
	void decimalCast() {
		final BigDecimal bigDecimalValue = BigDecimal.valueOf(1_00000_00000.11111); // 11자리 정수 + 5자리 소수점
		final double doubleValue = 1_00000_00000.11111;// 11자리 정수 + 5자리 소수점
		final var fetchOne = dslContext.select(
				DSL.value(bigDecimalValue),
				DSL.value(doubleValue).coerce(BigDecimal.class),
				DSL.value(bigDecimalValue).cast(BigInteger.class),
				DSL.value(bigDecimalValue).cast(BigDecimal.class),
				DSL.value(bigDecimalValue).cast(SQLDataType.DECIMAL.precision(30, 5))
		).fetchOne();

		// 형변환 X
		assertThat(fetchOne.component1())
				.as(&quot;캐스팅 안한 결과: 값이 그대로 출력된다.&quot;)
				.isEqualByComparingTo(bigDecimalValue);
				
		// cast할때, 정석
		assertThat(fetchOne.component5())
				.as(&quot;DECIMAL.precision(30, 5) =&amp;gt; cast(? as decimal(30, 5)): 자리수를 초과하지 않았기때문에 그대로 출력된다.&quot;)
				.isEqualByComparingTo(bigDecimalValue);
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인의견: 캐스팅하는것이 성능저하에 영향이 조금이나마 영향이 있을것 같아 꺼려졌다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;캐스팅처리를 안하면 되는거아냐?: &lt;span&gt;coerce&lt;/span&gt;로 SQL(cast) 렌더링 없이 제네릭 형변환하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jOOQ에서 JAVA컴파일단 형변환만 수행하는 메서드가 존재했다: &lt;span&gt;coerce(Class&amp;lt;Z&amp;gt; type)&lt;br /&gt;&lt;/span&gt;제네릭 타입은 변환하지만, SQL 렌더링(cast)은 하지않음&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// Field&amp;lt;Z&amp;gt; coerce(Class&amp;lt;Z&amp;gt; type);
@Test
void decimalCast() {
	final BigDecimal bigDecimalValue = BigDecimal.valueOf(1_00000_00000.11111); // 11자리 정수 + 5자리 소수점
	final double doubleValue = 1_00000_00000.11111;// 11자리 정수 + 5자리 소수점
	final var fetchOne = dslContext.select(
			DSL.value(bigDecimalValue),
			DSL.value(doubleValue).coerce(BigDecimal.class),
			DSL.value(bigDecimalValue).cast(BigInteger.class),
			DSL.value(bigDecimalValue).cast(BigDecimal.class),
			DSL.value(bigDecimalValue).cast(SQLDataType.DECIMAL.precision(30, 5))
	).fetchOne();

	// coerce: 타입 강제 형변환(SQL 렌더링 X)
	assertThat(fetchOne.component2())
			.as(&quot;캐스팅 안함&quot;)
			.isEqualByComparingTo(bigDecimalValue);
}&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;a href=&quot;https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/datatype-coercions/&quot;&gt;https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/datatype-coercions/&lt;/a&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;그러니까.. 형변환을 안하면 되는것 아니냐고.. 왜 해야되는데?: jOOQ클래스 Long필드를 BigDecimal로 바꾸기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜 형변환이 필요했을까?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;형변환이 필요없었던 jOOQ Class 필드&lt;/li&gt;
&lt;li&gt;BigDecimal을 BigDecimal과 연산할때는 형변환이 필요하지 않았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;public class ENTITY extends TableImpl&amp;lt;ENTITY_RECORD&amp;gt; {
  // ...
  public final TableField&amp;lt;ENTITY_RECORD, BigDecimal&amp;gt; SUM_AMT = createField(DSL.name(&quot;SUM_AMT&quot;), SQLDataType.DECIMAL(15, 3).defaultValue(DSL.inline(&quot;0.000&quot;, SQLDataType.DECIMAL)), this, &quot;&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형변환이 필요했던 jOOQ Class 필드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필드의 제네릭 타입이 BigDecimal이 아님.&lt;br /&gt;Long을 BigDecimal과 연산하려니 형변환이 필요했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;public class ENTITY extends TableImpl&amp;lt;ENTITY_RECORD&amp;gt; {
    // ...
    public final TableField&amp;lt;ENTITY_RECORD, Long&amp;gt; DR_AMT = createField(DSL.name(&quot;DR_AMT&quot;), SQLDataType.BIGINT.nullable(false).defaultValue(DSL.inline(&quot;0&quot;, SQLDataType.BIGINT)), this, &quot;&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;결론: decimal(numeric)의 소수점 유무가 jOOQ 필드타입에 영향을 미친것 같다.&lt;/b&gt;&lt;br /&gt;(왜 BigInteger가 아니고 Long일까..?)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;다른컬럼들처럼 AMT, QTY 컬럼은 그냥 BigDecimal로 다룰래&lt;/li&gt;
&lt;li&gt;jOOQ Forced types으로 타입을 지정한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jOOQ Forced types Manual: &lt;a href=&quot;https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types/&quot;&gt;https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;gradle.build&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;jooq {
    // ...
    project(sourceSets.main) {
        // ...
        generator {
            // ...
            database {
                // ...
                forcedTypes {
                    forcedType {
                        // Specify any data type that is supported in your database, or if unsupported, 
                        // a type from org.jooq.impl.SQLDataType
                        name = 'DECIMAL'
                        
                        // A Java regex matching data types to be forced to have this type.
                        includeTypes = '.*' 
                        
                        // A Java regex matching fully-qualified columns, attributes, parameters. Use the pipe to separate several expressions.
                        includeExpression = '.*AMT|.*PRICE|.*QTY'
                        
                        // Force a type on ALL or specific object types, including 
                        // ATTRIBUTE, COLUMN, ELEMENT, PARAMETER, SEQUENCE
                        objectType = 'COLUMN'
                    }
                }
            }
            // ...
        }
    }
    system(sourceSets.main) {
        // ...
        generator {
            // ...
            database {
                // ...
                forcedTypes {
                    forcedType {
                        name = 'DECIMAL'
                        includeTypes = '.*'
                        includeExpression = '.*AMT|.*PRICE|.*QTY'
                        objectType = 'COLUMN'
                    }
                }
            }
            // ...
        }
    }
}&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;소수점 없는 decimal타입을 BigDecimal로 다루는게 좋을까?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일단, 기존에는 Long이었다.&lt;/li&gt;
&lt;li&gt;BigDecimal보다 BigInteger가 더 적합한것 같다는 생각도 든다.&lt;br /&gt;(일단 생각만 하기로함&amp;hellip;)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BigInteger로 다룰 경우,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 BigDecimal처리를 BigInteger으로 변경해야 함.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BigDecimal.ZERO &amp;rarr; BigInteger.ZERO&lt;/li&gt;
&lt;li&gt;BigInteger와 BigDecimal 연산 시(+-*/), 타입으로인한 컴파일오류가 발생
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;coerce활용 필요.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;응답GQL, DTO까지 변환해야 완전한 BigInteger적용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;/**
 |------------------|------------------|-------------------|-------------------|--------------------------|
 |?                 |?                 |cast(? as decimal) |cast(? as decimal) |cast(? as decimal(30, 5)) |
 |------------------|------------------|-------------------|-------------------|--------------------------|
 |10000000000.11111 |10000000000.11111 |9999999999         |9999999999         |10000000000.11111         |
 |------------------|------------------|-------------------|-------------------|--------------------------|
 * */
@Test
void decimalCast() {
	final BigDecimal bigDecimalValue = BigDecimal.valueOf(1_00000_00000.11111); // 11자리 정수 + 5자리 소수점
	final double doubleValue = 1_00000_00000.11111;// 11자리 정수 + 5자리 소수점
	final var fetchOne = dslContext.select(
			DSL.value(bigDecimalValue),
			DSL.value(doubleValue).coerce(BigDecimal.class),
			DSL.value(bigDecimalValue).cast(BigInteger.class),
			DSL.value(bigDecimalValue).cast(BigDecimal.class),
			DSL.value(bigDecimalValue).cast(SQLDataType.DECIMAL.precision(30, 5))
	).fetchOne();

	// 형변환 X
	assertThat(fetchOne.component1())
			.as(&quot;캐스팅 안한 결과: 값이 그대로 출력된다.&quot;)
			.isEqualByComparingTo(bigDecimalValue);

	// coerce: 타입 강제 형변환(SQL 렌더링 X) https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/datatype-coercions/
	assertThat(fetchOne.component2())
			.as(&quot;캐스팅 안함&quot;)
			.isEqualByComparingTo(bigDecimalValue);

	// decimal의 default: decimal(10)
	// https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html
	assertThat(fetchOne.component3())
			.as(&quot;BigInteger =&amp;gt; cast(? as decimal): 소수점이 버려지고, 10자리 정수로 값이 변경된다.&quot;)
			.isEqualByComparingTo(BigInteger.valueOf((long) 9999999999.0));
	assertThat(fetchOne.component4())
			.as(&quot;BigDecimal =&amp;gt; cast(? as decimal): 소수점이 버려지고, 10자리 정수로 값이 변경된다.&quot;)
			.isEqualByComparingTo(BigDecimal.valueOf((long) 9999999999.0));

	// cast할때, 정석
	assertThat(fetchOne.component5())
			.as(&quot;DECIMAL.precision(30, 5) =&amp;gt; cast(? as decimal(30, 5)): 자리수를 초과하지 않았기때문에 그대로 출력된다.&quot;)
			.isEqualByComparingTo(bigDecimalValue);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Back-End/Java</category>
      <category>BigDecimal</category>
      <category>jOOQ</category>
      <category>MYSQL</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/610</guid>
      <comments>https://secr.tistory.com/610#entry610comment</comments>
      <pubDate>Sat, 26 Mar 2022 16:50:37 +0900</pubDate>
    </item>
    <item>
      <title>https로 npm start</title>
      <link>https://secr.tistory.com/603</link>
      <description>&lt;p&gt;MacOS&lt;/p&gt;
&lt;pre id=&quot;code_1601533463283&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTPS=true npm start&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Window&lt;/p&gt;
&lt;pre id=&quot;code_1601533515832&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;set HTTPS=true &amp;amp;&amp;amp; npm start&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Front-End</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/603</guid>
      <comments>https://secr.tistory.com/603#entry603comment</comments>
      <pubDate>Thu, 1 Oct 2020 15:24:29 +0900</pubDate>
    </item>
    <item>
      <title>[Git] git branch 명령어 쳤을때 별도의 viewer가 뜨는문제 해결</title>
      <link>https://secr.tistory.com/597</link>
      <description>&lt;pre id=&quot;code_1593068977084&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global pager.branch false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/48341920/git-branch-command-behaves-like-less/48342309&quot;&gt;https://stackoverflow.com/questions/48341920/git-branch-command-behaves-like-less/48342309&lt;/a&gt;&lt;/p&gt;</description>
      <category>Other/Git</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/597</guid>
      <comments>https://secr.tistory.com/597#entry597comment</comments>
      <pubDate>Thu, 25 Jun 2020 16:10:50 +0900</pubDate>
    </item>
    <item>
      <title>인텔리J Entity Class에 @Table(name), @Column(name) 빨간줄 끄는방법</title>
      <link>https://secr.tistory.com/590</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;Preferences &amp;gt; Editor &amp;gt; Inspections &amp;gt; JPA의 Unresolved database references in annotations 체크 해제 후 OK&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Back-End/Java</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/590</guid>
      <comments>https://secr.tistory.com/590#entry590comment</comments>
      <pubDate>Fri, 12 Jun 2020 16:45:12 +0900</pubDate>
    </item>
    <item>
      <title>[Gradle] SpringBoot 실행이안될때</title>
      <link>https://secr.tistory.com/565</link>
      <description>&lt;pre id=&quot;code_1590063704799&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Unnecessarily replacing a task that does not exist is not supported.
Use create() or register() directly instead.  
You attempted to replace a task named 'Application.main()', but there is no existing task with that name.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-12-07 오전 1.01.02.png&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vmvJt/btqEjqUXBmt/Ozk133paKnD5kRGM1brZCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vmvJt/btqEjqUXBmt/Ozk133paKnD5kRGM1brZCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vmvJt/btqEjqUXBmt/Ozk133paKnD5kRGM1brZCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvmvJt%2FbtqEjqUXBmt%2FOzk133paKnD5kRGM1brZCk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-12-07 오전 1.01.02.png&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;1436&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Back-End/Spring</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/565</guid>
      <comments>https://secr.tistory.com/565#entry565comment</comments>
      <pubDate>Thu, 21 May 2020 21:22:05 +0900</pubDate>
    </item>
    <item>
      <title>[JWT] 토큰(Token) 기반 인증에 대한 소개</title>
      <link>https://secr.tistory.com/559</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://velopert.com/2350&quot;&gt;https://velopert.com/2350&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1589943784203&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[JWT] 토큰(Token) 기반 인증에 대한 소개 | VELOPERT.LOG&quot; data-og-description=&quot;소개 토큰(Token) 기반 인증은 모던 웹서비스에서 정말 많이 사용되고 있습니다. 여러분이 API 를 사용하는 웹서비스를 개발한다면, 토큰을 사용하여 유저들의 인증작업을 처리하는것이 가장 좋은&quot; data-og-host=&quot;velopert.com&quot; data-og-source-url=&quot;https://velopert.com/2350&quot; data-og-url=&quot;https://velopert.com/2350&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JHPa1/hyF7mUJuW5/nqg2OhAoLwO1zMwQrUgYPK/img.jpg?width=740&amp;amp;height=250&amp;amp;face=0_0_740_250,https://scrap.kakaocdn.net/dn/bAmEd1/hyF6nAVcX3/OJ55unh3nU8DD8xcFW525k/img.jpg?width=740&amp;amp;height=250&amp;amp;face=0_0_740_250,https://scrap.kakaocdn.net/dn/bbvawl/hyF7tM5pjt/u2H6Zymmwc7GSACX4UX5tk/img.png?width=473&amp;amp;height=493&amp;amp;face=0_0_473_493&quot;&gt;&lt;a href=&quot;https://velopert.com/2350&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velopert.com/2350&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JHPa1/hyF7mUJuW5/nqg2OhAoLwO1zMwQrUgYPK/img.jpg?width=740&amp;amp;height=250&amp;amp;face=0_0_740_250,https://scrap.kakaocdn.net/dn/bAmEd1/hyF6nAVcX3/OJ55unh3nU8DD8xcFW525k/img.jpg?width=740&amp;amp;height=250&amp;amp;face=0_0_740_250,https://scrap.kakaocdn.net/dn/bbvawl/hyF7tM5pjt/u2H6Zymmwc7GSACX4UX5tk/img.png?width=473&amp;amp;height=493&amp;amp;face=0_0_473_493');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[JWT] 토큰(Token) 기반 인증에 대한 소개 | VELOPERT.LOG&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;소개 토큰(Token) 기반 인증은 모던 웹서비스에서 정말 많이 사용되고 있습니다. 여러분이 API 를 사용하는 웹서비스를 개발한다면, 토큰을 사용하여 유저들의 인증작업을 처리하는것이 가장 좋은&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;velopert.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front-End/JavaScript</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/559</guid>
      <comments>https://secr.tistory.com/559#entry559comment</comments>
      <pubDate>Wed, 20 May 2020 12:01:54 +0900</pubDate>
    </item>
    <item>
      <title>AWS EC2에 카프카 클러스터 구성시 에러</title>
      <link>https://secr.tistory.com/554</link>
      <description>&lt;p&gt;요약 : 돈을 아끼기위해 프리티어스펙의 EC2로 인스턴스를 생성했을경우 메모리가 1G 할당된다. &lt;br /&gt;문제는 카프카 브로커 설치 이후 주키퍼를 실행할때 512MB를 먹고 시작하며.. 이후 카프카가 1G를 먹고 실행하려던 중 에러가 발생한다. &lt;br /&gt;금액을 지불하고 인스턴스 스펙을 올리던가 JVM메모리를 조정하여야 한다.&lt;/p&gt;
&lt;h3&gt;에러 로그&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ kafka-topics --zookeeper ...생략... --create --topic first-test --partitions 3 --replication-factor 3

OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Error while executing topic command : Replication factor: 3 larger than available brokers: 0.
[2020-05-13 09:24:03,192] ERROR org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 0.
 (kafka.admin.TopicCommand$)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;상태확인&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Active: failed
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ sudo systemctl status confluent-kafka
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;● confluent-kafka.service - Apache Kafka - broker&lt;br /&gt;Loaded: loaded (/usr/lib/systemd/system/confluent-kafka.service; disabled; vendor preset: disabled)&lt;br /&gt;Active: failed (Result: exit-code) since Wed 2020-05-13 09:26:45 UTC; 5s ago&lt;br /&gt;Docs: &lt;a href=&quot;http://docs.confluent.io/&quot;&gt;http://docs.confluent.io/&lt;/a&gt;&lt;br /&gt;Process: 1772 ExecStart=/usr/bin/kafka-server-start /etc/kafka/server.properties (code=exited, status=1/FAILURE)&lt;br /&gt;Main PID: 1772 (code=exited, status=1/FAILURE)&lt;/p&gt;
&lt;p&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal kafka-server-start[1772]: OpenJDK 64-Bit Server VM warning: If the number of processors is ex...ads=N&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal kafka-server-start[1772]: OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000...o=12)&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal kafka-server-start[1772]: #&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal kafka-server-start[1772]: # There is insufficient memory for the Java Runtime Environment to ...inue.&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal kafka-server-start[1772]: # Native memory allocation (mmap) failed to map 1073741824 bytes fo...mory.&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal kafka-server-start[1772]: # An error report file with more information is saved as:&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal kafka-server-start[1772]: # /tmp/hs_err_pid1772.log&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal systemd[1]: confluent-kafka.service: main process exited, code=exited, status=1/FAILURE&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal systemd[1]: Unit confluent-kafka.service entered failed state.&lt;br /&gt;May 13 09:26:45 ip-172-31-42-242.ap-northeast-2.compute.internal systemd[1]: confluent-kafka.service failed.&lt;/p&gt;
&lt;h1&gt;/tmp/hs_err_pid1772.log 파일을 확인해보니 메모리 할당 오류인 것을 확인.&lt;/h1&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;

### 메모리 수정&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;카프카 메모리 수정.&lt;/h1&gt;
&lt;p&gt;$ sudo vi /usr/bin/kafka-server-start&lt;/p&gt;
&lt;p&gt;if [ &quot;x$KAFKA_HEAP_OPTS&quot; = &quot;x&quot; ]; then&lt;br /&gt;# export KAFKA_HEAP_OPTS=&quot;-Xmx1G -Xms1G&quot;&lt;br /&gt;export KAFKA_HEAP_OPTS=&quot;-Xmx256M -Xms128M&quot;&lt;br /&gt;fi&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;주키퍼 메모리 수정&lt;/h1&gt;
&lt;p&gt;$ sudo vi /usr/bin/zookeeper-server-start&lt;/p&gt;
&lt;p&gt;if [ &quot;x$KAFKA_HEAP_OPTS&quot; = &quot;x&quot; ]; then&lt;br /&gt;# export KAFKA_HEAP_OPTS=&quot;-Xmx512M -Xms512M&quot;&lt;br /&gt;export KAFKA_HEAP_OPTS=&quot;-Xmx256M -Xms128M&quot;&lt;br /&gt;fi&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;
### 재시작&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;재시작&lt;/h1&gt;
&lt;p&gt;sudo systemctl restart confluent-zookeeper&lt;br /&gt;sudo systemctl restart confluent-kafka&lt;/p&gt;
&lt;h1&gt;상태확인&lt;/h1&gt;
&lt;p&gt;sudo systemctl status confluent-zookeeper&lt;br /&gt;sudo systemctl status confluent-kafka&lt;br /&gt;```&lt;/p&gt;</description>
      <category>Dev-Ops/Linux, Cloud</category>
      <author>설 연수</author>
      <guid isPermaLink="true">https://secr.tistory.com/554</guid>
      <comments>https://secr.tistory.com/554#entry554comment</comments>
      <pubDate>Wed, 13 May 2020 19:04:36 +0900</pubDate>
    </item>
  </channel>
</rss>