<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>정수의 코닥코닥</title>
    <link>https://integer-ji.tistory.com/</link>
    <description>초보 개발자의 코닥코닥</description>
    <language>ko</language>
    <pubDate>Fri, 10 Jul 2026 05:19:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>integerJI</managingEditor>
    <image>
      <title>정수의 코닥코닥</title>
      <url>https://tistory1.daumcdn.net/tistory/3352469/attach/430e036c4b304ee4ad8076e24776ff6a</url>
      <link>https://integer-ji.tistory.com</link>
    </image>
    <item>
      <title>오픈클로(OpenClaw) 왜 쓰는가?</title>
      <link>https://integer-ji.tistory.com/454</link>
      <description>&lt;h1 data-end=&quot;126&quot; data-start=&quot;100&quot; data-section-id=&quot;hr0h6y&quot;&gt;오픈클로(OpenClaw) 왜 써야 할까&lt;/h1&gt;
&lt;p data-end=&quot;154&quot; data-start=&quot;127&quot; data-ke-size=&quot;size16&quot;&gt;GPT vs Claude, 비용과 운영 구조 정리&lt;/p&gt;
&lt;p data-end=&quot;251&quot; data-start=&quot;211&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;305&quot; data-start=&quot;253&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 오픈클로를 사용하면서 정리한 글이다.&lt;br /&gt;비전공자 기준으로 최대한 쉽게 풀어봤다.&lt;/p&gt;
&lt;p data-end=&quot;305&quot; data-start=&quot;253&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;365&quot; data-start=&quot;307&quot; data-ke-size=&quot;size16&quot;&gt;정리 글이라 틀린 부분이 있을 수도 있다.&lt;br /&gt;잘못된 내용이 있다면 댓글로 알려주면 확인 후 반영하겠다.&lt;/p&gt;
&lt;hr data-end=&quot;370&quot; data-start=&quot;367&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;384&quot; data-start=&quot;372&quot; data-section-id=&quot;1t6f4ut&quot; data-ke-size=&quot;size26&quot;&gt;오픈클로가 뭐냐면&lt;/h2&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;386&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로는 AI가 컴퓨터를 직접 조작하게 만드는 시스템이다.&lt;/p&gt;
&lt;p data-end=&quot;428&quot; data-start=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;489&quot; data-start=&quot;429&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;447&quot; data-start=&quot;429&quot; data-section-id=&quot;1t483ct&quot;&gt;검색해서 정보를 정리해준다&lt;/li&gt;
&lt;li data-end=&quot;467&quot; data-start=&quot;448&quot; data-section-id=&quot;1qp3310&quot;&gt;웹사이트에 접속해서 클릭한다&lt;/li&gt;
&lt;li data-end=&quot;489&quot; data-start=&quot;468&quot; data-section-id=&quot;s3nxxw&quot;&gt;글을 작성하고 전송까지 수행한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;520&quot; data-start=&quot;491&quot; data-ke-size=&quot;size16&quot;&gt;이 모든 과정을 사람이 아니라 AI가 대신 처리한다.&lt;/p&gt;
&lt;p data-end=&quot;562&quot; data-start=&quot;522&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;AI를 사용하는 수준이 아니라&lt;br /&gt;AI에게 일을 맡기는 구조다.&lt;/p&gt;
&lt;hr data-end=&quot;567&quot; data-start=&quot;564&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;580&quot; data-start=&quot;569&quot; data-section-id=&quot;lg2ypq&quot; data-ke-size=&quot;size26&quot;&gt;언제 쓰면 좋냐&lt;/h2&gt;
&lt;p data-end=&quot;607&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로는 아래 같은 상황에서 특히 유용하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;725&quot; data-start=&quot;609&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;629&quot; data-start=&quot;609&quot; data-section-id=&quot;1yhzwue&quot;&gt;반복적인 웹 작업이 많은 경우&lt;/li&gt;
&lt;li data-end=&quot;655&quot; data-start=&quot;630&quot; data-section-id=&quot;j0fp35&quot;&gt;매일 같은 데이터를 수집해야 하는 경우&lt;/li&gt;
&lt;li data-end=&quot;686&quot; data-start=&quot;656&quot; data-section-id=&quot;1781obu&quot;&gt;여러 단계를 거치는 작업을 자동화하고 싶은 경우&lt;/li&gt;
&lt;li data-end=&quot;725&quot; data-start=&quot;687&quot; data-section-id=&quot;1xei7hf&quot;&gt;AI를 &amp;ldquo;답변 도구&amp;rdquo;가 아니라 &amp;ldquo;실행 도구&amp;rdquo;로 쓰고 싶은 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;730&quot; data-start=&quot;727&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;743&quot; data-start=&quot;732&quot; data-section-id=&quot;lp05s8&quot; data-ke-size=&quot;size26&quot;&gt;문제는 비용이다&lt;/h2&gt;
&lt;p data-end=&quot;783&quot; data-start=&quot;745&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로를 사용하려면&lt;br /&gt;GPT나 Claude 같은 모델이 필요하다.&lt;/p&gt;
&lt;p data-end=&quot;812&quot; data-start=&quot;785&quot; data-ke-size=&quot;size16&quot;&gt;기존에는 대부분 토큰 기반 과금으로 운영했다.&lt;/p&gt;
&lt;p data-end=&quot;821&quot; data-start=&quot;814&quot; data-ke-size=&quot;size16&quot;&gt;이 구조는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;872&quot; data-start=&quot;822&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;845&quot; data-start=&quot;822&quot; data-section-id=&quot;10l3cl9&quot;&gt;요청을 보낼 때마다 비용이 발생한다&lt;/li&gt;
&lt;li data-end=&quot;872&quot; data-start=&quot;846&quot; data-section-id=&quot;nrsaqq&quot;&gt;사용량이 많아질수록 비용이 계속 증가한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;902&quot; data-start=&quot;874&quot; data-ke-size=&quot;size16&quot;&gt;특히 자동화를 실행하면 비용이 빠르게 누적된다.&lt;/p&gt;
&lt;p data-end=&quot;936&quot; data-start=&quot;904&quot; data-ke-size=&quot;size16&quot;&gt;실제로 사용해보면 생각보다 훨씬 많은 비용이 발생한다.&lt;/p&gt;
&lt;p data-end=&quot;972&quot; data-start=&quot;938&quot; data-ke-size=&quot;size16&quot;&gt;정리하면&lt;br /&gt;오픈클로의 가장 큰 진입 장벽은 &amp;ldquo;비용 구조&amp;rdquo;다.&lt;/p&gt;
&lt;hr data-end=&quot;977&quot; data-start=&quot;974&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;998&quot; data-start=&quot;979&quot; data-section-id=&quot;4enljh&quot; data-ke-size=&quot;size26&quot;&gt;GPT vs Claude 비교&lt;/h2&gt;
&lt;h3 data-end=&quot;1010&quot; data-start=&quot;1000&quot; data-section-id=&quot;ercgjg&quot; data-ke-size=&quot;size23&quot;&gt;Claude&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1065&quot; data-start=&quot;1012&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1039&quot; data-start=&quot;1012&quot; data-section-id=&quot;1j8rc0k&quot;&gt;자동화 연동 시 토큰 기반 과금이 필요하다&lt;/li&gt;
&lt;li data-end=&quot;1065&quot; data-start=&quot;1040&quot; data-section-id=&quot;fwbdlm&quot;&gt;사용량이 많아지면 요청 제한이 발생한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1071&quot; data-start=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1107&quot; data-start=&quot;1072&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1085&quot; data-start=&quot;1072&quot; data-section-id=&quot;zesuee&quot;&gt;결과 품질이 높다&lt;/li&gt;
&lt;li data-end=&quot;1107&quot; data-start=&quot;1086&quot; data-section-id=&quot;4i4y4o&quot;&gt;비교적 안정적인 응답을 제공한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1113&quot; data-start=&quot;1109&quot; data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1149&quot; data-start=&quot;1114&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1134&quot; data-start=&quot;1114&quot; data-section-id=&quot;ob9gmt&quot;&gt;장시간 자동화 운영에 불리하다&lt;/li&gt;
&lt;li data-end=&quot;1149&quot; data-start=&quot;1135&quot; data-section-id=&quot;gg7egt&quot;&gt;비용 예측이 어렵다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1154&quot; data-start=&quot;1151&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1168&quot; data-start=&quot;1156&quot; data-section-id=&quot;1o91xak&quot; data-ke-size=&quot;size23&quot;&gt;GPT (추천)&lt;/h3&gt;
&lt;p data-end=&quot;1206&quot; data-start=&quot;1170&quot; data-ke-size=&quot;size16&quot;&gt;최근에는 GPT를 구독형 기반으로 활용하는 방식도 가능해졌다.&lt;/p&gt;
&lt;p data-end=&quot;1211&quot; data-start=&quot;1208&quot; data-ke-size=&quot;size16&quot;&gt;따라서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1282&quot; data-start=&quot;1212&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1233&quot; data-start=&quot;1212&quot; data-section-id=&quot;gljep4&quot;&gt;월 고정 비용으로 운영 가능하다&lt;/li&gt;
&lt;li data-end=&quot;1263&quot; data-start=&quot;1234&quot; data-section-id=&quot;s5t70q&quot;&gt;사용량이 많아도 비용 부담이 비교적 안정적이다&lt;/li&gt;
&lt;li data-end=&quot;1282&quot; data-start=&quot;1264&quot; data-section-id=&quot;1iku7gg&quot;&gt;자동화 환경에 더 적합하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1320&quot; data-start=&quot;1284&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로를 실제로 운영하려면 GPT가 더 유리하다.&lt;/p&gt;
&lt;hr data-end=&quot;1325&quot; data-start=&quot;1322&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1341&quot; data-start=&quot;1327&quot; data-section-id=&quot;19vcmxo&quot; data-ke-size=&quot;size26&quot;&gt;클로드의 새로운 기능&lt;/h2&gt;
&lt;p data-end=&quot;1381&quot; data-start=&quot;1343&quot; data-ke-size=&quot;size16&quot;&gt;최근 클로드에서도&lt;br /&gt;오픈클로와 유사한 행동형 AI 기능이 출시됐다.&lt;/p&gt;
&lt;p data-end=&quot;1456&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size16&quot;&gt;비전공자 입장에서는 접근성이 좋은 구조다.&lt;/p&gt;
&lt;p data-end=&quot;1456&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1463&quot; data-start=&quot;1458&quot; data-ke-size=&quot;size16&quot;&gt;하지만&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1520&quot; data-start=&quot;1464&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1494&quot; data-start=&quot;1464&quot; data-section-id=&quot;brj7nt&quot;&gt;자동화 기준에서는 여전히 토큰 기반 과금 구조다&lt;/li&gt;
&lt;li data-end=&quot;1520&quot; data-start=&quot;1495&quot; data-section-id=&quot;fwbdlm&quot;&gt;사용량이 많아지면 요청 제한이 발생한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1571&quot; data-start=&quot;1522&quot; data-ke-size=&quot;size16&quot;&gt;따라서&lt;br /&gt;간단한 테스트나 체험에는 적합하지만 지속적인 자동화 운영에는 한계가 있다.&lt;/p&gt;
&lt;p data-end=&quot;1599&quot; data-start=&quot;1573&quot; data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고 클로드를 고려할 이유도 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1676&quot; data-start=&quot;1601&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1624&quot; data-start=&quot;1601&quot; data-section-id=&quot;1b0vpn5&quot;&gt;새로운 기능이 빠르게 추가되고 있다&lt;/li&gt;
&lt;li data-end=&quot;1655&quot; data-start=&quot;1625&quot; data-section-id=&quot;1995glp&quot;&gt;향후 더 안정적인 서비스로 발전할 가능성이 있다&lt;/li&gt;
&lt;li data-end=&quot;1676&quot; data-start=&quot;1656&quot; data-section-id=&quot;9ihih4&quot;&gt;보안 측면에서도 강점을 가진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1731&quot; data-start=&quot;1678&quot; data-ke-size=&quot;size16&quot;&gt;현재 기준에서는 GPT가 실용적이지만&lt;br /&gt;장기적으로는 클로드도 충분히 고려할 수 있는 선택지다.&lt;/p&gt;
&lt;hr data-end=&quot;1736&quot; data-start=&quot;1733&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1753&quot; data-start=&quot;1738&quot; data-section-id=&quot;1hkafo9&quot; data-ke-size=&quot;size26&quot;&gt;왜 맥미니를 사용하는가&lt;/h2&gt;
&lt;p data-end=&quot;1786&quot; data-start=&quot;1755&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로는 지속적으로 실행되어야 정상적으로 동작한다.&lt;/p&gt;
&lt;p data-end=&quot;1817&quot; data-start=&quot;1788&quot; data-ke-size=&quot;size16&quot;&gt;중간에 시스템이 종료되면 자동화도 함께 중단된다.&lt;/p&gt;
&lt;p data-end=&quot;1844&quot; data-start=&quot;1819&quot; data-ke-size=&quot;size16&quot;&gt;상시 실행 가능한 장비가 필요하다.&lt;/p&gt;
&lt;p data-end=&quot;1844&quot; data-start=&quot;1819&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;181&quot; data-start=&quot;166&quot; data-ke-size=&quot;size16&quot;&gt;또한 보안 측면도 중요하다.&lt;/p&gt;
&lt;p data-end=&quot;248&quot; data-start=&quot;183&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로는 컴퓨터를 직접 조작하는 구조이기 때문에&lt;br /&gt;개인이 사용하는 파일, 사진, 문서 등에도 접근할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;288&quot; data-start=&quot;250&quot; data-ke-size=&quot;size16&quot;&gt;이런 이유로 메인 PC와 분리된 환경에서 운영하는 것이 안전하다.&lt;/p&gt;
&lt;p data-end=&quot;348&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;그래서 별도의 장비인 맥미니를 따로 구성해 오픈클로 전용으로 사용하는 방식을 선택한다.&lt;/p&gt;
&lt;hr data-end=&quot;1849&quot; data-start=&quot;1846&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1866&quot; data-start=&quot;1851&quot; data-section-id=&quot;1qllzij&quot; data-ke-size=&quot;size23&quot;&gt;윈도우 데스크탑 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1921&quot; data-start=&quot;1868&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1881&quot; data-start=&quot;1868&quot; data-section-id=&quot;md3r45&quot;&gt;전력 소모가 크다&lt;/li&gt;
&lt;li data-end=&quot;1900&quot; data-start=&quot;1882&quot; data-section-id=&quot;14z7ssl&quot;&gt;장시간 운영에 비효율적이다&lt;/li&gt;
&lt;li data-end=&quot;1921&quot; data-start=&quot;1901&quot; data-section-id=&quot;cnbd7p&quot;&gt;하드웨어 비용이 상승하고 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1926&quot; data-start=&quot;1923&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1938&quot; data-start=&quot;1928&quot; data-section-id=&quot;y7229y&quot; data-ke-size=&quot;size23&quot;&gt;맥미니 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2005&quot; data-start=&quot;1940&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1953&quot; data-start=&quot;1940&quot; data-section-id=&quot;6gvx8n&quot;&gt;전력 소모가 낮다&lt;/li&gt;
&lt;li data-end=&quot;1973&quot; data-start=&quot;1954&quot; data-section-id=&quot;370n3d&quot;&gt;가격 대비 성능이 안정적이다&lt;/li&gt;
&lt;li data-end=&quot;2005&quot; data-start=&quot;1991&quot; data-section-id=&quot;mx61fx&quot;&gt;발열과 소음이 적다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2042&quot; data-start=&quot;2007&quot; data-ke-size=&quot;size16&quot;&gt;이러한 이유로&lt;br /&gt;오픈클로 운영 장비로 맥미니를 많이 선택한다.&lt;/p&gt;
&lt;hr data-end=&quot;2047&quot; data-start=&quot;2044&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2060&quot; data-start=&quot;2049&quot; data-section-id=&quot;s7wb4k&quot; data-ke-size=&quot;size26&quot;&gt;실제 운영 구조&lt;/h2&gt;
&lt;p data-end=&quot;2076&quot; data-start=&quot;2062&quot; data-ke-size=&quot;size16&quot;&gt;기본 구조는 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2152&quot; data-start=&quot;2078&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2095&quot; data-start=&quot;2078&quot; data-section-id=&quot;paz6e&quot;&gt;집에 맥미니를 설치한다&lt;/li&gt;
&lt;li data-end=&quot;2111&quot; data-start=&quot;2096&quot; data-section-id=&quot;4h2jk5&quot;&gt;오픈클로를 설치한다&lt;/li&gt;
&lt;li data-end=&quot;2133&quot; data-start=&quot;2112&quot; data-section-id=&quot;bap41e&quot;&gt;24시간 실행 상태를 유지한다&lt;/li&gt;
&lt;li data-end=&quot;2152&quot; data-start=&quot;2134&quot; data-section-id=&quot;nv0ao3&quot;&gt;외부에서 명령을 전달한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2164&quot; data-start=&quot;2154&quot; data-ke-size=&quot;size16&quot;&gt;명령 전달 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2200&quot; data-start=&quot;2165&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2173&quot; data-start=&quot;2165&quot; data-section-id=&quot;13lf9d0&quot;&gt;텔레그램&lt;/li&gt;
&lt;li data-end=&quot;2182&quot; data-start=&quot;2174&quot; data-section-id=&quot;1wl5bio&quot;&gt;디스코드&lt;/li&gt;
&lt;li data-end=&quot;2200&quot; data-start=&quot;2183&quot; data-section-id=&quot;1n5ujmk&quot;&gt;n8n 같은 자동화 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2255&quot; data-start=&quot;2202&quot; data-ke-size=&quot;size16&quot;&gt;이 구조를 구성하면&lt;br /&gt;사용자는 외부에서 명령만 내리고&lt;br /&gt;실제 작업은 내부 시스템이 수행한다.&lt;/p&gt;
&lt;hr data-end=&quot;2260&quot; data-start=&quot;2257&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2271&quot; data-start=&quot;2262&quot; data-section-id=&quot;1unakwl&quot; data-ke-size=&quot;size26&quot;&gt;단점도 있다&lt;/h2&gt;
&lt;p data-end=&quot;2297&quot; data-start=&quot;2273&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로는 강력하지만 단점도 분명 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2361&quot; data-start=&quot;2299&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2313&quot; data-start=&quot;2299&quot; data-section-id=&quot;18q0uy8&quot;&gt;초기 설정이 어렵다&lt;/li&gt;
&lt;li data-end=&quot;2337&quot; data-start=&quot;2314&quot; data-section-id=&quot;1etqntp&quot;&gt;오류가 발생하면 직접 해결해야 한다&lt;/li&gt;
&lt;li data-end=&quot;2361&quot; data-start=&quot;2338&quot; data-section-id=&quot;irxp3z&quot;&gt;완벽하게 사람처럼 동작하지는 않는다&lt;/li&gt;
&lt;li data-end=&quot;2361&quot; data-start=&quot;2338&quot; data-section-id=&quot;irxp3z&quot;&gt;나의 개인 정보와 파일들의 보안이 위험하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2409&quot; data-start=&quot;2363&quot; data-ke-size=&quot;size16&quot;&gt;따라서&lt;br /&gt;완전 초보보다는&lt;br /&gt;기본적인 개념을 이해한 상태에서 접근하는 것이 좋다.&lt;/p&gt;
&lt;hr data-end=&quot;2414&quot; data-start=&quot;2411&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2421&quot; data-start=&quot;2416&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;2475&quot; data-start=&quot;2423&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로는&lt;br /&gt;AI를 단순한 대화 도구가 아니라&lt;br /&gt;실제로 일을 수행하는 시스템으로 바꿔준다.&lt;/p&gt;
&lt;p data-end=&quot;2492&quot; data-start=&quot;2477&quot; data-ke-size=&quot;size16&quot;&gt;중요한 것은 모델 선택이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2548&quot; data-start=&quot;2494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2523&quot; data-start=&quot;2494&quot; data-section-id=&quot;znijpn&quot;&gt;Claude: 체험 및 제한적 사용에 적합하다&lt;/li&gt;
&lt;li data-end=&quot;2548&quot; data-start=&quot;2524&quot; data-section-id=&quot;1he35s5&quot;&gt;GPT: 실제 자동화 운영에 적합하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2599&quot; data-start=&quot;2550&quot; data-ke-size=&quot;size16&quot;&gt;안정적으로 운영하려면 맥미니 같은 저전력 장비를 사용하는 것이 효율적이다.&lt;/p&gt;
&lt;p data-end=&quot;2663&quot; data-start=&quot;2601&quot; data-ke-size=&quot;size16&quot;&gt;결국 오픈클로는 단순한 자동화 도구가 아니라&lt;br /&gt;AI를 실제 노동력처럼 활용하고 싶은 사람에게 맞는 도구다.&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/454</guid>
      <comments>https://integer-ji.tistory.com/454#entry454comment</comments>
      <pubDate>Wed, 25 Mar 2026 16:38:33 +0900</pubDate>
    </item>
    <item>
      <title>OpenClaw: access not configured.</title>
      <link>https://integer-ji.tistory.com/453</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 에러가 계속 뜨는 사람들에게&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N1krb/dJMcacoxia6/LpeOWqwX43wzNKYKoY2Znk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N1krb/dJMcacoxia6/LpeOWqwX43wzNKYKoY2Znk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N1krb/dJMcacoxia6/LpeOWqwX43wzNKYKoY2Znk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN1krb%2FdJMcacoxia6%2FLpeOWqwX43wzNKYKoY2Znk%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;417&quot; height=&quot;162&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 하며 텔레그램으로 코드를 등록하라고 올것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 인증 코드를 오픈클로에 저장하면 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자꾸 등록이 안되는 것이었다.&lt;/p&gt;
&lt;pre id=&quot;code_1771315936870&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openclaw pairing approve telegram &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;p data-ke-size=&quot;size16&quot;&gt;도커 안에 들어가서 명령어를 치면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771316025120&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;OpenClaw: access not configured.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자꾸 해당 에러가 나올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너에 들어가 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771316021079&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openclaw.mjs
package.json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일들로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;236&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;openclaw 바이너리가 아니라 openclaw.mjs 실행 구조이다.&lt;/p&gt;
&lt;p data-end=&quot;236&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;236&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;따라서&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;236&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771316011917&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node openclaw.mjs pairing approve telegram &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;p data-ke-size=&quot;size16&quot;&gt;이렇게 해줘야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>access not configured.</category>
      <category>MoltBot</category>
      <category>OpenClaw</category>
      <category>OpenClaw: access not configured.</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/453</guid>
      <comments>https://integer-ji.tistory.com/453#entry453comment</comments>
      <pubDate>Tue, 17 Feb 2026 17:13:59 +0900</pubDate>
    </item>
    <item>
      <title>왜 0.1 + 0.2는 0.3이 아닐까?</title>
      <link>https://integer-ji.tistory.com/452</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 유튜브를 보다 재밌는 걸 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-GsrYvZoAdA&amp;amp;list=LL&amp;amp;t=6s&quot;&gt;https://www.youtube.com/watch?v=-GsrYvZoAdA&amp;amp;list=LL&amp;amp;t=6s&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;코딩애플님의 영상이다.&lt;/p&gt;
&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;1.1 + 0.2&lt;/span&gt;를 계산했는데, 결과가 정확히 &lt;span&gt;1.3&lt;/span&gt;이 아니라는 이야기가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 짜보기&lt;/p&gt;
&lt;pre id=&quot;code_1765610930772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {

    public static void main(String[] args) {

        double a = 0.1;
        double b = 0.2;
        double sum = a + b;
        double target = 0.3;

        System.out.printf(&quot;0.1 + 0.2 계산값 : %.20f%n&quot;, sum);
        System.out.printf(&quot;      0.3 리터럴 : %.20f%n&quot;, target);

        System.out.println(sum == target);
        System.out.println(sum &amp;gt; target);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1765610938457&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0.1 + 0.2 계산값 : 0.30000000000000004000
      0.3 리터럴 : 0.30000000000000000000
false
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;프린트로 소수점 20자리까지 내려가서 보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 값이 이미 다르다는 걸 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.1 + 0.2&lt;span&gt;의 결과가 &lt;/span&gt;&lt;span&gt;0.3&lt;/span&gt;보다 아주 조금 더 큰 값으로&amp;nbsp;&lt;/p&gt;
&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&gt; 비교는 실패하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sum &amp;gt; target&lt;span&gt;은 &lt;/span&gt;true&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&gt;정말 내부 값이 다른가?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서는 소수점 아래를 길게 출력해서 두 값이 다르다는 건 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장된 값 자체가 다른 건가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Double.toHexString()&lt;span&gt;을 사용하면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;double 값을 IEEE 754 기준의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16진수 표현으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10진수 말고 16진수로 봐보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765613330943&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.out.println(&quot;0.1 + 0.2 (hex) : &quot; + Double.toHexString(sum));
System.out.println(&quot;0.3       (hex) : &quot; + Double.toHexString(target));&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1765613926484&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0.1 + 0.2 (hex) : 0x1.3333333333334p-2
0.3       (hex) : 0x1.3333333333333p-2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 값은 아예 다른 값으로 저장되어 있었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0.1 + 0.2&lt;span&gt; &amp;rarr; &lt;/span&gt;...33334&lt;/li&gt;
&lt;li&gt;0.3&lt;span&gt; &amp;rarr; &lt;/span&gt;...33333&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 문제는 출력 방식의 문제가 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음부터 메모리에 저장된 값이 달랐던 것이다.&lt;/p&gt;
&lt;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&gt; 비교가 실패하는 건 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;당연한 결과였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금액, 포인트, 정산처럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금의 오차도 허용되지 않는 영역에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;double 비교 자체가 위험하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때는 BigDecimal&lt;span&gt;을 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765613991532&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BigDecimal bd1 = new BigDecimal(&quot;0.1&quot;);
BigDecimal bd2 = new BigDecimal(&quot;0.2&quot;);
BigDecimal bdSum = bd1.add(bd2);
BigDecimal bdTarget = new BigDecimal(&quot;0.3&quot;);

System.out.println(&quot;BigDecimal 계산값: &quot; + bdSum);
System.out.println(&quot;결과가 0.3과 같니? -&amp;gt; &quot; + bdSum.equals(bdTarget));&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1765614006417&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BigDecimal 계산값: 0.3
결과가 0.3과 같니? -&amp;gt; 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BigDecimal은 부동소수점 방식이 아니라, 10진수를 그대로 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 처음부터 근사값이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의도한 값 그대로 저장하고 계산하기 때문에 이런 문제 자체가 발생하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 BigDecimal 쓸떄 주의해야할점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확한 계산이 필요할 때는 BigDecimal이 좋은 선택이지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-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_1765614088191&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BigDecimal wrong = new BigDecimal(0.1);
BigDecimal correct = new BigDecimal(&quot;0.1&quot;);

System.out.println(&quot;new BigDecimal(0.1)    : &quot; + wrong);
System.out.println(&quot;new BigDecimal(\&quot;0.1\&quot;)  : &quot; + correct);
System.out.println(&quot;둘이 같니? -&amp;gt; &quot; + wrong.equals(correct));&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1765614096934&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new BigDecimal(0.1)    : 0.1000000000000000055511151231257827021181583404541015625
new BigDecimal(&quot;0.1&quot;)  : 0.1
둘이 같니? -&amp;gt; false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 &lt;span&gt;0.1&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;new BigDecimal(0.1)&lt;span&gt;은 &lt;/span&gt;&lt;span&gt;0.1&lt;/span&gt;이라는 십진수를 BigDecimal로 바꾸는 게 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 오차가 포함된 double 0.1&lt;span&gt;을 &lt;/span&gt;그대로 BigDecimal로 감싼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new BigDecimal(&quot;0.1&quot;)&lt;span&gt;은 &lt;/span&gt;사람이 의도한 십진수 &lt;span&gt;0.1&lt;/span&gt;을 처음부터 정확하게 BigDecimal로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BigDecimal은 만능 해결책이 아니다.&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;span&gt;X &lt;/span&gt;new BigDecimal(double)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;O &lt;/span&gt;new BigDecimal(String)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;O &lt;/span&gt;BigDecimal.valueOf(double)&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;0.1 + 0.2 != 0.3 같은 부동소수점의 계산과 비교는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터가 숫자를 표현하는 방식에서 비롯된, 아주 자연스러운 결과다.&lt;/p&gt;
&lt;p data-ke-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>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/452</guid>
      <comments>https://integer-ji.tistory.com/452#entry452comment</comments>
      <pubDate>Sat, 13 Dec 2025 17:23:30 +0900</pubDate>
    </item>
    <item>
      <title>API 상태 코드, 어떤 기준으로 정하는게 좋을까?</title>
      <link>https://integer-ji.tistory.com/451</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/obCJI/btsOwfPAtM2/ta7fCQel4FgKk9MaaOrvx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/obCJI/btsOwfPAtM2/ta7fCQel4FgKk9MaaOrvx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/obCJI/btsOwfPAtM2/ta7fCQel4FgKk9MaaOrvx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FobCJI%2FbtsOwfPAtM2%2Fta7fCQel4FgKk9MaaOrvx1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&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;1. 들어가며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이드 프로젝트를 진행하며 궁금한 점이 생겼다. API에서 에러가 발생하면 어떤 상태 코드를 보내야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 팀원들과 이야기할 때마다 의견이 갈렸다. RESTful 원칙에 따라 400번대, 500번대를 사용하자는 의견과 응답을 정상적으로 받았으니 200이 맞다는 의견이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 여기서 200이 맞다고 생각했다. 에러를 반환했다는 것 자체가 HTTP 통신에는 성공한 것이고, HTTP는 RFC로 정의된 표준 프로토콜인데 굳이 왜 변경해야 하는지 의문이었다. 차라리 그럴 거면 커스텀 상태코드를 만들어서 사용하는 게 낫지 않을까 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/shorts/_r880rjE3fM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ZeroCho님의 유튜브 영상&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;또한 혹시나 해서 적는건데 절대 싸우자는 의미가 아니다 !! 결론은 각자 서비스에 맞는 스타일을 쓰자. 정답은 없다.&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;2. HTTP 상태코드의 원칙과 현실&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST 아키텍처에서는 HTTP 상태코드를 명확하게 구분해서 사용하라고 한다. 200은 성공, 400번대는 클라이언트 오류, 500번대는 서버 오류로 말이다. 로그인 실패라면 401, 잘못된 요청이면 400을 보내는 게 원칙이다. 이론적으로는 깔끔하다. API 문서만 봐도 어떤 에러가 나올지 예측할 수 있고, 프론트엔드에서도 상태코드만 보고 처리 방향을 정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실무에서는 문제가 생긴다. 4xx, 5xx 코드가 나올 때마다 모니터링 시스템에서 알람이 울린다면, 운영팀에서는 진짜 서버 장애와 단순 비즈니스 로직 실패를 구분하기 어렵다. 대표적으로 404가 있다. GET /users/123에서 404가 나왔을 때, API 엔드포인트가 없는 걸까? 아니면 API는 있지만 해당 사용자가 없는 건지 클라이언트는 구분하기 어렵다.&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;3. 200 vs RESTful 방식, 어떤 게 더 좋을까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 두 방식의 장단점을 구체적으로 살펴보자. AI 툴과 구글링을 통해 알아보고 각 접근법의 장단점을 정리해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;200 + body 에러 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점으로는 개발 편의성이 크다. 모든 API가 동일한 응답 구조를 가지니까 프론트엔드에서 일관된 에러 처리 패턴을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점은 HTTP 표준을 무시한다는 점이다. 브라우저나 CDN이 잘못된 응답도 성공으로 캐시할 수 있고, 히스토리를 모르는 개발자가 코드를 본다면 혼란스러워할 수 있다. 또한 웹서버 로그만으로는 실제 성공률을 파악하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESTful 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점은 HTTP 표준에 부합한다는 점이다. 브라우저, 프록시, 각종 도구들이 상태코드를 보고 적절히 처리할 수 있다. API 문서도 명확해진다. &quot;로그인 실패 시 401 반환&quot;이라고 쓰면 모든 개발자가 이해하므로 유지보수가 용이하다. 웹서버 로그만 봐도 대략적인 성공/실패 비율을 알 수 있어 운영에 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점은 운영 복잡성이다. 정상적인 비즈니스 실패(로그인 실패, 권한 없음)와 실제 서버 장애를 구분해야 한다. 프론트엔드에서도 HTTP 레벨 에러와 비즈니스 로직 에러를 따로 처리해야 해서 코드가 복잡해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 성능/운영 임팩트 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 면에서는 큰 차이가 없다. 둘 다 같은 HTTP 요청/응답이고, 상태코드 몇 자리 숫자 차이일 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 팀의 상황과 우선순위에 따라 선택해야 한다. 빠른 개발과 운영 단순성을 원한다면 200 방식이, HTTP 표준 준수와 명확성을 원한다면 RESTful 방식이 적합하다.&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;4. 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸로 나의 결과를 통해 단정 짓기에는 무리가 있는 것 같다. 많은 프로젝트가 있고 많은 개인 사정들이 있을 것이다. 그걸 내가 이게 맞다고 글을 적기엔 어려운 부분이 많다. 그래서 다들 정답이 없나 보다. 다들 자신의 프로젝트에서 잘 쓰고 있을 것이고, 나처럼 고민하는 분에게는 이러한 이유 때문에 정답이 없구나 생각해 주시면 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 조사하면서 내 생각도 조금 바뀌었다. 처음엔 &quot;HTTP 통신 성공했으니 200이 맞다&quot;고 생각했는데, 사소한 프로젝트라도 규약을 지켜가며 쌓아가야 되지 않을까? 라는 생각이 들게 되었다. 앞으로는 프로젝트 초기에 팀과 상황을 고려해서 방식을 정하고, &quot;왜 이 방식을 선택했는지&quot; 명확한 근거를 가지고 결정하는 게 중요할 것 같다.&lt;/p&gt;</description>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/451</guid>
      <comments>https://integer-ji.tistory.com/451#entry451comment</comments>
      <pubDate>Thu, 12 Jun 2025 09:50:21 +0900</pubDate>
    </item>
    <item>
      <title>사내스터디 - 파티셔닝</title>
      <link>https://integer-ji.tistory.com/450</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;뒤끝터디 5주차 &amp;ndash; 파티셔닝&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5장에서 복제를 다루며 동일한 데이터를 여러 노드에 저장하는 방식을 배웠다. 이중화로 읽기 처리량을 높이고 장애 대응도 가능해졌지만, 여전히 데이터가 너무 많거나 요청이 너무 많은 상황은 복제만으로 감당할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 등장하는 해결책이 바로 데이터 파티셔닝이다. 이번에는 파티셔닝과 다양한 기법들, 그리고 클러스터 환경에서의 재균형화 전략까지 적혀있어 읽어 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. New &amp;ndash; 새롭게 알게 된 개념 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-1. 데이터 파티셔닝의 진짜 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파티셔닝을 고민하는 이유는 명확하다. &lt;span&gt;확장성&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 장비로 처리할 수 없는 수준의 데이터를 &lt;span&gt;쪼개서 여러 장비에 나누고&lt;/span&gt;, 그에 따라 &lt;span&gt;저장과 질의 부담을 분산&lt;/span&gt;하려는 것이다. 단순히 데이터를 나누는 것이 아니라, &lt;span&gt;어떻게 나눌지, 그리고 어디에 나눌지를 결정하는 것이 핵심&lt;/span&gt;이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-2. 문서 기준 보조 색인 파티셔닝&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 ID 기준으로 문서를 조회하는 방식 같았다. 파티셔닝된 환경에서 보조 색인을 어떻게 운영할지를 다루는데, &lt;br /&gt;여기에 전역 색인(global index)과 &lt;span&gt;지역 색인(local index)&lt;/span&gt; 개념이 등장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;전역 색인&lt;/span&gt;: 클러스터 전체를 아우르는 색인. 단일 색인으로 빠르게 찾을 수 있지만, 업데이트 비용이 높다.&lt;/li&gt;
&lt;li&gt;&lt;span&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;흠 ... 어렵다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #0e0e0e;&quot; data-ke-size=&quot;size16&quot;&gt;전역 색인은 &amp;lsquo;책 맨 뒤의 주제별 색인&amp;rsquo;처럼 한 번에 찾아볼 수 있는 구조.&lt;/p&gt;
&lt;p style=&quot;color: #0e0e0e;&quot; data-ke-size=&quot;size16&quot;&gt;반면 지역 색인은 &amp;lsquo;각 장의 맨 앞에 있는 소제목 목차&amp;rsquo;처럼, 해당 장만 뒤져야 하므로 찾는 범위가 제한적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 찾아보니가 조금 나왔다. 새롭게 알게 되었지만 명확하지도 않는 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Difficulty &amp;ndash; 명확하지 않았던 부분&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-1. 전역 vs 지역 색인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색인이라는 말 자체가 SQL 인덱스처럼 느껴진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-2. 파티션 재균형화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서 언급한 파티션 재균형화(rebalancing)는 다음과 같은 상황에서 필요하다고 한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;질의 처리량이 늘어 CPU를 더 추가하고 싶을 때&lt;/li&gt;
&lt;li&gt;데이터셋이 커져 디스크나 메모리 자원이 부족할 때&lt;/li&gt;
&lt;li&gt;장비 장애로 특정 노드가 제거되어야 할 때&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가&amp;nbsp;&lt;span&gt;스케일업/다운, 오토스케일링, L7 로드밸런서&lt;/span&gt;랑 비슷한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Amendment &amp;ndash; 도움이 된 생각의 전환&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 장을 정리하면서 서버 부하 분산 구조(L7 Load Balancing와 비교하면 이해가 더 쉬웠다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;L7에서 사용자의 요청을 여러 서버로 분산하듯&lt;/li&gt;
&lt;li&gt;파티셔닝은 데이터를 여러 노드로 나눠 저장하고 처리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&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;이 시점에서 데이터베이스는 단순 저장소가 아니라, &lt;span&gt;설계와 인프라의 연장선&lt;/span&gt;이라는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 장에서는 대용량 데이터셋을 더욱 작은 데이터셋으로 파티셔닝하는 방법을 살펴봤다.&lt;/p&gt;
&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&gt;하는 것이다. 그렇게 하려면 데이터에 적합한 파티셔닝 방식을 선택해야 하고, 클러스터의 노드가 추가되거나 제거될 때 &lt;span&gt;파티션 재균형화&lt;/span&gt;가 수행되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #0e0e0e;&quot; data-ke-size=&quot;size16&quot;&gt;이건 마치 서버에서 L7 로드밸런서를 통해 요청을 분산하는 구조와도 유사하게 생각하니 알기 쉬웠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/450</guid>
      <comments>https://integer-ji.tistory.com/450#entry450comment</comments>
      <pubDate>Thu, 15 May 2025 12:09:07 +0900</pubDate>
    </item>
    <item>
      <title>사내스터디 - 데이터 모델과 질의 언어</title>
      <link>https://integer-ji.tistory.com/449</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;뒤끝터디 2주차 &amp;ndash; 데이터 모델과 질의 언어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 들어가며&lt;/h3&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;MSSQL을 중심으로 정형화된 모델만 사용해 온 입장에서, 이번 장은 모델링과 시스템 설계 전반을 다시 생각해보게 하는 내용이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관계형 모델의 태생적 한계와 이를 보완하기 위해 등장한 다양한 비관계형 DB의 목적, 그리고 각각의 데이터 모델이 사용되는 맥락에 대해 살펴볼 수 있었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. New &amp;ndash; 새롭게 알게 된 개념 정리&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 계층 구조로 쌓이는 데이터 모델&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 애플리케이션은 데이터 모델이 단일 계층이 아니라 여러 계층 위에 얹힌 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 도메인 객체 &amp;rarr; JSON &amp;rarr; 관계형 테이블처럼 여러 표현 방식이 존재하며,&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;h3 data-ke-size=&quot;size23&quot;&gt;2-2. NoSQL의 등장 배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NoSQL은 단순히 &amp;lsquo;SQL을 쓰지 않는다&amp;rsquo;기보다는 &amp;lsquo;SQL만 고집하지 않는다(Not Only SQL)&amp;rsquo;라는 의미에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서는 NoSQL이 등장하게 된 이유를 아래와 같이 정리하고 있다.&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;상용 관계형 DB의 높은 라이선스 비용에 비해, 오픈소스 도입을 선호하는 흐름&lt;/li&gt;
&lt;li&gt;관계형 모델이 표현하기 어려운 질의 요구사항 존재&lt;/li&gt;
&lt;li&gt;고정된 스키마 구조에 대한 불만 &amp;rarr; 유연하고 동적인 스키마 요구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 현실적인 문제에서 출발한 해결책이라는 점에서, 비즈니스와 맞닿아 있는 기술이라 느껴졌다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 다중 저장소 지속성 (Polyglot Persistence)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 개념은 처음 알게 되었는데, 이미 실무에서는 무의식 중에 사용하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 정보는 MSSQL, 로그는 MongoDB, 캐시는 Redis처럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 시스템에 서로 다른 특성을 가진 DB를 병렬적으로 사용하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 데이터 모델의 강점을 조합하는 방식으로 이해할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 문서형 vs 그래프형 데이터베이스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서형(Document): 각 문서가 독립적이며, 문서 간 연관이 거의 없는 경우에 적합. 예: 주문 내역, 게시글&lt;/li&gt;
&lt;li&gt;그래프형(Graph): 모든 데이터 간 연결이 중요할 때 적합. 예: 소셜 관계망, 추천 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 연관성 정도에 따라 데이터 모델이 달라질 수 있다는 점이 실무에서도 도움이 될 만한 기준이었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-5. 트리플 저장소 / SPARQL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지식 그래프나 의미론적 웹에서 사용하는 RDF 기반의 데이터 저장소.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPARQL은 이를 질의하는 언어로, 일반적인 CRUD와는 다소 결이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 챕터에서는 간단한 용도만 소개되며, 깊은 이해보다는 개념 위주의 정리였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Difficulty &amp;ndash; 명확하게 이해되지 않았던 부분&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 임피던스 불일치 (Impedance Mismatch)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 시스템과 관계형 데이터베이스 모델 간의 간극을 설명하는 용어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, User 객체 내부에 Address 클래스가 포함되어 있다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDB에서는 이걸 별도 테이블로 나눠 외래키로 연결해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 과정에서 데이터 표현 방식과 흐름이 자연스럽지 않게 되며, 이 전환 자체가 개발자에게 부담이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM이 존재하는 이유이기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직도 이 개념이 정확히 &amp;ldquo;어디까지를 임피던스 불일치라 부르나?&amp;rdquo;에 대해선 감이 확 오진 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 객체지향과 RDB의 구조적 차이를 표현하는 용어로는 적절하다는 생각이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 트리 구조 &amp;rarr; 관계형 모델의 역사&lt;/h3&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;트리 구조 모델: 단방향 계층 관계 표현에는 적합하지만 유연성이 부족&lt;/li&gt;
&lt;li&gt;관계형 모델: 모든 데이터를 릴레이션으로 추상화 &amp;rarr; 조인을 통한 유연한 질의 가능&lt;/li&gt;
&lt;li&gt;비관계형 모델: 관계형이 해결하지 못하는 성능/확장성/표현력 문제를 해결하기 위해 등장&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 관점은 단순한 기술 비교를 넘어, 시스템 아키텍처 설계의 배경 논리를 제공한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 각 데이터 모델별 특성 정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 관계형 DB (MSSQL) 비관계형 DB (MongoDB)&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;고정된 스키마&lt;/td&gt;
&lt;td&gt;유연한 JSON 기반 문서 구조&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;트랜잭션보다는 가용성과 속도 중시&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;복잡한 조인 가능, 성숙한 툴 생태계&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;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 챕터는 단순한 CRUD 중심의 사고에서 벗어나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;왜 이 모델을 쓰는가&amp;rdquo;, &amp;ldquo;우리 서비스는 어떤 데이터 구조가 맞는가&amp;rdquo; 같은 질문을 던지게 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 선택은 결국 기술이 아니라 요구사항에서 출발한다는 점에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 모델의 배경과 쓰임새를 알아두는 게 꽤 중요하다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/449</guid>
      <comments>https://integer-ji.tistory.com/449#entry449comment</comments>
      <pubDate>Thu, 24 Apr 2025 17:59:38 +0900</pubDate>
    </item>
    <item>
      <title>글또10기 회고, 글쓰는 또라이가 세상을 바꾼다</title>
      <link>https://integer-ji.tistory.com/448</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPPKz/btsM1jrAE4y/4kEKKHtBSR9rLHrxfdRaWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPPKz/btsM1jrAE4y/4kEKKHtBSR9rLHrxfdRaWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPPKz/btsM1jrAE4y/4kEKKHtBSR9rLHrxfdRaWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPPKz%2FbtsM1jrAE4y%2F4kEKKHtBSR9rLHrxfdRaWK%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;200&quot; height=&quot;200&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;200&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;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;글또와 함께한 3년&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 5월, 글또 7기로 첫 발을 내디뎠다. 그리고 2025년 3월, 글또 10기를 끝으로 나의 글또 여정은 잠시 마무리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글또와의 만남은 우연이었다. 인스타그램 알고리즘이 이끌어준 인연.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 나는 2~3년 차 개발자로, 성장에 목말라 있던 시기였다. 다양한 스터디와 커뮤니티를 기웃거리며 나에게 맞는 &amp;lsquo;성장의 환경&amp;rsquo;을 찾고 있었고, 그 무렵 성윤님의 게시글을 통해 &amp;lsquo;글또&amp;rsquo;라는 개발자 글쓰기 커뮤니티를 알게 되었다.&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;1910&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN7kww/btsM1LIfVgV/lw3bwncwQjkVj4va9si5S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN7kww/btsM1LIfVgV/lw3bwncwQjkVj4va9si5S1/img.png&quot; data-alt=&quot;오잉 원래 이렇게 간단한 글이었나? 뭔가 엄청 화려했던거같은데 .. ㅋㅋ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN7kww/btsM1LIfVgV/lw3bwncwQjkVj4va9si5S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN7kww%2FbtsM1LIfVgV%2Flw3bwncwQjkVj4va9si5S1%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;602&quot; height=&quot;299&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;948&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;받은 따뜻함을 나누고 싶다&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nVIIB/btsM2JXoUhZ/Uqkl1KIcmebY1mn1wznCEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nVIIB/btsM2JXoUhZ/Uqkl1KIcmebY1mn1wznCEK/img.png&quot; data-alt=&quot;7기 다짐글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nVIIB/btsM2JXoUhZ/Uqkl1KIcmebY1mn1wznCEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnVIIB%2FbtsM2JXoUhZ%2FUqkl1KIcmebY1mn1wznCEK%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;629&quot; height=&quot;166&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;7기 다짐글&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTIynN/btsM2MNoy5j/8q0JZdmPXSFXPg6pxdk4y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTIynN/btsM2MNoy5j/8q0JZdmPXSFXPg6pxdk4y1/img.png&quot; data-alt=&quot;8기 회고글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTIynN/btsM2MNoy5j/8q0JZdmPXSFXPg6pxdk4y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTIynN%2FbtsM2MNoy5j%2F8q0JZdmPXSFXPg6pxdk4y1%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;616&quot; height=&quot;355&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;8기 회고글&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPOyRB/btsM1hVnCBJ/Gr1UPfTmVDKM70PJXNvMpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPOyRB/btsM1hVnCBJ/Gr1UPfTmVDKM70PJXNvMpK/img.png&quot; data-alt=&quot;10기 다짐글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPOyRB/btsM1hVnCBJ/Gr1UPfTmVDKM70PJXNvMpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPOyRB%2FbtsM1hVnCBJ%2FGr1UPfTmVDKM70PJXNvMpK%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;652&quot; height=&quot;521&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1118&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;10기 다짐글&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;7기 때 나는 주도적인 학습보다는 &amp;lsquo;해야 하니까 하는&amp;rsquo; 느낌에 가까웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의무적으로 참여했기에 깊이 몰입하지 못했던 것도 사실이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 어영부영 8기를 맞이했고, 그때 &lt;span&gt;CS 스터디&lt;/span&gt;를 통해 전환점을 맞이했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소극적이던 나에게 스터디 멤버들은 따뜻하게 다가와 주었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그들과 함께하면서 글또 활동의 진짜 재미를 느낄 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 스터디 안의 운영진 분들이, 적응하지 못하던 나를 자연스럽게 이끌었고 그분들을 보며 운영진이라는 역할을 동경하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 내가 받은 따뜻함을 다른 사람들에게 나누고 싶다는 생각에 9기 운영진을 지원하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 9기 운영진 활동은 마음처럼 쉽지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 일이 갑자기 바빠지면서 글또 참여가 점점 줄어들었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 9기의 다짐글과 회고글도 남기지 못한 걸 보면, 그 점은 지금도 마음에 아쉬움으로 남아 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 10기를 시작할 때는 &lt;span&gt;다시 처음처럼 해보자&lt;/span&gt;는 마음으로 삶의 지도와 다짐글을 조심스럽게 꺼내 적었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영진으로서 목표했던 &amp;lsquo;따뜻함 나누기&amp;rsquo;, 그리고 &amp;mdash;&lt;span&gt;&lt;b&gt;과거의 나처럼 망설이는 분들을 이끌어주는 일&lt;/b&gt;&lt;/span&gt;&amp;mdash;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다짐을 안고, 마지막 기수였던 10기에서 최선을 다해 활동하기를 다짐했다.&lt;/p&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;font-family: 'Noto Serif KR';&quot;&gt;글또를 하는 사람에서 함께하는 사람으로&lt;/span&gt;&lt;/b&gt;&lt;/h3&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/boUY9N/btsM3nGk673/qRK9z7hkI3rXqHgKGK88Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boUY9N/btsM3nGk673/qRK9z7hkI3rXqHgKGK88Xk/img.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;880&quot; data-is-animation=&quot;false&quot; width=&quot;700&quot; height=&quot;336&quot; style=&quot;width: 61.1489%; margin-right: 10px;&quot; data-widthpercent=&quot;61.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boUY9N/btsM3nGk673/qRK9z7hkI3rXqHgKGK88Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboUY9N%2FbtsM3nGk673%2FqRK9z7hkI3rXqHgKGK88Xk%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;1834&quot; height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JHoju/btsM13oxg9H/niY2QUT8cILtFF6VuKYPAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JHoju/btsM13oxg9H/niY2QUT8cILtFF6VuKYPAk/img.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;942&quot; data-is-animation=&quot;false&quot; width=&quot;477&quot; height=&quot;371&quot; style=&quot;width: 37.6883%;&quot; data-widthpercent=&quot;38.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JHoju/btsM13oxg9H/niY2QUT8cILtFF6VuKYPAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJHoju%2FbtsM13oxg9H%2FniY2QUT8cILtFF6VuKYPAk%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;1210&quot; height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/div&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuatg0/btsM0Nmucyu/WqsponQA3gegi1CYQ580B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuatg0/btsM0Nmucyu/WqsponQA3gegi1CYQ580B0/img.png&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;316&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.9927%; margin-right: 10px;&quot; data-widthpercent=&quot;46.53&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuatg0/btsM0Nmucyu/WqsponQA3gegi1CYQ580B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuatg0%2FbtsM0Nmucyu%2FWqsponQA3gegi1CYQ580B0%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;1272&quot; height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc0xtn/btsM1qEyVue/RcLUdeXfdtUVyQt2h5dNI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc0xtn/btsM1qEyVue/RcLUdeXfdtUVyQt2h5dNI0/img.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;112&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.8446%;&quot; data-widthpercent=&quot;53.47&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc0xtn/btsM1qEyVue/RcLUdeXfdtUVyQt2h5dNI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc0xtn%2FbtsM1qEyVue%2FRcLUdeXfdtUVyQt2h5dNI0%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;518&quot; height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG0scH/btsM2eJ6kiM/1qq4JTBy4aMRfZ9S5MdvC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG0scH/btsM2eJ6kiM/1qq4JTBy4aMRfZ9S5MdvC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG0scH/btsM2eJ6kiM/1qq4JTBy4aMRfZ9S5MdvC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG0scH%2FbtsM2eJ6kiM%2F1qq4JTBy4aMRfZ9S5MdvC0%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;1654&quot; height=&quot;268&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글또를 하며 다양한 사람들을 만나고, 함께 시간을 나누었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 과정에서 나도 자연스럽게 성장할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날, 누군가 내게 물었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그렇게 모임도 만들고 사람들 만나서&amp;hellip; 얻는 게 뭐야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해 보니, 나는 누군가의 행복한 기억 속에 조금이라도 남는 사람이 되고 싶었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힘들 때 떠올릴 수 있는 기억 중 하나가 나와 함께한 순간이면 좋겠다는 마음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그게 내가 모임을 주최하는 이유다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 준비는 쉽지 않다. 하지만 커피챗 후기나 슬랙에서 웃는 사람들 모습을 보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 행복이 고스란히 전해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9기에는 운영진으로 &amp;lsquo;고민 상담소&amp;rsquo;를 진행했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;10기에는 팟캐스또, &lt;/span&gt;썰매&amp;middot;스키&lt;span&gt;, &lt;/span&gt;김장&lt;span&gt;, 관악또, 마인크래프트&lt;/span&gt;, &lt;span&gt;보드게임 모임&lt;/span&gt; 등 정말 다양한 활동을 해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 즐거운 기억이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 안에서 나는 정말 글또와 함께 &amp;lsquo;살아갔다&amp;rsquo;고 느낄 수 있었다.&lt;/p&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;font-family: 'Noto Serif KR';&quot;&gt;10기, 마지막을 준비하며 &lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글또를 하며 수많은 사람들을 만났다. 함께 웃고, 함께 성장하며 남긴 사진들과 추억이 참 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;떠오르는 이름도 정말 많지만, 누구 하나 쉽게 적을 수 없을 만큼 모두 소중하고 감사한 인연이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;못 본 지 오래된 분들도 문득 그립다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 이 글을 읽으며 &lt;b&gt;&amp;lsquo;혹시 나인가?&amp;rsquo;&lt;/b&gt; 생각했다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맞다. 그 주인공은 바로 &lt;b&gt;당신&lt;/b&gt;이다. 정말 고맙습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글또를 만들고 이끌어주신 성윤님께도 진심으로 감사드린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 미성숙했던 나는 글또라는 작은 사회 안에서 함께하고, 부딪히며 조금씩 성장할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10기를 거치며 다양한 활동을 해보았고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 안에서 어느 순간부터는 좀 더 진중하게 배우고, 성장하고 싶다&lt;span&gt;는 마음이 자라났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2주에 한 번씩, 어떻게든 글을 써냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부족하더라도 기술적인 글에도 도전했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 시간들이 쌓이며 내 안의 태도와 시선이 천천히 변하기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 나는 토플을 공부하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 단순한 호기심으로 시작했지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함께 공부하는 사람들의 간절함과 진심을 보며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 다시 배움 앞에 &lt;span&gt;겸손해지는 법&lt;/span&gt;을 배우는 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회고도 그랬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 마음을 꺼내 쓰는 게 부끄럽고 어색했지만,&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;span&gt;감정이 담긴 기록&lt;/span&gt;이라는 걸, 이제는 안다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 나는 마지막을 준비하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 단단한 사람으로 성장할 거라고 믿는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글또를 함께 만든 성윤님,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;늘 곁에서 응원해 준 운영진 분들,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모자란 나를 따뜻하게 대해준 모든 분들,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 스치듯 만나 인사 나눈 모든 글또분들에게&lt;/p&gt;
&lt;p data-ke-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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daZqol/btsMZ3wwUfw/9GLvvTOb8fWPQFN4SaxhC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daZqol/btsMZ3wwUfw/9GLvvTOb8fWPQFN4SaxhC0/img.jpg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot; data-is-animation=&quot;false&quot; width=&quot;235&quot; height=&quot;77&quot; style=&quot;width: 58px; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daZqol/btsMZ3wwUfw/9GLvvTOb8fWPQFN4SaxhC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaZqol%2FbtsMZ3wwUfw%2F9GLvvTOb8fWPQFN4SaxhC0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DBcuU/btsMZ3chugZ/Y1B8sXxZLIr6W3AD28zae1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DBcuU/btsMZ3chugZ/Y1B8sXxZLIr6W3AD28zae1/img.jpg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot; data-is-animation=&quot;false&quot; width=&quot;227&quot; height=&quot;187&quot; style=&quot;width: 140px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DBcuU/btsMZ3chugZ/Y1B8sXxZLIr6W3AD28zae1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDBcuU%2FbtsMZ3chugZ%2FY1B8sXxZLIr6W3AD28zae1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL2mua/btsM2zmVb2Y/5XUIeI5Vs7cz31LbeBdN5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL2mua/btsM2zmVb2Y/5XUIeI5Vs7cz31LbeBdN5k/img.jpg&quot; width=&quot;257&quot; height=&quot;133&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;480&quot; data-is-animation=&quot;false&quot; style=&quot;width: 100px; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL2mua/btsM2zmVb2Y/5XUIeI5Vs7cz31LbeBdN5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL2mua%2FbtsM2zmVb2Y%2F5XUIeI5Vs7cz31LbeBdN5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Waias/btsM2G0Ib1G/oYsZZNkdJxudC3kr1MNFV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Waias/btsM2G0Ib1G/oYsZZNkdJxudC3kr1MNFV1/img.jpg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;2048&quot; data-is-animation=&quot;false&quot; width=&quot;311&quot; height=&quot;139&quot; style=&quot;width: 104px; margin-top: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Waias/btsM2G0Ib1G/oYsZZNkdJxudC3kr1MNFV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWaias%2FbtsM2G0Ib1G%2FoYsZZNkdJxudC3kr1MNFV1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;2048&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 많다.. 고성,, 판교제육,, 강남구청 템플스테이, 간단 캠핑 ㅠ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.jpeg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjoGXY/btsM1RPsuMH/k6AHpuFSfPjDuhJOXPBS70/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjoGXY/btsM1RPsuMH/k6AHpuFSfPjDuhJOXPBS70/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjoGXY/btsM1RPsuMH/k6AHpuFSfPjDuhJOXPBS70/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjoGXY%2FbtsM1RPsuMH%2Fk6AHpuFSfPjDuhJOXPBS70%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;447&quot; data-filename=&quot;다운로드.jpeg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>글또</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/448</guid>
      <comments>https://integer-ji.tistory.com/448#entry448comment</comments>
      <pubDate>Sun, 30 Mar 2025 22:37:54 +0900</pubDate>
    </item>
    <item>
      <title>redis를 사용하여 원하는 데이터 백업하기</title>
      <link>https://integer-ji.tistory.com/447</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxoGys/btsMNfvk9Xa/ZAoxSq0WMXKPd1iFfOhFbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxoGys/btsMNfvk9Xa/ZAoxSq0WMXKPd1iFfOhFbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxoGys/btsMNfvk9Xa/ZAoxSq0WMXKPd1iFfOhFbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxoGys%2FbtsMNfvk9Xa%2FZAoxSq0WMXKPd1iFfOhFbk%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;385&quot; height=&quot;131&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 글또 활동을 하며 마인크래프트를 즐기고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GCP를 사용해 서버를 열고 사용자와 함께 즐기고 있는데 같은 데이터 직군분께서 마크 데이터를 활용하여 통계를 내주시고는 하는데 이는 마크 서버에서 특정 데이터를 백업하고, 추출해야 하는 번거로움이 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 크론탭을 이용해 정해진 시간마다 백업을 수행했다. 하지만 이는 불필요한 데이터까지 백업하게 되어 비효율적이었다. 따라서 실제 접속이 발생한 시간대만 백업하는 방식이 필요했고, 이 문제를 해결하기 위해 Redis를 도입했다. Redis를 활용하면 접속 상태를 실시간으로 감지하고 특정 조건에서만 백업을 실행할 수 있어, 불필요한 백업을 줄이고 서버 리소스를 절약할 수 있다. 이 과정을 적어보며 redis를 설치 &amp;amp; 적용하며 수행했던 명령어와 느낀 점을 적어본다.&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;497&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uAtiG/btsMMfiAwpt/Qkcoid3HaAkHM3Cs0lp7Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uAtiG/btsMMfiAwpt/Qkcoid3HaAkHM3Cs0lp7Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uAtiG/btsMMfiAwpt/Qkcoid3HaAkHM3Cs0lp7Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuAtiG%2FbtsMMfiAwpt%2FQkcoid3HaAkHM3Cs0lp7Uk%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;497&quot; height=&quot;273&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크론탭으로 특정 시간마다 이렇게 데이터를 백업을 하고 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 개선할 수 있는 방법은 무엇이 있을까? 고민을 하다 이 김에 redis를 사용해볼까? 하여 도전해 보기로 하였다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 마크 서버에는 이렇게&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfUyby/btsMLuAVQU6/wT66GkPKOcnZg3UDZJKtP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfUyby/btsMLuAVQU6/wT66GkPKOcnZg3UDZJKtP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfUyby/btsMLuAVQU6/wT66GkPKOcnZg3UDZJKtP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfUyby%2FbtsMLuAVQU6%2FwT66GkPKOcnZg3UDZJKtP0%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;531&quot; height=&quot;178&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 사용자가 로그인을 하면 스레드에 알림을 주는 파이썬 스레드가 돌고있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 이용해서 사용자가 접속하여 접속 인원이 1명 이상인 날짜 + 사용자가 퇴장하여 접속 인원이 0명이 된 날짜의 데이터만 백업을 하면 좋을 것 같았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 될 경우 특정지어서 데이터 분석에 효과를 줄 수 있지 않을까 ?! 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 레디스 설치&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1742133522760&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install redis -y

sudo systemctl status redis&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레디스를 설치하고 실행상태를 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HsMtM/btsML3o9nVw/Xp4vbb69pLRwhMADSgvu40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HsMtM/btsML3o9nVw/Xp4vbb69pLRwhMADSgvu40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HsMtM/btsML3o9nVw/Xp4vbb69pLRwhMADSgvu40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHsMtM%2FbtsML3o9nVw%2FXp4vbb69pLRwhMADSgvu40%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;1044&quot; height=&quot;757&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;757&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;844&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Od12H/btsMMcGj8x3/vaptBGktMlQK8k9jwe6gjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Od12H/btsMMcGj8x3/vaptBGktMlQK8k9jwe6gjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Od12H/btsMMcGj8x3/vaptBGktMlQK8k9jwe6gjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOd12H%2FbtsMMcGj8x3%2FvaptBGktMlQK8k9jwe6gjK%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;844&quot; height=&quot;250&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Hello, Redis&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1742134393010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install redis

import redis

# Redis 서버 연결
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 테스트 데이터 저장
r.set(&quot;test_key&quot;, &quot;Hello from Python!&quot;)
print(r.get(&quot;test_key&quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byir7b/btsMNrPRVYV/Qdzbu124sj5q4PgVajGprk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byir7b/btsMNrPRVYV/Qdzbu124sj5q4PgVajGprk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byir7b/btsMNrPRVYV/Qdzbu124sj5q4PgVajGprk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyir7b%2FbtsMNrPRVYV%2FQdzbu124sj5q4PgVajGprk%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;1183&quot; height=&quot;257&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 중인 python 가상환경에 redis를 설치하고 서버에 연결하여 key를 가져와본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. redis 함수 삽입&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWYIW/btsMLvNfsNz/RNjCC0KrnzCHKlmUvPWUok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWYIW/btsMLvNfsNz/RNjCC0KrnzCHKlmUvPWUok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWYIW/btsMLvNfsNz/RNjCC0KrnzCHKlmUvPWUok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWYIW%2FbtsMLvNfsNz%2FRNjCC0KrnzCHKlmUvPWUok%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;792&quot; height=&quot;130&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1742135326889&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    for player in new_players:
        redis_client.lpush(&quot;mc_players&quot;, player)  # Redis 리스트에 플레이어 추가&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;특정 플레이어가 접속하면 Redis에 플레이어 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mhNx1/btsMLOsf2sW/gLj0YtLoootuKpIql9aOIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mhNx1/btsMLOsf2sW/gLj0YtLoootuKpIql9aOIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mhNx1/btsMLOsf2sW/gLj0YtLoootuKpIql9aOIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmhNx1%2FbtsMLOsf2sW%2FgLj0YtLoootuKpIql9aOIk%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;670&quot; height=&quot;121&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1742135368693&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    for player in left_players:
        redis_client.lrem(&quot;mc_players&quot;, 1, player)  # Redis 리스트에서 제거&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플레이어가 퇴장하면 레디스에서 플레이어 제거&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 가운데 인자인 1은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis의 &lt;span&gt;LREM 명령어 중 리스트에서 특정&lt;/span&gt;&amp;nbsp;값을 제거할 때 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742135449242&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;redis_client.lrem(name, count, value)&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;가운데 count가 의미하는 값은&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;count 값&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;동작 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;리스트에서 해당하는 모든 값을 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;왼쪽(0번째)의 값 부터 일치하는 값을 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;오른쪽(맨뒤)의 값 부터 일치하는 값을 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;N&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;왼쪽부터 N개의 일치하는 값을 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 모든 플레이어가 나가면 백업을 실행할 수 있게 함수를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742135559664&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if redis_client.llen(&quot;mc_players&quot;) == 0:
    last_backup_time = redis_client.get(&quot;last_backup&quot;)

    if last_backup_time:
        last_backup_time = datetime.datetime.strptime(last_backup_time, &quot;%Y-%m-%d %H:%M&quot;)
        now = datetime.datetime.now()
        
        if (now - last_backup_time).total_seconds() &amp;lt; 3600:
            print(&quot;최근 1시간 내에 백업이 실행되어 실행하지 않음.&quot;)
        else:
            print(&quot;백업 스크립트 실행 중...&quot;)
            subprocess.run([&quot;backup_script.sh&quot;])
            redis_client.set(&quot;last_backup&quot;, now.strftime(&quot;%Y-%m-%d %H:%M&quot;))
    else:
        print(&quot;백업 스크립트 실행 중...&quot;)
        subprocess.run([&quot;backup_script.sh&quot;])
        redis_client.set(&quot;last_backup&quot;, datetime.datetime.now().strftime(&quot;%Y-%m-%d %H:%M&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;특정 플레이어 리스트가 0이 되면 특정 sh 파일을 실행하여 백업을 진행한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TIbo2/btsMLITf9O6/rwO342KrFpOcVvAgOxK331/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TIbo2/btsMLITf9O6/rwO342KrFpOcVvAgOxK331/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TIbo2/btsMLITf9O6/rwO342KrFpOcVvAgOxK331/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTIbo2%2FbtsMLITf9O6%2FrwO342KrFpOcVvAgOxK331%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;398&quot; height=&quot;63&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 관리하며 백업을 실행해 보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;마무리.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 백업 스크립트를 사용하거나 크론탭으로 감지하여 실행해 볼 수 있었지만 간단하게 진행하는 미니 프로젝트 용으로는 redis를 사용해 보며 도입해 보면 좋을 것 같았다. 그래서 이번 서버의 경우 서버 접속 감지가 기존에도 사용이 되고 있었으며 특정 스크립트를 통해 백업 트리거가 목적이었다. 따라서 접속 상태를 리스트(LPUSH/LREM)로 간단하게 관리가 가능하고 메모리 기반으로써 실시간 응답속도가 빠른 redis를 도입한 이유이다.&lt;/p&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를 이용하는 것도 좋아 보인다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩공부</category>
      <category>redis</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/447</guid>
      <comments>https://integer-ji.tistory.com/447#entry447comment</comments>
      <pubDate>Sun, 16 Mar 2025 23:40:34 +0900</pubDate>
    </item>
    <item>
      <title>마라톤 회고, 부제 : 완주 못한 마라톤은 실패한 마라톤인가?</title>
      <link>https://integer-ji.tistory.com/445</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2mB9T/btsMAMNRqUV/7KKKdXVevvYnqID0DfLlq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2mB9T/btsMAMNRqUV/7KKKdXVevvYnqID0DfLlq1/img.jpg&quot; data-alt=&quot;새는 날고 물고기는 헤엄치고 인간은 달린다. 피크닉 전시회 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2mB9T/btsMAMNRqUV/7KKKdXVevvYnqID0DfLlq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2mB9T%2FbtsMAMNRqUV%2F7KKKdXVevvYnqID0DfLlq1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;769&quot; height=&quot;431&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새는 날고 물고기는 헤엄치고 인간은 달린다. 피크닉 전시회 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;들어가며&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 달리기를 한다. 좋아하지는 않지만, 군대에서 처음 뛰어본 마라톤은 나의 스트레스를 해소하는 운동으로 이용되기 시작했다. 나는 평소에 생각이 많다. 업무를 하며, 일상을 살며 다양한 생각이 머릿속을 떠나지 않는다. 머리가 복잡해질 때, 혹은 다른 안 좋은 네이티브한 생각들로 머릿속이 가득 찰 때, 나는 뛰러 나가기 시작한다. 심장 소리와 나의 호흡을 느끼며 오래 달리다 보면, 생각이 사라진다(하지 못한다). 그리고 깨끗하고 맑은 생각으로 뇌를 초기화한다. 그렇게 마라톤을 시작하게 되었다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실패와 성공&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 실패의 쓴맛은 나를 더 강하게 만들었다. 2023년 마라톤에 도전했을 때, &quot;&lt;b&gt;의지와 정신력&lt;/b&gt;만 있으면 풀마라톤을 뛸 수 있을 거야&quot;라는 자만심으로 충분히 완주할 수 있을 거라 생각했다. 하지만 완주에 실패하고 말았다. 당연하게도 의지와 정신력만으로는 완주를 할 수 없었고 연습량과 마라톤을 참가하는 나의 나쁜 마음가짐을 생각하며 나를 더욱 열심히 준비하게 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그렇게 2024년, 다시 한 번 마라톤에 도전하게 되었다. 이번에는 2023년과는 다르게 나름 열심히 준비했다. 식단부터 시작해, 격주로 진행하는 장거리 훈련, 글리코겐 로딩까지, 그리고 주변 사람들에게 열심히 말을 하며 나만의 동기부여를 만들었다. 그렇게 완주에 성공할 수 있었다. 이 도전을 통해 나는 앞으로 무엇이든 해낼 수 있을 것 같다는 자신감을 얻었고 해외 마라톤이라는 2025년 오사카 마라톤에 다시 도전할 수 있었다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그리고, 다시 실패(?)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 2월 24일, 나는 해외 마라톤에 참가했다. 실패와 성공의 경험을 통하여 해외 마라톤을 경험해 보고 싶었다. 그렇게 참가를 결정하며 눈 내리는 추웠던 2월, 해외 마라톤에 참가하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;해외&amp;nbsp;마라톤은&amp;nbsp;정말&amp;nbsp;색다른&amp;nbsp;경험이었다.&amp;nbsp;한국은&amp;nbsp;응원&amp;nbsp;문화가&amp;nbsp;매우&amp;nbsp;파이팅&amp;nbsp;넘치고&amp;nbsp;열기가&amp;nbsp;대단하다면,&amp;nbsp;일본은&amp;nbsp;비교적&amp;nbsp;조용하고&amp;nbsp;차분한&amp;nbsp;분위기였다.&amp;nbsp;음식도&amp;nbsp;정말&amp;nbsp;다양하게&amp;nbsp;제공되었고,&amp;nbsp;마라톤&amp;nbsp;운영이&amp;nbsp;너무&amp;nbsp;깔끔하고&amp;nbsp;체계적이라는&amp;nbsp;생각이&amp;nbsp;들었다.&amp;nbsp;(이것이&amp;nbsp;바로&amp;nbsp;세계&amp;nbsp;6대&amp;nbsp;마라톤&amp;nbsp;보유국의&amp;nbsp;운영&amp;nbsp;스타일인가?)&amp;nbsp;날씨도&amp;nbsp;많이&amp;nbsp;추웠고,&amp;nbsp;연습도&amp;nbsp;충분히&amp;nbsp;하지&amp;nbsp;못했기&amp;nbsp;때문에&amp;nbsp;완주가&amp;nbsp;어려울&amp;nbsp;거라&amp;nbsp;예상했다.&amp;nbsp;하지만&amp;nbsp;뛰면서&amp;nbsp;제공되는&amp;nbsp;간식들&amp;nbsp;(빵,&amp;nbsp;과자,&amp;nbsp;사탕,&amp;nbsp;바나나,&amp;nbsp;에너지&amp;nbsp;음료&amp;nbsp;등)이&amp;nbsp;끊임없이&amp;nbsp;에너지를&amp;nbsp;공급해&amp;nbsp;주어&amp;nbsp;지치지&amp;nbsp;않게&amp;nbsp;만들었다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;그러나&lt;/b&gt; 피니시 라인이 까지 7km를 남겨두고, 비행기 시간이 부족해 결국 포기하고 집으로 돌아가게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아니, 그저 경험일 뿐&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 경험을 통하여 누구는 더 빨리 겪을 수 있고 누구는 조금 더 늦게 겪을 수 있다. 하지만 이 또한 마라톤과 똑같다. 사람들은 모두 다르다. 페이스, 호흡, 근육량, 성별 등 염색체 하나하나 다르다. 그렇기에 남들과 비교하지 않고 나의 길을 걸을 수 있지 않을까?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정리하며&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 경험은 2025년, 나에게 가장 큰 선물 같았다. 이 도전을 통해 나는 새로운 용기를 얻었고, 그 용기가 나를 한 걸음 더 나아가게 만들었다. 이제는 성공과 실패를 하더라도 도전할 수 있는 용기를 갖게 되었으며 마라톤도, 인생도 결국은 목표를 향해 달려가는 긴 여정이며 목표 지점에 다다르는 순간, 그것이 바로 내 인생의 골인선이 될 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;성장이 없는 실패는 결국 상처만 남는다. 실패는 누구에게나 찾아올 수 있는 경험이고, 상처는 결국 아물고 나면 더 강해진다. 누구나 원하는 목표를 이루지 못할 수 있다. 마라톤을 뛰며 모르는 사람들의 응원을 받으면서, 낯선 곳에서 같은 한국인을 만나 &quot;한국인 파이팅!&quot;을 외치며 서로를 응원하는 그 순간들. 그 순간은 내가 목표를 향해 도전하고 있다는 것만으로도 큰 의미가 있다. 인생도 마찬가지다. 실패와 좌절을 겪더라도, 그건 그저 잠시일 뿐. 조금만 더 기다리면, 언제든지 다시 일어날 수 있다. 털어놓지 않아도, 그 안에 응원하고 지지해 주는 사람들이 있을 거니까.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;새로 얻은 깨닳음과 다짐을 잊지 않게 회고를 작성해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAcpNN/btsMBdxv9zf/EKJzrkEpzaosjrKXFBcZpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAcpNN/btsMBdxv9zf/EKJzrkEpzaosjrKXFBcZpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAcpNN/btsMBdxv9zf/EKJzrkEpzaosjrKXFBcZpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAcpNN%2FbtsMBdxv9zf%2FEKJzrkEpzaosjrKXFBcZpk%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;444&quot; height=&quot;592&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&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;</description>
      <category>끄적끄적</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/445</guid>
      <comments>https://integer-ji.tistory.com/445#entry445comment</comments>
      <pubDate>Sun, 2 Mar 2025 22:28:27 +0900</pubDate>
    </item>
    <item>
      <title>Apache Kafka를 실행해보자</title>
      <link>https://integer-ji.tistory.com/444</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVISww/btsMkaPOGOs/5Nf5yhb2IUJiSPe37tXIOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVISww/btsMkaPOGOs/5Nf5yhb2IUJiSPe37tXIOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVISww/btsMkaPOGOs/5Nf5yhb2IUJiSPe37tXIOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVISww%2FbtsMkaPOGOs%2F5Nf5yhb2IUJiSPe37tXIOk%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;333&quot; height=&quot;151&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 들어가며&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 회사 프로젝트에서 클라이언트와 실시간으로 데이터를 저장해야하는 일이 생겼다. 이 데이터를 보다 효율적으로 처리하기 위해 Apache Kafka를 도입하게 되었고 Kafka를 도입하기 전 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;2. Apache Kafka란?&lt;/b&gt;&lt;/h3&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;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;Producer&lt;/b&gt;: 데이터를 Kafka로 보내는 역할&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Broker&lt;/b&gt;: 데이터를 저장하고 관리하는 서버&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Consumer&lt;/b&gt;: Kafka에서 데이터를 가져가는 역할&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Topic&lt;/b&gt;: 데이터가 저장되는 논리적인 공간&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Partition&lt;/b&gt;: Topic을 여러 개의 작은 단위로 나누어 병렬 처리 가능하게 함\&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;AWS에서 제공하는 카프카 대기열&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zOze3/btsMlprGUP9/nQAKMRYH9FJYefZEy7rhx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zOze3/btsMlprGUP9/nQAKMRYH9FJYefZEy7rhx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zOze3/btsMlprGUP9/nQAKMRYH9FJYefZEy7rhx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzOze3%2FbtsMlprGUP9%2FnQAKMRYH9FJYefZEy7rhx0%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;1051&quot; height=&quot;301&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 게시-구독&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chCAGH/btsMjCsKfPP/qaaVegOuSSKBQ37KpEgk90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chCAGH/btsMjCsKfPP/qaaVegOuSSKBQ37KpEgk90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chCAGH/btsMjCsKfPP/qaaVegOuSSKBQ37KpEgk90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchCAGH%2FbtsMjCsKfPP%2FqaaVegOuSSKBQ37KpEgk90%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;1051&quot; height=&quot;301&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;301&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;b&gt;3. Kafka의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1. 높은 처리량과 확장성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka는 &lt;b&gt;분산 처리 기반&lt;/b&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;Topic을 여러 Partition으로 나누어 Consumer가 병렬 처리 가능&lt;/li&gt;
&lt;li&gt;다수의 Broker로 클러스터를 구성해 수평 확장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2. 내결함성(Fault-Tolerance)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka는 Replicas를 지원하여 하나의 Broker가 다운되더라도 데이터 손실 없이 서비스 운영이 가능하다.&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;Leader-Follower 구조&lt;/b&gt;를 유지하며 안정성 확보&lt;/li&gt;
&lt;li&gt;장애 발생 시 자동으로 다른 노드가 리더 역할을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3. 실시간 데이터 처리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka Streams 또는 Spark Streaming 같은 기술과 결합하면 &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;/ul&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;4. Kafka 로컬 실행&lt;/b&gt;&lt;/h3&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;/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;Kafka 버전&lt;/b&gt;: Apache Kafka 3.9.0&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java &lt;/b&gt;: Java 17&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1 다운로드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 -&amp;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;figure id=&quot;og_1739708797941&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;Apache Kafka&quot; data-og-description=&quot;Apache Kafka: A Distributed Streaming Platform.&quot; data-og-host=&quot;kafka.apache.org&quot; data-og-source-url=&quot;https://kafka.apache.org/downloads&quot; data-og-url=&quot;https://kafka.apache.org/downloads&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/o4czZ/hyYfJyD7lB/SZ0SuoxoK0npjFdlEdtg3K/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://kafka.apache.org/downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kafka.apache.org/downloads&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/o4czZ/hyYfJyD7lB/SZ0SuoxoK0npjFdlEdtg3K/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Apache Kafka&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Apache Kafka: A Distributed Streaming Platform.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kafka.apache.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 카프카 홈페이지에서 최신 버전인 3.9.0 버전의 &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;Scala 2.12를 &lt;/span&gt;설치해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 받은 압축 파일을 아무 경로에 풀어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;zookeeper&lt;span&gt;&amp;nbsp;실행&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zookeeper.properties 파일 수정&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;599&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qYOfc/btsMlkRubTE/LP52NwlaX3HR8atmSXtc3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qYOfc/btsMlkRubTE/LP52NwlaX3HR8atmSXtc3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qYOfc/btsMlkRubTE/LP52NwlaX3HR8atmSXtc3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqYOfc%2FbtsMlkRubTE%2FLP52NwlaX3HR8atmSXtc3k%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;599&quot; height=&quot;379&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E 드라이브의 특정 경로에 카프카를 설치하였는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로퍼티 설정을 바꿔주어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739710291728&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir E:\Developer\kafka\data\zookeeper&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉터리를 하나 더 생성해준 뒤&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739710352448&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/e/Developer/kafka/bin/windows
./zookeeper-server-start.bat /e/Developer/kafka/config/zookeeper.properties&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;598&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqqvQ5/btsMkVqVBXF/kIXlk8CC2boOI8E3Ktah90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqqvQ5/btsMkVqVBXF/kIXlk8CC2boOI8E3Ktah90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqqvQ5/btsMkVqVBXF/kIXlk8CC2boOI8E3Ktah90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqqvQ5%2FbtsMkVqVBXF%2FkIXlk8CC2boOI8E3Ktah90%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;598&quot; height=&quot;108&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행해보면 ..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGYZpU/btsMli7c07N/LPI6HQBxn0f0kVafIr9pMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGYZpU/btsMli7c07N/LPI6HQBxn0f0kVafIr9pMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGYZpU/btsMli7c07N/LPI6HQBxn0f0kVafIr9pMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGYZpU%2FbtsMli7c07N%2FLPI6HQBxn0f0kVafIr9pMK%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;598&quot; height=&quot;376&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zookeeper 구동 성공!&lt;/p&gt;
&lt;p data-end=&quot;190&quot; data-start=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;190&quot; data-start=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;zookeeper는 Kafka 를 실행시키기 위해 꼭 필요하다. 하지만 3.3.0 이상 버전부터는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;zookeeper&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;190&quot; data-start=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT의 힘을 빌려 Zookeeper가 필요한 이유를 찾아보면&lt;/p&gt;
&lt;pre id=&quot;code_1739710576489&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;✅ Kafka가 Zookeeper를 필요로 하는 이유

Broker 등록 및 상태 모니터링
Leader Election (리더 선출)
Topic 및 Partition 메타데이터 저장
Consumer Group 관리 및 오프셋 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-3. Kafka 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;새로운 bash 창을 열어서&lt;/p&gt;
&lt;pre id=&quot;code_1739710715474&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/e/Developer/kafka/config/server.properties&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HsSM0/btsMj6GCn4F/Uph9uyRnSqkUSgfKr5o5s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HsSM0/btsMj6GCn4F/Uph9uyRnSqkUSgfKr5o5s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HsSM0/btsMj6GCn4F/Uph9uyRnSqkUSgfKr5o5s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHsSM0%2FbtsMj6GCn4F%2FUph9uyRnSqkUSgfKr5o5s1%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;580&quot; height=&quot;362&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 저장하는 디렉터리 경로를 바꿔주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 알맞게 폴더도 생성 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739710784920&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir E:\Developer\kafka\data\kafka-logs&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를 실행해 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LAu8r/btsMkXhX937/fdYhi0ApX1JwLdg8qO88t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LAu8r/btsMkXhX937/fdYhi0ApX1JwLdg8qO88t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LAu8r/btsMkXhX937/fdYhi0ApX1JwLdg8qO88t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLAu8r%2FbtsMkXhX937%2FfdYhi0ApX1JwLdg8qO88t0%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;566&quot; height=&quot;117&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1739711083031&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./kafka-server-start.bat /e/Developer/kafka/config/server.properties&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-4. Topic 생성 및 테스트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bash 창을 새로 열어 토픽을 생성하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YNuaM/btsMlOdv6YA/5IUsIsPsm4zMw9KF60KtBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YNuaM/btsMlOdv6YA/5IUsIsPsm4zMw9KF60KtBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YNuaM/btsMlOdv6YA/5IUsIsPsm4zMw9KF60KtBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYNuaM%2FbtsMlOdv6YA%2F5IUsIsPsm4zMw9KF60KtBK%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;576&quot; height=&quot;281&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1739711159810&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /e/Developer/kafka/bin/windows #kafka 폴더 이동
./kafka-topics.bat --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 #kafka 토픽 생성
./kafka-topics.bat --list --bootstrap-server localhost:9092 #kafka 토픽 목록 확인&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;p data-ke-size=&quot;size16&quot;&gt;토픽 생성 후 &quot;Created topic test-topic&quot;가 나오면 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-5. Producer&amp;nbsp;실행&amp;nbsp;(메시지&amp;nbsp;전송)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 bash 창을 또 열어서 메시지를 전송해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4P1l9/btsMkcUnWSl/tgaQenKp5PJ3iOtyUngYrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4P1l9/btsMkcUnWSl/tgaQenKp5PJ3iOtyUngYrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4P1l9/btsMkcUnWSl/tgaQenKp5PJ3iOtyUngYrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4P1l9%2FbtsMkcUnWSl%2FtgaQenKp5PJ3iOtyUngYrK%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;567&quot; height=&quot;174&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1739711409446&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; ./kafka-console-producer.bat --topic test-topic --bootstrap-server localhost:9092
hihi kafka
test message
message test one two&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는 메시지를 Consumer가 가져가기 전까지는 별다른 응답을 주지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-6. Consumer 실행 (메시지 수신)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxiBA2/btsMlpkVgNy/YmLF7m1f4227FEUfSCAb0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxiBA2/btsMlpkVgNy/YmLF7m1f4227FEUfSCAb0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxiBA2/btsMlpkVgNy/YmLF7m1f4227FEUfSCAb0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxiBA2%2FbtsMlpkVgNy%2FYmLF7m1f4227FEUfSCAb0K%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;1166&quot; height=&quot;746&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1739711598456&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./kafka-console-consumer.bat --topic test-topic --from-beginning --bootstrap-server localhost:9092&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;1번 bash 창이 메시지 전송 bash이다. 2번이 방금 입력한 메시지 수신 명령어!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신 명령어를 치면 로그가 쭈르륵 올라오며 1번에서 보낸 메시지가 정상적으로 노출이 되는것을 볼 수 있다!!&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;5. 결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Kafka를 도입하기 위해 구동시켜보았다. 확실히 이미지로 로드맵을 보는 것보다 직접 구동시키며 동작하는 과정을 보니 이해하기가 더 쉬웠다. Topic에서부터 Producer, Consumer까지 메시지가 이동되는 게 상당히 흥미로웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;최근 마인크래프트 서버를 운영하면서 &lt;/span&gt;&lt;span&gt;Kafka를 활용한 실험을 진행할 계획&lt;/span&gt;&lt;span&gt;이다. Kafka를 통해 서버와 클라이언트 간의 &lt;/span&gt;&lt;span&gt;비동기 메시지 처리&lt;/span&gt;&lt;span&gt;를 테스트하고, 실시간 데이터 전송 및 로그 수집을 자동화하는 방법을 탐색해볼 것이다. 이를 통해 &lt;/span&gt;&lt;span&gt;Kafka의 확장성과 비동기 처리 모델이 게임 서버에서 어떻게 활용될 수 있는지 검증&lt;/span&gt;&lt;span&gt;할 예정이다. &lt;/span&gt;&lt;span&gt;이를 바탕으로 앞으로 더 발전된 구조로 개선하고 실 업무에 도입할 생각이다. 재밌을 것 같다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩공부</category>
      <category>kafka</category>
      <category>kafka 실행</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/444</guid>
      <comments>https://integer-ji.tistory.com/444#entry444comment</comments>
      <pubDate>Sun, 16 Feb 2025 22:22:22 +0900</pubDate>
    </item>
    <item>
      <title>Kotlin 런타임 시간 개선하기</title>
      <link>https://integer-ji.tistory.com/443</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HF7yV/btsL4JRS2qd/JVYGkfqFC5Cjt2q4EFJkKK/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HF7yV/btsL4JRS2qd/JVYGkfqFC5Cjt2q4EFJkKK/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HF7yV/btsL4JRS2qd/JVYGkfqFC5Cjt2q4EFJkKK/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHF7yV%2FbtsL4JRS2qd%2FJVYGkfqFC5Cjt2q4EFJkKK%2Ftfile.dat&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;240&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;240&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;blockquote data-ke-style=&quot;style2&quot;&gt;이전 글 : &lt;a href=&quot;https://integer-ji.tistory.com/441?category=793136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Kotlin으로&amp;nbsp;Chunk&amp;nbsp;사용하기,&amp;nbsp;Spring와&amp;nbsp;얼마나&amp;nbsp;다를까?&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글에서 이어집니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;0. 런타임 시간을 줄일 수는 없을까?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문득 공부를 해보고 궁금해졌다. 코틀린 런타임 시간은 줄일 수 없을까? 줄일 수 있다면 어떤 방법이 있는지 알아보고 기존 소스를 개선할 수 있는점은 없을까하여 추가로 수정해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Kotlin Reflection (kotlin-reflect) 제거&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;kotlin-reflect&lt;/span&gt;는 주로 &lt;span&gt;리플렉션 기능&lt;/span&gt; (&lt;span&gt;KClass&lt;/span&gt;, &lt;span&gt;KProperty&lt;/span&gt;, &lt;span&gt;KFunction&lt;/span&gt; 등)을 사용할 때 필요하지만, 현재 코드에서는 사용하지 않는다. 지워도 되는 이유는 아래의 이유가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 정보를 동적으로 조회하지 않음 (::class 사용 없음)&lt;/li&gt;
&lt;li&gt;프로퍼티나 함수 호출에 call() 같은 리플렉션 기능을 사용하지 않음&lt;/li&gt;
&lt;li&gt;어노테이션을 런타임에 조회하는 코드가 없음&lt;/li&gt;
&lt;li&gt;Spring Batch와 관련된 모든 컴포넌트가 일반적인 @Bean으로 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 kotlin-reflect를 제거함으로써 런타임 실행을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;But. 이럴 경우에는 필요할 수 있다.&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 style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;만약 이후에 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Kotlin 데이터 클래스의 copy(), toString(), equals(), hashCode() 같은 함수들을 리플렉션으로 처리하는 프레임워크(Jackson, Spring Validation, DI 등)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;를 사용하게 되면, 다시 필요할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Spring에서 @ConfigurationProperties를 사용할 경우&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;, 내부적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;kotlin-reflect를 필요로 할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;2. Kotlin Object 인스턴스 최적화&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 &lt;/span&gt;data class 및 일반 클래스를 많이 사용하면&lt;span&gt; 실행 시 &lt;/span&gt;객체가 계속 생성&lt;span&gt;되면서 메모리를 많이 차지할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin에서는 &lt;span&gt;object&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;어떤 부분을 object로 바꿔야 할까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상수 값들을 담고 있는 객체&lt;/li&gt;
&lt;li&gt;한 번만 생성되어야 하는 공통적인 함수/설정 값&lt;/li&gt;
&lt;li&gt;불필요하게 매번 생성되는 고정 데이터&lt;/li&gt;
&lt;li&gt;Mapper 또는 RowMapper 같은 반복 호출되는 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-1. SQL Query / 설정값을 object로 관리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AS-IS&lt;/p&gt;
&lt;pre id=&quot;code_1738471426704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
fun itemReader(): JdbcCursorItemReader&amp;lt;InputType&amp;gt; {
    return JdbcCursorItemReaderBuilder&amp;lt;InputType&amp;gt;()
        .name(&quot;jdbcItemReader&quot;)
        .dataSource(dataSource)
        .sql(&quot;SELECT id, name, value, created_at FROM test_table&quot;) //   쿼리가 매번 객체로 생성됨
        .rowMapper { rs, _ -&amp;gt;
            InputType(
                rs.getString(&quot;name&quot;),
                rs.getInt(&quot;value&quot;),
                rs.getTimestamp(&quot;created_at&quot;).toLocalDateTime()
            )
        }
        .build()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 코드에서는 SQL 쿼리 문자열이 &lt;span&gt;itemReader()&lt;/span&gt; 메서드가 호출될 때마다 새로운 객체로 생성된다. 동일한 SQL 문장이 반복적으로 메모리에 할당되는 상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TO-BE&lt;/p&gt;
&lt;pre id=&quot;code_1738471456325&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;object QueryConstants {
    const val SELECT_TEST_TABLE = &quot;SELECT id, name, value, created_at FROM test_table&quot;
}

@Bean
fun itemReader(): JdbcCursorItemReader&amp;lt;InputType&amp;gt; {
    return JdbcCursorItemReaderBuilder&amp;lt;InputType&amp;gt;()
        .name(&quot;jdbcItemReader&quot;)
        .dataSource(dataSource)
        .sql(QueryConstants.SELECT_TEST_TABLE) //   문자열 객체 재사용
        .rowMapper { rs, _ -&amp;gt;
            InputType(
                rs.getString(&quot;name&quot;),
                rs.getInt(&quot;value&quot;),
                rs.getTimestamp(&quot;created_at&quot;).toLocalDateTime()
            )
        }
        .build()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;object&lt;/span&gt;를 활용하여 SQL 쿼리를 상수로 선언하면, 애플리케이션 실행 중 단일 객체로 유지되며 JVM에서 재사용된다. 이를 통해 문자열 객체의 반복 생성을 방지하고, 메모리를 보다 효율적으로 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2. RowMapper를 object로 최적화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AS-IS&lt;/p&gt;
&lt;pre id=&quot;code_1738471599672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.rowMapper { rs, _ -&amp;gt;
    InputType(
        rs.getString(&quot;name&quot;),
        rs.getInt(&quot;value&quot;),
        rs.getTimestamp(&quot;created_at&quot;).toLocalDateTime()
    )
}&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;rowMapper&lt;/span&gt; 람다가 &lt;span&gt;itemReader()&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;TO-BE&lt;/p&gt;
&lt;pre id=&quot;code_1738471700355&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;object InputTypeRowMapper : RowMapper&amp;lt;InputType&amp;gt; {
    override fun mapRow(rs: ResultSet, rowNum: Int): InputType {
        return InputType(
            rs.getString(&quot;name&quot;),
            rs.getInt(&quot;value&quot;),
            rs.getTimestamp(&quot;created_at&quot;).toLocalDateTime()
        )
    }
}

@Bean
fun itemReader(): JdbcCursorItemReader&amp;lt;InputType&amp;gt; {
    return JdbcCursorItemReaderBuilder&amp;lt;InputType&amp;gt;()
        .name(&quot;jdbcItemReader&quot;)
        .dataSource(dataSource)
        .sql(QueryConstants.SELECT_TEST_TABLE)
        .rowMapper(InputTypeRowMapper) //   같은 객체를 계속 사용
        .build()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;RowMapper&lt;/span&gt;를 &lt;span&gt;object&lt;/span&gt;로 정의하여 싱글톤으로 관리하여 동일한 객체  재사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-3. ItemProcessor를 싱글톤 object로 변경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AS-IS&lt;/p&gt;
&lt;pre id=&quot;code_1738471749168&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
fun itemProcessor(): ItemProcessor&amp;lt;InputType, OutputType&amp;gt; {
    return ItemProcessor { input -&amp;gt;
        OutputType(
            name = input.name.uppercase(),
            value = input.value * 2,
            createdAt = input.createdAt
        )
    }
}&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;itemProcessor()&lt;/span&gt;가 호출될 때마다 새로운 &lt;span&gt;ItemProcessor&lt;/span&gt; 인스턴스가 생성된다. 이는 불필요한 객체 할당 되는 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TO-BE&lt;/p&gt;
&lt;pre id=&quot;code_1738471826916&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;object BatchItemProcessor : ItemProcessor&amp;lt;InputType, OutputType&amp;gt; {
    override fun process(input: InputType): OutputType {
        return OutputType(
            name = input.name.uppercase(),
            value = input.value * 2,
            createdAt = input.createdAt
        )
    }
}

@Bean
fun itemProcessor(): ItemProcessor&amp;lt;InputType, OutputType&amp;gt; = BatchItemProcessor&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;ItemProcessor&lt;/span&gt;를 &lt;span&gt;object&lt;/span&gt;로 정의하여 싱글톤으로 관리, 동일한 객체를 재사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-4. PerformanceStepListener를 object로 변경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AS-IS&lt;/p&gt;
&lt;pre id=&quot;code_1738471867498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
fun step1(
    jobRepository: JobRepository,
    transactionManager: PlatformTransactionManager
): Step {
    return StepBuilder(&quot;step1&quot;, jobRepository)
        .chunk&amp;lt;InputType, OutputType&amp;gt;(1000, transactionManager)
        .reader(itemReader())
        .processor(itemProcessor())
        .writer(itemWriter())
        .listener(PerformanceStepListener()) //   매번 새로운 인스턴스 생성
        .allowStartIfComplete(false)
        .build()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PerformanceStepListener&lt;/span&gt;가 &lt;span&gt;step1()&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;TO-BE&lt;/p&gt;
&lt;pre id=&quot;code_1738472041820&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// as-is
class PerformanceStepListener : StepExecutionListenerSupport()

// to-be
object PerformanceStepListener : StepExecutionListenerSupport()&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;class로 되어있는 PerformanceStepListener를 object로 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738472086459&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
fun step1(
    jobRepository: JobRepository,
    transactionManager: PlatformTransactionManager
): Step {
    return StepBuilder(&quot;step1&quot;, jobRepository)
        .chunk&amp;lt;InputType, OutputType&amp;gt;(1000, transactionManager)
        .reader(itemReader())
        .processor(itemProcessor())
        .writer(itemWriter())
        .listener(PerformanceStepListener) //   같은 객체를 재사용
        .allowStartIfComplete(false)
        .build()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 재사용&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;3. JdbcPagingItemReader를 사용해서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;페이징 처리&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1738478960291&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
fun itemReader(): JdbcCursorItemReader&amp;lt;InputType&amp;gt; {
    return JdbcCursorItemReaderBuilder&amp;lt;InputType&amp;gt;()
        .name(&quot;jdbcItemReader&quot;)
        .dataSource(dataSource)
        .sql(QueryConstants.SELECT_TEST_TABLE)
        .rowMapper(InputTypeRowMapper) //   같은 객체를 계속 사용
        .build()
}

object BatchItemProcessor : ItemProcessor&amp;lt;InputType, OutputType&amp;gt; {
    override fun process(input: InputType): OutputType {
        return OutputType(
            name = input.name.uppercase(),
            value = input.value * 2,
            createdAt = input.createdAt
        )
    }
}&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;JdbcCursorItemReader&lt;/span&gt;를 사용하여 한 번에 모든 데이터를 읽어오는 방식이다. 이 경우, 대용량 데이터를 처리할 때 &lt;span&gt;메모리 사용량이 급격히 증가&lt;/span&gt;하는데 특히, 전체 데이터를 커서 기반으로 한꺼번에 메모리에 로드하기 때문에, &lt;span&gt;데이터 크기가 커질수록&amp;nbsp;&lt;/span&gt;&lt;span&gt;OutOfMemory(메모리 부족)이 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분을 수정해보자&lt;/p&gt;
&lt;pre id=&quot;code_1738479012460&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
fun itemReader(): JdbcPagingItemReader&amp;lt;InputType&amp;gt; {
    val pagingQueryProvider = SqlPagingQueryProviderFactoryBean().apply {
        setDataSource(dataSource)
        setSelectClause(&quot;id, name, value, created_at&quot;)
        setFromClause(&quot;from test_table&quot;)
        setSortKey(&quot;id&quot;) // 정렬 필수
    }.getObject()!!

    return JdbcPagingItemReaderBuilder&amp;lt;InputType&amp;gt;()
        .name(&quot;jdbcPagingItemReader&quot;)
        .dataSource(dataSource)
        .fetchSize(1000) // ✅ 한 번에 가져오는 개수 줄이기
        .rowMapper(InputTypeRowMapper)
        .queryProvider(pagingQueryProvider)
        .build()
}

object BatchItemProcessor : ItemProcessor&amp;lt;InputType, OutputType&amp;gt; {
    override fun process(input: InputType): OutputType = input.run {
        OutputType(
            name.uppercase(), // ✅ 기존 객체를 사용하여 최소한의 데이터 변경
            value * 2,
            createdAt
        )
    }
}&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;JdbcPagingItemReader&lt;/span&gt;&lt;span&gt;를 사용하여 &lt;/span&gt;페이징 단위로 데이터를 가져오도록 변경&lt;span&gt;하면, 한 번에 로드되는 데이터 개수를 제한할 수 있어 &lt;/span&gt;메모리 사용량을 효과적으로 줄일 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;4.  어플리케이션 실행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;페이징을 적용하기 전&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;JdbcCursorItemReader&lt;/span&gt;&lt;span&gt;를 사용한 기존 방식에서는 실행 시간이 빠르지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;메모리 사용량이 높고 CPU 활용도가 낮은 특징&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; 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;chunk 크기&lt;/td&gt;
&lt;td&gt;실행 시간(ms)&lt;/td&gt;
&lt;td&gt;CPU 사용률 (%)&lt;/td&gt;
&lt;td&gt;메모리 사용량 (MB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;74689&lt;/td&gt;
&lt;td&gt;0.09&lt;/td&gt;
&lt;td&gt;143.88&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5000&lt;/td&gt;
&lt;td&gt;52788&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;117.95&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; 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;h4 data-ke-size=&quot;size20&quot;&gt;4-1. chunk 1000, fetch size 1000&lt;/h4&gt;
&lt;pre id=&quot;code_1738475801618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=== Batch Step Performance Metrics ===
Step Name: step1
Execution Time: 238215 ms
CPU Usage: 0.02 %
Memory Usage: 62.34 MB
Items Read: 1500000
Items Written: 1500000
======================================&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: #555555; text-align: start;&quot;&gt;chunk 1000일 경우 cpu와 memory 사용률이 눈에 뛰게 줄어들었다.&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: #555555; text-align: start;&quot;&gt;근데 .. 시간이 너무 오래걸린다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&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;fetchSize를 올리고 스레드를 사용하여 병렬 처리를 해보기로 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-2. chunk 1000, fetch size 5000&lt;/h4&gt;
&lt;pre id=&quot;code_1738477491427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=== Batch Step Performance Metrics ===
Step Name: step1
Execution Time: 187629 ms
CPU Usage: 0.02 %
Memory Usage: 38.21 MB
Items Read: 1500000
Items Written: 1500000
======================================&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;chunk를 키워보자&lt;/p&gt;
&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;fetchSize&lt;/span&gt;&lt;span&gt;를 5000으로 증가하면서 실행 시간이 줄어들었고, 메모리 사용량도 감소하였다. &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;h4 data-ke-size=&quot;size20&quot;&gt;4-3. 변경 데이터 확인&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; 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;chunk 크기&lt;/td&gt;
&lt;td&gt;fetch size&lt;/td&gt;
&lt;td&gt;실행 시간(ms)&lt;/td&gt;
&lt;td&gt;CPU 사용률 (%)&lt;/td&gt;
&lt;td&gt;메모리 사용량 (MB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;238215 (3분)&lt;/td&gt;
&lt;td&gt;0.02&lt;/td&gt;
&lt;td&gt;62.34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;5000&lt;/td&gt;
&lt;td&gt;187629&lt;/td&gt;
&lt;td&gt;0.02&lt;/td&gt;
&lt;td&gt;38.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5000&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;161150&lt;/td&gt;
&lt;td&gt;0.02&lt;/td&gt;
&lt;td&gt;43.36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5000&lt;/td&gt;
&lt;td&gt;5000&lt;/td&gt;
&lt;td&gt;162954&lt;/td&gt;
&lt;td&gt;0.13&lt;/td&gt;
&lt;td&gt;69.71&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이쯤 되면 시간이 너무 오래 걸려서 이렇게 굳이 페이징 처리를 해야하나?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;페이징 처리는 메모리 최적화에는 유리하지만, 실행 시간이 길어질 수 있다.사용 목적에 맞게 적절한 chunkSize와 fetchSize를 조절해야 하며, 무조건 페이징이 최적의 방법은 아니라고 생각이 든다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. 후기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사실 아직까지 코틀린을 써야 하는 이유가 명확하지 않다. 코틀린의 장점과 단점을 함께 비교해 보면 메모리 최적화나 객체 재사용 측면에서는 유리하지만, 실행 시간이 길어지는 문제가 있다. 이러한 점을 고려할 때, 특정 상황에서는 자바가 더 적합할 수도 있겠다고 생각한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;저번에 공부한 것을 기반으로 메모리 점유률, cpu 사용률을 계산할 수 있어서 이것저것 해보고있었는데 흠,, 오늘의 결과는 조금 아쉽긴 하다. 물론 내가 올바른 방법으로 테스트를 한게 아닐 수도 있다. 그래도 기존과는 다른 접근 방식을 시도하면서 새로운 시각을 얻을 수 있어서 뿌듯하긴 하다. 다음에는 코틀린 말고 Java에 더 집중해서 공부를 해볼까 한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩공부</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/443</guid>
      <comments>https://integer-ji.tistory.com/443#entry443comment</comments>
      <pubDate>Sun, 2 Feb 2025 16:14:07 +0900</pubDate>
    </item>
    <item>
      <title>Kotlin으로 Chunk 사용하기, Spring와 얼마나 다를까?</title>
      <link>https://integer-ji.tistory.com/441</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XDB92/btsLBXJl4fG/UWlVAIKhFhuqljsTz9efn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XDB92/btsLBXJl4fG/UWlVAIKhFhuqljsTz9efn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XDB92/btsLBXJl4fG/UWlVAIKhFhuqljsTz9efn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXDB92%2FbtsLBXJl4fG%2FUWlVAIKhFhuqljsTz9efn1%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;480&quot; height=&quot;240&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://integer-ji.tistory.com/440&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://integer-ji.tistory.com/440&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735522947939&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Boot 3.x에서 Chunk 사용해서 데이터 read, write 사용률 알아보기&quot; data-og-description=&quot;0. Chunk를 사용하는 이유는 뭘까?메모리 관리에 용이전체 데이터를 한 번에 로드하지 않고 설정된 Chunk 크기만큼 메모리에 유지시킨다.&amp;nbsp;대용량 데이터 처리 시에도 OutOfMemoryError를 방지할 수 있다&quot; data-og-host=&quot;integer-ji.tistory.com&quot; data-og-source-url=&quot;https://integer-ji.tistory.com/440&quot; data-og-url=&quot;https://integer-ji.tistory.com/440&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/l7M8v/hyXWxYz7eS/LEMT0YgFIR3b4aAFQRA1g0/img.png?width=490&amp;amp;height=257&amp;amp;face=18_50_156_200,https://scrap.kakaocdn.net/dn/baRXvO/hyXWvl9X0m/ENwxQp7mVFlrdxE0D3W3u0/img.png?width=490&amp;amp;height=257&amp;amp;face=18_50_156_200,https://scrap.kakaocdn.net/dn/Um24P/hyXWnVX0X5/OwOzXxPOxYr0JdbKNDl2b1/img.png?width=2299&amp;amp;height=697&amp;amp;face=0_0_2299_697&quot;&gt;&lt;a href=&quot;https://integer-ji.tistory.com/440&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://integer-ji.tistory.com/440&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/l7M8v/hyXWxYz7eS/LEMT0YgFIR3b4aAFQRA1g0/img.png?width=490&amp;amp;height=257&amp;amp;face=18_50_156_200,https://scrap.kakaocdn.net/dn/baRXvO/hyXWvl9X0m/ENwxQp7mVFlrdxE0D3W3u0/img.png?width=490&amp;amp;height=257&amp;amp;face=18_50_156_200,https://scrap.kakaocdn.net/dn/Um24P/hyXWnVX0X5/OwOzXxPOxYr0JdbKNDl2b1/img.png?width=2299&amp;amp;height=697&amp;amp;face=0_0_2299_697');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 3.x에서 Chunk 사용해서 데이터 read, write 사용률 알아보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;0. Chunk를 사용하는 이유는 뭘까?메모리 관리에 용이전체 데이터를 한 번에 로드하지 않고 설정된 Chunk 크기만큼 메모리에 유지시킨다.&amp;nbsp;대용량 데이터 처리 시에도 OutOfMemoryError를 방지할 수 있다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;integer-ji.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;0. Kotlin과 차이가 있을까?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번주에는 Spring Boot에서 Java 17을 이용해 Chunk의 메모리 사용량을 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 궁금한 점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin에서 Java 소스를 그대로 사용하게 된다면 과연 메모리 사용율은 어떻게 변할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 차이가 있을지 궁금하여 시도해 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 프로젝트 설정&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-1. 사용된 언어와 라이브러리 버전&lt;/h4&gt;
&lt;pre id=&quot;code_1735523124403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kotlin 1.9.25
spring boot 3.3.6

dependencies {
    implementation(&quot;org.springframework.boot:spring-boot-starter-batch:3.3.6&quot;)
    implementation(&quot;org.springframework.boot:spring-boot-starter-jdbc:3.3.6&quot;)
    implementation(&quot;org.jetbrains.kotlin:kotlin-reflect&quot;)
    compileOnly(&quot;org.projectlombok:lombok:1.18.36&quot;)
    runtimeOnly(&quot;com.microsoft.sqlserver:mssql-jdbc:12.6.4.jre11&quot;)
    annotationProcessor(&quot;org.projectlombok:lombok:1.18.36&quot;)
    testImplementation(&quot;org.springframework.boot:spring-boot-starter-test:3.3.6&quot;)
    testImplementation(&quot;org.springframework.batch:spring-batch-test:5.1.2&quot;)
    testImplementation(&quot;org.jetbrains.kotlin:kotlin-test-junit5&quot;)
    testRuntimeOnly(&quot;org.junit.platform:junit-platform-launcher:1.10.5&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;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://integer-ji.tistory.com/440&quot;&gt;이전 글과 동의.&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-2.&amp;nbsp;테이블&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;데이터&amp;nbsp;Insert&amp;nbsp;(mssql)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;이전 글과 동의&quot; href=&quot;https://integer-ji.tistory.com/440&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전 글과 동의.&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 배치 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunk를&amp;nbsp;사용하여&amp;nbsp;데이터를&amp;nbsp;Read,&amp;nbsp;Write&amp;nbsp;하는&amp;nbsp;함수를&amp;nbsp;만듭니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737284220627&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.kin.batch.config

import com.kin.batch.listener.PerformanceStepListener
import com.kin.batch.model.InputType
import com.kin.batch.model.OutputType
import org.springframework.batch.core.Job
import org.springframework.batch.core.Step
import org.springframework.batch.core.job.builder.JobBuilder
import org.springframework.batch.core.repository.JobRepository
import org.springframework.batch.core.step.builder.StepBuilder
import org.springframework.batch.item.ItemProcessor
import org.springframework.batch.item.database.JdbcBatchItemWriter
import org.springframework.batch.item.database.JdbcCursorItemReader
import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder
import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.transaction.PlatformTransactionManager
import javax.sql.DataSource

@Configuration
class BatchConfig(private val dataSource: DataSource) {

    @Bean
    fun batchJob(
        jobRepository: JobRepository,
        transactionManager: PlatformTransactionManager
    ): Job {
        return JobBuilder(&quot;batchJob&quot;, jobRepository)
            .start(step1(jobRepository, transactionManager))
            .build()
    }

    @Bean
    fun step1(
        jobRepository: JobRepository,
        transactionManager: PlatformTransactionManager
    ): Step {
        return StepBuilder(&quot;step1&quot;, jobRepository)
            .chunk&amp;lt;InputType, OutputType&amp;gt;(1000, transactionManager)
            .reader(itemReader())
            .processor(itemProcessor())
            .writer(itemWriter())
            .listener(PerformanceStepListener())
            .allowStartIfComplete(false)
            .build()
    }

    @Bean
    fun itemReader(): JdbcCursorItemReader&amp;lt;InputType&amp;gt; {
        return JdbcCursorItemReaderBuilder&amp;lt;InputType&amp;gt;()
            .name(&quot;jdbcItemReader&quot;)
            .dataSource(dataSource)
            .sql(&quot;SELECT id, name, value, created_at FROM test_table&quot;)
            .rowMapper { rs, _ -&amp;gt;
                InputType(
                    rs.getString(&quot;name&quot;),
                    rs.getInt(&quot;value&quot;),
                    rs.getTimestamp(&quot;created_at&quot;).toLocalDateTime()
                )
            }
            .build()
    }

    @Bean
    fun itemProcessor(): ItemProcessor&amp;lt;InputType, OutputType&amp;gt; {
        return ItemProcessor { input -&amp;gt;
            OutputType(
                name = input.name.uppercase(),
                value = input.value * 2,
                createdAt = input.createdAt
            )
        }
    }

    @Bean
    fun itemWriter(): JdbcBatchItemWriter&amp;lt;OutputType&amp;gt; {
        return JdbcBatchItemWriterBuilder&amp;lt;OutputType&amp;gt;()
            .dataSource(dataSource)
            .sql(&quot;INSERT INTO processed_table (name, value, created_at) VALUES (:name, :value, :createdAt)&quot;)
            .beanMapped()
            .build()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지는 이전 글과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 메모리 체크 함수&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1737284369424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.kin.batch.listener

import org.springframework.batch.core.ExitStatus
import org.springframework.batch.core.StepExecution
import org.springframework.batch.core.listener.StepExecutionListenerSupport
import java.lang.management.ManagementFactory
import com.sun.management.OperatingSystemMXBean
import java.time.Duration
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId

class PerformanceStepListener : StepExecutionListenerSupport() {

    private val runtime: Runtime = Runtime.getRuntime()

    override fun afterStep(stepExecution: StepExecution): ExitStatus {
        // 시작 시간과 종료 시간 가져오기
        val startTime: LocalDateTime = stepExecution.startTime ?: LocalDateTime.now()
        val endTime: LocalDateTime = stepExecution.endTime ?: LocalDateTime.now()

        // Instant 변환
        val startInstant: Instant = localDateTimeToInstant(startTime)
        val endInstant: Instant = localDateTimeToInstant(endTime)

        // 실행 시간 계산 (밀리초)
        val executionTimeMs: Long = Duration.between(startInstant, endInstant).toMillis()

        val cpuUsage: Float = getCpuUsage()
        val memoryUsage: Double = getMemoryUsage()

        printPerformanceMetrics(stepExecution, executionTimeMs, cpuUsage, memoryUsage)
        return stepExecution.exitStatus
    }

    private fun localDateTimeToInstant(localDateTime: LocalDateTime): Instant {
        return localDateTime.atZone(ZoneId.systemDefault()).toInstant()
    }

    private fun getCpuUsage(): Float {
        return try {
            val osBean: OperatingSystemMXBean =
                ManagementFactory.getPlatformMXBean(OperatingSystemMXBean::class.java)

            // 첫 번째 샘플링
            val startTime: Long = System.nanoTime()
            val startCpuTime: Double = osBean.processCpuTime.toDouble()

            // 100ms 대기
            Thread.sleep(100)

            // 두 번째 샘플링
            val endTime: Long = System.nanoTime()
            val endCpuTime: Double = osBean.processCpuTime.toDouble()

            // CPU 사용률 계산
            val elapsedTime: Long = endTime - startTime // 나노초
            val cpuUsage: Double = (endCpuTime - startCpuTime) / (elapsedTime * osBean.availableProcessors)

            // 퍼센트 단위로 변환
            (cpuUsage * 100).toFloat()
        } catch (e: Exception) {
            e.printStackTrace()
            0.0f // 오류 시 기본값
        }
    }

    private fun getMemoryUsage(): Double {
        // JVM 메모리 사용량 측정 (MB)
        val usedMemory: Long = runtime.totalMemory() - runtime.freeMemory()
        return usedMemory / (1024.0 * 1024.0) // MB 단위로 변환
    }

    private fun printPerformanceMetrics(
        stepExecution: StepExecution,
        executionTimeMs: Long,
        cpuUsage: Float,
        memoryUsage: Double
    ) {
        System.out.printf(
            &quot;&quot;&quot;
                === Batch Step Performance Metrics ===
                Step Name: %s
                Execution Time: %d ms
                CPU Usage: %.2f %%
                Memory Usage: %.2f MB
                Items Read: %d
                Items Written: %d
                ======================================
                &quot;&quot;&quot;.trimIndent(),
            stepExecution.stepName,
            executionTimeMs,
            cpuUsage,
            memoryUsage,
            stepExecution.readCount,
            stepExecution.writeCount
        )
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://integer-ji.tistory.com/440&quot;&gt;이전 글과 동의.&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 배치 수행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트는 Java와 마찬가지로 1,500,000건으로 테스트를 진행해 보았다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;mssql을 사용했고 서버는 docker container로 올렸다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 배치 수행 전 평시 상태를 체크해 보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3074&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boYRRf/btsLStaQuqZ/BkJnvqjhd5kZLRKul1uFK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boYRRf/btsLStaQuqZ/BkJnvqjhd5kZLRKul1uFK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boYRRf/btsLStaQuqZ/BkJnvqjhd5kZLRKul1uFK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboYRRf%2FbtsLStaQuqZ%2FBkJnvqjhd5kZLRKul1uFK0%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;3074&quot; height=&quot;1080&quot; data-origin-width=&quot;3074&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평온하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평온한 도커에 돌을 던져보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-1. 애플리케이션 수행&lt;/h4&gt;
&lt;pre id=&quot;code_1737285711186&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=== Batch Step Performance Metrics ===
Step Name: step1
Execution Time: 74689 ms
CPU Usage: 0.09 %
Memory Usage: 143.88 MB
Items Read: 1500000
Items Written: 1500000
======================================&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;앗 Java 보다 자원을 많이 쓴 거 같은데?&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;3044&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwhKza/btsLScgAeyU/W4htUFPOB9JjmpfoWYK7GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwhKza/btsLScgAeyU/W4htUFPOB9JjmpfoWYK7GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwhKza/btsLScgAeyU/W4htUFPOB9JjmpfoWYK7GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwhKza%2FbtsLScgAeyU%2FW4htUFPOB9JjmpfoWYK7GK%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;3044&quot; height=&quot;994&quot; data-origin-width=&quot;3044&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 DB CPU는 74% 정도 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(java는 80% 넘게 사용됐다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;청크를 높여보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chunk 5000&lt;/p&gt;
&lt;pre id=&quot;code_1737286010761&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=== Batch Step Performance Metrics ===
Step Name: step1
Execution Time: 52788 ms
CPU Usage: 0.01 %
Memory Usage: 117.95 MB
Items Read: 1500000
Items Written: 1500000
======================================&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 메모리 사용량이 되게 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3052&quot; data-origin-height=&quot;1076&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A3y7a/btsLRGaYNGq/RkEKD7UIZCn8jz350zMfjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A3y7a/btsLRGaYNGq/RkEKD7UIZCn8jz350zMfjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A3y7a/btsLRGaYNGq/RkEKD7UIZCn8jz350zMfjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA3y7a%2FbtsLRGaYNGq%2FRkEKD7UIZCn8jz350zMfjk%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;3052&quot; height=&quot;1076&quot; data-origin-width=&quot;3052&quot; data-origin-height=&quot;1076&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 77.68%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션의 메모리를 정리해 본다면&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; 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;chunk 크기&lt;/td&gt;
&lt;td&gt;실행 시간(ms)&lt;/td&gt;
&lt;td&gt;CPU 사용률 (%)&lt;/td&gt;
&lt;td&gt;메모리 사용량 (MB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;74689&lt;/td&gt;
&lt;td&gt;0.09&lt;/td&gt;
&lt;td&gt;143.88&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5000&lt;/td&gt;
&lt;td&gt;52788&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;117.95&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흠 정리를 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 마무리&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5-1. 비교 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Java (chunk 1000): 80,352ms&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Kotlin (chunk 1000): 74,689ms&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Kotlin이 약 7% 더 빠른 실행 속도를 보임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션 메모리 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Java (chunk 1000): 48.31MB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Kotlin (chunk 1000): 143.88MB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin이 약 3배 더 많은 메모리를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB CPU 사용률&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java: 최대 80% 이상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin: 최대 74%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin이 DB CPU를 조금 더 효율적으로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5-2. 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 서버의 리소스 사용과 전반적인 실행 속도에서는 kotiln이 더 우세한 성능을 보였다. 하지만 어플리케이션 메모리 사용량에서는 Java가 더 효율적이었다. 이 이유는 kotiln이 런타임 라이브러리가 크기때문에 많이 사용되는 거라고 추정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 kotiln을 사용하는데 정말 편했다. 나는 Python과 Java를 사용하고 있는데 딱 두개의 장점을 섞어놓은 듯한 느낌을 받았다. 특히 java에서 만든 소스 그대로 kotiln에서 사용하는게 너무 편했다&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; 5-3. 짧은 회고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kotiln을 연구하는 이유는 많은 회사에서 kotiln을 도입한 이유를 알고 싶었고 이미 고착화된 java를 버리고 kotiln으로 넘어가야하나?라는 의문점에 답변을 하고싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 Java와 Kotiln을 비교해가며 사용해보니 각각의 장점을 알 수 있었다. 또한 이러한 연구방식은 처음 시도해 보는데 CPU, 메모리의 사용량을 알기위해 라이브러리도 처음 써보고 Docker 컨테이너를 사용해서 상태분석도 해봤다. 물론 이게 옳지 않을 수도 있다. 하지만 이러한 방향성을 잡은 지금으로써는 더 다듬어가며 앞으로의 연구에 도움이 될 것 같아서 많이 뿌듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩공부</category>
      <category>chunk</category>
      <category>docker</category>
      <category>java</category>
      <category>kotiln</category>
      <category>MSSQL</category>
      <category>Spring</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/441</guid>
      <comments>https://integer-ji.tistory.com/441#entry441comment</comments>
      <pubDate>Sun, 19 Jan 2025 20:29:46 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot 3.x에서 Chunk 사용해서 데이터 read, write 사용률 알아보기</title>
      <link>https://integer-ji.tistory.com/440</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkaceU/btsLvUfhQTc/5EgtjmosWDmrBJZg5Mqsr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkaceU/btsLvUfhQTc/5EgtjmosWDmrBJZg5Mqsr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkaceU/btsLvUfhQTc/5EgtjmosWDmrBJZg5Mqsr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkaceU%2FbtsLvUfhQTc%2F5EgtjmosWDmrBJZg5Mqsr0%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;490&quot; height=&quot;257&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;257&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;b&gt;0. Chunk를 사용하는 이유는 뭘까?&lt;/b&gt;&lt;/h3&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: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;전체 데이터를 한 번에 로드하지 않고 설정된 Chunk 크기만큼 메모리에 유지시킨다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;대용량 데이터 처리 시에도 OutOfMemoryError를 방지할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Garbage Collection 부하가 감소된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 트랜잭션 관리
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Chunk 단위로 트랜잭션 처리가 되기 때문에 전체적인 프로세스 안정성에 향상된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. 성능 최적화
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;JDBC Batch 처리와 결합하여 데이터베이스 작업에 최적화한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;네트워크 통신 횟수를 감소시킨다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;데이터베이스에 부하를 분산시킨다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 이 3가지로 보인다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 회사 프로젝트에서 대용량 데이터를 조금 더 효율적으로 다루어 보기 위해 테스트를 진행해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 프로젝트 설정&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-1. 사용된 언어와 라이브러리 버전&lt;/h4&gt;
&lt;pre id=&quot;code_1735017461056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Java 17
spring boot 3.3.6

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-batch:3.3.6'
	implementation 'org.springframework.boot:spring-boot-starter-jdbc:3.3.6'
	compileOnly 'org.projectlombok:lombok:1.18.36'
	runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc:12.6.4.jre11'
	annotationProcessor 'org.projectlombok:lombok:1.18.36'
	testImplementation 'org.springframework.boot:spring-boot-starter-test:3.3.6'
	testImplementation 'org.springframework.batch:spring-batch-test:5.1.2'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.5'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-2. 테이블 생성 및 데이터 Insert (mssql)&lt;/h4&gt;
&lt;pre id=&quot;code_1735017542823&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 테스트 데이터를 저장할 테이블
CREATE TABLE test_table (
    id BIGINT IDENTITY PRIMARY KEY, -- 자동 증가 ID
    name NVARCHAR(100),             -- 이름
    value INT,                      -- 랜덤 값
    created_at DATETIME             -- 생성 날짜
);

-- 처리된 데이터를 저장할 테이블
CREATE TABLE processed_table (
    id BIGINT IDENTITY PRIMARY KEY, -- 자동 증가 ID
    name NVARCHAR(100),             -- 변환된 이름
    value INT,                      -- 변환된 값
    created_at DATETIME             -- 생성 날짜
);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735017558602&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 대용량 데이터 삽입
SET NOCOUNT ON;

DECLARE @Counter INT = 1;

WHILE @Counter &amp;lt;= 300000
BEGIN
    INSERT INTO test_table (name, value, created_at)
    VALUES (
        CONCAT('TestName_', @Counter),        -- 고유한 이름
        ABS(CHECKSUM(NEWID()) % 10000),       -- 랜덤 값 (0~9999)
        DATEADD(SECOND, @Counter, GETDATE()) -- 고유한 생성 날짜
    );
    SET @Counter = @Counter + 1;
END;&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;b&gt;2. 배치 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunk를 사용하여 데이터를 Read, Write 하는 함수를 만듭니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735017610657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.batch.config;

import com.home.batch.listener.PerformanceStepListener;
import com.home.batch.model.InputType;
import com.home.batch.model.OutputType;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.database.JdbcCursorItemReader;
import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder;
import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
public class BatchConfig {

    private final DataSource dataSource;

    public BatchConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Bean
    public Job batchJob(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
        return new JobBuilder(&quot;batchJob&quot;, jobRepository)
                .start(step1(jobRepository, transactionManager))
                .build();
    }

    @Bean
    public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
        return new StepBuilder(&quot;step1&quot;, jobRepository)
                .&amp;lt;InputType, OutputType&amp;gt;chunk(1000, transactionManager)
                .reader(itemReader())
                .processor(itemProcessor())
                .writer(itemWriter())
                .listener(new PerformanceStepListener())
                .allowStartIfComplete(false)
                .build();
    }

    @Bean
    public JdbcCursorItemReader&amp;lt;InputType&amp;gt; itemReader() {
        return new JdbcCursorItemReaderBuilder&amp;lt;InputType&amp;gt;()
                .name(&quot;jdbcItemReader&quot;)
                .dataSource(dataSource)
                .sql(&quot;SELECT id, name, value, created_at FROM test_table&quot;)
                .rowMapper((rs, rowNum) -&amp;gt; new InputType(
                        rs.getString(&quot;name&quot;),
                        rs.getInt(&quot;value&quot;),
                        rs.getTimestamp(&quot;created_at&quot;).toLocalDateTime()
                ))
                .build();
    }

    @Bean
    public ItemProcessor&amp;lt;InputType, OutputType&amp;gt; itemProcessor() {
        return input -&amp;gt; new OutputType(
                input.getName().toUpperCase(),
                input.getValue() * 2,
                input.getCreatedAt()
        );
    }

    @Bean
    public JdbcBatchItemWriter&amp;lt;OutputType&amp;gt; itemWriter() {
        return new JdbcBatchItemWriterBuilder&amp;lt;OutputType&amp;gt;()
                .dataSource(dataSource)
                .sql(&quot;INSERT INTO processed_table (name, value, created_at) VALUES (:name, :value, :createdAt)&quot;)
                .beanMapped()
                .build();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나씩 알아보자&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-1. Step&lt;/h4&gt;
&lt;pre id=&quot;code_1735020865165&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    return new StepBuilder(&quot;step1&quot;, jobRepository)
            .&amp;lt;InputType, OutputType&amp;gt;chunk(1000, transactionManager)
            .reader(itemReader())
            .processor(itemProcessor())
            .writer(itemWriter())
            .listener(new PerformanceStepListener())
            .allowStartIfComplete(false)
            .build();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chunk를 100으로 설정한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reader -&amp;gt; processor -&amp;gt; writer 하나의 묶음으로 동작한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;listener을 통하여 메타데이터를 확인한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;allowstartIfComplete를 false로 설정하여 완료된 Step은 재실행되지 않도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2. reader&lt;/h4&gt;
&lt;pre id=&quot;code_1735021238036&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
public JdbcCursorItemReader&amp;lt;InputType&amp;gt; itemReader() {
    return new JdbcCursorItemReaderBuilder&amp;lt;InputType&amp;gt;()
            .name(&quot;jdbcItemReader&quot;)
            .dataSource(dataSource)
            .sql(&quot;SELECT id, name, value, created_at FROM test_table&quot;)
            .rowMapper((rs, rowNum) -&amp;gt; new InputType(
                    rs.getString(&quot;name&quot;),
                    rs.getInt(&quot;value&quot;),
                    rs.getTimestamp(&quot;created_at&quot;).toLocalDateTime()
            ))
            .build();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test_table 테이블에서 데이터를 조회한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 위해 30만 건 Insert.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-3. processor&lt;/h4&gt;
&lt;pre id=&quot;code_1735021301824&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
public ItemProcessor&amp;lt;InputType, OutputType&amp;gt; itemProcessor() {
    return input -&amp;gt; new OutputType(
            input.getName().toUpperCase(),
            input.getValue() * 2,
            input.getCreatedAt()
    );
}&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;로직 수행을 위해 read에서 읽은 데이터를 변환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name는 대문자로, value는 두배로 증폭.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-4. writer&lt;/p&gt;
&lt;pre id=&quot;code_1735021366612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
public JdbcBatchItemWriter&amp;lt;OutputType&amp;gt; itemWriter() {
    return new JdbcBatchItemWriterBuilder&amp;lt;OutputType&amp;gt;()
            .dataSource(dataSource)
            .sql(&quot;INSERT INTO processed_table (name, value, created_at) VALUES (:name, :value, :createdAt)&quot;)
            .beanMapped()
            .build();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 완료된 데이터를 processed_table에 inert를 진행한다.&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;3. 메모리 체크 함수 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치가 수행되는 동안 애플리케이션의 메모리를 체크합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1735017659324&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.batch.listener;

import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.listener.StepExecutionListenerSupport;

import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class PerformanceStepListener extends StepExecutionListenerSupport {

    private final Runtime runtime;

    public PerformanceStepListener() {
        this.runtime = Runtime.getRuntime();
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        LocalDateTime startTime = stepExecution.getStartTime() != null
                ? stepExecution.getStartTime()
                : LocalDateTime.now();

        LocalDateTime endTime = stepExecution.getEndTime() != null
                ? stepExecution.getEndTime()
                : LocalDateTime.now();

        Instant startInstant = localDateTimeToInstant(startTime);
        Instant endInstant = localDateTimeToInstant(endTime);

        long executionTimeMs = Duration.between(startInstant, endInstant).toMillis();

        float cpuUsage = getCpuUsage();
        double memoryUsage = getMemoryUsage();

        printPerformanceMetrics(stepExecution, executionTimeMs, cpuUsage, memoryUsage);
        return stepExecution.getExitStatus();
    }

    private Instant localDateTimeToInstant(LocalDateTime localDateTime) {
        return localDateTime.atZone(ZoneId.systemDefault()).toInstant();
    }

    private float getCpuUsage() {
        try {
            OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
            long startTime = System.nanoTime();
            double startCpuTime = osBean.getProcessCpuTime();

            Thread.sleep(100); // 100ms 대기

            long endTime = System.nanoTime();
            double endCpuTime = osBean.getProcessCpuTime();

            return (float) ((endCpuTime - startCpuTime) / (endTime - startTime) * 100 / osBean.getAvailableProcessors());
        } catch (Exception e) {
            e.printStackTrace();
            return 0.0f;
        }
    }

    private double getMemoryUsage() {
        return (runtime.totalMemory() - runtime.freeMemory()) / (1024.0 * 1024.0);
    }

    private static void printPerformanceMetrics(StepExecution stepExecution, long executionTimeMs, float cpuUsage, double memoryUsage) {
        System.out.printf(&quot;&quot;&quot;
                === Batch Step Performance Metrics ===
                Step Name: %s
                Execution Time: %d ms
                CPU Usage: %.2f %%
                Memory Usage: %.2f MB
                Items Read: %d
                Items Written: %d
                ======================================
                &quot;&quot;&quot;,
                stepExecution.getStepName(),
                executionTimeMs,
                cpuUsage,
                memoryUsage,
                stepExecution.getReadCount(),
                stepExecution.getWriteCount()
        );
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1. StepExecutionListenerSupport&lt;/h4&gt;
&lt;pre id=&quot;code_1735021577779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class PerformanceStepListener extends StepExecutionListenerSupport&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;Spring Batch의 &lt;span&gt;StepExecutionListenerSupport&lt;/span&gt;를 상속받아 Step 실행 이후(&lt;span&gt;afterStep&lt;/span&gt;)에 특정 작업을 수행할 수 있도록 확장했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-2. runtime&lt;/h4&gt;
&lt;pre id=&quot;code_1735021672270&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public PerformanceStepListener() {
    this.runtime = Runtime.getRuntime();
}&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;JVM 메모리 정보를 얻기 위해 Java의 &lt;span&gt;Runtime&lt;/span&gt; 인스턴스를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-3. afterStep&lt;/h4&gt;
&lt;pre id=&quot;code_1735021743960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
public ExitStatus afterStep(StepExecution stepExecution) {
    LocalDateTime startTime = stepExecution.getStartTime() != null
            ? stepExecution.getStartTime()
            : LocalDateTime.now();

    LocalDateTime endTime = stepExecution.getEndTime() != null
            ? stepExecution.getEndTime()
            : LocalDateTime.now();

    Instant startInstant = localDateTimeToInstant(startTime);
    Instant endInstant = localDateTimeToInstant(endTime);

    long executionTimeMs = Duration.between(startInstant, endInstant).toMillis();

    float cpuUsage = getCpuUsage();
    double memoryUsage = getMemoryUsage();

    printPerformanceMetrics(stepExecution, executionTimeMs, cpuUsage, memoryUsage);
    return stepExecution.getExitStatus();
}

private Instant localDateTimeToInstant(LocalDateTime localDateTime) {
    return localDateTime.atZone(ZoneId.systemDefault()).toInstant();
}

private float getCpuUsage() {
    try {
        OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
        long startTime = System.nanoTime();
        double startCpuTime = osBean.getProcessCpuTime();

        Thread.sleep(100); // 100ms 대기

        long endTime = System.nanoTime();
        double endCpuTime = osBean.getProcessCpuTime();

        return (float) ((endCpuTime - startCpuTime) / (endTime - startTime) * 100 / osBean.getAvailableProcessors());
    } catch (Exception e) {
        e.printStackTrace();
        return 0.0f;
    }
}

private double getMemoryUsage() {
    return (runtime.totalMemory() - runtime.freeMemory()) / (1024.0 * 1024.0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 시간 계산
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Step의 시작 시간(startTime)과 종료 시간(endTime)을 기반으로 실행 시간을 계산&lt;/li&gt;
&lt;li&gt;시작/종료 시간이 null인 경우, 현재 시간을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU 사용량 계산
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OperatingSystemMXBean 사용&lt;/li&gt;
&lt;li&gt;osBean.getProcessCpuTime()&lt;span&gt;과 시스템 시간(&lt;/span&gt;System.nanoTime()&lt;span&gt;)을 사용하여 CPU 사용 시간 측정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Thread.sleep(100). Cpu 사용량을 계산하기 위해 100ms 대기&lt;/li&gt;
&lt;li&gt;CPU 사용률 = CPU 사용 시간 차이 &amp;divide; 시스템 시간 차이 &amp;divide; CPU 코어 수 &amp;times; 100&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메모리 사용량 계산
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Runtime&amp;nbsp;객체&amp;nbsp;사용&lt;/li&gt;
&lt;li&gt;&lt;span&gt;totalMemory()&lt;/span&gt;: JVM에 할당된 총 메모리&lt;/li&gt;
&lt;li&gt;&lt;span&gt;freeMemory()&lt;/span&gt;: JVM에서 사용 가능한 메모리&lt;/li&gt;
&lt;li&gt;사용 메모리 = 총 메모리 - 사용 가능한 메모리&lt;/li&gt;
&lt;li&gt;&lt;span&gt;계산 결과를 MB 단위로 변환(&lt;/span&gt;/ (1024.0 * 1024.0)&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4. 결과 출력
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계산된 값들을 print로 찍어낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 배치 수행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1,500,000건으로 테스트를 진행해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mssql을 사용했고 서버는 docker container로 올렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-1. 어플리케이션 수행 (chunk 1000)&lt;/h4&gt;
&lt;pre id=&quot;code_1735017773152&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=== Batch Step Performance Metrics ===
Step Name: step1
Execution Time: 80352 ms
CPU Usage: 0.01 %
Memory Usage: 48.31 MB
Items Read: 1500000
Items Written: 1500000
======================================&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;chunk 1000건으로 수행하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1,500,000만 건 기준으로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cpu는 0.01%, Memory는 48MB 사용된 부분을 알 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;execution time도 80초, 하지만 1천 단위로 끊어 썼기 때문에 더 안정적이라 생각된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도면 많이 양호하다 생각된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 도커 상태 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2274&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w9FYe/btsLvSCfG6i/gSNMVZENJqxYZQLZucoP41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w9FYe/btsLvSCfG6i/gSNMVZENJqxYZQLZucoP41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w9FYe/btsLvSCfG6i/gSNMVZENJqxYZQLZucoP41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw9FYe%2FbtsLvSCfG6i%2FgSNMVZENJqxYZQLZucoP41%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;2274&quot; height=&quot;700&quot; data-origin-width=&quot;2274&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 삽입하기 위해 잠깐 Cpu가 튀긴 했지만 무난한 수준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 수행 후 (chunk 1000)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2278&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beCvwj/btsLuHBzasa/J8YDlNN7lUi3QD6X0IqDZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beCvwj/btsLuHBzasa/J8YDlNN7lUi3QD6X0IqDZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beCvwj/btsLuHBzasa/J8YDlNN7lUi3QD6X0IqDZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeCvwj%2FbtsLuHBzasa%2FJ8YDlNN7lUi3QD6X0IqDZk%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;2278&quot; height=&quot;702&quot; data-origin-width=&quot;2278&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cpu 사용도 Max 80% 이하이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양호하다고 생각된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 사용율도 양호한데?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;청크를 높여보자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chunk 5000&lt;/p&gt;
&lt;pre id=&quot;code_1735023979857&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=== Batch Step Performance Metrics ===
Step Name: step1
Execution Time: 52986 ms
CPU Usage: 0.01 %
Memory Usage: 85.33 MB
Items Read: 1500000
Items Written: 1500000
======================================&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간은 빨리 처리 되었지만 메모리가 많이 먹는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpu는 아까부터 0.01인데 저부분은 확인해 봐야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 정말 CPU를 안쓴 것이었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2299&quot; data-origin-height=&quot;697&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chBtVz/btsLw0TDjuZ/9X4i7XrANNmuKPwJ2BnAUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chBtVz/btsLw0TDjuZ/9X4i7XrANNmuKPwJ2BnAUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chBtVz/btsLw0TDjuZ/9X4i7XrANNmuKPwJ2BnAUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchBtVz%2FbtsLw0TDjuZ%2F9X4i7XrANNmuKPwJ2BnAUK%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;2299&quot; height=&quot;697&quot; data-origin-width=&quot;2299&quot; data-origin-height=&quot;697&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cpu가 조금 더 오르긴 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;85%까지 올랐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션의 메모리를 정리해 본다면&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 56px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;chunk 크기&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;실행 시간(ms)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;CPU 사용률 (%)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;메모리 사용량 (MB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1000&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;80352&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;0.01&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;48.31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;5000&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;52986&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;0.01&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;85.33&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 프로젝트에서 사용하는 방식에서 문제가 생겨 다른 방법을 찾아보다 chunk는 얼마나 효율이 좋을지 증명하기 위해 해당 글을 작성해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chunk를 적용하지 않은 버전을 올리지는 않았지만&amp;nbsp;회사 프로젝트에서 사용하던 방식과 위의 로직을 적용한 버전으로 비교하면 성능이 개선되었기는 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 연구를 바탕으로 업무에 적용해 결과를 도출할 계획이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 코프링을 이용하여 더 넓은 지식을 습득하고 최적의 방식을 도출해 낼 수 있을 것 같다.&lt;/p&gt;</description>
      <category>코딩공부</category>
      <category>boot</category>
      <category>chunk</category>
      <category>java</category>
      <category>MSSQL</category>
      <category>Spring</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/440</guid>
      <comments>https://integer-ji.tistory.com/440#entry440comment</comments>
      <pubDate>Tue, 24 Dec 2024 14:28:16 +0900</pubDate>
    </item>
    <item>
      <title>OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended</title>
      <link>https://integer-ji.tistory.com/439</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;해당 에러는 jdk 17 이상 버전에서 gradle를 실행할때 경고문으로 발생한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenJDK&amp;nbsp;64-Bit&amp;nbsp;Server&amp;nbsp;VM&amp;nbsp;warning:&amp;nbsp;Sharing&amp;nbsp;is&amp;nbsp;only&amp;nbsp;supported&amp;nbsp;for&amp;nbsp;boot&amp;nbsp;loader&amp;nbsp;classes&amp;nbsp;because&amp;nbsp;bootstrap&amp;nbsp;classpath&amp;nbsp;has&amp;nbsp;been&amp;nbsp;appended&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733805973697&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tasks.named('test') {
    useJUnitPlatform()
    jvmArgs '-Xshare:off'
}&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;jvmArgs '-Xshare:off'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문구를 넣어주자.&lt;/p&gt;</description>
      <category>jvmargs '-xshare:off'</category>
      <category>openjdk 64-bit server vm warning: sharing is only supported for boot loader classes because bootstrap classpath has been appended</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/439</guid>
      <comments>https://integer-ji.tistory.com/439#entry439comment</comments>
      <pubDate>Tue, 10 Dec 2024 13:49:24 +0900</pubDate>
    </item>
    <item>
      <title>spring batch 5.0 JobBuilderFactory, StepBuilderFactory</title>
      <link>https://integer-ji.tistory.com/438</link>
      <description>&lt;pre id=&quot;code_1732411466584&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'org.springframework.batch.core.configuration.annotation.StepBuilderFactory' is deprecated since version 5.0.0 and marked for removal&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732411477230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'org.springframework.batch.core.configuration.annotation.JobBuilderFactory' is deprecated since version 5.0.0 and marked for removal&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;Spring Batch 5.0 이상부턴 JobBuilderFactory, StepBuilderFactory을 사용하려면 해당 경고문이 나온다.&lt;/p&gt;
&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://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732411503328&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Spring Batch 5.0 Migration Guide&quot; data-og-description=&quot;Spring Batch is a framework for writing batch applications using Java and Spring - spring-projects/spring-batch&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide&quot; data-og-url=&quot;https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tXFef/hyXDjfOmZk/nG2yabOPdKY3Myr8rBY0a1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bzSTPl/hyXzOoeHAZ/Fz17bf56UCx3eKBkH3fXU1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tXFef/hyXDjfOmZk/nG2yabOPdKY3Myr8rBY0a1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bzSTPl/hyXzOoeHAZ/Fz17bf56UCx3eKBkH3fXU1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Batch 5.0 Migration Guide&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Batch is a framework for writing batch applications using Java and Spring - spring-projects/spring-batch&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서를 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JobBuilderFactory&lt;/p&gt;
&lt;pre id=&quot;code_1732411524712&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Sample with v5
@Configuration
@EnableBatchProcessing
public class MyJobConfig {

    @Bean
    public Job myJob(JobRepository jobRepository, Step step) {
        return new JobBuilder(&quot;myJob&quot;, jobRepository)
                .start(step)
                .build();
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StepBuilderFactory&lt;/p&gt;
&lt;pre id=&quot;code_1732411561479&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Sample with v5
@Configuration
@EnableBatchProcessing
public class MyStepConfig {

    @Bean
    public Tasklet myTasklet() {
       return new MyTasklet();
    }

    @Bean
    public Step myStep(JobRepository jobRepository, Tasklet myTasklet, PlatformTransactionManager transactionManager) {
        return new StepBuilder(&quot;myStep&quot;, jobRepository)
                .tasklet(myTasklet, transactionManager) // or .chunk(chunkSize, transactionManager)
                .build();
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 사용하라고 가이드가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JobBuilderFactory -&amp;gt; JobRepository&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>에러</category>
      <category>'org.springframework.batch.core.configuration.annotation.jobbuilderfactory' is deprecated since version 5.0.0 and marked for removal</category>
      <category>'org.springframework.batch.core.configuration.annotation.stepbuilderfactory' is deprecated since version 5.0.0 and marked for removal</category>
      <category>jobbuilderfactory</category>
      <category>spring batch 5.0</category>
      <category>stepbuilderfactory</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/438</guid>
      <comments>https://integer-ji.tistory.com/438#entry438comment</comments>
      <pubDate>Sun, 24 Nov 2024 10:36:41 +0900</pubDate>
    </item>
    <item>
      <title>Mac m1 docker Mssql 설치하기</title>
      <link>https://integer-ji.tistory.com/437</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Mssql은 말 그대로 Microsoft&amp;nbsp;SQL&amp;nbsp;Server이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Mac Os에서는 지원이 안되지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; docker를 설치하여 mssql을 사용할 수 있다.&lt;/p&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. Docker-desktop 다운받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732015440952&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Docker Desktop: The #1 Containerization Tool for Developers | Docker&quot; data-og-description=&quot;Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.&quot; data-og-host=&quot;www.docker.com&quot; data-og-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eN33Eq/hyXzU84Gvu/StUrCBYRRU7gpFFqzws3WK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/8jm5O/hyXzH2ZCbf/gB0kWkCZr0FD3DalRz1EbK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580&quot;&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eN33Eq/hyXzU84Gvu/StUrCBYRRU7gpFFqzws3WK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/8jm5O/hyXzH2ZCbf/gB0kWkCZr0FD3DalRz1EbK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580');&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;Docker Desktop: The #1 Containerization Tool for Developers | Docker&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 사이트에서 본인의 OS에 맞게 docker을 설치해주자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Mssql image 다운받기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2564&quot; data-origin-height=&quot;1456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rwzux/btsKNBIWD0f/uWkMfebjqwJrKnV0dqmYo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rwzux/btsKNBIWD0f/uWkMfebjqwJrKnV0dqmYo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rwzux/btsKNBIWD0f/uWkMfebjqwJrKnV0dqmYo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frwzux%2FbtsKNBIWD0f%2FuWkMfebjqwJrKnV0dqmYo0%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;2564&quot; height=&quot;1456&quot; data-origin-width=&quot;2564&quot; data-origin-height=&quot;1456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker desktop를 실행하고 좌측 하단의 terminal을 열어 명령어를 입력해 주어야 한다.&lt;/p&gt;
&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://hub.docker.com/r/microsoft/mssql-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hub.docker.com/r/microsoft/mssql-server&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732016413635&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;https://hub.docker.com/r/microsoft/mssql-server&quot; data-og-description=&quot;&quot; data-og-host=&quot;hub.docker.com&quot; data-og-source-url=&quot;https://hub.docker.com/r/microsoft/mssql-server&quot; data-og-url=&quot;https://hub.docker.com/r/microsoft/mssql-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbfmkc/hyXzNITf8G/EUVmEElxRqv2oU0EovHiR1/img.png?width=3372&amp;amp;height=1896&amp;amp;face=0_0_3372_1896&quot;&gt;&lt;a href=&quot;https://hub.docker.com/r/microsoft/mssql-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hub.docker.com/r/microsoft/mssql-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbfmkc/hyXzNITf8G/EUVmEElxRqv2oU0EovHiR1/img.png?width=3372&amp;amp;height=1896&amp;amp;face=0_0_3372_1896');&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;https://hub.docker.com/r/microsoft/mssql-server&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hub.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서를 보면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732016296427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull mcr.microsoft.com/mssql/server:2022-latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 이미지를 사용하라고 가이드를 주지만 이 image는 mac m1 arm64 칩에서는 사용하지 못한다..&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;2170&quot; data-origin-height=&quot;1610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AjRD9/btsKPEcVNdV/0X7uYRrKPeq8cRQAYM3zy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AjRD9/btsKPEcVNdV/0X7uYRrKPeq8cRQAYM3zy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AjRD9/btsKPEcVNdV/0X7uYRrKPeq8cRQAYM3zy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAjRD9%2FbtsKPEcVNdV%2F0X7uYRrKPeq8cRQAYM3zy0%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;2170&quot; height=&quot;1610&quot; data-origin-width=&quot;2170&quot; data-origin-height=&quot;1610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* image may have poor performance or fail if run via emulation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 이미지를 다운받자&lt;/p&gt;
&lt;pre id=&quot;code_1732016620936&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull mcr.microsoft.com/azure-sql-edge:latest&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;2836&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c64Sop/btsKONIp8jv/bB6ekfi579tPcj6bg2NBM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c64Sop/btsKONIp8jv/bB6ekfi579tPcj6bg2NBM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c64Sop/btsKONIp8jv/bB6ekfi579tPcj6bg2NBM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc64Sop%2FbtsKONIp8jv%2FbB6ekfi579tPcj6bg2NBM0%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;2836&quot; height=&quot;1648&quot; data-origin-width=&quot;2836&quot; data-origin-height=&quot;1648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;azure-sql은 경고 문구가 뜨지 않는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 안쓰는 이미지는 지우고 컨테이너를 실행시키자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 컨테이너 실행&lt;/p&gt;
&lt;pre id=&quot;code_1732016809023&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=1' -e 'MSSQL_SA_PASSWORD=$PASSWORD' -p 1433:1433 --name mssql -d mcr.microsoft.com/azure-sql-edge&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;b&gt;$PASSWORD&lt;/b&gt; 대신에 패스워드를 입력하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 8자리 이상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;대문자, 소문자, 숫자 및 특수 문자 중 3가지 이상을 포함해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니게 될 경우 이런 에러를 볼 수 있다. -&amp;gt; &lt;a href=&quot;https://integer-ji.tistory.com/435&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://integer-ji.tistory.com/435&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2882&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qOiJz/btsKQcGXbVn/IDv1oBQC10l8qKdVKdKkUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qOiJz/btsKQcGXbVn/IDv1oBQC10l8qKdVKdKkUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qOiJz/btsKQcGXbVn/IDv1oBQC10l8qKdVKdKkUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqOiJz%2FbtsKQcGXbVn%2FIDv1oBQC10l8qKdVKdKkUk%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;2882&quot; height=&quot;1632&quot; data-origin-width=&quot;2882&quot; data-origin-height=&quot;1632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 실행해 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/873Qu/btsKOWyBx2G/sF7TYCCq7F9JWgFMPd96W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/873Qu/btsKOWyBx2G/sF7TYCCq7F9JWgFMPd96W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/873Qu/btsKOWyBx2G/sF7TYCCq7F9JWgFMPd96W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F873Qu%2FbtsKOWyBx2G%2FsF7TYCCq7F9JWgFMPd96W1%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;2618&quot; height=&quot;1184&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상 작동하는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. DB 관리툴 dbeaver 다운받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dbeaver.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dbeaver.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732269214746&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;DBeaver Community | Free Universal Database Tool&quot; data-og-description=&quot;DBeaver Universal Database Tool DBeaver Community is a free cross-platform database tool for developers, database administrators, analysts, and everyone working with data. It supports all popular SQL databases like MySQL, MariaDB, PostgreSQL, SQLite, Apach&quot; data-og-host=&quot;dbeaver.io&quot; data-og-source-url=&quot;https://dbeaver.io/&quot; data-og-url=&quot;https://dbeaver.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIgxl2/hyXC9RzCbW/VpNMHMVihCbf9ng9g1gYhk/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/bj0qOq/hyXDlRZVQ6/VuMKQIkhxnSHt8Aiuurtek/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/cyvUZN/hyXDeFljS3/I0lE0lUAX5D0Xu2jdwOJF0/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220&quot;&gt;&lt;a href=&quot;https://dbeaver.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbeaver.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIgxl2/hyXC9RzCbW/VpNMHMVihCbf9ng9g1gYhk/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/bj0qOq/hyXDlRZVQ6/VuMKQIkhxnSHt8Aiuurtek/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/cyvUZN/hyXDeFljS3/I0lE0lUAX5D0Xu2jdwOJF0/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220');&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;DBeaver Community | Free Universal Database Tool&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DBeaver Universal Database Tool DBeaver Community is a free cross-platform database tool for developers, database administrators, analysts, and everyone working with data. It supports all popular SQL databases like MySQL, MariaDB, PostgreSQL, SQLite, Apach&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dbeaver.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;DB 관리툴로 편하신거 쓰시면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jetbrains사의 datagrip / ms사의 azure 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 DBeaver으로 진행하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5TmVu/btsKTAChPTl/RKvRDaQWR1RLZuUDrLBUbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5TmVu/btsKTAChPTl/RKvRDaQWR1RLZuUDrLBUbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5TmVu/btsKTAChPTl/RKvRDaQWR1RLZuUDrLBUbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5TmVu%2FbtsKTAChPTl%2FRKvRDaQWR1RLZuUDrLBUbk%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;583&quot; height=&quot;439&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Server 선택&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;1856&quot; data-origin-height=&quot;1454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhA1b8/btsKTSo6RlW/sUbuaZTnehjyUawG5SefIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhA1b8/btsKTSo6RlW/sUbuaZTnehjyUawG5SefIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhA1b8/btsKTSo6RlW/sUbuaZTnehjyUawG5SefIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhA1b8%2FbtsKTSo6RlW%2FsUbuaZTnehjyUawG5SefIK%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;706&quot; height=&quot;553&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;1454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Host : localhost&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Port : 1433 (mssql 기본 포트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Database : master&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authentication : SQL Server Authentication&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Username : sa (mssql 기몬 username)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Password : 컨테이너 실행하며 설정하였던 password 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test Connection ... 클릭&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;932&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyLL3N/btsKTJscXMQ/8Pgs5ACDR7XRnxAWIBsS20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyLL3N/btsKTJscXMQ/8Pgs5ACDR7XRnxAWIBsS20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyLL3N/btsKTJscXMQ/8Pgs5ACDR7XRnxAWIBsS20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyLL3N%2FbtsKTJscXMQ%2F8Pgs5ACDR7XRnxAWIBsS20%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;614&quot; height=&quot;435&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 성공!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 맥북에서 mssql을 사용하시면 됩니다.&lt;/p&gt;</description>
      <category>설치 &amp;amp;&amp;amp; 설정</category>
      <category>m1 mssql 설치</category>
      <category>mac m1 mssql</category>
      <category>mac mssql</category>
      <category>mac mssql 설치</category>
      <category>MSSQL</category>
      <category>mssql 설치</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/437</guid>
      <comments>https://integer-ji.tistory.com/437#entry437comment</comments>
      <pubDate>Fri, 22 Nov 2024 18:59:27 +0900</pubDate>
    </item>
    <item>
      <title>docker permission denied while trying to connect to the docker daemon socket</title>
      <link>https://integer-ji.tistory.com/436</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEwyff/btsKPTVhpeN/l5782MDGlkb7trcNIEWK00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEwyff/btsKPTVhpeN/l5782MDGlkb7trcNIEWK00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEwyff/btsKPTVhpeN/l5782MDGlkb7trcNIEWK00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEwyff%2FbtsKPTVhpeN%2Fl5782MDGlkb7trcNIEWK00%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;1295&quot; height=&quot;259&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker containers를 실행하는데 해당 에러가 났다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한이 없어서 이런거니 권한을 주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;/var/run/docker.sock 파일 권한 변경&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732057587158&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chmod 666 /var/run/docker.sock&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>설치 &amp;amp;&amp;amp; 설정</category>
      <category>containers</category>
      <category>docker</category>
      <category>docker containers</category>
      <category>docker permission denied while trying to connect to the docker daemon socket</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/436</guid>
      <comments>https://integer-ji.tistory.com/436#entry436comment</comments>
      <pubDate>Wed, 20 Nov 2024 08:07:13 +0900</pubDate>
    </item>
    <item>
      <title>ERROR: Unable to set system administrator password: Password validation failed. The password does not meet SQL Server password policy requirements because it is not complex enough. The password must be at least 8 characters long and contain characters fro</title>
      <link>https://integer-ji.tistory.com/435</link>
      <description>&lt;pre id=&quot;code_1731994149454&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ERROR: Unable to set system administrator password: Password validation failed. The password does not meet SQL Server password policy requirements because it is not complex enough. The password must be at least 8 characters long and contain characters from three of the following four sets: Uppercase letters, Lowercase letters, Base 10 digits, and Symbols.&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;이 에러는 mssql을 설치할 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 조건을 만족 시켜야 정상적으로 db가 만들어질 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;최소 8자 이상.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;대문자, 소문자, 숫자 및 특수 문자 중 3가지 이상을 포함해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSSQL</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/435</guid>
      <comments>https://integer-ji.tistory.com/435#entry435comment</comments>
      <pubDate>Tue, 19 Nov 2024 14:29:51 +0900</pubDate>
    </item>
    <item>
      <title>rest docs RequestDocumentation requestParameters Cannot resolve symbol 'requestParameters' 이슈</title>
      <link>https://integer-ji.tistory.com/434</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;rest docs 프로젝트를 사용하고 있는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring 버전 업을 하고 난 뒤&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cannot&amp;nbsp;resolve&amp;nbsp;symbol&amp;nbsp;'requestParameters'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 이슈가 발생되며 requestParameters를 사용할 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queryParameters를 사용해서 해결&lt;/p&gt;</description>
      <category>코딩공부/Java Spring</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/434</guid>
      <comments>https://integer-ji.tistory.com/434#entry434comment</comments>
      <pubDate>Wed, 13 Nov 2024 13:40:57 +0900</pubDate>
    </item>
    <item>
      <title>퍼실리테이션 테크닉</title>
      <link>https://integer-ji.tistory.com/430</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LmsSx/btsKACmUFp0/kwUDKSQvH6KE8JnmDMrG21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LmsSx/btsKACmUFp0/kwUDKSQvH6KE8JnmDMrG21/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LmsSx/btsKACmUFp0/kwUDKSQvH6KE8JnmDMrG21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLmsSx%2FbtsKACmUFp0%2FkwUDKSQvH6KE8JnmDMrG21%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;406&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 학습 동아리를 하고있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 권으로 끝내는 퍼실리테이션 테크닉을 읽고 3장 부분을 요약해보았다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;퍼실리테이션 테크닉: 제 3장 요약&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 여행자와 가이드의 마음가짐&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 장에서는 워크숍이나 조직 활동에서 필요한 퍼실리테이터의 자세와 기술을 다루고있다. 새로운 문화와 관습을 받아들이는 열린 마음이 중요하다고 생각되는 장이었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의해야 할 6가지 행동&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1. 공감&lt;/h4&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;공감 A: 타인의 고통 인지와 해결 의지&lt;/li&gt;
&lt;li&gt;동조 B: 타인의 감정 이해와 공명&lt;/li&gt;
&lt;li&gt;연민 C: 타인의 감정에 동화&lt;/li&gt;
&lt;li&gt;호의 D: 타인의 안녕과 행복 기원&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;/li&gt;
&lt;li&gt;타인을 이해하기&lt;/li&gt;
&lt;li&gt;타인과 연결되기&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.2. 적극적 경청&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적극적 경청은 공감 능력을 기르는 핵심입니다. 경청의 10가지 규칙을 실천하세요.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.3. 겸손&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겸손한 태도를 기르기 위한 7일 트레이닝 방법을 소개합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.4. 다른 말로 표현하기&lt;/h4&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;/li&gt;
&lt;li&gt;거울: 자신의 단어로 재표현&lt;/li&gt;
&lt;li&gt;요약: 들은 내용을 종합&lt;/li&gt;
&lt;li&gt;명료화: 말을 더 명확하게 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.5. 질문하기&lt;/h4&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;/li&gt;
&lt;li&gt;미래를 예상하는 질문&lt;/li&gt;
&lt;li&gt;주어진 정보에 대한 질문&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.6. 침묵과 중립성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;침묵의 가치를 이해하고, 중립성을 유지하는 방법을 배웁니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 훌륭한 조직 이끌기&lt;/h3&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;/li&gt;
&lt;li&gt;명확하고 참여를 유도하는 지시 만들기&lt;/li&gt;
&lt;li&gt;적절한 유머 사용하기&lt;/li&gt;
&lt;li&gt;즉흥적 대응 능력 기르기&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;즉흥의 기본 요소&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신뢰&lt;/li&gt;
&lt;li&gt;경청&lt;/li&gt;
&lt;li&gt;효율성&lt;/li&gt;
&lt;li&gt;존중&lt;/li&gt;
&lt;li&gt;단순성&lt;/li&gt;
&lt;li&gt;수용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 기술과 태도를 습득하고 실천함으로써, 더 효과적인 퍼실리테이터가 될 수 있다고 설명하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3장을 공부하며 제일 인상 깊었던 내용은 적극적 경청이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공감능력을 기른다는 것 자체가 경청하는 자세를 기르는 것이며 이는 곧 집단에 큰 이해와 공감을 이끌어 낼 수 있는 단계라고 생각된다.&lt;/p&gt;</description>
      <category>오블완 챌린지</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/430</guid>
      <comments>https://integer-ji.tistory.com/430#entry430comment</comments>
      <pubDate>Fri, 8 Nov 2024 09:51:23 +0900</pubDate>
    </item>
    <item>
      <title>흑백요리사 철가방요리사 식당 도량 동파육, 어향가지튀김 후기</title>
      <link>https://integer-ji.tistory.com/429</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://naver.me/GlVbCkgI&quot;&gt;https://naver.me/GlVbCkgI&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730964568835&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;도량 : 네이버 &quot; data-og-description=&quot;방문자리뷰 272 &amp;middot; 블로그리뷰 631&quot; data-og-host=&quot;m.place.naver.com&quot; data-og-source-url=&quot;https://naver.me/GlVbCkgI&quot; data-og-url=&quot;https://m.place.naver.com/restaurant/1817207066/home&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IEqq9/hyXsVtP7WJ/rKKilrUV5SwMOrA72h71T1/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/bFzLlP/hyXsSw6rq0/MEzM4uAANG096ZOjeS0EJ0/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/kZ21y/hyXwhorrWs/ANTceYB5JakOC27UvJ00t1/img.jpg?width=560&amp;amp;height=560&amp;amp;face=0_0_560_560&quot;&gt;&lt;a href=&quot;https://naver.me/GlVbCkgI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://naver.me/GlVbCkgI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IEqq9/hyXsVtP7WJ/rKKilrUV5SwMOrA72h71T1/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/bFzLlP/hyXsSw6rq0/MEzM4uAANG096ZOjeS0EJ0/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/kZ21y/hyXwhorrWs/ANTceYB5JakOC27UvJ00t1/img.jpg?width=560&amp;amp;height=560&amp;amp;face=0_0_560_560');&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;방문자리뷰 272 &amp;middot; 블로그리뷰 631&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;m.place.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-3dac3b59-7338-49ea-b22b-f6d832e0251c&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경복궁역 3번출구에 있는 중식당 &quot;도량&quot;에 다녀왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7ea79fb5-0a1b-4c48-baee-510a7643ae76&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d57a046f-b7f9-4815-8a79-077f46ecb470&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도량은 현재 캐치테이블과 현장예약을 받고 있었는데 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bc29edc4-7c8b-4f78-b79b-9248ac5f3c4d&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d9b43101-3274-445d-b8d2-9b2d7b8fcbe2&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현장예약은 새벽에 가서 줄서도 겨우 먹을까 말까 한다고 한다  &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d04a22f6-a627-4d72-8e67-c66a0dd4e9d3&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-8f26c8f0-c37c-4562-9992-e4f3044773f8&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 우연히도 .. 운이 좋게도 !!! 캐치테이블에서 예약을 성공해버렸다 !!! &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-c782796d-99f7-4fd4-a294-973b408f6206&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-c782796d-99f7-4fd4-a294-973b408f6206&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-c782796d-99f7-4fd4-a294-973b408f6206&quot; data-unitid=&quot;&quot;&gt;
&lt;div id=&quot;SE-c782796d-99f7-4fd4-a294-973b408f6206&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0a3jj/btsKzdIhR1X/nyUZZVK4nnKxFZQzkuMN71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0a3jj/btsKzdIhR1X/nyUZZVK4nnKxFZQzkuMN71/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0a3jj/btsKzdIhR1X/nyUZZVK4nnKxFZQzkuMN71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0a3jj%2FbtsKzdIhR1X%2FnyUZZVK4nnKxFZQzkuMN71%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;868&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예약 성공 후 바로 달려갔다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZwBWp/btsKzL5mJR9/7K3BqwcAUfS4jaxgHer1cK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZwBWp/btsKzL5mJR9/7K3BqwcAUfS4jaxgHer1cK/img.jpg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot; data-is-animation=&quot;false&quot; width=&quot;300&quot; height=&quot;400&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZwBWp/btsKzL5mJR9/7K3BqwcAUfS4jaxgHer1cK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZwBWp%2FbtsKzL5mJR9%2F7K3BqwcAUfS4jaxgHer1cK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdMkAs/btsKzLEgaTb/KPefnfTUn1TXWHumtns7kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdMkAs/btsKzLEgaTb/KPefnfTUn1TXWHumtns7kk/img.jpg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot; data-is-animation=&quot;false&quot; width=&quot;300&quot; height=&quot;400&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdMkAs/btsKzLEgaTb/KPefnfTUn1TXWHumtns7kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdMkAs%2FbtsKzLEgaTb%2FKPefnfTUn1TXWHumtns7kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-918d7205-dbc9-43c9-99b3-7bad0a21d26c&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11시 예약이라 11시 땡 하고 도착했는데&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래도 웨이팅 하시는 분들이 조금 계셨다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4c61a053-109b-464d-a8a4-b23a0854ad47&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d11ecf1a-a033-4101-ada4-ecc9b4142883&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아마 현장 웨이팅 아침 일찍 하고 입장대기하고 있는 것 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2qom1/btsKzgrihEf/pFq0nKUOS84iU1LuvW6mf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2qom1/btsKzgrihEf/pFq0nKUOS84iU1LuvW6mf1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2qom1/btsKzgrihEf/pFq0nKUOS84iU1LuvW6mf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2qom1%2FbtsKzgrihEf%2FpFq0nKUOS84iU1LuvW6mf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-56c45202-43b2-46d2-8b6f-07a57680de58&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뭘 먹을까 고민을 정말 많이했다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dfdba125-5ad2-49f7-8288-1600abc751b9&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-4ca27c79-4171-4ec8-9d3a-5616c7f8269e&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유튜브 성시경의 먹을텐데에 따르면 훠궈와 함께 동파육을 먹었는데 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b16296a9-6900-4eb3-af82-a1333c6b197e&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-eaa644a3-9add-40f9-ad3e-bdbb39b7a633&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;훠궈를 먹을것인가 다른 메뉴를 먹을것인가 너~~~무 고민이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-426337e9-94a4-46f7-b2db-2169bc24f6b3&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-420c858d-5475-4488-b4b2-7b1a05e517c6&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결국 내가 선택한 메뉴는 ,,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;동파육과 어향가지튀김과 마라샹궈!!!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMUGu5/btsKAMoKkat/JqQC8uxQdtosbqKtUGSkaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMUGu5/btsKAMoKkat/JqQC8uxQdtosbqKtUGSkaK/img.jpg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot; data-is-animation=&quot;false&quot; width=&quot;300&quot; height=&quot;400&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMUGu5/btsKAMoKkat/JqQC8uxQdtosbqKtUGSkaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMUGu5%2FbtsKAMoKkat%2FJqQC8uxQdtosbqKtUGSkaK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/shxko/btsKzV0YAKQ/jIlGkkM5fEL8zgKOEHAUCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/shxko/btsKzV0YAKQ/jIlGkkM5fEL8zgKOEHAUCk/img.jpg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot; data-is-animation=&quot;false&quot; width=&quot;300&quot; height=&quot;400&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/shxko/btsKzV0YAKQ/jIlGkkM5fEL8zgKOEHAUCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fshxko%2FbtsKzV0YAKQ%2FjIlGkkM5fEL8zgKOEHAUCk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-fa82ec31-ab7a-4b89-bcec-38fef7c16efc&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동파육은 정말 입에 넣자마자 고기가 녹는 느낌이 너무 환상적이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-780b5842-02f9-47db-8243-8d5e6a3282ea&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-c012f826-5ebd-41e9-96e1-9d4a45e7af75&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;고기가 이렇게 요리가 된다고?!?!의 깜짝놀랄맛&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-69e8a460-c50e-4ac6-b90e-40cca4024403&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a59aa139-77c7-4ca2-87ca-ceeb55bcf183&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;청경채도 익힘정도가 아주 굿이었다 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E1jDl/btsKAKj6IPH/r0qvckkZyfy3wkBtZyIdOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E1jDl/btsKAKj6IPH/r0qvckkZyfy3wkBtZyIdOK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E1jDl/btsKAKj6IPH/r0qvckkZyfy3wkBtZyIdOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE1jDl%2FbtsKAKj6IPH%2Fr0qvckkZyfy3wkBtZyIdOK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-36362455-ab02-4134-bddf-34b8a6188136&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음은 어향가지인데 이 친구가 진짜 맛있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f5020e65-9315-412c-b3ae-7c9fed7864fb&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-5720c22b-0f3f-45e6-ad82-3f6291aee695&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순하게 가지튀김을 생각했지만&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dd1107f5-ffe6-4487-8231-40e2d9e4abfd&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-4984fded-f6e7-43de-97bc-30d78a0328cd&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가지안에 새우살의 크기들과 맛, 익힘이 너무 좋았고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4623bb67-a7cb-4dbf-9fd0-6e28c5b086aa&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-735b651c-9bea-4d69-a72d-1007835b704e&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처음 씹었을때의 새우향과 육즙, 그리고 중간에는 부드러운 식감의 새우들이 너무 환상적이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d2964bbc-c8a7-497a-85e8-e3226ec70bc0&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a3e242c4-d18f-430d-8e32-be50f326034b&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;거기다 칠리?느낌의 소스는 튀김의 느끼한 맛을 잡아주며 달달한 맛까지 나서 음식의 조화가 뛰어나다고 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6b01b804-abc3-455b-b6e5-b4bb68e9035e&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-935f748c-648e-4195-bfd2-e34c2f851a8c&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘의 Best Pick였다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ea0f057d-1407-4b2d-a9f8-50086f02a1cd&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lfoeN/btsKzUufpcp/eXV3xsAY0yIdgXoQdvmhKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lfoeN/btsKzUufpcp/eXV3xsAY0yIdgXoQdvmhKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lfoeN/btsKzUufpcp/eXV3xsAY0yIdgXoQdvmhKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlfoeN%2FbtsKzUufpcp%2FeXV3xsAY0yIdgXoQdvmhKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-920bc558-760c-467f-81a4-7c76b46047bb&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으론 샹궈!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4d2615da-4d4c-41ca-88ef-8f52f61cdd07&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a74d741e-c0ea-45c2-95c6-7dac579e5af7&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ㅎ.. 2명이서 갔는데 많이도 먹었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e4c38f78-c7b2-4eca-82a6-f02af95b4d0c&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-e86b17fc-6073-4511-bc94-d6d47ef8d084&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;샹궈는 조금 평범한? 느낌이었다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-51c73109-aba1-4d7c-ac63-c02601a75eb0&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-28e6bf03-82ce-4e00-9c22-ec2f4f0e39ba&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아직 나는 마라 초보인데 먹을만 했고 뭔가 마라향이 강하진 않았던거같다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-40452788-2936-47e6-bf28-57892928fc9d&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d3b971c4-2d9b-4034-b60e-6f11f6997a3c&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;음 ~ 마라샹궈는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Not Bad&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 나쁘지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J0Vfu/btsKzgdMlfv/siKJP9AbfkW7eoAZJaJbNK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J0Vfu/btsKzgdMlfv/siKJP9AbfkW7eoAZJaJbNK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J0Vfu/btsKzgdMlfv/siKJP9AbfkW7eoAZJaJbNK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ0Vfu%2FbtsKzgdMlfv%2FsiKJP9AbfkW7eoAZJaJbNK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-751600d9-72aa-43f3-bf6d-c57f27b171b7&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3가지 음식을 먹으면서 느낀건&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7b4e1e81-a960-44fe-95a7-897b90879dfb&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-9e13433a-0ca5-4277-ab52-4ca4115fc906&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동파육은 확실히 이러한 음식이 식으면 고기가 질겨지고 조금 차가워진 반면&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9b4b7abd-94d3-46fc-aedb-8a1e6ebfd71f&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-ad4f83ba-3ed5-4080-8c93-2336bc701ba7&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어향가지 튀김은 식어도 너무 맛있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0e81d3b9-15fc-4fe2-87aa-64484f133abe&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-35c42b65-224e-4045-b56e-5ccaa30b5896&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개인적인 순서로는 1. 어향가지튀김 2. 동파육 3. 마라샹궈 인데 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4c3616c3-d3db-4969-b09d-a5a58cdf17f5&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-79e407c2-b21c-411a-8aa9-b8a961e56d53&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동파육은 식기 전에 다 먹어버리면 그만이니까 ^.^&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-13d1b932-3ea4-4d2a-a496-5a8b8666e267&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-e25e52e4-4a9a-4a8e-a55a-2e9384039814&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어향가지튀김과 동파육은 꼭 추천하는 메뉴인 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB661M/btsKAFwzZj7/kCo0Mg1qPvINsbO2WKQbC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB661M/btsKAFwzZj7/kCo0Mg1qPvINsbO2WKQbC0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB661M/btsKAFwzZj7/kCo0Mg1qPvINsbO2WKQbC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB661M%2FbtsKAFwzZj7%2FkCo0Mg1qPvINsbO2WKQbC0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-61891262-5cc8-4c01-b1cb-ce89221ae7df&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으론 집가는 길에 이쁜 경복궁 길을 보며 마무리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 첫 번째 오블완 완료!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/429</guid>
      <comments>https://integer-ji.tistory.com/429#entry429comment</comments>
      <pubDate>Thu, 7 Nov 2024 16:45:37 +0900</pubDate>
    </item>
    <item>
      <title>2024 JTBC 풀 마라톤을 완주하며 회고</title>
      <link>https://integer-ji.tistory.com/428</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T0qoN/btsKzed3fbT/cDIwsWj6QS5zK3pKYqcfIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T0qoN/btsKzed3fbT/cDIwsWj6QS5zK3pKYqcfIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T0qoN/btsKzed3fbT/cDIwsWj6QS5zK3pKYqcfIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT0qoN%2FbtsKzed3fbT%2FcDIwsWj6QS5zK3pKYqcfIk%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;618&quot; height=&quot;345&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;11월 3일 JTBC에서 주최하는 풀 마라톤에 참가했다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;2263b3d9-94f7-4497-9a17-c53a27618fca&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀 마라톤은 참가는 처음이 아니지만 두 번째 참가하며 느낀 점과 내가 풀 마라톤을 뛴 이유, 그리고 달리기를 하는 이유를 잊지 않기 위해 회고글을 적는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ed5zVH/btsKzgizuTX/scO5WyVBf7HOfpniYRS1lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ed5zVH/btsKzgizuTX/scO5WyVBf7HOfpniYRS1lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ed5zVH/btsKzgizuTX/scO5WyVBf7HOfpniYRS1lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fed5zVH%2FbtsKzgizuTX%2FscO5WyVBf7HOfpniYRS1lk%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;400&quot; height=&quot;533&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀 마라톤을 하게 된 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 생각이 많다. 그래서 생각을 멈추는 법을 잘 몰랐는데, 군대에서 시작한 마라톤과 주기적인 달리기를 통해 몸이 너무 힘들면 생각하지 않게 된다는 것을 알게 되었다. 이 후로는 집 앞 하천을 뛰며 머릿속을 비우고 리프레시하는 것을 습관처럼 하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 흘러 10km 달리기가 익숙해졌을 무렵, 풀 마라톤에 도전하고 싶어졌다. 그렇게 작년 2023 JTBC 풀 마라톤에 참여하게 되었는데 이때의 나는 나의 장거리 페이스도 모르고 아무 준비도 안된 상태에서 안되면 말고 식으로 참여하게 되었다. 결국 26km 즈음에서 무릎의 통증을 이기지 못해 중도에 포기하게 되었다. 작년의 포기한 기억이 있어서 이번 2024 마라톤에서는 악으로 깡으로 버티며 꼭 완주하고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에는 보디빌딩 대회에 나가시는 분이 있었다. 그분은 음식과 술을 좋아했지만, 목표가 생기니 모든 것을 끊고 식단과 자기 관리를 통해 대회에서 우승까지 하셨다. 그 모습을 보고 '나는 지금 이 마라톤 대회를 진심으로 대하고 있을까?' 하는 의문이 들며 그 순간 이렇게 살다가는 작년처럼 실패할 것 같다는 느낌이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10월부터는 최대한 약속을 줄이고 운동에만 전념했다. 달리기에 익숙한 몸 상태를 만들며 대회 2주 전에는 30km 장거리 훈련도 하며 내 페이스를 천천히 익혀 나아갔다. 그렇게 긴장 속에서 대회날을 맞이했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4keMX/btsKyniwqaD/PMGb74nBS7GPTTakopgjCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4keMX/btsKyniwqaD/PMGb74nBS7GPTTakopgjCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4keMX/btsKyniwqaD/PMGb74nBS7GPTTakopgjCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4keMX%2FbtsKyniwqaD%2FPMGb74nBS7GPTTakopgjCK%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;400&quot; height=&quot;711&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&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;E조 그룹 출발 대기를 하며 완주 후 내 모습은 어떨까 상상을 하였다. 나는 이때까지만 해도 드디어 끝났구나, 내가 해냈구나 하는 감동과 함께 눈물이 흘러나올 줄 알았다. 또한 혼자 참가했기에, '혼자서도 할 수 있다'를 되뇌며 끝까지 달려야겠다고 생각했다. 게다가 30km 이상의 거리를 달린 경험이 있었으니 나 자신을 믿자고 다짐했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는 전혀 달랐다. 나는 혼자 뛰었다고 생각했지만, 아침 일찍부터 코스 옆에서 응원해 주는 러닝 크루들, 응원가 힘내라는 말을 건네는 할머니, 할아버지, 아이들 등 남녀노소 가리지 않고 응원해 주는 분들 덕에 큰 힘을 얻었다. 특히 30km를 넘어서부터 너무 힘들었는데, 러닝 크루들의 하이파이브를 받을 때마다 힘이 솟아났고, 배번표의 내 이름을 보고 이름을 불러주며 파이팅을 외칠 때는 정말로 큰 힘이 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이날은 살면서 가장 많은 응원을 받은 날이라고 생각한다. 나는 혼자 뛰었지만, 그분들 덕분에 함께 달린 느낌이었다. 한계가 올때마다 물, 콜라, 레몬즙, 상쾌환 등 에너지 드링크를 주시며 힘을 나게 해 주시고, 쥐가 날 것 같으면 준비해 둔 파스를 뿌려주며 근육을 풀어주셨다. 정말로 응원해 주시는 모든 분들 덕분에 완주할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 300m에서 피니시 라인이 보일 때는 아드레날린이 폭발하며 아프고 힘든 것도 잊은 채 냅다 달렸다. 이 순간만큼은 도파민과 힘이 넘쳤다. 그렇게 완주한 뒤 감동의 눈물이 아닌 기쁨의 웃음이 나왔다. 드디어 해냈구나!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4K6yG/btsKw2GqHmK/dXP2PAImpBSL95o23Idlx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4K6yG/btsKw2GqHmK/dXP2PAImpBSL95o23Idlx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4K6yG/btsKw2GqHmK/dXP2PAImpBSL95o23Idlx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4K6yG%2FbtsKw2GqHmK%2FdXP2PAImpBSL95o23Idlx1%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;400&quot; height=&quot;533&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;완주를 하고 느낀 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇이든 해낼 수 있다는 생각이 든다. 앞으로 삶에서 이보다 더 힘든 일도 많겠지만, 마라톤을 뛰었던 경험을 되새기며 역경을 헤쳐나갈 수 있다고 믿는다. 무엇보다 할 수 있다는 자신감과 해낼 수 있다는 나에 대한 확신이 붙었다. 달리면서 나는 내가 누구인지, 무엇을 잘하고 무엇을 못했는지, 최근의 삶을 돌아보며 끊임없이 생각했다. 다른 사람들은 계속 묻는다. 왜 뛰냐고, 하지만 좋은 걸 어떡하나 뛰는 게 좋다. 뛰면서 생각하지 못한 범위를 생각하며 머릿속을 비우며 리프레시하는 게 좋다.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CjrTn/btsKxUU991X/Oyh4iGwJeuqHQdeoeto3G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CjrTn/btsKxUU991X/Oyh4iGwJeuqHQdeoeto3G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CjrTn/btsKxUU991X/Oyh4iGwJeuqHQdeoeto3G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCjrTn%2FbtsKxUU991X%2FOyh4iGwJeuqHQdeoeto3G1%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;400&quot; height=&quot;533&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마라톤을 한번 뛰고 나니 완주 당시엔 다시는 하고싶진 않았지만 어느 정도 회복하고 나니 또 한 번 뛰어보고 싶다 ㅎㅎ&lt;/p&gt;
&lt;/div&gt;</description>
      <category>끄적끄적</category>
      <category>jtbc마라톤</category>
      <category>서울마라톤</category>
      <category>풀마라톤</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/428</guid>
      <comments>https://integer-ji.tistory.com/428#entry428comment</comments>
      <pubDate>Wed, 6 Nov 2024 11:28:35 +0900</pubDate>
    </item>
    <item>
      <title>Java와 Kotlin, 컴파일 속도 차이가 많이날까?</title>
      <link>https://integer-ji.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로젝트 환경 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qLI5Y/btsKn3dJsxg/USlIRYXKLhLy8K4SYbU0M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qLI5Y/btsKn3dJsxg/USlIRYXKLhLy8K4SYbU0M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qLI5Y/btsKn3dJsxg/USlIRYXKLhLy8K4SYbU0M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqLI5Y%2FbtsKn3dJsxg%2FUSlIRYXKLhLy8K4SYbU0M0%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;790&quot; height=&quot;729&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w40rc/btsKm7VsB9u/I8wHnhafRL2MqgSvfw7zc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w40rc/btsKm7VsB9u/I8wHnhafRL2MqgSvfw7zc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w40rc/btsKm7VsB9u/I8wHnhafRL2MqgSvfw7zc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw40rc%2FbtsKm7VsB9u%2FI8wHnhafRL2MqgSvfw7zc1%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;794&quot; height=&quot;725&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 작성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 동일하게 동작하는 함수를 호출한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java&lt;/p&gt;
&lt;pre id=&quot;code_1730185863632&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        long sum = 0;
        for (int i = 1; i &amp;lt;= 1_000_000; i++) {
            sum += i;
        }
        System.out.println(&quot;Sum: &quot; + sum);
    }
}&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;Kotlin&lt;/p&gt;
&lt;pre id=&quot;code_1730185890759&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    var sum = 0L
    for (i in 1..1_000_000) {
        sum += i
    }
    println(&quot;Sum: $sum&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;h3 data-ke-size=&quot;size23&quot;&gt;빌드시간 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSrs4T/btsKnqmTuRg/RMmUk0enjxgTRe8Y9FVVgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSrs4T/btsKnqmTuRg/RMmUk0enjxgTRe8Y9FVVgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSrs4T/btsKnqmTuRg/RMmUk0enjxgTRe8Y9FVVgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSrs4T%2FbtsKnqmTuRg%2FRMmUk0enjxgTRe8Y9FVVgk%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;815&quot; height=&quot;373&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 진행 Java 평균 BUILD SUCCESSFUL in 1XXms&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM747h/btsKmuXjFHo/AqhqnC5H0kwaZtk9Z5F0xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM747h/btsKmuXjFHo/AqhqnC5H0kwaZtk9Z5F0xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM747h/btsKmuXjFHo/AqhqnC5H0kwaZtk9Z5F0xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM747h%2FbtsKmuXjFHo%2FAqhqnC5H0kwaZtk9Z5F0xK%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;808&quot; height=&quot;348&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 진행 Kotlin 평균 BUILD SUCCESSFUL in 2XXms&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java가 조금 더 빠르긴 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 이렇게 차이가 나는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfYojh/btsKogjAAT7/4TrzSCyGTivlaj9LBeJRm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfYojh/btsKogjAAT7/4TrzSCyGTivlaj9LBeJRm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfYojh/btsKogjAAT7/4TrzSCyGTivlaj9LBeJRm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfYojh%2FbtsKogjAAT7%2F4TrzSCyGTivlaj9LBeJRm1%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;675&quot; height=&quot;295&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바의 경우 Gradle Build를 수행할 때 Task가 적은 반면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotiln&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1iJnl/btsKnax7KQV/qBqefhkEERd9b9Jsg9dPD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1iJnl/btsKnax7KQV/qBqefhkEERd9b9Jsg9dPD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1iJnl/btsKnax7KQV/qBqefhkEERd9b9Jsg9dPD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1iJnl%2FbtsKnax7KQV%2FqBqefhkEERd9b9Jsg9dPD1%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;858&quot; height=&quot;366&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotiln의 경우는 Task가 조금 더 많은걸 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 프로젝트를 계속 사용하고 어플리케이션이 무거워질수록 차이는 있겠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 구축만으로 확인한 사실은 빌드 시간의 차이가 있다는 것을 알게 되었다.&lt;/p&gt;</description>
      <category>코딩공부</category>
      <category>java</category>
      <category>kotiln</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/427</guid>
      <comments>https://integer-ji.tistory.com/427#entry427comment</comments>
      <pubDate>Tue, 29 Oct 2024 16:26:49 +0900</pubDate>
    </item>
    <item>
      <title>Kotlin을 알아보자</title>
      <link>https://integer-ji.tistory.com/426</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jei3X/btsKoSPSWRj/Df3GiYtOyC40cEjRIBWIFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jei3X/btsKoSPSWRj/Df3GiYtOyC40cEjRIBWIFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jei3X/btsKoSPSWRj/Df3GiYtOyC40cEjRIBWIFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJei3X%2FbtsKoSPSWRj%2FDf3GiYtOyC40cEjRIBWIFk%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;480&quot; height=&quot;240&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 회사에서는 Java를 사용한다. 나중에 Kotlin을 사용할 때를 대비하기 위하여 코틀린은 자바에 비하여 무엇이 좋고 기업에서 왜 사용하는지 궁금하여 알아보았다.&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;h4 data-ke-size=&quot;size20&quot;&gt;1. 간결함&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린은 자바보다 구문이 간단하다. 이로 인하여 코드를 더 쉽게 짤 수 있고 유지보수 차원에서도 유용하게 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 예를 들자면 아래의 함수는 리스트의 짝수의 합을 구하는 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java&lt;/p&gt;
&lt;pre id=&quot;code_1729954706974&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.List;

public class Main {
    public static void main(String[] args) {
        List&amp;lt;Integer&amp;gt; numbers = List.of(1, 2, 3, 4, 5, 6);

        int sumWithForEach = calculateSumWithForEach(numbers);
        System.out.println(&quot;Sum with for-each: &quot; + sumWithForEach);

        int sumWithStream = calculateSumWithStream(numbers);
        System.out.println(&quot;Sum with stream: &quot; + sumWithStream);
    }

    public static int calculateSumWithForEach(List&amp;lt;Integer&amp;gt; numbers) {
        int sum = 0;
        for (int number : numbers) {
            if (number % 2 == 0) { // 짝수 확인
                sum += number;
            }
        }
        return sum;
    }

    public static int calculateSumWithStream(List&amp;lt;Integer&amp;gt; numbers) {
        return numbers.stream()
                      .filter(number -&amp;gt; number % 2 == 0)
                      .reduce(0, Integer::sum);
    }
}&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;Kotlin&lt;/p&gt;
&lt;pre id=&quot;code_1729954752553&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    val numbers = listOf(1, 2, 3, 4, 5, 6)
    val sum = numbers.filter { it % 2 == 0 }.sum()
    println(sum)
}&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;Java의 경우 코드의 스타일, 처리방식에 따라 for-each와 stream으로 작성할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이보다 더 간결하게 함수를 만든다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. NullPointException의 안정성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린은 기본적으로 null을 허용하지 않는다. 변수를 선언할 때 기본적으로 non-null로 지정되기 때문에 null과 관련된 예외 처리나 오류가 컴파일 단계에서 줄어들고, 코드 작성도 훨씬 간결해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java&lt;/p&gt;
&lt;pre id=&quot;code_1729954991781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public String getUpperCaseName(Person person) {
    return Optional.ofNullable(person)
        .map(Person::getName)
        .map(String::toUpperCase)
        .orElse(&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;Kotlin&lt;/p&gt;
&lt;pre id=&quot;code_1729955003202&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun getUpperCaseName(person: Person?): String {
    return person?.name?.uppercase() ?: &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;코틀린에서는 ?. 연산자를 사용해 null 여부를 간단하게 체크하고, ?: 연산자로 기본 값을 지정할 수 있다. 자바는 Optional을 사용해 널 안정성을 확보할 수 있지만, 코틀린의 null 처리 방식이 더 직관적인 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;NullPointerException 발생 포인트 예시&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Java&lt;/p&gt;
&lt;pre id=&quot;code_1730181089921&quot; class=&quot;reasonml&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;public String getUpperCaseName(Person person) {
    return person.getName().toUpperCase();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바에서는 Optional을 사용하지 않고 null 체크를 하지 않으면 person가 없을 때 NullPointerException이 발생&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;Kotiln&lt;/p&gt;
&lt;pre id=&quot;code_1730181089922&quot; class=&quot;kotlin&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;fun getUpperCaseName(person: Person?): String {
    return person?.name?.uppercase() ?: &quot;이름 없음&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;person이나 name이 null일 경우 ?. 연산자가 null을 반환하며, ?: 연산자를 통해 &quot;이름 없음&quot;을 반환&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코틀린의 단점&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 컴파일 속도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린은 자바보다 컴파일 속도가 조금 더 걸릴 수 있다. 코틀린에서 기본적으로 제공하는 안정성과 추가 기능들, 또한 Null 관련 검사를 자동으로 수행하며 이 과정에서 컴파일 속도가 늦춰질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 속도가 정말 차이날까? 궁금해서 새로운 프로젝트를 만나 기본 동일한 설정에서 테스트해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt;&amp;nbsp;&lt;a href=&quot;https://integer-ji.tistory.com/427&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://integer-ji.tistory.com/427&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 자바와의 호환성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린의 큰 장점으로는 자바와 호환이 잘되는 점을 뽑는다. 하지만 아이러니 하게도 자바가 가지고 있는 모든 라이브러리나 프레임워크가 코틀린을 100% 지원을 장담하진 않는다. 이 부분에서 필요한 라이브러리가 적용이 안될 경우 제한사항이 발생할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;느낀점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린을 살펴본 결과, 생산성과 가독성 면에서 확실한 장점이 느껴진다. 코드가 더 간결해져 유지보수에 유리하고, 널 안정성 덕분에 런타임 오류를 줄일 수 있는 건 큰 장점이라 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 코틀린의 문법은 안드로이드, JavaScript와 같은 다른 플랫폼 언어들과 유사하다 느꼈는데 이 점은 개발 인력이 부족한 스타트업이나 다양한 플랫폼을 제공해야 하는 초기 구축 단계에서 큰 장점으로 발휘하지 않을까 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이미 자바로 구축되어 몇십 년 이상 서비스되는 곳에서는 코틀린을 도입하기 어려울 것 같다는 생각이 들었다. 코틀린을 자바 프로젝트에 추가할 경우 생길 수 있는 호환성 문제와 의존성 관리의 복잡성도 고려해하며 새로운 이슈가 발생될 때 대응이 어렵다는 점도 크게 느껴진다.&lt;br /&gt;&lt;br /&gt;결론적으로, 코틀린의 장점을 잘 이해하고 필요할 때를 대비하되, 현재 환경에서는 자바의 깊이를 더해가는 것도 좋은 선택이라고 생각이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린이라는 언어를 직접 사용해 보기 전의 전반적이 느낌을 적어 보았다. 하지만 여기서 끝내지 않고 더 공부를 해가 보면 충분히 장점과 단점이 더 많이 나올 것이다. 그때 다시 이 글을 보며 회고를 작성하면 좋을 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩공부</category>
      <category>java</category>
      <category>kotiln</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/426</guid>
      <comments>https://integer-ji.tistory.com/426#entry426comment</comments>
      <pubDate>Sun, 27 Oct 2024 00:44:25 +0900</pubDate>
    </item>
    <item>
      <title>글또 10기, 삶의 지도, 주저리주저리, 목표, 다짐</title>
      <link>https://integer-ji.tistory.com/425</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beN239/btsJ0QSSrdi/T6cDMOhVaqtCU9dRDkdz8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beN239/btsJ0QSSrdi/T6cDMOhVaqtCU9dRDkdz8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beN239/btsJ0QSSrdi/T6cDMOhVaqtCU9dRDkdz8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeN239%2FbtsJ0QSSrdi%2FT6cDMOhVaqtCU9dRDkdz8K%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;141&quot; height=&quot;138&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;글또를 시작한 지 7기, 8기, 9기를 넘어 10기에 참여하게 되었다. 2년이란 시간이 흐른 지금 삶의 지도를 작성하여 나의 인생을 되돌아보고 이번 10기에는 어떤 다짐과 목표를 가지고 활동할지 적어본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;나의 삶의 지도&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;할 수 있는 것&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;학창시절 메이플 스토리라는 게임을 접하여 매크로를 만들며 처음 코딩을 해보았다. 그때 당시에는 매크로를 USB에 담에 판매를 했던 것으로 기억한다. 나는 그 돈이 너어어무 아까워 내가 직접 만들어 버렸고 이를 통해 코딩에 대해 처음 접하게 되었다. 그 이후로는 게임을 하기 위해 코딩을 시작하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;할 수 있는 것의 한계&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;14년도에는 컴퓨터 공학이 인기 과목이 아니었다. 모두 화공, 기공을 가는 시대였지만 내가 할 수 있는 건 컴퓨터 밖에 없었다.&amp;nbsp; 나는 컴공으로 전문대학에 입학하고 군대를 가게 되었다. 그런데 이게 웬걸, 군대에 들어가 보니 이세돌과 알파고의 바둑싸움을 통하여 컴퓨터 공학에 대한 인기가 상승하고 있었다. 설상가상으로 비트코인이 등장하고 IT에 지원이 빵빵해져 버려 취업이 잘 될 것이라는 오만이 생겨버렸다. 하지만 내가 좋아하지도 않고 할 수 있는 일을 이용해서 취업하기엔 모자람이 너무 많았다. 그렇게 취준에 실패하게 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;나의 강점 찾기&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;취업이 안될때를 대비하여 편입을 준비했었다. 취업 서류는 다 떨어졌지만 편입 원사 하나만 붙어 편입을 하게 되었고 더 넓은 세상을 접하게 되었다. 첫 1학년때에는 갑작스럽게 바뀐 학교에 적응도 못하고 성적도 바닥이었다. 공부는 물론 재미도 없었다. 하지만 이왕 대학생활을 즐기고 싶던 나는 편입한 사람들을 모아 편입 단톡방을 만들어 편입생들끼리 학교 생활을 즐기는 모임을 만들었다. 이렇게 대학생활을 즐기고 그러다 보니 교수님과도 친해지게 되어 교수님들의 제자(선배들)를 소개받기도 하였다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;하고 싶은 것&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;4학년 때엔 선배를 통하여 멋쟁이 사자처럼이라는 동아리에 들어가 운영진을 하며 처음으로 개발에 대한 공부를 본격적으로 시작하였다. Python Django를 통하여 비 전공자 학생들에게 코딩을 알려주는 동아리였다. 나는 동아리 운영진으로써 부끄럽지 않게 열심히 공부하게 되었고 현재의 이 블로그도 탄생하게 되었다. 동아리 운영, 코딩 경험을 쌓으며 내가 좋아하는 것이 개발이라는 것을 알게 되어 좋아하는 일을 하니 취업 준비는 너무 수월하게 되었다. 그렇게 교수님의 추천을 받고 한 SI 회사에 들어가게 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 나의 인생이 시작되었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;삶의 지도를 작성하고 느낀 나&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;삶의 지도를 작성하니 내가 이루고자 하는 목표와 방향을 다시 한번 상기시켜 주는 계기가 되었다. 내 목표는 세상 사람들이 모두 행복했으면 좋겠다. 그러기 위해 나는 무엇을 할 수 있을까? 내가 좋아하는 일을 찾아 추진하며 사람들에게 도움과 행복을 주고 싶다. 글또 7,8,9기를 하였지만 잘 적응을 하지 못하였다. 글 제출 또한 활발하게 하지 못했다. 하지만 커피챗과 여러 모임을 통하여 사람들을 알게 되었고 그로 인해 자극도 받으며 많은 도움을 받게 되었다. 이번 글또의 마지막 10기에서는 내가 받은 배품을 나누고 싶다. 그렇게 나의 강점인 커뮤니케이션과 퍼실리테이션 테크닉을 활용하여 많은 경험을 나누고 싶다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이번 10기의 목표&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;채널 활발히 활동하기&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 나의 체력이 남을 때까지 채널에서 활발히 활동을 해볼 것이다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;큰 모임 주최해 보기&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 많은 인원을 모아 좋은 경험과 추억을 만들고 싶다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;라디오 진행해 보기&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 피식대학의 피식쇼처럼 간단하게 라이브 인터뷰 방송을 진행해보고 싶다&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;글 제출 많이 하기 (최대한)&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 처음부터 올 제출을 바라면 목표에 다가가기 어렵다. 나는 나를 잘 안다. 최대한 많이 제출하는 것을 목표로 삼겠다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;나에게 관심을 표현해 준 분들에게 커피라도 대접하기&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 모르는 사람에게 관심을 표현한다는 것은 생각보다 어려운 것이다. 이 어려운 일을 해내 주셨으니 기념으로 커피챗을 하며 이야기를 나누고 싶다.&amp;nbsp;&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <category>글또</category>
      <category>글또10기</category>
      <category>삶의지도</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/425</guid>
      <comments>https://integer-ji.tistory.com/425#entry425comment</comments>
      <pubDate>Fri, 11 Oct 2024 10:48:10 +0900</pubDate>
    </item>
    <item>
      <title>sdk 만들어보기</title>
      <link>https://integer-ji.tistory.com/424</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 알람 시스템은 나는 정말 유용하게 사용하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 더 확장해서 SDK로 만들면 어떨까?!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 SDK를 만들기 위해서는 유연성과 확장성이 좋아야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금의 내 프로젝트의 문제점을 파악해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 패키지 구조 및 네이밍&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efMJ0o/btsIXHCPB6K/AeaI1n1MSW4d5fOwiEdOA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efMJ0o/btsIXHCPB6K/AeaI1n1MSW4d5fOwiEdOA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efMJ0o/btsIXHCPB6K/AeaI1n1MSW4d5fOwiEdOA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefMJ0o%2FbtsIXHCPB6K%2FAeaI1n1MSW4d5fOwiEdOA0%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;409&quot; height=&quot;499&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 나의 구조 상태이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API, billing라는 명칭을 사용하였는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sdk라는 걸 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;명확하게&lt;span&gt;&amp;nbsp;하기 위해&lt;/span&gt;&lt;/span&gt; com.sdk.notification으로 바꾸어 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Application 제거&lt;/p&gt;
&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;Applicationd을 통해서 &lt;/span&gt;Spring Boot를 시작시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 내 SDK가 특정 프로젝트의 애플리케이션 설정과 분리되어야 하는 이유는 &lt;b&gt;독립성&lt;/b&gt; 때문이다. 다양한 환경과 프로젝트에서 사용될 수 있어야 하기 때문에 애플리케이션 초기화 코드는 포함되지 않는 것이 좋다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXqAJv/btsIXmZ3tSl/dnyu8NqrlgWb9WfV3kkqTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXqAJv/btsIXmZ3tSl/dnyu8NqrlgWb9WfV3kkqTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXqAJv/btsIXmZ3tSl/dnyu8NqrlgWb9WfV3kkqTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXqAJv%2FbtsIXmZ3tSl%2Fdnyu8NqrlgWb9WfV3kkqTk%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;569&quot; height=&quot;212&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YT1vB/btsIWGrjjWW/cyObo6PM6V6qj7kAOkcAJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YT1vB/btsIWGrjjWW/cyObo6PM6V6qj7kAOkcAJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YT1vB/btsIWGrjjWW/cyObo6PM6V6qj7kAOkcAJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYT1vB%2FbtsIWGrjjWW%2FcyObo6PM6V6qj7kAOkcAJ0%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;305&quot; height=&quot;154&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조가 이렇게 바뀔 듯싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 우선 구조까지만 바꾸고 추가로 채널 ID도 직접 받아야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 이 알림에서 에러가 나서 기존의 서비스에 영향이 가면 안 되기 때문에 이러한 상황도 고려를 해봐야겠다.&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/424</guid>
      <comments>https://integer-ji.tistory.com/424#entry424comment</comments>
      <pubDate>Wed, 7 Aug 2024 17:47:42 +0900</pubDate>
    </item>
    <item>
      <title>슬랙으로 알람 쏘기 2</title>
      <link>https://integer-ji.tistory.com/423</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이제 회사에서 슬랙이 아닌 팀즈를 사용한다구 한다 ...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-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_1722929801653&quot; class=&quot;clean&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;implementation 'com.slack.api:slack-api-client:1.40.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 해당 버전은 보안 이슈가 있었다고한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전을 올리자니 Boot 버전이랑 안맞고 ...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 그냥 버리고 RestTemplate로 진행할까 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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;929&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ArNJt/btsIXkNBdcX/Oz1kiUEXLbKNmcilCgWPm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ArNJt/btsIXkNBdcX/Oz1kiUEXLbKNmcilCgWPm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ArNJt/btsIXkNBdcX/Oz1kiUEXLbKNmcilCgWPm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FArNJt%2FbtsIXkNBdcX%2FOz1kiUEXLbKNmcilCgWPm0%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;929&quot; height=&quot;1162&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;1162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 간단하게 만들어 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 슬랙 service 하나, Teams Service 하나 만들다보니&amp;nbsp;&lt;br /&gt;&lt;br /&gt;그러면 플랫폼 별로 다 만들건 아니지 않나? 라는 생각이 들어서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정신차리고 하나의 Service로 묶어 관리를 하려고 하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 좋고 깔끔한 방법이 있을 것 같은데 조금 더 찾아보려고한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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;935&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9sDgY/btsIVD8UDCc/qKmahehxpaPxccEJ8nSQK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9sDgY/btsIVD8UDCc/qKmahehxpaPxccEJ8nSQK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9sDgY/btsIVD8UDCc/qKmahehxpaPxccEJ8nSQK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9sDgY%2FbtsIVD8UDCc%2FqKmahehxpaPxccEJ8nSQK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;176&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWrev/btsIUAZkT47/7f7u6eUC2KIBTaqFbsFSw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWrev/btsIUAZkT47/7f7u6eUC2KIBTaqFbsFSw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWrev/btsIUAZkT47/7f7u6eUC2KIBTaqFbsFSw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWrev%2FbtsIUAZkT47%2F7f7u6eUC2KIBTaqFbsFSw0%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;444&quot; height=&quot;172&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/423</guid>
      <comments>https://integer-ji.tistory.com/423#entry423comment</comments>
      <pubDate>Tue, 6 Aug 2024 16:40:21 +0900</pubDate>
    </item>
    <item>
      <title>슬랙으로 알람 쏘기</title>
      <link>https://integer-ji.tistory.com/422</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서비스를 제공하는 입장에서 사람이라면(?) 어쩔수 없이 서비스 장애가 날 수 밖에 없다고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장애를 예밤하기 위해 Qa 검증을 진행하고, 다양한 경험을 쌓아 미연에 방지를 해야한다고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 정말 본의아니게 어쩔수 없는 상황 (방화벽, 다른 업체 제공, 경험 부족 등)으로 발생되는 상황을 좀 더 빠르게 캐치하고 대처하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 좋은 서비스를 제공할 수 있지 않을까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 업무에도 사용하고 폰에도 깔려있지만 카톡과는 확실하게 Work / Life가 구분되어있는 슬랙을 사용하겠다 .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;incoming-webhook을 사용하여 특정 시점에 메시지 제목을 발송하면 어떨까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722846898866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'com.slack.api:slack-api-client:1.40.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬랙 API를 Gradle로 연동을 해 보았다 .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 테스트 용으로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722846964443&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private final Slack slackClient = Slack.getInstance();

    public void sendMessage(String title) {
        try {
            slackClient.send(&quot;https://hooks.slack.com/services/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&quot;, WebhookPayloads.payload(p -&amp;gt; p
                    .text(title) // 메시지 제목
            ));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전송!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 작동하는 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이거를 더 디벨롭 하면서 어떻게 하면 좋알까 생각해 보아야겠다.&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/422</guid>
      <comments>https://integer-ji.tistory.com/422#entry422comment</comments>
      <pubDate>Mon, 5 Aug 2024 17:36:38 +0900</pubDate>
    </item>
    <item>
      <title>레디스(Redis) 알아보기</title>
      <link>https://integer-ji.tistory.com/420</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FioNM/btsDdExRXf3/sqqLdcQxjkaUaRfenpfM4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FioNM/btsDdExRXf3/sqqLdcQxjkaUaRfenpfM4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FioNM/btsDdExRXf3/sqqLdcQxjkaUaRfenpfM4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFioNM%2FbtsDdExRXf3%2FsqqLdcQxjkaUaRfenpfM4K%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;308&quot; height=&quot;260&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Redis란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 빠르고 간편한 오픈 소스 DB이다. 주로 메모리에 데이터를 저장하여 높은 성능을 제공하며, 캐싱, 세션 관리, 메시지 브로커 등에 활용된다. 기본적으로 키-값 형태로 데이터를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #374151; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Redis의 특징&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 기반의 데이터 저장&lt;br /&gt;레디스는 데이터를 주로 메모리(RAM)에 저장하여 빠른 읽기와 쓰기 속도를 제공한다. 이는 디스크 기반의 데이터베이스보다 높은 성능을 실현할 수 있다.&amp;nbsp;메모리 기반의 저장은 주로 캐싱 및 높은 처리량이 필요한 실시간 응용 프로그램에서 효과적으로 사용되지만 아무래도 휘발성 메모리에 저장하기 때문에 백업을 효율적으로 잘 해두어야 한다.&lt;/li&gt;
&lt;li&gt;키-값 구조&lt;br /&gt;레디스는 간단한 키-값 구조로 데이터를  저장한다. 각 데이터는 고유한 식별자인 &quot;키&quot;와 그에 대응하는 &quot;값&quot;으로 이루어져 있어서 데이터를 빠르게 검색하고 관리할 수 있다. 그리고 익숙하다!&lt;/li&gt;
&lt;li&gt;다양한 데이터 타입:&lt;br /&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;br /&gt;레디스는 자주 사용되는 데이터를 빠르게 제공하기 위한 캐싱 시스템으로 활용된다. 매번 계산하거나 디스크에서 읽어오는 데 소요되는 시간을 절약하고, 자주 업데이트되지 않는 데이터를 메모리에 저장하여 높은 성능을 유지할 수 있다.&lt;/li&gt;
&lt;li&gt;세션 관리&lt;br /&gt;애플리케이션에서 사용자 세션을 효과적으로 관리하기 위해 레디스를 사용할 수도 있다. 사용자 로그인 정보나 세션 데이터를 안정적으로 저장하고 검색하여 빠르게 세션을 관리할 수 있다.&lt;/li&gt;
&lt;li&gt;메시지 브로커로의 활용&lt;br /&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;br /&gt;레디스는 메모리 기반의 저장소를 사용하여 빠른 읽기 및 쓰기 성능을 제공하기 때문에 응답 시간이 중요한 실시간 응용 프로그램이나 캐싱 시스템에서 효과적으로 사용된다. 제 생각으론 대용량 데이터를 빠르게 조회하는 곳에서 쓰면 확실히 좋은 것 같다.&lt;/li&gt;
&lt;li&gt;데이터 분석 및 실시간 이벤트 처리:&lt;br /&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;br /&gt;레디스는 주로 메모리 기반의 데이터베이스로서, 전원이 꺼지거나 서버가 재시작되면 데이터가 손실될 수 있다... 이는 데이터의 영속성이 보장되지 않으며 주기적인 스냅샷 백업이나 &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;AOF(Append-Only File) 등 잘 대비를 해야한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;용량 제한&lt;br /&gt;레디스는 메모리 기반의 저장소로 용량이 제한되어 있다. 매우 큰 데이터셋을 다루기에는 부적합하며, 대용량의 데이터를 다루기 위해서는 메모리를 확장하는 대신 다른 데이터베이스 시스템을 고려해야 할 수도..있다.&lt;/li&gt;
&lt;li&gt;복잡한 쿼리 처리 부족&lt;br /&gt;레디스는 기본적으로 간단한 키-값 구조이기 때문에 다양한 쿼리나 복잡한 데이터 연산을 처리하는 데는 적합하지 않을 수 있다. 관계형 데이터베이스 시스템보다는 데이터 모델이 단순하고 직관적인 편이며 잘 고려하고 도입을 해야한다.&lt;/li&gt;
&lt;li&gt;단일 스레드 구조&lt;br /&gt;레디스는 단일 스레드로 동작한다. 그래서 동시에 명령어를 처리하는 데에는 한계가 있다. 이는 다중 코어를 활용하지 못하고 단일 코어의 성능에 의존한다는 의미이며, 몇몇 CPU 바운드 작업에 대한 처리 속도를 제한할 수도 있다.&lt;/li&gt;
&lt;/ul&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;각 솔루션에 따라 레디스를 정말 잘 활용할 수 있다고 생각한다.&amp;nbsp;단점이 뭐가 있을까? 하고 여러가지를 알아 보았지만 단점에 걸리지 않는 정도이고 효율적으로 사용한다면 레디스는 충분히 좋은 시스템이라고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 글쓰기 연습 겸 정리하면서 글을  적어보았다.&amp;nbsp;분명 저번 글까지만 해도 잘 쓰고 있다고 생각했는데 막상 적고 나니까 어렵다!&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <category>redis</category>
      <category>레디스</category>
      <category>레디스(Redis)</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/420</guid>
      <comments>https://integer-ji.tistory.com/420#entry420comment</comments>
      <pubDate>Sun, 7 Jan 2024 23:11:57 +0900</pubDate>
    </item>
    <item>
      <title>NoSql이란? by gpt</title>
      <link>https://integer-ji.tistory.com/419</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GPT를 사용하여 한번 더 공부하고 정리를 해보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #374151; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;NoSQL 소개&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NoSQL이란?&lt;br /&gt;NoSQL은 &quot;Not Only SQL&quot;의 약자로, 관계형 데이터베이스 이외의 다양한 데이터 모델을 지원하는 데이터베이스를 말한다. 이는 유연한 데이터 구조와 대용량 데이터 처리에 적합하며, 전통적인 테이블 기반의 관계형 데이터베이스의 제약을 벗어나려는 목적에서 등장한 이력이 있다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;관계형 데이터베이스와의 차이점&lt;br /&gt;관계형 데이터베이스는 정해진 스키마에 따라 데이터를 저장하는 반면, NoSQL은 스키마가 유동적이고 데이터 모델이 다양하다. NoSQL은 확장성과 빠른 읽기/쓰기 속도에 중점을 둬, 특히 대규모 분산 시스템에서 효과를 발휘한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;NoSQL의 주요 특징과 장단점&lt;br /&gt;주요&amp;nbsp;특징:&amp;nbsp;유연한&amp;nbsp;데이터&amp;nbsp;모델,&amp;nbsp;확장성,&amp;nbsp;분산&amp;nbsp;처리,&amp;nbsp;다양한&amp;nbsp;데이터&amp;nbsp;모델&amp;nbsp;지원&lt;br /&gt;장점:&amp;nbsp;대용량&amp;nbsp;및&amp;nbsp;비정형&amp;nbsp;데이터&amp;nbsp;처리,&amp;nbsp;수평&amp;nbsp;확장&amp;nbsp;용이,&amp;nbsp;높은&amp;nbsp;성능&lt;br /&gt;단점:&amp;nbsp;일관성&amp;nbsp;및&amp;nbsp;트랜잭션&amp;nbsp;지원이&amp;nbsp;상대적으로&amp;nbsp;부족,&amp;nbsp;학습&amp;nbsp;곡선이&amp;nbsp;높을&amp;nbsp;수&amp;nbsp;있음&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NoSQL 데이터 모델&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키-값 스토어 (Key-Value Store)&lt;br /&gt;키-값 스토어는 간단한 데이터 모델을 가지고 있어서 효율적인 데이터 검색과 쓰기에 특화되어 있다. 각 데이터는 고유한 키와 연결되어 있으며, 이를 통해 데이터에 접근하거나 갱신할 수 있고 주로 단순한 조회 및 저장에 사용된다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;문서 지향 데이터베이스 (Document-Oriented Database)&lt;br /&gt;문서 지향 데이터베이스는 데이터를 문서 형식으로 저장한다. 주로 JSON 또는 BSON 형태를 사용하며, 중첩된 구조로 데이터를 표현하며 이 모델은 복잡한 데이터 구조를 효과적으로 다룬다. 관련 데이터를 함께 저장하여 쿼리 성능을 향상시킬 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;왜 그래프 데이터베이스인가? (Graph Database)&lt;br /&gt;그래프&amp;nbsp;데이터베이스는&amp;nbsp;노드(Node)와&amp;nbsp;엣지(Edge)로&amp;nbsp;이뤄진&amp;nbsp;그래프&amp;nbsp;모델을&amp;nbsp;사용하여&amp;nbsp;데이터를&amp;nbsp;표현합니다.&amp;nbsp;관계형&amp;nbsp;데이터베이스보다&amp;nbsp;뛰어난&amp;nbsp;관계&amp;nbsp;표현과&amp;nbsp;탐색이&amp;nbsp;가능하며,&amp;nbsp;소셜&amp;nbsp;네트워크,&amp;nbsp;추천&amp;nbsp;시스템&amp;nbsp;등에서&amp;nbsp;강점을&amp;nbsp;보입니다.&amp;nbsp;복잡한&amp;nbsp;연결&amp;nbsp;관계를&amp;nbsp;다룰&amp;nbsp;때&amp;nbsp;특히&amp;nbsp;유용합니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;컬럼 패밀리 데이터베이스 (Wide-Column Store)&lt;br /&gt;컬럼 패밀리 데이터베이스는 로우보다는 칼럼을 중심으로 데이터를 저장한다. 이는 대규모 분산 데이터베이스에서 성능 향상을 가져오는데, 필요한 칼럼만 읽어오기 때문에 빠른 읽기 속도를 제공하며, 대용량 데이터에 대한 효과적인 스토리지를 지원한다.&lt;br /&gt;&lt;br /&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;br /&gt;데이터 모델 선택은 데이터베이스를 구축할 때 가장 중요한 결정 중 하나이다. 선택한 데이터 모델에 따라 데이터의 구조, 유연성, 쿼리 효율성 등이 크게 영향을 받으며 올바른 데이터 모델을 선택하는 것은 향후 확장성과 유지보수에 매우 중요한 역할을 한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;어떤 상황에서 어떤 NoSQL 데이터베이스를 선택해야 하는가?&lt;br /&gt;키-값 스토어: 간단한 조회 및 저장이 필요한 경우, 예를 들어 세션 관리나 캐싱에 적합&lt;br /&gt;문서 지향 데이터베이스: 복잡한 데이터 구조를 다루거나 중첩된 데이터가 필요한 경우, 예를 들어 블로그 포스트, 제품 카탈로그 등&lt;br /&gt;그래프 데이터베이스: 복잡한 관계를 다루어야 하는 경우, 예를 들어 소셜 네트워크에서의 친구 관계, 네트워크 구조 등에 적합&lt;br /&gt;컬럼 패밀리 데이터베이스: 대용량 데이터를 다루거나 읽기 성능이 중요한 경우, 예를 들어 로그 데이터, 시계열 데이터 등&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;예시를 통한 실제 적용 사례&lt;br /&gt;전자상거래 플랫폼에서는 제품 정보와 주문 정보를 각각 문서 지향 데이터베이스와 키-값 스토어에 저장할 수 있다. 제품 정보는 복잡한 구조를 갖고 있을 수 있고, 주문 정보는 효율적인 조회와 저장이 중요하기 때문입니다. 또한, 소셜 미디어 플랫폼에서는 사용자 간의 관계를 그래프 데이터베이스로 효과적으로 관리할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NoSQL 쿼리 언어 및 API&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NoSQL 데이터베이스에서의 쿼리 언어&lt;br /&gt;예시로 MongoDB는 문서 지향 데이터베이스로, JSON 형식의 쿼리를 사용한다. &lt;br /&gt;ex) { &quot;author&quot;: &quot;John Doe&quot; }와 같은 쿼리로 작성자가 John Doe인 문서를 찾을 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;RESTful API, GraphQL 등 NoSQL에서의 데이터 검색 및 조작 방법&lt;br /&gt;대부분의 NoSQL 데이터베이스는 RESTful API 또는 GraphQL을 통해 데이터에 접근하고 조작할 수 있다.&lt;br /&gt;&lt;br /&gt;RESTful API 예시: MongoDB에서는 HTTP GET, POST, PUT, DELETE 등의 메서드를 사용하여 데이터를 읽거나 쓸 수 있으며 /articles 엔드포인트로 모든 글을 얻거나, /articles/{id}로 특정 글을 얻을 수 있다.&lt;br /&gt;&lt;br /&gt;GraphQL 예시: GraphQL을 사용하면 클라이언트가 필요한 데이터만 요청할 수 있다. &lt;br /&gt;ex) &quot;특정 글의 제목과 작성자&quot;를 요청하는 쿼리라면&lt;br /&gt;
&lt;pre id=&quot;code_1702209085831&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;query {
  article(id: &quot;123&quot;) {
    title
    author
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;NoSQL 데이터 모델에 따른 쿼리 예시&lt;br /&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;그래프 데이터베이스에서는 사용자 간의 관계를 탐색하기 위해 특정 노드와 연결된 다른 노드를 조회하는 쿼리를 작성할 수 있다. 예를 들어, &quot;A 사용자의 친구 목록&quot;을 조회하는 그래프 데이터베이스의 쿼리는&lt;br /&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1702209156281&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MATCH (a:User)-[:FRIEND]-&amp;gt;(friend:User)
WHERE a.username = 'A'
RETURN friend.username&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&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;여러가지 글을 잘 쓰는 방법을 찾아보고 있다. 확실히 GPT가 있으니 조금 더 편한거 같긴 하다. 다음부터는 GPT로 먼저 글을 작성해보고 그 다음 한번 더 내가 써보는 형식으로 바꿔봐야겠다.&lt;/p&gt;</description>
      <category>GPT</category>
      <category>NoSQL</category>
      <category>NoSql이란?</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/419</guid>
      <comments>https://integer-ji.tistory.com/419#entry419comment</comments>
      <pubDate>Sun, 10 Dec 2023 20:53:46 +0900</pubDate>
    </item>
    <item>
      <title>NoSQL이란?</title>
      <link>https://integer-ji.tistory.com/418</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;NoSQL이란&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비관계형 데이터베이스를 말한다. 일반적인 관계형 데이터 모델을 지양하고 많은 분산된 데이터를 저장, 조회하는데 특화되어 있으며 스키마 없이 사용이 가능한 점이 큰 특징이며 기존의 RDBMS(&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;Relational DataBase Management System&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;RDBMS와 NoSql의 차이&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;RDBMS&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;NoSql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;* 정해진&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;스키마에&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;따라 데이터를 저장하여 명확한 데이터 구조를 보장한다.&lt;br /&gt;* &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;관계는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 데이터를 중복없이 한 번만 저장할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;* 스키마가 없기때문에 자유로운 데이터 구조를 가질 수 있다.&lt;br /&gt;* 언제든 데이터를 조정하고 새로운 필드를 추가하기 자유롭다.&lt;br /&gt;* 데이터 분산에 용이하며 성능 향상을 위한 &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;Saclue&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;-up 또는 Scale-out도 가능하다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;* &lt;span style=&quot;color: #000000;&quot;&gt; 시스템이 커질 수록 테이블간의 JOIN이 많아져 쿼리가 복잡해질 수 있다.&lt;br /&gt;* 스키마로 인하여 데이터가 유연하지 못하며 스키마가 변경될 경우 번거로워진다.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;* 데이터 중복이 발생할 수 있다. 중복된 데이터가 수정될 경우 모든 컬렉션에서 수행이 되어야 한다.&lt;br /&gt;* 스키마가 존재하지 않기 때문에 명확한 데이터 구조를 보장하지 않으며 데이터 구조 결정이 어려울 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;NoSql은 어떤 상황에서 사용을 할까&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;1. 비구조화 데이터를 다루어야 할 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- 일반적으로 행과 열의 형태로 표현하기 어려운 데이터들을 다룰 때 사용하면 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;2. 대량의 데이터를 읽기, 쓰기를 할 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- 수평 확장성을 제공하여 분산 아키텍처에서 쉽게 확장할수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;3. 유연한 스키마가 필요한 경우&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- RDBMS의 경우 사전에 데이터 모델을 정의해야 하지만 NoSql은 스키마가 동적이거나 유연하여 데이터 모델을 쉽게 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;4. 큰 규모의 분산 시스템&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- 수많은 서버에 데이터를 분산하고있고 클라우드 환경에서의 확장성이 중요한 경우 유리한 점을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;5. 빠른 개발 및 서비스 출시가 필요한 경우&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- 초기 개발 단계의 스키마가 자주 변경될 경우 매우 유용하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;6. 다양한 종류의 데이터 모델이 필요한 경우&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- 다양한 데이터 모델을 지원하여 키-값 저장소, 문서 저장소, 그래프 데이터베이스 등 다양한 유형의 데이터를 다룰 수 있다.&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;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt; 알아보면서 들었던 나의 생각&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;우선 NoSql이 어떤것인지에 대하여 간단하게 알아보았다. 하지만 왜인지 아직 실감이 안나는 것일까? NoSql의 MongoDB를&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&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;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;GPT로 글을 한번 더 적어보기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&lt;a href=&quot;https://integer-ji.tistory.com/419&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://integer-ji.tistory.com/419&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;GPT로 글을 적어 보았다. 확실히 간결하게 글이 작성이 되었고 또 이해가 더 쉽게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는 GPT로 글을 한번 적어보고 나의 스타일로 한번 더 적어보면서 글을 써보면 더 좋을 것 같다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 리마인드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- RDBMS (&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, Oracle Database 등)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- DBMS : &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;DataBase&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Management System&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: left;&quot;&gt;&amp;nbsp;- Sql : &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;Strucured&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Query Language&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://code-lab1.tistory.com/53&quot;&gt;https://code-lab1.tistory.com/53&lt;/a&gt;&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <category>NoSQL</category>
      <category>NoSql이란?</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/418</guid>
      <comments>https://integer-ji.tistory.com/418#entry418comment</comments>
      <pubDate>Sun, 10 Dec 2023 20:27:06 +0900</pubDate>
    </item>
    <item>
      <title>python mysqlclient 2.2.x 버전 설치 시 에러</title>
      <link>https://integer-ji.tistory.com/416</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2818&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPYMSg/btsudLthUS6/0VKBaK0Ys2flWQuny8OUEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPYMSg/btsudLthUS6/0VKBaK0Ys2flWQuny8OUEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPYMSg/btsudLthUS6/0VKBaK0Ys2flWQuny8OUEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPYMSg%2FbtsudLthUS6%2F0VKBaK0Ys2flWQuny8OUEk%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;2818&quot; height=&quot;1242&quot; data-origin-width=&quot;2818&quot; data-origin-height=&quot;1242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1694939334935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(env) int@intui-MacBookAir potenday-309 % pip install mysqlclient             
Collecting mysqlclient
  Using cached mysqlclient-2.2.0.tar.gz (89 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error
  
  &amp;times; Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&amp;gt; [24 lines of output]
      /bin/sh: pkg-config: command not found
      /bin/sh: pkg-config: command not found
      Trying pkg-config --exists mysqlclient
      Command 'pkg-config --exists mysqlclient' returned non-zero exit status 127.
      Trying pkg-config --exists mariadb
      Command 'pkg-config --exists mariadb' returned non-zero exit status 127.
      Traceback (most recent call last):
        File &quot;/Users/int/Development/workspace/potenday-309/env/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 353, in &amp;lt;module&amp;gt;
          main()
        File &quot;/Users/int/Development/workspace/potenday-309/env/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
        File &quot;/Users/int/Development/workspace/potenday-309/env/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 118, in get_requires_for_build_wheel
          return hook(config_settings)
        File &quot;/private/var/folders/gz/nfvkk1c10m3d7dy7_bwzy43m0000gn/T/pip-build-env-48994rpk/overlay/lib/python3.9/site-packages/setuptools/build_meta.py&quot;, line 355, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=['wheel'])
        File &quot;/private/var/folders/gz/nfvkk1c10m3d7dy7_bwzy43m0000gn/T/pip-build-env-48994rpk/overlay/lib/python3.9/site-packages/setuptools/build_meta.py&quot;, line 325, in _get_build_requires
          self.run_setup()
        File &quot;/private/var/folders/gz/nfvkk1c10m3d7dy7_bwzy43m0000gn/T/pip-build-env-48994rpk/overlay/lib/python3.9/site-packages/setuptools/build_meta.py&quot;, line 341, in run_setup
          exec(code, locals())
        File &quot;&amp;lt;string&amp;gt;&quot;, line 154, in &amp;lt;module&amp;gt;
        File &quot;&amp;lt;string&amp;gt;&quot;, line 48, in get_config_posix
        File &quot;&amp;lt;string&amp;gt;&quot;, line 27, in find_package_name
      Exception: Can not find valid pkg-config name.
      Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

&amp;times; Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─&amp;gt; See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.&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;python에서 mysql을 사용하려고 pip를 이용해 mysqlclient를 설치하다 에러가 났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 다른 프로젝트에서는 잘 작동하였는데 찾아보니까 간단하였다.&lt;/p&gt;
&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;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2.2.0 버전이 2023년 6월 릴리스 되었으며 해당 버전 이후부터는 pkg-config 패키지를 container에 설치해야 한다.&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;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;맥북에 brew를 사용하여 pkg-config를 설치하자&lt;/span&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;976&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CWaJs/btst9aUCy86/0ZnjsKk9jk0zEKxdhM5NZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CWaJs/btst9aUCy86/0ZnjsKk9jk0zEKxdhM5NZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CWaJs/btst9aUCy86/0ZnjsKk9jk0zEKxdhM5NZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCWaJs%2Fbtst9aUCy86%2F0ZnjsKk9jk0zEKxdhM5NZk%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;527&quot; height=&quot;280&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1694939574669&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install mysql pkg-config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치를 완료하고 다시 mysqlclient를 설치하면&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;2576&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b10G6s/btsudjcBgcc/UL4A8EATXlAEbbWCSEVCQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b10G6s/btsudjcBgcc/UL4A8EATXlAEbbWCSEVCQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b10G6s/btsudjcBgcc/UL4A8EATXlAEbbWCSEVCQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb10G6s%2FbtsudjcBgcc%2FUL4A8EATXlAEbbWCSEVCQk%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;2576&quot; height=&quot;428&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1694939730700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install mysqlclient&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 설치된다.&lt;/p&gt;</description>
      <category>에러</category>
      <category>Exception: Can not find valid pkg-config name</category>
      <category>Getting requirements to build wheel did not run successfully.</category>
      <category>mysqlclient</category>
      <category>pkg-config</category>
      <category>Python</category>
      <category>Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually</category>
      <category>subprocess-exited-with-error</category>
      <category>This error originates from a subprocess</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/416</guid>
      <comments>https://integer-ji.tistory.com/416#entry416comment</comments>
      <pubDate>Sun, 17 Sep 2023 17:37:32 +0900</pubDate>
    </item>
    <item>
      <title>근황</title>
      <link>https://integer-ji.tistory.com/415</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;근황 List Up&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- DDD 9기가 끝났다. 운영진으로써 첫 기수였는데 좋았따.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 비사이드 포텐데이를 한번 더 참여하기로 하였다. (309) 1등 꼭할꺼야&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 서핑에 대한 취미를 가지게 되었다. 서핑좋아&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 일본여행 갈 준비를 하고있다. 추석 연휴가 너무 길어졌다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/415</guid>
      <comments>https://integer-ji.tistory.com/415#entry415comment</comments>
      <pubDate>Mon, 11 Sep 2023 17:04:57 +0900</pubDate>
    </item>
    <item>
      <title>비사이드 포텐데이 후기 - 10일만에 서비스 배포하기</title>
      <link>https://integer-ji.tistory.com/414</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사이드 프로젝트를 해보았지만 결국 끝은 열정이 식어버렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금의 나는 번아웃과 슬럼프를 포장한 게으름에 빠져있었고 예전의 모습을 찾기 위해 다양한 프로그램을 찾고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾는 중 마침 기획을 할 수 있는 학교 후배와 함께 비사이드 포텐데이라는 10일에 걸쳐 서비스를 출시하는 프로그램을 발견하게 되었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비사이드에서 연결해 준 디자이너와 함께 우승 상금과 성장을 초점으로 &lt;b&gt;백엔드&lt;/b&gt;와 &lt;b&gt;프론트엔드&lt;/b&gt; 개발자로서 다시 한번 경쟁에 참여하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bside.best/potenday&quot;&gt;https://bside.best/potenday&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692024978987&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;비사이드 : IT 프로젝트 경험을 통해 성장하세요!&quot; data-og-description=&quot;&quot; data-og-host=&quot;bside.best&quot; data-og-source-url=&quot;https://bside.best/potenday&quot; data-og-url=&quot;https://bside.best&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdoybj/hyTFbrXD33/f5YvbcrM9wsKA4dvcgFNz0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://bside.best/potenday&quot; data-source-url=&quot;https://bside.best/potenday&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdoybj/hyTFbrXD33/f5YvbcrM9wsKA4dvcgFNz0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;비사이드 : IT 프로젝트 경험을 통해 성장하세요!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;bside.best&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(8월 4일 ~ 8월 13일까지 총 10일에 걸쳐 서비스를 출시하는 비사이드 포텐데이 308기!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하자면 1등은 하지 못하였다. 하지만 좋은 경험이었고 짧은 시간 안에 많은 포퍼먼스를 보여줘야 하여 나 자신을 더욱더 채찍질 하였다. 프론트엔드와 백엔드 동시에 개발을 하며 기술을 더욱 더 고도화시키고 싶었지만 시간에 쫓겨 결국 있는 백엔드 소스를 활용하였다. 하지만 디자이너와 피그마로 소통을 진행하며 한 픽셀 한픽셀 맞춰가는 방법을 알았고 그 덕분에 화면이 너무 이쁘게 나와 뿌듯해하며 개발을 하여서 너무 즐거웠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉬운 점?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 아쉬운 점은 오히려 API 소스로는 있는 소스를 활용하다 보니 급하게 치는 느낌을 많이 받았다. 그러다 보니 API는 금방 끝나 화면에 집중하게 되었고 기획자보다는 디자이너와 소통을 더 많이 하였던 것 같으며 기획의 의도, 서비스의 핵심 목표를 파악하지 못한고 서비스를 만든 것이 너무 아쉬웠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후기!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자이너와 프런트엔드 개발자 사이에 소통이 어떤 식으로 이루어지는지 배운 것 같다. 보통 API 개발을 진행하다 보면 기획자 분들과 더 많이 이야기를 나누었지 사실 디자이너와는 많이 나누지는 못하였다. 하지만 이번 기회를 통해 어떠한 방식으로 소통하는지 조금은 이해가 되는 시간이었다. 또한 개발에 대한 자신감과 재미를 찾은 것 같다. 사실 너무 재밌었다. 좋은 팀원을 만나 그런 것도 있겠지만 내가 개발을 시작한 이유를 다시 한번 생각하고 돌아보는 계기가 되어 너무 좋았다. 앞으로 있을 FitNote 고도화와 개인적으로 공부하고 있는 서비스에 개발한 항목을 적용시키지는 못하겠지만 나의 정신적인 성장을 통해 더 잘할 수 있을 거란 생각이 들어 너무 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 고도화 작업과 리펙터링이다! 마감시간에 맞추느라 미쳐 신경 쓰지 못한 부분을 고칠 거다. 소스 단에서는 중복되는 항목을 공통화시키며 앞으로 구한다면(?) 진행될 클라이언트 단과의 협업을 위해 Rest API 형식으로 깔끔하게 바꿀 예정이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;a href=&quot;http://atee.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://atee.kr&lt;/a&gt;&lt;/s&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692025985792&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;Atee&quot; data-og-description=&quot;&quot; data-og-host=&quot;atee.kr&quot; data-og-source-url=&quot;http://atee.kr/&quot; data-og-url=&quot;http://atee.kr/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://atee.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://atee.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Atee&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;atee.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2902&quot; data-origin-height=&quot;1626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CCSU4/btsq5dmBtom/zsNCqOaJnybbD7Vs86lVI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CCSU4/btsq5dmBtom/zsNCqOaJnybbD7Vs86lVI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CCSU4/btsq5dmBtom/zsNCqOaJnybbD7Vs86lVI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCCSU4%2Fbtsq5dmBtom%2FzsNCqOaJnybbD7Vs86lVI1%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;2902&quot; height=&quot;1626&quot; data-origin-width=&quot;2902&quot; data-origin-height=&quot;1626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 과금이슈로 닫아두었습니다 :(&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <category>비사이드</category>
      <category>비사이드 308</category>
      <category>비사이드 포텐데이</category>
      <category>비사이드 포텐데이 308</category>
      <category>비사이드 포텐데이 회고</category>
      <category>비사이드 포텐데이 후기</category>
      <category>포텐데이</category>
      <category>포텐데이 308</category>
      <category>포텐데이 후기</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/414</guid>
      <comments>https://integer-ji.tistory.com/414#entry414comment</comments>
      <pubDate>Tue, 15 Aug 2023 00:13:52 +0900</pubDate>
    </item>
    <item>
      <title>[회고] 글또</title>
      <link>https://integer-ji.tistory.com/413</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;6개월간의 진행된 글또8기의 활동이 끝이 났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6개월 동안 나는 무엇을 하였는가? 회고를 진행해 보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 활동을 시작하며 나의 목표를 이루었는가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직은 적응하는 단계라고 생각이 되었다. 따라서 나의 첫 목표는 꼭 모든 글을 제출하지 않더라도 꾸준히 글을 쓰는 것이었다. 이것에 대하여는 목표를 이루었다고 생각한다. 새로운 cs 스터디를 진행하며 자연스럽게 글을 쓰게 되었고 이전에 끝내지 못한 글을 마무리하였다. 이 부분에 있어서는 충분히 성공적이라고 생각한다.&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;2. 떳떳한 활동을 하였는가?&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 앞으로는?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브를 보다 이런 영상을 보았다. &lt;a href=&quot;https://youtu.be/3hfGK-GX8Bs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;뇌를 확장시키는 글쓰기 방법&amp;nbsp;&lt;/a&gt; 다음에 내 전공 분야에 대한 글을 쓰게 된다면 그때를 대비하여 끄적끄적이라도 나의 생각을 확장시킬 생각이다. 이제 육체적인 성장과 함께 뇌의 성장을 기대하려고 하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 4. &lt;span style=&quot;background-color: #ffffff; color: #373a3c; text-align: start;&quot;&gt;End Credits&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활동하며 썼던 글&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://integer-ji.tistory.com/402&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DDD 8기의 마무리와 새로운 시작&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;a href=&quot;https://integer-ji.tistory.com/403&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인덱스를&amp;nbsp;타지&amp;nbsp;않는&amp;nbsp;쿼리&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;a href=&quot;https://integer-ji.tistory.com/404&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;chat&amp;nbsp;gpt&amp;nbsp;활용&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;a href=&quot;https://integer-ji.tistory.com/405&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;로드&amp;nbsp;밸런싱(Load&amp;nbsp;Balancing)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. &lt;a href=&quot;https://integer-ji.tistory.com/406&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;kakao&amp;nbsp;tech&amp;nbsp;meet&amp;nbsp;후기,&amp;nbsp;AI와&amp;nbsp;Chat&amp;nbsp;GPT..&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. &lt;a href=&quot;https://integer-ji.tistory.com/407&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Django&amp;nbsp;Jenkins&amp;nbsp;자동&amp;nbsp;배포하기&amp;nbsp;-&amp;nbsp;ec2&amp;nbsp;docker&amp;nbsp;설치하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. &lt;a href=&quot;https://integer-ji.tistory.com/409&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Django Jenkins 자동 배포하기 - docker에 Jenkins 설치하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. &lt;a href=&quot;https://integer-ji.tistory.com/411&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;REST와&amp;nbsp;RESTful&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;이상 새로운 시작을 기대하며 글을 마친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>글또</category>
      <category>글또</category>
      <category>글또8기</category>
      <category>글또8기마무리</category>
      <category>글또8기회고</category>
      <category>회고글</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/413</guid>
      <comments>https://integer-ji.tistory.com/413#entry413comment</comments>
      <pubDate>Sun, 16 Jul 2023 22:59:53 +0900</pubDate>
    </item>
    <item>
      <title>Cannot run program catalina.sh (in directory bin): error=13, Permission denie</title>
      <link>https://integer-ji.tistory.com/412</link>
      <description>&lt;pre id=&quot;code_1689048174108&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Cannot run program catalina.sh (in directory bin): error=13, Permission denie&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;맥북에서 인텔리제이와 tomcat을 연결한 뒤 run을 할 경우 생기는 에러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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;549&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJk3w/btsm84fBXTK/R1V6RAgI1Ojg0q4KvL6DX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJk3w/btsm84fBXTK/R1V6RAgI1Ojg0q4KvL6DX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJk3w/btsm84fBXTK/R1V6RAgI1Ojg0q4KvL6DX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJk3w%2Fbtsm84fBXTK%2FR1V6RAgI1Ojg0q4KvL6DX0%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;549&quot; height=&quot;142&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러할 경우 자신의 설치(혹은 압축 해제 한) 톰캣 경로의 bin 파일로 가서 catilna.sh의 권한을 775로 바꾸어 주면 된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689048551438&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chmod 775 catalina.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>에러</category>
      <category>Cannot run program catalina.sh (in directory bin): error=13</category>
      <category>catilna.sh</category>
      <category>Permission denie</category>
      <category>tomcat</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/412</guid>
      <comments>https://integer-ji.tistory.com/412#entry412comment</comments>
      <pubDate>Tue, 11 Jul 2023 13:09:24 +0900</pubDate>
    </item>
    <item>
      <title>REST와 RESTful</title>
      <link>https://integer-ji.tistory.com/411</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;채용 공고를 보다 보면 &amp;ldquo;Rest API 개발 우대&amp;rdquo; 라는 항목을 쉽게 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 여기서 Rest API는 무엇인가? 그리고 RestFul과는 어떤 차이가 있는지 궁금해서 공부해 보았다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;REST
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Rest의 정의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;REpresentational State Transfer라고 불린다.&lt;/li&gt;
&lt;li&gt;소프트웨어 개발 아키텍처의 한 방식.&lt;/li&gt;
&lt;li&gt;동작 위치는 네트워크 상 클라이언트와 서버 사이의 통신 방식 중 하나이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스 : 각각의 서비스가 제공하는 개별 항목마다 리소스가 존재한다.&lt;/li&gt;
&lt;li&gt;상태전달 : 클라이언트와 서버의 통신은 주로 HTTP 통신을 이용한다.&lt;/li&gt;
&lt;li&gt;메소드 : 대표적인 4가지를 사용한다. (GET, POST, PUT, DELETE)&lt;/li&gt;
&lt;li&gt;표현 방식 : JSON, XML, HTML등의 형식으로 표현하며 클라이언트에서는 이를 처리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장점과 단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hypermedia API의 기본 원칙을 따르면서 충분한 범용성을 보장한다.&lt;/li&gt;
&lt;li&gt;http 프로토콜을 활용하여 http의 캐싱 기능을 이용하여 응답을 캐시로 받을 수 있다. 이로인해 성능도 개선된다.&lt;/li&gt;
&lt;li&gt;다양한 디자인 서비스에서 발생할 수 있는 문제를 간결한 아키텍처 스타일로 문제를 최소화 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Url 대신 헤더 값을 데이터로 전달할 때 어렵게 느껴질 수 있다.&lt;/li&gt;
&lt;li&gt;구형 브라우저 같은 경우 Put와 Delete 메서드를 사용할 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;큰 방향은 아키텍처 스타일로서의 원칙을 가이드 해주지만 세부적인 구현 방식은 개발자마다 다를 수 있어 일관성이 부족할수도있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;pushState를 지원하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장점&lt;/li&gt;
&lt;li&gt;필요한 이유
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어플리케이션의 분리와 통합&lt;/li&gt;
&lt;li&gt;다양한 클라이언트의 등장 (웹, 안드로이드, ios..)&lt;/li&gt;
&lt;li&gt;고유한 리소스가 있기 때문에 용이한 업데이트 및 유지보수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;REST API
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;REST API의 정의와 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;REST 아키텍처 기반으로 API를 구현한 것&lt;/li&gt;
&lt;li&gt;REST의 유연함이 마이크로서비스 아키텍처에서 컴포넌트와 어플리케이션을 연결하는 일반적인 방법으로 부상하게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REST API 디자인 원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;균일한 인터페이스 : REST API는 사용자의 이름이나 이메일 주소 등의 동일한 데이터 조각이 오직 하나의 URI 에 속함을 보장해야한다.&lt;/li&gt;
&lt;li&gt;클라이언트-서버 디커플링 : REST API 디자인에서 클라이언트와 서버 애플리케이션은 서로 간에 완전히 독립적이어야 한다.&lt;/li&gt;
&lt;li&gt;Stateless : REST API는 서버측 세션을 필요로 하지 않으며 서버 애플리케이션은 클라이언트 요청과 관련된 데이터를 저장할 수 없다.&lt;/li&gt;
&lt;li&gt;캐싱 가능성 : 리소스를 클라이언트 또는 서버측에서 캐싱할 수 있어야 하며 서버 응답에는 전달된 리소스에 대해 캐싱이 허용되는지 여부에 대한 정보도 포함되어야 한다.&lt;/li&gt;
&lt;li&gt;계층 구조 아키텍처 : REST API는 엔드 애플리케이션 또는 중개자와 통신하는지 여부를 클라이언트나 서버가 알 수 없도록 설계되어야 한다.&lt;/li&gt;
&lt;li&gt;코드 온디맨드 : 특정한 경우에는 응답에 실행 코드(예: Java 애플릿)를 포함할 수도 있다. 경우에 코드는 요청 시에만 실행되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;RESTful
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;RESTful의 개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESTful은 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어&lt;/li&gt;
&lt;li&gt;RESTful은 REST를 REST답게 쓰기 위한 방법으로 누군가가 공식적으로 발표한 것은 아니다.&lt;/li&gt;
&lt;li&gt;여기서 ful은 full의 줄임말이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RESTful 하지 못한 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRUD 기능을 모두 POST로만 처리하는 API&lt;/li&gt;
&lt;li&gt;route에 resource, id 외의 정보가 들어가는 경우(/post/1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면, REST는 아키텍처 스타일로서 네트워크 기반 시스템에서의 통신을 설명하는 개념이며, RESTful은 REST 원칙을 따르는 웹 서비스를 나타냅니다. RESTful 서비스는 REST 아키텍처 원칙을 준수하여 설계되어 클라이언트와 서버 간의 상호 작용을 용이하게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 문서 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ibm.com/kr-ko/topics/rest-apis&quot;&gt;https://www.ibm.com/kr-ko/topics/rest-apis&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md#rest와-restful의-개념&quot;&gt;https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md#rest와-restful의-개념&lt;/a&gt;&lt;/p&gt;</description>
      <category>글또</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/411</guid>
      <comments>https://integer-ji.tistory.com/411#entry411comment</comments>
      <pubDate>Sat, 10 Jun 2023 20:01:35 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Django Jenkins 자동 배포하기 - docker에 Jenkins 설치하기 (7)</title>
      <link>https://integer-ji.tistory.com/409</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEAzdE/btsiop9pyAG/LI5w7p0z6Zz1M3KCPTotRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEAzdE/btsiop9pyAG/LI5w7p0z6Zz1M3KCPTotRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEAzdE/btsiop9pyAG/LI5w7p0z6Zz1M3KCPTotRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEAzdE%2Fbtsiop9pyAG%2FLI5w7p0z6Zz1M3KCPTotRk%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;360&quot; height=&quot;230&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD]&amp;nbsp;Django&amp;nbsp;Jenkins&amp;nbsp;자동&amp;nbsp;배포하기&amp;nbsp;-&amp;nbsp;Django&amp;nbsp;프로젝트&amp;nbsp;생성&amp;nbsp;(1)&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://integer-ji.tistory.com/379&quot;&gt;https://integer-ji.tistory.com/379&lt;/a&gt;&lt;br /&gt;[CI/CD]&amp;nbsp;Django&amp;nbsp;Jenkins&amp;nbsp;자동&amp;nbsp;배포하기&amp;nbsp;-&amp;nbsp;Ec2&amp;nbsp;Ubuntu&amp;nbsp;22.04&amp;nbsp;설치&amp;nbsp;(2)&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://integer-ji.tistory.com/380&quot;&gt;https://integer-ji.tistory.com/380&lt;/a&gt;&lt;br /&gt;[CI/CD]&amp;nbsp;Django&amp;nbsp;Jenkins&amp;nbsp;자동&amp;nbsp;배포하기&amp;nbsp;-&amp;nbsp;Ec2&amp;nbsp;모바엑스텀&amp;nbsp;접속하기&amp;nbsp;(3)&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://integer-ji.tistory.com/381&quot;&gt;https://integer-ji.tistory.com/381&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Django Jenkins 자동 배포하기 - Aws Ec2 Django 프로젝트 배포하기 (4) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://integer-ji.tistory.com/383&quot;&gt;https://integer-ji.tistory.com/383&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Django Jenkins 자동 배포하기 - ngnix, gunicorn으로 Django 서버 기동하기 (5) : &lt;a href=&quot;https://integer-ji.tistory.com/385&quot;&gt;https://integer-ji.tistory.com/385&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Django Jenkins 자동 배포하기 - ec2 docker 설치하기 (6) : &lt;a href=&quot;https://integer-ji.tistory.com/407&quot;&gt;https://integer-ji.tistory.com/407&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 젠킨스 이미지 다운&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daa4tg/btshzCW5yl9/8nIFnJWGp7uOyClQHfKgak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daa4tg/btshzCW5yl9/8nIFnJWGp7uOyClQHfKgak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daa4tg/btshzCW5yl9/8nIFnJWGp7uOyClQHfKgak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdaa4tg%2FbtshzCW5yl9%2F8nIFnJWGp7uOyClQHfKgak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;374&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;pull jenkins/jenkins:lts&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker pull 명령어를 이용하여 jenkins 이미지를 다운받아줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lts는 jdk8로 설치한다는 의미이며 다른 jdk 버전이 필요 시 jdk11, jdk17로 바꾸어 입력하면 됩니다.&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;2. jenkins 이미지 실행&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vusIi/btshE1HU6CG/FMmKK8sPItoI9cElWEqJp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vusIi/btshE1HU6CG/FMmKK8sPItoI9cElWEqJp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vusIi/btshE1HU6CG/FMmKK8sPItoI9cElWEqJp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvusIi%2FbtshE1HU6CG%2FFMmKK8sPItoI9cElWEqJp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;118&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685275905807&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 사용하면 다운 받았던 이미지를 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 삭제하려면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685275934095&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker rmi [image id]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 지우기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2820&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TtaqG/btshA4FrvOx/kkXVvAOQTQapiUL377PHmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TtaqG/btshA4FrvOx/kkXVvAOQTQapiUL377PHmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TtaqG/btshA4FrvOx/kkXVvAOQTQapiUL377PHmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTtaqG%2FbtshA4FrvOx%2FkkXVvAOQTQapiUL377PHmk%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;2820&quot; height=&quot;348&quot; data-origin-width=&quot;2820&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685275882841&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 8190:8080 -v /var/jenkins_home --name jenkins -u root jenkins/jenkins:lts&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 이미지를 8190 port로 실행시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps 명령어를 통해 확인해 보면 잘 실행된 모습을 볼 수 있다.&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;3. ec2 인스턴스의 인바운드 규칙 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5fmA8/btshFaLvXVR/1kPdrVRM1yUXXdxrlhvCKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5fmA8/btshFaLvXVR/1kPdrVRM1yUXXdxrlhvCKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5fmA8/btshFaLvXVR/1kPdrVRM1yUXXdxrlhvCKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5fmA8%2FbtshFaLvXVR%2F1kPdrVRM1yUXXdxrlhvCKK%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;2860&quot; height=&quot;902&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;902&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;3280&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/benAT7/btshAq91uMX/RKkN0kwYTzEMrNClXeTno0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/benAT7/btshAq91uMX/RKkN0kwYTzEMrNClXeTno0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/benAT7/btshAq91uMX/RKkN0kwYTzEMrNClXeTno0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbenAT7%2FbtshAq91uMX%2FRKkN0kwYTzEMrNClXeTno0%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;3280&quot; height=&quot;1024&quot; data-origin-width=&quot;3280&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ec2에서 보안그룹의 규칙에서 인바운드 규칙을 추가해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 지정의 TCP, 방금 전 docker images를 실행 시킨 8190&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;4. 접속하기&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2780&quot; data-origin-height=&quot;2030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EVJbG/btshKSwTGlu/5BaVOhg1thKkbCtvIrA7k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EVJbG/btshKSwTGlu/5BaVOhg1thKkbCtvIrA7k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EVJbG/btshKSwTGlu/5BaVOhg1thKkbCtvIrA7k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEVJbG%2FbtshKSwTGlu%2F5BaVOhg1thKkbCtvIrA7k0%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;802&quot; height=&quot;586&quot; data-origin-width=&quot;2780&quot; data-origin-height=&quot;2030&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://자신의ec2Ip:8190&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 Url로 들어오면 실행 된 jenkins를 볼 수 있다.&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;4-1. jenkins 비밀번호 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2942&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4mX28/btshCgFom08/5RBxsgzOqkhSOi2wkuSXuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4mX28/btshCgFom08/5RBxsgzOqkhSOi2wkuSXuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4mX28/btshCgFom08/5RBxsgzOqkhSOi2wkuSXuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4mX28%2FbtshCgFom08%2F5RBxsgzOqkhSOi2wkuSXuK%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;2942&quot; height=&quot;190&quot; data-origin-width=&quot;2942&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685276950125&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps

# docker ps로 실행 된 컨테이너 ID 확인

docker logs 78ae895e0c35

# 해당 컨테이너 ID의 로그 확인&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;1680&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZBTyr/btshAzFHMrF/cYdq2paVotACp4OlR9mkc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZBTyr/btshAzFHMrF/cYdq2paVotACp4OlR9mkc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZBTyr/btshAzFHMrF/cYdq2paVotACp4OlR9mkc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZBTyr%2FbtshAzFHMrF%2FcYdq2paVotACp4OlR9mkc1%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;1680&quot; height=&quot;296&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 쭉 확인해 보면 Jenkins가 실행될 때 비밀번호를 알려준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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;2046&quot; data-origin-height=&quot;1888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXPyZZ/btshCgejjB2/9aUfeR5k7eFmRbX7VuEsB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXPyZZ/btshCgejjB2/9aUfeR5k7eFmRbX7VuEsB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXPyZZ/btshCgejjB2/9aUfeR5k7eFmRbX7VuEsB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXPyZZ%2FbtshCgejjB2%2F9aUfeR5k7eFmRbX7VuEsB0%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;698&quot; height=&quot;644&quot; data-origin-width=&quot;2046&quot; data-origin-height=&quot;1888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Install suggested plugins&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;1862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb70Zw/btshA03VHRy/9kNwKSkPhxLT7ZzpoaZjd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb70Zw/btshA03VHRy/9kNwKSkPhxLT7ZzpoaZjd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb70Zw/btshA03VHRy/9kNwKSkPhxLT7ZzpoaZjd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb70Zw%2FbtshA03VHRy%2F9kNwKSkPhxLT7ZzpoaZjd1%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;704&quot; height=&quot;646&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;1862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 기다리기 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;1882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj60pr/btshBiQQaL6/psAv0bZBATVlz86MKxI3UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj60pr/btshBiQQaL6/psAv0bZBATVlz86MKxI3UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj60pr/btshBiQQaL6/psAv0bZBATVlz86MKxI3UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj60pr%2FbtshBiQQaL6%2FpsAv0bZBATVlz86MKxI3UK%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;692&quot; height=&quot;630&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;1882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 계정 생성 후 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2056&quot; data-origin-height=&quot;1910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NX0aR/btshHNbqOoN/9z1lskBjK9NcRUk3jKYF01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NX0aR/btshHNbqOoN/9z1lskBjK9NcRUk3jKYF01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NX0aR/btshHNbqOoN/9z1lskBjK9NcRUk3jKYF01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNX0aR%2FbtshHNbqOoN%2F9z1lskBjK9NcRUk3jKYF01%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;719&quot; height=&quot;668&quot; data-origin-width=&quot;2056&quot; data-origin-height=&quot;1910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NWgQH/btshzAyfqwV/qtTyQp448SlgSCOfyxD4L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NWgQH/btshzAyfqwV/qtTyQp448SlgSCOfyxD4L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NWgQH/btshzAyfqwV/qtTyQp448SlgSCOfyxD4L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNWgQH%2FbtshzAyfqwV%2FqtTyQp448SlgSCOfyxD4L0%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;733&quot; height=&quot;674&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1886&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;3404&quot; data-origin-height=&quot;1492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djwJW9/btshHOuEjoB/XKpc5UClolNNiRL0KlnoIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djwJW9/btshHOuEjoB/XKpc5UClolNNiRL0KlnoIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djwJW9/btshHOuEjoB/XKpc5UClolNNiRL0KlnoIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjwJW9%2FbtshHOuEjoB%2FXKpc5UClolNNiRL0KlnoIk%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;3404&quot; height=&quot;1492&quot; data-origin-width=&quot;3404&quot; data-origin-height=&quot;1492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속하시면 끝입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다음 시간엔 자신이 만든 프로젝틀을 자동 빌드할 수 있게 설정해보겠습니다.&lt;/p&gt;</description>
      <category>코딩공부/Server</category>
      <category>docker</category>
      <category>docker jenkins</category>
      <category>ec2 jenkins</category>
      <category>jenkins</category>
      <category>jenkins 설치</category>
      <category>도커 젠킨스</category>
      <category>젠킨스 설치</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/409</guid>
      <comments>https://integer-ji.tistory.com/409#entry409comment</comments>
      <pubDate>Sun, 28 May 2023 21:38:37 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu] docker gpg key 에러</title>
      <link>https://integer-ji.tistory.com/408</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 따라 하다 보면 gpg key 할 때 에러가 발생할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 서버에 gpg key가 등록된 건지 확인할 수 없을 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Szp54/btsgkYl8Zl2/MyDmkKuuAFEyGaektKVtYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Szp54/btsgkYl8Zl2/MyDmkKuuAFEyGaektKVtYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Szp54/btsgkYl8Zl2/MyDmkKuuAFEyGaektKVtYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSzp54%2FbtsgkYl8Zl2%2FMyDmkKuuAFEyGaektKVtYk%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;1271&quot; height=&quot;227&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684329337370&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Hit:1 http://...ubuntu.com/ubuntu jammy InRelease
Hit:2 http://...ubuntu.com/ubuntu jammy-updates InRelease                      
Hit:3 http://...ubuntu.com/ubuntu jammy-backports InRelease                    
Hit:4 https://download.docker.com/linux/ubuntu bionic InRelease                                        
Hit:5 http://security.ubuntu.com/ubuntu jammy-security InRelease                                       
Reading package lists... Done
W: https://download.docker.com/linux/ubuntu/dists/bionic/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.&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;도커를 설치하다 해당 W가 나온다면 도커 설치를 위해 gpg키를 저장할 때 새로운 위치에 저장이 되어야 한다는 뜻이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 서버에 gpg key가 등록된 건지 확인할 수 없을때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 명령어를 통해 키를 다시 등록하자!&lt;/p&gt;
&lt;pre id=&quot;code_1684331033576&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>에러</category>
      <category>docker gpg key</category>
      <category>docker 설치</category>
      <category>GPG Key</category>
      <category>Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg)</category>
      <category>see the DEPRECATION section in apt-key(8) for details.</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/408</guid>
      <comments>https://integer-ji.tistory.com/408#entry408comment</comments>
      <pubDate>Wed, 17 May 2023 23:02:32 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Django Jenkins 자동 배포하기 - ec2 docker 설치하기 (6)</title>
      <link>https://integer-ji.tistory.com/407</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CED82/btsij5REb8G/OjjbAlcsyHfBfqk00bIYeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CED82/btsij5REb8G/OjjbAlcsyHfBfqk00bIYeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CED82/btsij5REb8G/OjjbAlcsyHfBfqk00bIYeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCED82%2Fbtsij5REb8G%2FOjjbAlcsyHfBfqk00bIYeK%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;360&quot; height=&quot;230&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD]&amp;nbsp;Django&amp;nbsp;Jenkins&amp;nbsp;자동&amp;nbsp;배포하기&amp;nbsp;-&amp;nbsp;Django&amp;nbsp;프로젝트&amp;nbsp;생성&amp;nbsp;(1)&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://integer-ji.tistory.com/379&quot;&gt;https://integer-ji.tistory.com/379&lt;/a&gt;&lt;br /&gt;[CI/CD]&amp;nbsp;Django&amp;nbsp;Jenkins&amp;nbsp;자동&amp;nbsp;배포하기&amp;nbsp;-&amp;nbsp;Ec2&amp;nbsp;Ubuntu&amp;nbsp;22.04&amp;nbsp;설치&amp;nbsp;(2)&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://integer-ji.tistory.com/380&quot;&gt;https://integer-ji.tistory.com/380&lt;/a&gt;&lt;br /&gt;[CI/CD]&amp;nbsp;Django&amp;nbsp;Jenkins&amp;nbsp;자동&amp;nbsp;배포하기&amp;nbsp;-&amp;nbsp;Ec2&amp;nbsp;모바엑스텀&amp;nbsp;접속하기&amp;nbsp;(3)&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://integer-ji.tistory.com/381&quot;&gt;https://integer-ji.tistory.com/381&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Django Jenkins 자동 배포하기 - Aws Ec2 Django 프로젝트 배포하기 (4) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://integer-ji.tistory.com/383&quot;&gt;https://integer-ji.tistory.com/383&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[CI/CD] Django Jenkins 자동 배포하기 - ngnix, gunicorn으로 Django 서버 기동하기 (5) : &lt;a href=&quot;https://integer-ji.tistory.com/385&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://integer-ji.tistory.com/385&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;우분투 서버 준비&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 나중에 여러가지 사용할 것을 대비하여 docker를 이용해 젠킨스를 설치할겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 도커부터 설치!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbVV4c/btsglxhpALA/THogXLTV2fgK2SL2s7qllK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbVV4c/btsglxhpALA/THogXLTV2fgK2SL2s7qllK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbVV4c/btsglxhpALA/THogXLTV2fgK2SL2s7qllK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbVV4c%2FbtsglxhpALA%2FTHogXLTV2fgK2SL2s7qllK%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;732&quot; height=&quot;653&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토리지는 도커에 설치할 이미지들을 대비하여 프리티어의 최고 용량으로 설정(개인적인판단)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0eP4x/btsgkKn7ccD/CwCN1QBbQpmJM2OkJtZMO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0eP4x/btsgkKn7ccD/CwCN1QBbQpmJM2OkJtZMO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0eP4x/btsgkKn7ccD/CwCN1QBbQpmJM2OkJtZMO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0eP4x%2FbtsgkKn7ccD%2FCwCN1QBbQpmJM2OkJtZMO0%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;675&quot; height=&quot;321&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투 서버 접속&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T1ZyM/btsgmGEUrKv/SacJYCKKO6IoArnr0jcMD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T1ZyM/btsgmGEUrKv/SacJYCKKO6IoArnr0jcMD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T1ZyM/btsgmGEUrKv/SacJYCKKO6IoArnr0jcMD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT1ZyM%2FbtsgmGEUrKv%2FSacJYCKKO6IoArnr0jcMD0%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;625&quot; height=&quot;655&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu가 시작되었습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 통해 apt-get 업데이트&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;1125&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mA1xV/btsgkJvXUJf/PDtgFaeKCkpLGof7nKBeVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mA1xV/btsgkJvXUJf/PDtgFaeKCkpLGof7nKBeVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mA1xV/btsgkJvXUJf/PDtgFaeKCkpLGof7nKBeVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmA1xV%2FbtsgkJvXUJf%2FPDtgFaeKCkpLGof7nKBeVk%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;1125&quot; height=&quot;147&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684328463840&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update&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;apt가 https를 통해 패키지를 설치할 수 있도록 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tByHF/btsgiBL3AD1/pUCKZIxFDEJbbwFPGKEUu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tByHF/btsgiBL3AD1/pUCKZIxFDEJbbwFPGKEUu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tByHF/btsgiBL3AD1/pUCKZIxFDEJbbwFPGKEUu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtByHF%2FbtsgiBL3AD1%2FpUCKZIxFDEJbbwFPGKEUu1%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;707&quot; height=&quot;366&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684328474956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install apt-transport-https 
sudo apt install ca-certificates 
sudo apt install curl 
sudo apt install software-properties-common&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;이제 도커에서 제공하는 gpg 키를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684328800238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 키를 잘못 등록하거나 우분투 버전에 맞지 않게 옛날 키를 적용하게 된다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://integer-ji.tistory.com/408&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://integer-ji.tistory.com/408&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684332194578&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;도커 설치 중 에러&quot; data-og-description=&quot;Hit:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy InRelease Hit:2 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy-updates InRelease Hit:3 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy-backports InRelease Hit:4 https://do&quot; data-og-host=&quot;integer-ji.tistory.com&quot; data-og-source-url=&quot;https://integer-ji.tistory.com/408&quot; data-og-url=&quot;https://integer-ji.tistory.com/408&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZswSf/hySE9QWmSy/iM1TNK8SAKxv0xf6pAqn00/img.png?width=800&amp;amp;height=142&amp;amp;face=0_0_800_142,https://scrap.kakaocdn.net/dn/HCNqQ/hySF9PjOvC/dEgrdbWukirhRRRQg4aDf0/img.png?width=800&amp;amp;height=142&amp;amp;face=0_0_800_142,https://scrap.kakaocdn.net/dn/bYfBYz/hySEYu5hix/1ob74RKYMnEt4oo8BJcerk/img.png?width=1271&amp;amp;height=227&amp;amp;face=0_0_1271_227&quot;&gt;&lt;a href=&quot;https://integer-ji.tistory.com/408&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://integer-ji.tistory.com/408&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZswSf/hySE9QWmSy/iM1TNK8SAKxv0xf6pAqn00/img.png?width=800&amp;amp;height=142&amp;amp;face=0_0_800_142,https://scrap.kakaocdn.net/dn/HCNqQ/hySF9PjOvC/dEgrdbWukirhRRRQg4aDf0/img.png?width=800&amp;amp;height=142&amp;amp;face=0_0_800_142,https://scrap.kakaocdn.net/dn/bYfBYz/hySEYu5hix/1ob74RKYMnEt4oo8BJcerk/img.png?width=1271&amp;amp;height=227&amp;amp;face=0_0_1271_227');&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;Hit:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy InRelease Hit:2 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy-updates InRelease Hit:3 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy-backports InRelease Hit:4 https://do&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;integer-ji.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 에러가 나올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 repository 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ5Ggh/btsgkj5rhpp/xYKCkBZW4nlSB4OV194pE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ5Ggh/btsgkj5rhpp/xYKCkBZW4nlSB4OV194pE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ5Ggh/btsgkj5rhpp/xYKCkBZW4nlSB4OV194pE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ5Ggh%2Fbtsgkj5rhpp%2FxYKCkBZW4nlSB4OV194pE1%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;1157&quot; height=&quot;157&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable&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;마지막으로 apt를 다시 업데이트 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3394&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xd31X/btsgly8ul8s/4P1lVnlVcFaKkwin1ACok1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xd31X/btsgly8ul8s/4P1lVnlVcFaKkwin1ACok1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xd31X/btsgly8ul8s/4P1lVnlVcFaKkwin1ACok1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxd31X%2Fbtsgly8ul8s%2F4P1lVnlVcFaKkwin1ACok1%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;3394&quot; height=&quot;542&quot; data-origin-width=&quot;3394&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684329283370&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 마지막으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커를 설치해주자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2JA5/btsgnjCJ2pN/w7jAWdwKxsN7CcsikTUau0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2JA5/btsgnjCJ2pN/w7jAWdwKxsN7CcsikTUau0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2JA5/btsgnjCJ2pN/w7jAWdwKxsN7CcsikTUau0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2JA5%2FbtsgnjCJ2pN%2Fw7jAWdwKxsN7CcsikTUau0%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;1356&quot; height=&quot;246&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684331283649&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install docker-ce&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njD59/btsglRNyhG5/UZyUlJCziw4Yqjbki1Kkc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njD59/btsglRNyhG5/UZyUlJCziw4Yqjbki1Kkc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njD59/btsglRNyhG5/UZyUlJCziw4Yqjbki1Kkc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnjD59%2FbtsglRNyhG5%2FUZyUlJCziw4Yqjbki1Kkc1%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;758&quot; height=&quot;474&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684331503220&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker run hello-world&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hello-world run을 해보면 올바른 명령어를 보내준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH7fDJ/btsgnYLUZbP/LvKcRkekakzHXvXNUKpf9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH7fDJ/btsgnYLUZbP/LvKcRkekakzHXvXNUKpf9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH7fDJ/btsgnYLUZbP/LvKcRkekakzHXvXNUKpf9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH7fDJ%2FbtsgnYLUZbP%2FLvKcRkekakzHXvXNUKpf9k%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;695&quot; height=&quot;158&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 명령어를 도커 명렁어 모두 sudo를 넣어주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 그룹에 사용자를 넣어주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에 도커 그룹이 있는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7sSq/btsgn2ndBHi/yTDIZRthgyZRS5oqNAFoR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7sSq/btsgn2ndBHi/yTDIZRthgyZRS5oqNAFoR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7sSq/btsgn2ndBHi/yTDIZRthgyZRS5oqNAFoR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7sSq%2Fbtsgn2ndBHi%2FyTDIZRthgyZRS5oqNAFoR1%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;553&quot; height=&quot;62&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684331808849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo groupadd docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자에게 그룹 추가&lt;/p&gt;
&lt;pre id=&quot;code_1684331840612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo usermod -aG docker ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 세션에 도커에 대한 그룹 변경 사항 적용!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHVnZQ/btsgkZL6osv/ufWFBXneKOKBM2bhNXvpr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHVnZQ/btsgkZL6osv/ufWFBXneKOKBM2bhNXvpr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHVnZQ/btsgkZL6osv/ufWFBXneKOKBM2bhNXvpr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHVnZQ%2FbtsgkZL6osv%2FufWFBXneKOKBM2bhNXvpr0%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;643&quot; height=&quot;95&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684331885180&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;newgrp docker&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;그러면 sudo 명령어 없이 사용이 가능 합니다!&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩공부/Server</category>
      <category>docker</category>
      <category>docker 설치</category>
      <category>E: Unable to locate package yum</category>
      <category>ec2 도커 설치</category>
      <category>gpg 키 에러</category>
      <category>linux</category>
      <category>see the DEPRECATION section in apt-key(8) for details.</category>
      <category>ubuntu</category>
      <category>리눅스</category>
      <category>우분투</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/407</guid>
      <comments>https://integer-ji.tistory.com/407#entry407comment</comments>
      <pubDate>Wed, 17 May 2023 22:11:22 +0900</pubDate>
    </item>
    <item>
      <title>kakao tech meet 후기, AI와 Chat GPT..</title>
      <link>https://integer-ji.tistory.com/406</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;5월 11일 카카오에서 열리는 첫 번째 tech meet가 열렸는데 단 100명만 당첨이 되는 행사에 당첨이 되어 다녀왔다!!&lt;br /&gt;&lt;br /&gt; &lt;span&gt;첫 번째 kakao tech meet에서는 &quot;AI(인공지능)&quot; 주제로 진행이 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://tech.kakao.com/2023/04/26/kakao-tech-meet-1-speakers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tech.kakao.com/2023/04/26/kakao-tech-meet-1-speakers/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684246517990&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;제1회 kakao tech meet 발표자와 발표 내용을 소개합니다!&quot; data-og-description=&quot;안녕하세요! 지난 글에서 kakao tech meet 행사를 소개하고 그 시작이 될 제1회 행사의 정보를 공유드렸는데요, 이번 글에서는 제1회 행사에서 지식과 경험을 나눠주실 크루들과 발표 내용을 간단히 &quot; data-og-host=&quot;tech.kakao.com&quot; data-og-source-url=&quot;https://tech.kakao.com/2023/04/26/kakao-tech-meet-1-speakers/&quot; data-og-url=&quot;https://tech.kakao.com/2023/04/26/kakao-tech-meet-1-speakers/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cglUtp/hySEZT3iSp/BKmy8SPqHSxDCdMUG4msp0/img.png?width=1240&amp;amp;height=930&amp;amp;face=0_0_1240_930,https://scrap.kakaocdn.net/dn/bEDmg9/hySE3vnf6q/E7vNYnK6Vrlxx2BkBJHHu0/img.png?width=1240&amp;amp;height=930&amp;amp;face=0_0_1240_930,https://scrap.kakaocdn.net/dn/E9R7y/hySC2dLX7I/twMdiCHBmJ5VLmJUmnFcYk/img.png?width=1240&amp;amp;height=930&amp;amp;face=0_0_1240_930&quot;&gt;&lt;a href=&quot;https://tech.kakao.com/2023/04/26/kakao-tech-meet-1-speakers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tech.kakao.com/2023/04/26/kakao-tech-meet-1-speakers/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cglUtp/hySEZT3iSp/BKmy8SPqHSxDCdMUG4msp0/img.png?width=1240&amp;amp;height=930&amp;amp;face=0_0_1240_930,https://scrap.kakaocdn.net/dn/bEDmg9/hySE3vnf6q/E7vNYnK6Vrlxx2BkBJHHu0/img.png?width=1240&amp;amp;height=930&amp;amp;face=0_0_1240_930,https://scrap.kakaocdn.net/dn/E9R7y/hySC2dLX7I/twMdiCHBmJ5VLmJUmnFcYk/img.png?width=1240&amp;amp;height=930&amp;amp;face=0_0_1240_930');&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;제1회 kakao tech meet 발표자와 발표 내용을 소개합니다!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요! 지난 글에서 kakao tech meet 행사를 소개하고 그 시작이 될 제1회 행사의 정보를 공유드렸는데요, 이번 글에서는 제1회 행사에서 지식과 경험을 나눠주실 크루들과 발표 내용을 간단히&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tech.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;1788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9VXrd/btsf6G0GmqT/lePenkBbzqt6dXAhzM21vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9VXrd/btsf6G0GmqT/lePenkBbzqt6dXAhzM21vK/img.png&quot; data-alt=&quot;카카오 사옥에서 반기는 tech meet 가는 길&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9VXrd/btsf6G0GmqT/lePenkBbzqt6dXAhzM21vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9VXrd%2Fbtsf6G0GmqT%2FlePenkBbzqt6dXAhzM21vK%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;469&quot; height=&quot;771&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;1788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카카오 사옥에서 반기는 tech meet 가는 길&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;2596&quot; data-origin-height=&quot;1978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pY1AT/btsgb6YPK17/QirtglByaYboBX1AsDc0wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pY1AT/btsgb6YPK17/QirtglByaYboBX1AsDc0wk/img.png&quot; data-alt=&quot;카카오&amp;amp;amp;nbsp;판교아지트&amp;amp;amp;nbsp;지하&amp;amp;amp;nbsp;1층&amp;amp;amp;nbsp;세미나홀&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pY1AT/btsgb6YPK17/QirtglByaYboBX1AsDc0wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpY1AT%2Fbtsgb6YPK17%2FQirtglByaYboBX1AsDc0wk%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;2596&quot; height=&quot;1978&quot; data-origin-width=&quot;2596&quot; data-origin-height=&quot;1978&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카카오&amp;amp;nbsp;판교아지트&amp;amp;nbsp;지하&amp;amp;nbsp;1층&amp;amp;nbsp;세미나홀&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;1938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdUukr/btsf59PH2K6/pDkhDRNRMrhGYT9vxZZrr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdUukr/btsf59PH2K6/pDkhDRNRMrhGYT9vxZZrr0/img.png&quot; data-alt=&quot;귀여운 최고심라이언 스티커도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdUukr/btsf59PH2K6/pDkhDRNRMrhGYT9vxZZrr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdUukr%2Fbtsf59PH2K6%2FpDkhDRNRMrhGYT9vxZZrr0%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;561&quot; height=&quot;767&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;1938&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;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-id=&quot;e7805ff&quot; data-element_type=&quot;column&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-id=&quot;aa87bc0&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;heading.default&quot;&gt;
&lt;div&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;(1) ChatGPT로 바뀐 개발자의 일상 이야기&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-id=&quot;ce53d5a&quot; data-element_type=&quot;column&quot;&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o5n2A/btsgcNxL0li/ei4JVN7JKj0hwzZ8UkL7J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o5n2A/btsgcNxL0li/ei4JVN7JKj0hwzZ8UkL7J1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o5n2A/btsgcNxL0li/ei4JVN7JKj0hwzZ8UkL7J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo5n2A%2FbtsgcNxL0li%2Fei4JVN7JKj0hwzZ8UkL7J1%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;468&quot; height=&quot;1772&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;첫 번째로 robin님의 강연이 시작되었다.&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;시작할 때 첫 ppt 설명을 해주시고 이 ppt는 AI가 만든 발표자료입니다. 라고 하셔서 정말 깜짝 놀랐다.&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;전혀 의심이 안들었고 자연스러웠기 때문이다.&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;오히려 살짝 (?) 하는 부분이 있었지만 그 부분이 더 사람이니까~ 하고 넘어갈 수 있는 부분이어서 더 기억에 남는 것 같다.&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-id=&quot;d4902f5&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;robin님은 내가 생각하지 못한 AI의 이용법을 알려주었다.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 도구를 활용하여 효율적으로 업무를 좀 더 효율적으로 바꿔보고 싶었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-id=&quot;62fa217&quot; data-element_type=&quot;column&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-id=&quot;fdb5aa8&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;heading.default&quot;&gt;
&lt;div&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;(2) 실전! 인공지능 챗봇 개발&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2638&quot; data-origin-height=&quot;1912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OWmXj/btsge5EsNIh/soz4cguxpMC6Fa2qkcL311/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OWmXj/btsge5EsNIh/soz4cguxpMC6Fa2qkcL311/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OWmXj/btsge5EsNIh/soz4cguxpMC6Fa2qkcL311/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOWmXj%2Fbtsge5EsNIh%2Fsoz4cguxpMC6Fa2qkcL311%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;525&quot; height=&quot;381&quot; data-origin-width=&quot;2638&quot; data-origin-height=&quot;1912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-id=&quot;9ef14d0&quot; data-element_type=&quot;column&quot;&gt;
&lt;div data-id=&quot;828427d&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;두 번째는 dennis님의 챗봇 개발 이야기였다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;클라우드와 AI를 합쳐 시너지를 더 낼 수 있는 예시와 챗봇 개발 사례와 동작 원리 등 알기 쉽게 설명해주셔서 너무 좋았다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;특히 아직도 기억에 남는 그림이 있다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;예전 개발자는 java, python 등 여러가지 무기(웨폰)을 사용하는 다양한 웨폰 마스터가 있었다면&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;이제는 AI(마법)을 사용한 마검사(?)가 존재한다는 이야기의 그림이었다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;정말 공감되었고 재미있었다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div data-id=&quot;03b3683&quot; data-element_type=&quot;column&quot;&gt;
&lt;div data-id=&quot;0e7991c&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;heading.default&quot;&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;(3) Nocode, Serverless cloud Services for Generative AI : monokode stein&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbgAXl/btsf6EBRWiB/u9mFXvPf1HAPEiV4M7a6Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbgAXl/btsf6EBRWiB/u9mFXvPf1HAPEiV4M7a6Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbgAXl/btsf6EBRWiB/u9mFXvPf1HAPEiV4M7a6Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbgAXl%2Fbtsf6EBRWiB%2Fu9mFXvPf1HAPEiV4M7a6Ok%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;609&quot; height=&quot;438&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1906&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;div&gt;
&lt;div data-id=&quot;e3fd1f4&quot; data-element_type=&quot;column&quot;&gt;
&lt;div data-id=&quot;045c317&quot; data-element_type=&quot;widget&quot; data-widget_type=&quot;text-editor.default&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;세 번째 강의는 andrew님의 강연이었다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;정말 대단하신 것 같다. 말이 안나온다&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;2022년에 진행 된 kakako if 페이지가 andrew님이 소개한 monokode 서비스를 이용해 만든 페이지란걸 보고&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;정말 빠른 시간 안에 개발자란 직종에 닥쳐올 미래가 무서웠다. ..&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;간단하게 말하자면 피그마와 비슷한 툴을 이용하여 디자인을 하면 그 디자인이 바로 반응형 퍼블리싱이 되는 것이었다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;매번 부트스트랩을 이용해 웹페이지를 조립해가던 나의 입장에선 너무 혁신적인 서비스였다 ..monokode가 출시된다면 정말 꼭 이용할 것 같다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;kakao tech meet를 통해서 카카오란 대기업에서 생각하는 AI와 활용방법을 접할 수 있어서 정말 좋았다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;첫 tech meet인도 성공적으로 끝난 것 같았다. 다음에는 네트워킹 시간도 조금 있었으면 좋겠다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;AI를 나쁘게만 생각하지 말고 충분히 컨트롤하고 이용할 수 있다면 업무 효율이 훨씬 늘어날 것 같다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;하지만 제일 중요한건 AI를 이용할 수 있는 베이스다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;최근에는 chat gpt를 이용해 코드 받았을 때 버그가 발생하면 디버그 시간이 더 오래걸렸다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&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&gt;
&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;</description>
      <category>글또</category>
      <category>Ai</category>
      <category>Chat GPT</category>
      <category>Chatbot</category>
      <category>kakao tech</category>
      <category>kakao tech meet</category>
      <category>kakao tech meet 후기</category>
      <category>kakaotech</category>
      <category>kakaotechmeet</category>
      <category>monokode</category>
      <category>Tech</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/406</guid>
      <comments>https://integer-ji.tistory.com/406#entry406comment</comments>
      <pubDate>Thu, 11 May 2023 20:07:17 +0900</pubDate>
    </item>
    <item>
      <title>로드 밸런싱(Load Balancing)</title>
      <link>https://integer-ji.tistory.com/405</link>
      <description>&lt;h1&gt;&lt;b&gt;로드 밸런싱(Load Balancing)&lt;/b&gt;&lt;/h1&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;Scale-up : 기존 서버의 성능을 업그레이드한다.&lt;/li&gt;
&lt;li&gt;Scale-out : 기존 서버와 동일하거나 낮은 성능의 서버로 증설한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서비스 별 상황에 맞게 처리를 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Scale-out 방식을 채택하였다면 여러 대의 서버로 트래픽을 균등하게 분산해 주는 로드밸런싱 작업이 반드시 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로드밸런싱이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서의 트래픽으로 인해 서버에 가해지는 부하를 분산 시켜주는 장치이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 서버 또는 네트워크 허브 사이에 위치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로드밸런싱의 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Round Robin (라운드로빈 방식)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에 들어온 요청을 순서대로 돌아가며 각 서버에 균등하게 분배하는 방식.&lt;/li&gt;
&lt;li&gt;여러 대의 서버가 동일한 스펙을 가지고 있다면 사용하기 적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IP Hash (IP 해시 방식)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트의 IP 주소를 특정 서버로 매핑하여 요청을 처리한다.&lt;/li&gt;
&lt;li&gt;사용자의 IP를 해싱하기 때문에 사용자가 항상 동일한 서버로 연결되는 것을 보장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Least Connection (최소 연결 방식)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청이 들어온 시점에 가장 적은 트래픽을 처리하고 있는 서버에 우선 적으로 트래픽을 분배한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Least Response Time (최소 리스폰 타임)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버의 현재 연결 상태와 응답 시간을 모두 고려하여 트래픽을 분배한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드밸런싱의 대표적인 4가지 알고리즘이다. 한 가지 더 추가를 하자면 &lt;b&gt;가중 라운드 로빈 방식&lt;/b&gt;으로 서버마다 가중치를 설정하여 부하를 분배하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 알고리즘을 통하여 OSI의 7계층 중 L4, L7에 로드밸런싱을 구축한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로드밸런싱 L4, L7&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3566%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;L4&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;L7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3566%;&quot;&gt;네트워크 계층&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;Layer 4 전송계층(Transport Layer)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Layer 7 응용계층(Application Layer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3566%;&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;TCP/UDP 포트 정보를 바탕으로 작동 네트워크 계층이나 전송계층의 정보를 바탕으로 트래픽을 분산&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;TCP/UDP를 포함하여 HTTP의 Url, Ftp의 파일명, 쿠키 정보 등을 바탕으로 작동 &lt;br /&gt;(TCP/UDP를 확인할 수는 있지만 응용계층에서 프로토콜 기반의 정보를 처리하려면 L4가 낫다.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3566%;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;1. 데이터를 보지 않고 패킷 레벨에서만 트래픽을 분산하기 때문에 속도가 빠르고 효율적이다. &lt;br /&gt;2. 데이터의 내용을 복호화 할 필요가 없어 안전하다. &lt;br /&gt;3. L7보다는 가격이 저렴하다.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;1. 상위 계층에서 로드를 분산하기 때문에 훨씬 더 섬세한 라우팅이 가능하다. &lt;br /&gt;2. 캐싱 기능을 사용할 수 있다. &lt;br /&gt;3. 비정상적인 트래픽을 사전에 필터 할 수 있어 서비스의 안정성이 높아진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3566%;&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;1. 패킷의 내용을 볼 수 없기 때문에 섬세한 라우팅이 불가능하다. &lt;br /&gt;2. 사용자의 IP가 수시로 바뀌는 경우 연속적인 서비스를 제공하기 어렵다.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;1. 패킷의 내용을 복호화 해야 하기 때문에 높은 비용을 지불해야 한다. &lt;br /&gt;2. 클라이언트가 로드밸런서와 인증서를 공유하기 때문에 공격자가 로드밸런서를 통해서 클라이언트 데이터에 접근할 경우 보안상 위험성이 존재한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>글또</category>
      <category>L4</category>
      <category>L7</category>
      <category>Load Balancing</category>
      <category>로드 밸런싱</category>
      <category>로드밸런싱</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/405</guid>
      <comments>https://integer-ji.tistory.com/405#entry405comment</comments>
      <pubDate>Wed, 10 May 2023 22:09:56 +0900</pubDate>
    </item>
    <item>
      <title>chat gpt 활용</title>
      <link>https://integer-ji.tistory.com/404</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://integer-ji.tistory.com/403&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;방금 글을 쓰고&lt;/a&gt; 추가로 요즘 핫한 chat GPT에게 이 글에 대해서 물어봤는데 이런 답변을 받았다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b69cIp/btr4wLZHAxH/SWsX8OWtu8IWoNqHluRJYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b69cIp/btr4wLZHAxH/SWsX8OWtu8IWoNqHluRJYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b69cIp/btr4wLZHAxH/SWsX8OWtu8IWoNqHluRJYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb69cIp%2Fbtr4wLZHAxH%2FSWsX8OWtu8IWoNqHluRJYK%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;1752&quot; height=&quot;1158&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 gpt를 이런식으로 활용하고 있는데 정말 좋은 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음에는 게시글을 쓰기 전에 먼저 확인받고 질 좋은 글을 써야겠다.&lt;/p&gt;</description>
      <category>글또</category>
      <category>Chat GPT</category>
      <category>GPT</category>
      <category>gpt 활용</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/404</guid>
      <comments>https://integer-ji.tistory.com/404#entry404comment</comments>
      <pubDate>Sun, 19 Mar 2023 18:56:40 +0900</pubDate>
    </item>
    <item>
      <title>[mssql] 인덱스를 타지 않는 쿼리</title>
      <link>https://integer-ji.tistory.com/403</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Mssql을 사용하며 Index를 타지 않는 &lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;Query&lt;/span&gt;를 정리해 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도움 된 블로그!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hckcksrl.medium.com/index%EB%A5%BC-%ED%83%80%EC%A7%80%EC%95%8A%EB%8A%94-%EC%BF%BC%EB%A6%AC-41f0417bfe03&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;hckcksrl&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://isstory83.tistory.com/131&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;isstory83&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. where 컬럼의 &lt;u&gt;가공&lt;/u&gt;, 함수, 연산, 형변환 금지&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679214170123&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	[buy_id]
    , [product_id]
    , [create_date]
FROM
	[dbo].[pmt_product_buy]
WHERE&amp;nbsp;
	CONVERT(DATE,&amp;nbsp;[create_date])&amp;nbsp;&amp;lt;&amp;nbsp;'2022-01-01'&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;해당 쿼리는 create_date 컬럼에 대한 Index를 타지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;convert 함수를 통하여 변형이 되었기 때문에 create_date와는 다른 컬럼이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개선 방법은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679214344618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	[buy_id]
    , [product_id]
    , [create_date]
FROM&amp;nbsp;
	[dbo].[pmt_product_buy]
WHERE&amp;nbsp;
	[create_date]&amp;nbsp;BETWEEN&amp;nbsp;'2022-01-01'&amp;nbsp;AND&amp;nbsp;'2022-03-01'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 함수를 사용하여 데이터를 조회해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Like 검색 시 문자열 앞에 % 사용 금지&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679214408645&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	t1.*
FROM
	[dbo].[pmt_product_info]&amp;nbsp;t1
WHERE
	[product_price]&amp;nbsp;LIKE&amp;nbsp;'%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;문자열 앞에 %가 붙게 될 경우 product_price 컬럼의 인덱스와는 무관하게 전체 풀스캔을 타게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부득이하게 대용량의 모든 테이블을 조회할 경우에는 차라리 where을 통하여 한번 데이터를 필터링한 후 조회를 하거나&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카프카와 검색 엔진을 사용하여 조회하면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Null 조건의 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679214679361&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	t1.*
FROM
	[dbo].[pmt_product_info]&amp;nbsp;t1
WHERE
	[product_price]&amp;nbsp;is 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;where절에 null을 사용할 경우 인덱스와 무관하게 풀 스캔을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. not(부정문)을 사용할 경우&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679214952646&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	t1.*
FROM
	[dbo].[pmt_product_info]&amp;nbsp;t1
WHERE
	[product_price]&amp;nbsp;!= 3000&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;부정문을 사용할 경우 index를 타지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-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_1679215061315&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	t1.*
FROM
	[dbo].[pmt_product_info]&amp;nbsp;t1
WHERE
	[product_price]&amp;nbsp;&amp;lt; 3000 and [product_price] &amp;gt; 3000&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;b&gt;5. in, or 연산&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679216413077&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	t1.*
FROM
	[dbo].[pmt_product_info]&amp;nbsp;t1
WHERE
	[product_price]&amp;nbsp;in (3000, 1500, 1000)&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;in 조건을 사용할 경우 항상 인덱스를 타지 않는 것이 아니라 in 조건 안에 포함되는 데이터가 많을 경우 데이터베이스가 판단하여 테이블을 풀스캔을 한다고 한다..;;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 매우 흥미로운 부분이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or 조건의 사용은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679217111831&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	t1.*
FROM
	[dbo].[pmt_product_info]&amp;nbsp;t1
WHERE
	([product_price]&amp;nbsp;= 3000 or [product_price]&amp;nbsp;= 1500 or [product_price]&amp;nbsp;= 1000)&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;or의 경우 인덱스를 사용하지 못한다. 참이 하나라도 있으면 참이기 때문에 풀 스캔을 타게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023.09.25 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;DISTINCT가 낮은 경우 인덱스를 만드는게 아니라 전체에서 찾는게 더 빠르기 때문에 인덱스를 안만드는게 좋다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(ex 사전을 열었는데 남성과 여성의 확률이 50%일 경우 굳이 찾을 필요가 없어서 전체 테이블을 스캔)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 복합인덱스일 경우의 인덱스 호출 순서&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679217378799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	[buy_id]
    , [product_id]
    , [create_date]
FROM&amp;nbsp;
	[dbo].[pmt_product_buy]
WHERE&amp;nbsp;
	[product_price] = 3000
	and [create_date]&amp;nbsp;BETWEEN&amp;nbsp;'2022-01-01'&amp;nbsp;AND&amp;nbsp;'2022-03-01'&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;복합 인덱스의 경우 인덱스의 순서가 product_price, create_date일 경우 순서대로 조건을 걸어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분도 되게 흥미로웠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;참고 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://velog.io/@tothek/%EB%8B%A8%EC%9D%BC%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EB%B3%B5%ED%95%A9%EC%9D%B8%EB%8D%B1%EC%8A%A4&quot;&gt;tothek님의 블로그&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;해당 블로그를 보면서 더 공부를 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. 올바르지 않은 데이터 타입 조회&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679217549139&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	[buy_id]
    , [product_id]
    , [create_date]
FROM&amp;nbsp;
	[dbo].[pmt_product_buy]
WHERE&amp;nbsp;
	[product_price] = '3000'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;product_price 컬럼의 경우 Int 타입이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 String 타입의 값을 넣어 조회를 할 경우 인덱스를 타지 않을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 분야든 파고들면 끝이 없는 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 다행인 건 모르는 지식을 알아가는 게 재미있어서 다행이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부족한 부분을 채우기 위해 GPT에게 물어봐서 팩폭도 맞았다. &lt;a href=&quot;https://integer-ji.tistory.com/404&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://integer-ji.tistory.com/404&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>글또</category>
      <category>GPT</category>
      <category>index</category>
      <category>MSSQL</category>
      <category>Query</category>
      <category>인덱스를 타지 않는 쿼리</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/403</guid>
      <comments>https://integer-ji.tistory.com/403#entry403comment</comments>
      <pubDate>Sun, 19 Mar 2023 17:15:00 +0900</pubDate>
    </item>
    <item>
      <title>DDD 8기의 마무리와 새로운 시작</title>
      <link>https://integer-ji.tistory.com/402</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DDD 8기 프로젝트를 마무리하며 회고를 적어 보았다.&amp;nbsp;&lt;/p&gt;
&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://integer-ji.tistory.com/399&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://integer-ji.tistory.com/399&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676177778915&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;DDD 8기 중간회고&quot; data-og-description=&quot;DDD 8기 중간회고 2022년 10월부터 시작 한 DDD 8기 원티드에서 모집 한 DDD 동아리란 &amp;quot;dynamic designer developer&amp;quot;의 약자이다. 현업에 종사하고 있는 디자이너와 개발자를 연결해 줘 다양한 네트워킹과 프&quot; data-og-host=&quot;integer-ji.tistory.com&quot; data-og-source-url=&quot;https://integer-ji.tistory.com/399&quot; data-og-url=&quot;https://integer-ji.tistory.com/399&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biAllt/hyRAgcaLgn/qwqskcNaTNam8ZKWsz0yD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ezGwT/hyRAhIUr0h/F744IMPyqAHoEDffbFcf90/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://integer-ji.tistory.com/399&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://integer-ji.tistory.com/399&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biAllt/hyRAgcaLgn/qwqskcNaTNam8ZKWsz0yD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ezGwT/hyRAhIUr0h/F744IMPyqAHoEDffbFcf90/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;DDD 8기 중간회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DDD 8기 중간회고 2022년 10월부터 시작 한 DDD 8기 원티드에서 모집 한 DDD 동아리란 &quot;dynamic designer developer&quot;의 약자이다. 현업에 종사하고 있는 디자이너와 개발자를 연결해 줘 다양한 네트워킹과 프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;integer-ji.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;p data-ke-size=&quot;size16&quot;&gt;우리 팀(안드2, 서버 1, 디자이너 2) 모두 운동에 관심이 많았고 PT를 받으며 공통적으로 불편한 점이 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려 PT운동을 받으면서 운동하는 입장이 아닌 트레이너 입장의 앱을 만들기로 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트레이너를 위한 멋진 앱 FitNote&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;2월 중 플레이스토어에 출시 예정이다!&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2월 8일 출시 완료 되었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4월 28일 ver0.0.1 업데이트 완료&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;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 FitNote에서 서버파트였다. Python Django 프레임 워크를 사용하여 restful api로 개발을 진행하였고 서버는 Nginx를 통해 gunicorn을 사용하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;나의 성장 정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 지금까지 restful를 사용해 개발을 해본 적이 없었다. &lt;span&gt;따라서 Front, AOS, IOS&lt;span&gt; 등 모두 혼자 개발을 진행해 왔고 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;혼자 개발을 해왔다.&lt;span&gt; 그러다 보니 Front, IOS, Android에 API를 던져줄 때 머릿속에서 어떤 식으로 데이터를 주어야 되는지 익숙하지 않았다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;앞으로의 방향과 새로운 시작&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 이 프로젝트를 꼭 출시를 시킬 것이다. 팀원들과 함께 끝을 보기로 하였으며 모두 개인의 성장을 위해 여러 가지 실험을 할 예정이다. 무엇보다 이제 사이드 프로젝트에서만 사용하던 Python을 그만하고 Java에 집중할 생각이다. Java와 함께 &lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;Kotlin을 사용하여 리펙토링 후 서버도 Docker Stack를 사용하여 좀 더 지금의 기술을 깊게 파고들 생각이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;기술을 사용하며 진정한 개자가 될때까지 파이팅!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <category>ddd</category>
      <category>DDD 8기</category>
      <category>DDD 동아리</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/402</guid>
      <comments>https://integer-ji.tistory.com/402#entry402comment</comments>
      <pubDate>Sun, 12 Feb 2023 22:31:57 +0900</pubDate>
    </item>
    <item>
      <title>브런치먹기</title>
      <link>https://integer-ji.tistory.com/401</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주말의 시작을 빨리 하기 위해 주찬 모임에 참가해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;장소는&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%84%9C%EC%9A%B8%20%EA%B0%95%EB%82%A8%EA%B5%AC%20%EC%97%AD%EC%82%BC%EB%8F%99%20640-9&amp;amp;addtype=1&amp;amp;confirmid=1937691860&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A507620%2C%22mapCenterY%22%3A1111913%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A507620%2C%22y%22%3A1111915%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%2F%2Ft1.daumcdn.net%2Flocalimg%2Flocalimages%2F07%2F2012%2Fattach%2Fpc_img%2Fico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B9%B4%ED%8E%98413%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%22%2C%22confirmid%22%3A1937691860%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=507620&amp;amp;mapY=1111913&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=1168064000&amp;amp;tel=070-7798-0544&amp;amp;title=%EC%B9%B4%ED%8E%98413%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1675592930353&quot; id=&quot;maps_1675592930353&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%84%9C%EC%9A%B8%20%EA%B0%95%EB%82%A8%EA%B5%AC%20%EC%97%AD%EC%82%BC%EB%8F%99%20640-9&amp;amp;addtype=1&amp;amp;confirmid=1937691860&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A507620%2C%22mapCenterY%22%3A1111913%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A507620%2C%22y%22%3A1111915%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%2F%2Ft1.daumcdn.net%2Flocalimg%2Flocalimages%2F07%2F2012%2Fattach%2Fpc_img%2Fico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B9%B4%ED%8E%98413%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%22%2C%22confirmid%22%3A1937691860%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=507620&amp;amp;mapY=1111913&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=1168064000&amp;amp;tel=070-7798-0544&amp;amp;title=%EC%B9%B4%ED%8E%98413%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8&quot; data-maps-mapx=&quot;507620&quot; data-maps-mapy=&quot;1111913&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=507620%2C1111913&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A507620%2C1111915&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;카페413프로젝트&lt;br /&gt;서울&amp;nbsp;강남구&amp;nbsp;논현로97길&amp;nbsp;19-11&lt;br /&gt;&lt;a href=&quot;https://naver.me/FQaIaP4Z&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://naver.me/FQaIaP4Z&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675593141741&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;카페413프로젝트 : 네이버 &quot; data-og-description=&quot;방문자리뷰 633 &amp;middot; 블로그리뷰 1,255&quot; data-og-host=&quot;m.place.naver.com&quot; data-og-source-url=&quot;https://naver.me/FQaIaP4Z&quot; data-og-url=&quot;https://m.place.naver.com/restaurant/33445630/home&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQPrM1/hyRwJkhOsO/ex1U2ynBzotTN91cxHeMD1/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/2dFTQ/hyRvgjHaAE/8jKkFHz5X067wjqkpxDB20/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380&quot;&gt;&lt;a href=&quot;https://naver.me/FQaIaP4Z&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://naver.me/FQaIaP4Z&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQPrM1/hyRwJkhOsO/ex1U2ynBzotTN91cxHeMD1/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/2dFTQ/hyRvgjHaAE/8jKkFHz5X067wjqkpxDB20/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380');&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;카페413프로젝트 : 네이버 &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;방문자리뷰 633 &amp;middot; 블로그리뷰 1,255&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;m.place.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;카페413프로젝트로 역삼역 근처에 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AA2P3/btrX7Yck449/IjYzx1YZ6xovb6IhSncZW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AA2P3/btrX7Yck449/IjYzx1YZ6xovb6IhSncZW0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AA2P3/btrX7Yck449/IjYzx1YZ6xovb6IhSncZW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAA2P3%2FbtrX7Yck449%2FIjYzx1YZ6xovb6IhSncZW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;286&quot; height=&quot;381&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;입구부터 귀여운 고양이가 반겨주었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;조찬 모임에서의 주요 내용은 이번 한 주는 어떠하게 보내었는지, 한주를 돌아보는 회고의 이야기로 모이게 되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;과연 이번주의 나는 어땠을까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;분명 그 당일이나 혹은 다음날 생각하고 다짐한 게 있을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 역시 그 다짐은 그날에 했던 다짐일 뿐 전혀 기억나지 않았었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모인 사람들과 이야기를 하며 자신을 돌아보니 잊었던 다짐을 다시 생각나게 하는 좋은 자리였다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1773&quot; data-origin-height=&quot;1773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZuhv1/btrYe0mSnQB/WiTHRI0gLEw0I1Qy3u8jR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZuhv1/btrYe0mSnQB/WiTHRI0gLEw0I1Qy3u8jR0/img.jpg&quot; data-alt=&quot;소세지 베이컨 오믈렛&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZuhv1/btrYe0mSnQB/WiTHRI0gLEw0I1Qy3u8jR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZuhv1%2FbtrYe0mSnQB%2FWiTHRI0gLEw0I1Qy3u8jR0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;498&quot; data-origin-width=&quot;1773&quot; data-origin-height=&quot;1773&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소세지 베이컨 오믈렛&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이야기하다 보니 브런치가 나왔다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;각자의 고민을 털어놓고 공유하는 좋은 자리였다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모두 잘 되었으면 좋겠다.&lt;/p&gt;</description>
      <category>글또</category>
      <category>브런치</category>
      <category>브런치카페</category>
      <category>카페413프로젝트</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/401</guid>
      <comments>https://integer-ji.tistory.com/401#entry401comment</comments>
      <pubDate>Sun, 5 Feb 2023 19:33:57 +0900</pubDate>
    </item>
    <item>
      <title>fatal: unable to access '': SSL certificate problem: unable to get local issuer certificate</title>
      <link>https://integer-ji.tistory.com/400</link>
      <description>&lt;pre id=&quot;code_1675077027807&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fatal: unable to access '': SSL certificate problem: unable to get local issuer certificate&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;SSL 인증서가 필요 없는 항목을 clone할 때 해당 에러가 나온다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675077088651&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global http.sslVerify false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 사용하여 SSL 옵션을 false 시켜주면 된다.&lt;/p&gt;</description>
      <category>에러</category>
      <category>clone ssl</category>
      <category>fatal: unable to access '': SSL certificate problem: unable to get local issuer certificate</category>
      <category>git problem</category>
      <category>git ssl</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/400</guid>
      <comments>https://integer-ji.tistory.com/400#entry400comment</comments>
      <pubDate>Mon, 30 Jan 2023 20:12:00 +0900</pubDate>
    </item>
    <item>
      <title>DDD 8기 중간회고</title>
      <link>https://integer-ji.tistory.com/399</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;DDD&amp;nbsp;8기&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;2022년 10월부터 시작 한 &lt;a href=&quot;https://recruit.wanted.co.kr/events/ddd8th&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DDD 8기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원티드에서 모집 한 DDD 동아리란 &quot;dynamic designer developer&quot;의 약자이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현업에 종사하고 있는 디자이너와 개발자를 연결해 줘 다양한 네트워킹과 프로젝트를 만들 수 있게 도와주는 동아리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벌써 DDD가 시작한지 중간 이상이 지났다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 지금까지 어떤걸 얻었을까 회고하는 시간을 가져 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 시작할때의 다짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 다짐은 나 자신의 성장이다. 또한 이직을 한 뒤 현업에 뒤처지지 않고 빠르게 적응하기 위한 디자이너, WEB/APP 개발자와의 소통력 향상을 목표로 시작하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 지금은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이 좋아진 것 같다. 디자이너와 소통하는 법과 디자이너가 사용하는 툴의 이해하게 되었고 디자인을 보며 API를 어떤 식으로 개발해야 할지 생각해 볼 수 있는 좋은 기회였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 나는 Android 팀에 배정 되어 AOS 개발자와 소통하였는데 지금까지는 나 혼자 WEB까지 개발하며 편하게 API를 만들고 프레임워크에만 의존을 하였는데 이번 기회로 프레임워크의 커스텀, 프레임워크에 의존하지 않고 직접 만드는 방법 등 다른 직군과의 개발적 소통을 알게 되었다. 이 부분이 있어서 나에게 가장 좋은 부분이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 아쉬운점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하며 실제 출시를 위해 제일 익숙 한 Python Django를 사용하여 API/Server 개발을 진행하였다. 하지만 이제 Java 언어를 쓰며 백엔드 개발을 시작한 지 4년 차가 되었다. 더 이상 사이드 프로젝트를 Python으로 진행하는 게 아니라 나의 직무 기술을 더 깊이 있게 배우고 싶은 욕망이 생기게 되었다. 또한 이제 Python보단 Java가 익숙하다 ㅎㅎ..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 앞으로의 방향성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행하고 있는 프로젝트를 기반으로 Java로 다시 만들어 보고 싶다. Java를 이용하여 기본 틀을 만들고 다시 새롭게 Java 프로젝트를 참여하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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&gt;&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <category>ddd</category>
      <category>DDD 8기</category>
      <category>DDD8기</category>
      <category>사이드프로젝트</category>
      <category>원티드 DDD 8기</category>
      <category>회고</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/399</guid>
      <comments>https://integer-ji.tistory.com/399#entry399comment</comments>
      <pubDate>Sun, 15 Jan 2023 21:13:18 +0900</pubDate>
    </item>
    <item>
      <title>재해발생 4단계 순서</title>
      <link>https://integer-ji.tistory.com/398</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;재해발생 4단계 순서로써는&lt;/p&gt;
&lt;pre id=&quot;code_1671410619944&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 현장조사
2. 구조요청
3. 상태파악 후 조치
4. 안정화&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현장조사 후 구조 요청이 진행 된다.&lt;/p&gt;</description>
      <category>법정의무교육</category>
      <category>사고발생 시 응급처치</category>
      <category>산업안전보건교육</category>
      <category>안전</category>
      <category>재해발생 4단계 순서</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/398</guid>
      <comments>https://integer-ji.tistory.com/398#entry398comment</comments>
      <pubDate>Mon, 19 Dec 2022 09:45:05 +0900</pubDate>
    </item>
    <item>
      <title>ImportError: Could not import 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ImportError: cannot import name 'smart_text' from 'django.utils.encoding'</title>
      <link>https://integer-ji.tistory.com/396</link>
      <description>&lt;pre id=&quot;code_1668253082813&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ImportError: Could not import 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. 
ImportError: cannot import name 'smart_text' from 'django.utils.encoding'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.38.19.png&quot; data-origin-width=&quot;2828&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dt6RS1/btrQ1lsfI8l/jWw3evAiu2YfPTmUKDKlS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dt6RS1/btrQ1lsfI8l/jWw3evAiu2YfPTmUKDKlS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dt6RS1/btrQ1lsfI8l/jWw3evAiu2YfPTmUKDKlS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdt6RS1%2FbtrQ1lsfI8l%2FjWw3evAiu2YfPTmUKDKlS0%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;2828&quot; height=&quot;160&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.38.19.png&quot; data-origin-width=&quot;2828&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT를 Django에서 사용하며 생긴 에러입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 에러는 Django 버전이 4버전 이상일 경우 발생됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rest_framework_jwt 해당 프레임워크 말고 &lt;b&gt;&quot;rest_framework_simplejwt&quot;을 사용해줍니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.39.54.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UnCcB/btrQZ21mzrX/jecSsQqoLaSbkcUlwCkc11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UnCcB/btrQZ21mzrX/jecSsQqoLaSbkcUlwCkc11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UnCcB/btrQZ21mzrX/jecSsQqoLaSbkcUlwCkc11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUnCcB%2FbtrQZ21mzrX%2FjecSsQqoLaSbkcUlwCkc11%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;1290&quot; height=&quot;416&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.39.54.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 -&amp;gt; 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.40.13.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w9rbv/btrQZ3657Br/h4Lr0Vr6R2ERfK0iIAPLx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w9rbv/btrQZ3657Br/h4Lr0Vr6R2ERfK0iIAPLx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w9rbv/btrQZ3657Br/h4Lr0Vr6R2ERfK0iIAPLx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw9rbv%2FbtrQZ3657Br%2Fh4Lr0Vr6R2ERfK0iIAPLx0%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;1110&quot; height=&quot;404&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.40.13.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.40.33.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4riK5/btrQ1KMcJGb/GWOm7ykyykeDw7xLEWS0ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4riK5/btrQ1KMcJGb/GWOm7ykyykeDw7xLEWS0ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4riK5/btrQ1KMcJGb/GWOm7ykyykeDw7xLEWS0ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4riK5%2FbtrQ1KMcJGb%2FGWOm7ykyykeDw7xLEWS0ok%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;720&quot; height=&quot;438&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.40.33.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;djangorestframework-simplejwt pip도 설치해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668253258063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install djangorestframework-simplejwt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.41.15.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FwlGx/btrQ4bJeOWH/ElUylJa89sBKklUXt9k6q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FwlGx/btrQ4bJeOWH/ElUylJa89sBKklUXt9k6q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FwlGx/btrQ4bJeOWH/ElUylJa89sBKklUXt9k6q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFwlGx%2FbtrQ4bJeOWH%2FElUylJa89sBKklUXt9k6q1%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;1464&quot; height=&quot;436&quot; data-filename=&quot;스크린샷 2022-11-12 오후 8.41.15.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 rest_framework_jwt 사용하던 소스도 모두 정리하여 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상!&lt;/p&gt;</description>
      <category>에러</category>
      <category>djangorestframework-simplejwt</category>
      <category>JSONWebTokenAuthentication</category>
      <category>rest_framework_jwt</category>
      <category>simplejwt</category>
      <author>integerJI</author>
      <guid isPermaLink="true">https://integer-ji.tistory.com/396</guid>
      <comments>https://integer-ji.tistory.com/396#entry396comment</comments>
      <pubDate>Sat, 12 Nov 2022 20:41:51 +0900</pubDate>
    </item>
  </channel>
</rss>