<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코드를 찢다</title>
    <link>https://jaeseo0519.tistory.com/</link>
    <description>싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.</description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 09:18:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>나죽못고나강뿐</managingEditor>
    <image>
      <title>코드를 찢다</title>
      <url>https://tistory1.daumcdn.net/tistory/5201662/attach/e714f007cdc2403cbbb0eec1db20357a</url>
      <link>https://jaeseo0519.tistory.com</link>
    </image>
    <item>
      <title>AI Native 탭 개설</title>
      <link>https://jaeseo0519.tistory.com/notice/523</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsH83t/dJMcadPbLhS/uZbHOvhg58ZHOuhOC1YUWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsH83t/dJMcadPbLhS/uZbHOvhg58ZHOuhOC1YUWk/img.png&quot; data-alt=&quot;블로그 문 안 닫았습니다 ㅜㅜ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsH83t/dJMcadPbLhS/uZbHOvhg58ZHOuhOC1YUWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsH83t%2FdJMcadPbLhS%2FuZbHOvhg58ZHOuhOC1YUWk%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;700&quot; height=&quot;467&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;785&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;최근 바쁘기도 바빴지만, 대체 블로그 포스팅을 뭘 해야 하나 고민이 너무 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 정보를 조합해서 열거하는 건 AI 쓰면 될 일이고, 기술적 고민을 적자니 사내 보안에 걸릴까봐 벌벌 떨어야 하고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애초에 AI 시대에 적을만한 기술적 고민을 적는다면 기술 유출범이나 다름 없지 않은가 싶었더니 진짜 쓸 게 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 한동안 Review 탭에 뻘글을 적었는데, 이건 또 왜 조회수가 잘 나오는 건지 이해가 안 감.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 가장 몰두하고 있는 것이 AI Native에 대함인데, 막상 또 이걸 적으려니 인플루언서형 개발자가 되어가는 느낌이라 영 불쾌했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평가 기준이 모호해서 정말 뭐가 더 나아진 건지, 나아졌다고 착각하고 있는 건지 분간이 되질 않으니, 이런 내용들을 함부로 적고 싶지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 한동안 어떻게 엔지니어 관점에서 관련 경험들을 풀어나갈 수 있을 지 연구하는데 시간을 퍼부었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 시간을 거친 덕분에 이제 나름 많은 의미있는 경험들을 축적하긴 했으나, 이걸 그대로 쓰기엔 또 보안 유출이 될 거 같아서 각색할 시간이 필요하긴 할 듯.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 거의 3주 가까이 포스팅을 못하고 있는데, 제 블로그 정상 운영 중입니다.&lt;/p&gt;</description>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/notice/523</guid>
      <pubDate>Sun, 19 Apr 2026 00:22:00 +0900</pubDate>
    </item>
    <item>
      <title>[대규모 시스템 설계] 8장. URL 단축키 설계</title>
      <link>https://jaeseo0519.tistory.com/522</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  해당 내용은 &quot;가상 면접 사례로 배우는 대규모 시스템 설계 기초&quot;를 참조하여 작성하였습니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;1. Introduction&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Opening&lt;/b&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;/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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Usecase&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;original URL을 단축 URL로 표현해야 하며, 단축 URL로 original URL로 갈 수 있어야 한다.&lt;/li&gt;
&lt;li&gt;단축 URL 결과는 짧을 수록 좋다.&lt;/li&gt;
&lt;li&gt;연산
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;쓰기 연산: 매일 1억 개의 단축 URL 생성&lt;/li&gt;
&lt;li&gt;초당 쓰기 연산: 100 (million * writes/day) / 24 (hr/day) / 3,600 (sec/hr) = 1,157 (writes/sec)&lt;/li&gt;
&lt;li&gt;읽기 연산: 초당 11,600 (reads/sec) (assume, 읽기 연산 : 쓰기 연산 = 10 : 1)&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;URL 단축 서비스를 10년간 운영하면, 100 million * 365 days * 10 years = 365 billion 개 record를 보관해야 함&lt;/li&gt;
&lt;li&gt;축약 전 URL 평균 길이는 100이라고 가정 (단, URL은 모두 영문)&lt;/li&gt;
&lt;li&gt;10년 동안 필요한 저장 용량 = 365 billion * 100bytes = 36.5TB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10년이 지나면 저장된 단축 URL은 제거한다고 봐도 될 듯.&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;2. Draft Desgin&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  API Endpoint&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmjDgh/dJMcaflPz09/XJjq9fmz3Gag5KDpq39xk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmjDgh/dJMcaflPz09/XJjq9fmz3Gag5KDpq39xk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmjDgh/dJMcaflPz09/XJjq9fmz3Gag5KDpq39xk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmjDgh%2FdJMcaflPz09%2FXJjq9fmz3Gag5KDpq39xk1%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;301&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RESTful API style로 설계한다는 전제로 시작.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;URL compression endpoint
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 단축 URL을 생성할 때는 다음과 같은 요청을 보내야 한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Request URL: POST /api/v1/data/shorten&lt;/li&gt;
&lt;li&gt;parameters: {longUrl: longURLstring}&lt;/li&gt;
&lt;li&gt;return: compressed URL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;URL redirection endpoint
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단축 URL로 HTTP 요청이 오면 origianl URL로 보내주기 위한 endpoint
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Request URL: /api/v2/shortUrl&lt;/li&gt;
&lt;li&gt;return: original URL (redirection)&lt;/li&gt;
&lt;/ul&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  URL Redirection&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfVh31/dJMcafsz4L7/jJqlTimLFkU79zTVv07aKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfVh31/dJMcafsz4L7/jJqlTimLFkU79zTVv07aKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfVh31/dJMcafsz4L7/jJqlTimLFkU79zTVv07aKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfVh31%2FdJMcafsz4L7%2FjJqlTimLFkU79zTVv07aKk%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;303&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;redirect되면 Location header에 original URL을 담아서 301 http status response를 반환한다.&lt;/li&gt;
&lt;/ul&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;808&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cednE3/dJMcacCEmK3/47jTsxkgjfhEdpoLEunBo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cednE3/dJMcacCEmK3/47jTsxkgjfhEdpoLEunBo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cednE3/dJMcacCEmK3/47jTsxkgjfhEdpoLEunBo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcednE3%2FdJMcacCEmK3%2F47jTsxkgjfhEdpoLEunBo1%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;700&quot; height=&quot;188&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;301 Permanently Moved
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;해당 URL에 대한 HTTP 요청의 처리 책임이 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;영구적으로&lt;/b&gt;&lt;/span&gt; Location header의 URL로 이전되었음을 의미&lt;/li&gt;
&lt;li&gt;영구적 이전이므로, 브라우저가 response를 caching&lt;/li&gt;
&lt;li&gt;서버 부하를 줄이는데 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;302 Found
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;요청이 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;일시적으로&lt;/b&gt;&lt;/span&gt; 다른 URL로 이전되었음을 의미&lt;/li&gt;
&lt;li&gt;Client의 request는 브라우저에 cache되지 않으므로, 언제나 compression URL server로 전달되어야 함.&lt;/li&gt;
&lt;li&gt;트래픽 분석(e.g., 클릭 발생률, 발생 위치 추적)에 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;URL redirection의 가장 직관적인 구현 방법은 hash table을 사용하는 것&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  URL Compression&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축 URL의 형태가 &lt;a href=&quot;http://www.example.com/&quot;&gt;www.example.com/&lt;/a&gt;{hashValue}&amp;nbsp; 같은 형태라면, 긴 URL을 hash value로 대응시킬 hash function f(x)를 찾아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f(x)의 요구사항&lt;/p&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;계산된 해시 값은 원래 입력으로 주어졌던 original URL로 복원될 수 있어야 한다.&lt;/li&gt;
&lt;/ul&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;3. Detailed Design&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Data Model&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcZR6m/dJMcahRsSU0/PqYLRjnUpV9cSus6ECDcq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcZR6m/dJMcahRsSU0/PqYLRjnUpV9cSus6ECDcq1/img.png&quot; data-alt=&quot;id가 꼭 auto increment여야 할 이유는 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcZR6m/dJMcahRsSU0/PqYLRjnUpV9cSus6ECDcq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcZR6m%2FdJMcahRsSU0%2FPqYLRjnUpV9cSus6ECDcq1%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;258&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;id가 꼭 auto increment여야 할 이유는 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 설계: 모든 값을 hash table(in-memory)에 저장하자
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;한계: 직관적이지만 36.5TB 데이터를 어떻게 올릴 거냐?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그냥 RDB에 때려넣자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  캐싱이 필요할까?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;읽기 연산이 쓰기 연산보다 10배 높다는 것이 가정이므로, 캐싱을 하는 것을 고려해볼 수는 있을 것 같다.&lt;br /&gt;그런데 굳이 필요할까?&lt;br /&gt;&lt;br /&gt;단축 URL을 공유하는 경우는 웹 서핑을 하다 우연히 타고 들어온 경우보다는 특수한 목적을 가지고 있을 확률이 높다.&lt;br /&gt;예를 들어 confluence에서 문서를 공유할 때도 단축 URL을 사용하는 것처럼, 누군가가 정보를 공유했고 그 정보가 필요한 사람들일 확률이 높다.&lt;br /&gt;이미 목적이 뚜렷한 사람들이 방문할 페이지이므로 조회가 조금 느려도 사용자가 이탈할 일은 그다지 없을 것이고, 따라서 캐싱까지 해가며 읽기 성능을 높여주어야 할까 싶긴 하다.&lt;br /&gt;단축 URL을 사용하는 목적에 따라 달라질 듯.&lt;br /&gt;&lt;br /&gt;그리고 어차피 읽기 연산이면 Tx도 안 걸고 쿼리 날려버리면 그리 느리지도 않을 거고, index도 기껏 해봐야 shortURL에 걸려있을 텐데 진짜 필요 없을지도.&lt;/blockquote&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Hash Function&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  hash value length&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba1sYV/dJMcad2yG6P/wLPDSCTJOS9xTb75yKN5V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba1sYV/dJMcad2yG6P/wLPDSCTJOS9xTb75yKN5V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba1sYV/dJMcad2yG6P/wLPDSCTJOS9xTb75yKN5V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba1sYV%2FdJMcad2yG6P%2FwLPDSCTJOS9xTb75yKN5V1%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;700&quot; height=&quot;382&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;893&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딱히 특별한 내용은 없음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hashValue는 총 62개의 문자들로 구성
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;[0-9, a-z, A-Z]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;365 billion의 고유값을 보장하기 위한 n(=minimum hash value length)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;62^n &amp;ge; 365 million&lt;/li&gt;
&lt;li&gt;n &amp;ge; 7&lt;/li&gt;
&lt;/ul&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;&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;&lt;b&gt;  hash collision resolution&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;문제는 hash function 중에 7글자 문자열로 줄이는 hash function이 있을까?&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;&lt;a href=&quot;https://en.wikipedia.org/wiki/Cyclic_redundancy_check&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CRC32&lt;/a&gt; (Cyclic Redundancy Check 32): 32 bits&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/MD5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MD5&lt;/a&gt; (Message-Digest Algorithm 5): 128 bits&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/SHA-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SHA-1&lt;/a&gt;: 160 bits&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1595&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFMi3/dJMb990fa7P/f08zKAdJlfk3gvByozKf80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFMi3/dJMb990fa7P/f08zKAdJlfk3gvByozKf80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFMi3/dJMb990fa7P/f08zKAdJlfk3gvByozKf80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFMi3%2FdJMb990fa7P%2Ff08zKAdJlfk3gvByozKf80%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;700&quot; height=&quot;318&quot; data-origin-width=&quot;1595&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안에 민감한 정보는 아니니 어떤 hash function을 써도 무방하지만, 가장 짧은 CRC32 조차 8글자.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;hash 에서 앞의 7자리만 자르면? &amp;rarr; hash collision 발생 우려&lt;/li&gt;
&lt;li&gt;충돌이 해소될 때까지 longURL에 사전에 정한 문자열을 덧붙여서 rehash? &amp;rarr; 될 때까지 DB 조회할 거임?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;longURL을 DB에 저장할 때는 원본값을 넣어야 한다. 안 그러면 뒤의 값의 어디까지가 덧붙여진 값인지 알아내야 하는 번거로움이 존재함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bloom Filter 쓰자. (in-memory에서 &quot;값의 존재 여부&quot;를 매우 빠르고 저렴하게 확인하는 방법. 있다고 답할 땐 있을 수도 없을 수도 있는데, 없다고 답할 때는 진짜 없음을 보장.)&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  base-62 conversion&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;왜 base64가 아니라 62?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;hashValue에 사용가능한 문자 개수를 62개로 정했으므로.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;왜 사용함?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;수의 표현 방식이 다른 두 시스템이 같은 수를 공유해야 하는 경우&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MFVC4/dJMcagLO4WK/7wCYvunXycbUkXwqHngKV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MFVC4/dJMcagLO4WK/7wCYvunXycbUkXwqHngKV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MFVC4/dJMcagLO4WK/7wCYvunXycbUkXwqHngKV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMFVC4%2FdJMcagLO4WK%2F7wCYvunXycbUkXwqHngKV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;499&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;856&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;문제는 longURL이 정수가 아니면 어떻게 할 건데?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;base-62 변환은 정수 &amp;rarr; 문자열 변환이므로, 입력이 문자열이면 먼저 정수로 만들어야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 base-62는 Unique ID Generator를 필요로 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 이런 flow가 되지 않을까?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;longURL 입력&lt;/li&gt;
&lt;li&gt;ID Generator로 unique integer ID 발급&lt;/li&gt;
&lt;li&gt;base-62 conversion&lt;/li&gt;
&lt;li&gt;따란~&lt;/li&gt;
&lt;/ol&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  URL Compression&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/riZWp/dJMcaduIbPz/QuVrulEvDK055kX6rKu0ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/riZWp/dJMcaduIbPz/QuVrulEvDK055kX6rKu0ok/img.png&quot; data-alt=&quot;귀찮아서 NotebookLM으로 정리했더니 난리가 났다. 영어로 만들어달라고 할 걸 ㅜ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/riZWp/dJMcaduIbPz/QuVrulEvDK055kX6rKu0ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FriZWp%2FdJMcaduIbPz%2FQuVrulEvDK055kX6rKu0ok%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;700&quot; height=&quot;484&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;귀찮아서 NotebookLM으로 정리했더니 난리가 났다. 영어로 만들어달라고 할 걸 ㅜ&lt;/figcaption&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  URL Redirection&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qEIHG/dJMcad2yIeG/g4mdNY24eLCYO2lHYHEKq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qEIHG/dJMcad2yIeG/g4mdNY24eLCYO2lHYHEKq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qEIHG/dJMcad2yIeG/g4mdNY24eLCYO2lHYHEKq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqEIHG%2FdJMcad2yIeG%2Fg4mdNY24eLCYO2lHYHEKq0%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;700&quot; height=&quot;299&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 위에서 굳이 cache 쓸 필요 없다고 했던 거 같은데, 책은 읽기를 더 자주하는 시스템이므로 cache를 도입해봤다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 cache 없이 해보고, 성능 평가 시 불만족스러우면 도입하는게 ㅎㅎ;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트래픽이 예측되지 않은 상황에서 무작정 cache 도입하면 문제만 복잡해지는 경우를 너무 많이 봤다.&lt;/p&gt;</description>
      <category>Reference/대규모 시스템 설계</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/522</guid>
      <comments>https://jaeseo0519.tistory.com/522#entry522comment</comments>
      <pubDate>Sat, 4 Apr 2026 16:01:44 +0900</pubDate>
    </item>
    <item>
      <title>개발자는 원래 직업을 없애는 직군이었다</title>
      <link>https://jaeseo0519.tistory.com/521</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;1. 개발자는 원래 직없을 없애는 직군이었다.&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;ERP 시스템이 그 자리를 가져갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;그 뒤에는 항상 개발자가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 이 과정을 &quot;비효율의 제거&quot;, &quot;자동화&quot;, &quot;혁신&quot;이라고 불렀다.&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;그건 &quot;시대의 흐름&quot;이었고, 자신들은 그 흐름을 만드는 쪽에 서 있었으니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수십 년간 개발자는 안전했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화의 칼날은 항상 바깥을 향했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 짤 수 있는 사람은 자동화를 당하는 쪽이 아니라 자동화를 시키는 쪽이었고, 그 기술적 장벽은 견고해 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;2. 그리고 자기 차례가 왔다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 본질적으로 &quot;귀찮음&quot;을 싫어하는 사람들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복적인 작업을 보면 참지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 코드를 두 번 작성하는 것을 혐오한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동으로 할 수 있는 일을 수동으로 하는 것을 견디지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 프레임워크를 만들고, 라이브러리를 만들고, 빌드 자동화를 만들고, CI/CD 파이프라인을 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 전부 &quot;귀찮으니까&quot;라는 동기에서 출발했을 수도 있겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이러니한 건, 그러면서도 기술 탐구 자체에는 한없이 비효율을 감수한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 언어가 나오면 밤을 새워 공부하고, 더 나은 아키텍처가 있다면 기존 코드를 전부 갈아엎는 것도 마다하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 확실하게 개념이 확립되지도 않은 트렌드로 뒤덮어버리고 이직해버리기도 하고, 여러모로 아이러니한 인간들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비효율을 제거하기 위해 비효율을 감수하는 모순, 하지만 그 모순이야말로 기술을 전진시켜 온 동력이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 동력이 결국 자기 자신에게까지 도달했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해보면 당연하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 세상의 모든 비효율을 자동화하겠다는 집념을 가진 사람들이라면, 자기 업무의 비효율도 당연히 자동화 대상이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 리뷰? 자동화하자.&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;그리고 이제는 &quot;코드 작성? 그것도 자동화하자.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신들이 그토록 좋아하던 &quot;코드를 작성한다&quot;는 행위마저도, 결국 &quot;딸깍&quot; 한 번으로 처리하고 싶어진 것이다.&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;3. &quot;도메인을 이해하는 개발자는 살아남는다&quot;는 말&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&quot;코드만 잘 짜는 시대는 끝났다. 비즈니스를 이해하고, 도메인 지식을 갖춘 개발자만이 살아남을 것이다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맞는 말이다. 코드를 작성하는 것은 개발자 업무의 일부에 불과하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항을 분석하고, 문제를 정의하고, 아키텍처를 설계하고, 기술적 의사결정을 내리고, 이해관계자와 소통하는 것 등.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 것이 개발자의 일이었고, AI가 코드 생성을 대체한다 해서 이 역할들이 한순간에 사라지지는 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 이 주장이 &quot;그러니까 개발자는 괜찮다&quot;는 결론으로 이어질 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 발만 더 나가보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;문제를 정의하고 구조화하는 역량이 중요해진다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 그 역량이 가장 뛰어난 사람이 누구인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인을 가장 깊이 이해하는 사람은 개발자가 아니라, 그 도메인에서 수십 년을 일한 종사자들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;번역이라는 행위 자체가 고귀했기 때문이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번역의 수요가 있었고, 번역할 수 있는 사람이 적었기 때문에 직업이 된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자도 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;비즈니스 요구사항&quot;이라는 인간의 언어를 &quot;코드&quot;라는 기계의 언어로 옮기는 사람.&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;중개 비용이 0에 수렴하면, 중개인은 필요 없어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 &quot;도메인을 이해하는 개발자가 살아남는다&quot;는 말의 진짜 의미는 개발자로서 살아남는 게 아니라, 도메인 전문가로서 살아남는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;개발자&quot;라는 타이틀이 남는 게 아니라, &quot;문제를 정의하는 사람&quot;이라는 역할이 남는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 역할은 굳이 개발자가 아니어도 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누구나 인스턴트 식품처럼 프로그램을 만들어낼 수 있는 시대에서 &quot;문제를 정의하고 구조화하는&quot; 역량은 더없이 중요해질 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그 역량의 주인이 반드시 &quot;개발자&quot;여야 할 이유는 점점 희미해지고 있다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;4. 직업은 사라지지 않고, 변형될 뿐이라구요?&lt;/b&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;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 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 data-ke-size=&quot;size16&quot;&gt;30년간 창구에서 일하며 가정을 먹여 살리던 사람에게, &quot;당신의 직업은 사라진 게 아닙니다, 변형된 겁니다&quot;라고 말할 수 있는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;금융 상담사라는 새로운 직업이 생겼으니 괜찮습니다&quot;라고?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 사람이 금융 상담사가 될 수 있었나? UX 디자이너가 될 수 있었나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;하지만 이미 구시대의 직업에 생계를 의탁하고 있던 사람에게 &quot;변형&quot;이라는 단어는 아무런 위안이 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그건 그냥 해고다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;직업은 사라지지 않는다, 변형될 뿐이다&quot;는 말은 역사를 요약할 때는 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그 역사의 한가운데 서 있는 사람에게는 폭력적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;50년 뒤의 경제학자가 &quot;2020년대에 소프트웨어 개발자가 줄었지만 AI 오케스트레이터라는 직업이 생겼다&quot;고 서술할 수 있을 것이다.&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;하지만 그 &quot;장기적&quot;이라는 단어 속에는 한 세대의 고통이 뭉개져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방직공에서 공장 노동자로의 전환이 수십 년에 걸쳐 수백만 명의 빈곤과 고통 속에서 이루어졌다는 사실을, &quot;변형&quot;이라는 단어는 너무 깔끔하게 포장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 얼마 전까지 같은 말을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;직업이 사라지는 게 아니라 바뀌는 거야.&quot;&lt;/p&gt;
&lt;p data-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;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;5. 그런데도&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 거품이라고 태평하게 말하는 사람들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;지금 AI가 과대평가되어 있어&quot;, &quot;결국 닷컴 버블처럼 꺼질 거야&quot;, &quot;아직 개발자 대체하기엔 한참 멀었어.&quot;&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;AI의 기술 트렌드를 쫓기 급급한 사람들이 있다.&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;하지만 &quot;이 기술이 내 존재에 어떤 의미인가&quot;를 묻지 않고 기술만 축적하는 것은, 무기가 자기에게 겨누어지는 줄 모르고 무기를 닦는 것과 다르지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 기술에 자신의 정체성을 묶어버리는 사람들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;나는 자바 개발자입니다.&quot; &quot;나는 리액트 전문가입니다.&quot; &quot;나는 스프링 엔지니어입니다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술은 도구인데, 도구에 이름을 걸어버리면 도구가 필요 없어질 때 자기 자신도 같이 필요 없어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목수가 &quot;나는 망치 전문가입니다&quot;라고 말하지 않는 것처럼, 개발자도 특정 기술이 아니라 해결하는 문제로 자신을 정의해야 하는데 그걸 못하는 사람들이 여전히 너무 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 부류는 방향이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 변화를 부정하고, 하나는 변화의 의미를 생각하지 않고, 하나는 변화 자체를 거부한다.&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;하지만 &quot;코딩을 좋아한다&quot;고 말하면서 정작 코딩이라는 행위의 의미가 바뀌고 있다는 사실에는 눈을 감는 사람들에 대한 답답함을 느낀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 코딩이 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 돌이켜보면 코딩 자체가 좋았던 건 아닌 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남들이 못하는 걸 내가 할 수 있다는 우월감이 좋았던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 작성한다는 행위가 주는 &quot;나는 특별하다&quot;는 감각.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그게 코딩에 대한 애정의 실체였다면 AI가 누구에게나 그 능력을 나눠주는 순간, 그 &quot;애정&quot;은 증발할 것이다.&lt;/p&gt;
&lt;p data-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;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;6. 아무도 괜찮지 않다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 AI에 또 한계가 찾아올 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금의 대규모 언어 모델이 천장에 부딪히고, &quot;생각보다 별거 아니었네&quot;라는 반응과 함께 다시 AI 겨울이 올 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 개발자는 다시 잠깐동안 숨을 돌릴 수 있을 지도 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 AI는 직업을 없애는 게 아니라, 엑셀이 그랬던 것처럼 기대치를 올리는 도구가 될 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엑셀이 등장했을 때 사무직 노동자의 업무량은 줄지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 정도는 당연히 처리해야지&quot;라는 기준선만 올라갔을 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI도 그렇게 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 사라지는 게 아니라, &quot;혼자서 열 명 몫을 해야 하는 개발자&quot;가 표준이 되는 미래가 열릴 수도 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니지, 그 때는 10명의 몫이 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;그게 어쩌면 &quot;직업이 사라지는 것&quot;보다 더 잔인할 수도 있다.&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;이것이 완전한 소멸인지, 변형인지, 아니면 그저 과도기의 착각인지는 아직 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이것만큼은 말할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;괜찮을 거야&quot;라는 말은, 적어도 지금은, 아무에게도 도움이 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;이 글은 저와 AI의 대화에서 시작되었고, AI가 모든 내용을 구조화하고 집필했음을 밝힙니다.&lt;/b&gt;&lt;/blockquote&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;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서부턴 직접 쓴 글.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전 딱히 AI가 개발자의 자리를 대체하는 것에 부정적인 입장이 아닌 사람입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 제가 만들려던 세상을 진짜로 만들어버린 인간들이 존재했을 뿐이라, 선수를 빼앗겼다? 정도의 느낌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 다양한 직군의 사람들과 대화하고, 같은 개발자끼리도 많은 대화를 나누다보니 생각이 복잡해졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 LLM한테 구조화해보라고 시켰더니 굉장히 염세주의적인 글이 탄생했네요.&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;최근 블로그 포스팅을 &quot;딸깍&quot;해보고 싶어져서 이런저런 시도를 해보는 중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적인 내용은 아직 업로드하기 처참한 수준이라 어렵고, 이번 글도 솔직히 별로 마음에 안 드는데 최근 포스팅을 거의 못해서 그냥 올렸습니다.&lt;/p&gt;</description>
      <category>Backend/AI-Native</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/521</guid>
      <comments>https://jaeseo0519.tistory.com/521#entry521comment</comments>
      <pubDate>Sat, 21 Mar 2026 00:58:05 +0900</pubDate>
    </item>
    <item>
      <title>디프만 18기 서버 파트 합격 후기</title>
      <link>https://jaeseo0519.tistory.com/520</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Introduction&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYsSkT/dJMb99Mh3YX/uskjd8id313qFAKqGBdSn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYsSkT/dJMb99Mh3YX/uskjd8id313qFAKqGBdSn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYsSkT/dJMb99Mh3YX/uskjd8id313qFAKqGBdSn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYsSkT%2FdJMb99Mh3YX%2Fuskjd8id313qFAKqGBdSn1%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;700&quot; height=&quot;285&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;550&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;808&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9h49/dJMcadgSpvF/rdYBw7P2TCZf4AJVLIhjPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9h49/dJMcadgSpvF/rdYBw7P2TCZf4AJVLIhjPK/img.png&quot; data-alt=&quot;왜 붙은 거지.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9h49/dJMcadgSpvF/rdYBw7P2TCZf4AJVLIhjPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9h49%2FdJMcadgSpvF%2FrdYBw7P2TCZf4AJVLIhjPK%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;309&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;625&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;서류부터 면접까지 아무것도 제대로 된 준비를 하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;못한 건지, 안 한 건지를 고민을 해봤는데 못했다고 보는 것이 맞다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디프만의 선발 과정을 얕본 건 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 어디까지나 양자 택일 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 활동을 하던, 나에게 최우선 순위는 커리어여야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 최근 상당히 까다로운 태스크를 할당받아서 업무를 하고 있었기에, 이 업무를 끝내지도 못한 상태에서 외부 활동을 하겠다는 나의 선택에 많은 고민을 했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 의욕만 앞선 행위라면, 회사나 동아리 양쪽에 모두 피해를 주는 이기적인 행동이라 생각했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 무엇에 더 집중을 할 지 선택의 기로에 놓였었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동아리 활동 전에 업무에 모든 시간을 투자한다면 서류나 면접 준비에 소홀해질 것이고, 선발 과정에 시간을 쏟으면 그만큼 업무가 늘어져서 합격을 해도 문제가 될 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;그 외에도 7개나 벌려놓은 스터디들을 하나씩 정리하고, 활동 전에 최대한 많은 이들에게 포폴 첨삭을 해주고, 동아리 활동에 지장을 주지 않도록 공부도 미리 다 끝내놔야만 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 되면 서류 작성은 하루, 면접 준비는 기껏해야 30분밖에 할애하지 못한다는 계산이 섰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고작 이 정도 준비밖에 안 했으면서 붙을 거라는 뻔뻔한 기대는 하지 않았고, 당연히 도중에 떨어질 거라 예상했는데 어찌저찌 붙었다. (물론 마인드 만큼은 언제나 월클이었다. '날 떨어트리면 너희 손해임.')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 기수 개발자 최고 경쟁률이 8.1:1 정도로 이전 기수들보다 확연히 저조해졌던데, 그게 아니었다면 반드시 떨어졌을 것이라 본다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Why Depromeet?&lt;/b&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;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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;하나의 집단에만 소속되면 필연적으로 우물 안 개구리가 되어 간다. 난 그 기분이 끔찍하게도 싫었다. (집단 구성원들의 실력과는 무관한 이야기)&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: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;학생 때 남은 유일한 미련은 모든 프로젝트가 결국 실패로 끝났다는 것.&lt;/li&gt;
&lt;li&gt;자사 서비스에 아무리 애정을 가진다고 해도, 결국 이건 내 것이 될 수 없다는 현실.&lt;/li&gt;
&lt;li&gt;그렇다면 '나는 여전히 로컬 호스트조차 벗어나지 못한 반쪽짜리 개발자가 아닌가?'라는 고민.&lt;/li&gt;
&lt;li&gt;AI 덕에 혼자서 제품을 만들 수 있는 시대가 오긴 했으나, 나의 고질적인 문제는 혼자 프로젝트를 하면 자꾸 딴 길로 샌다는 점이 치명적이었다. (지도에 위치 찍다가 삼각측량 공식을 음미하고 있는 게 말이 되나) 나의 연구욕이 뻗어나가는 걸 방지해줄 가이드레일이 필요했다.&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;p data-ke-size=&quot;size16&quot;&gt;원래는 특수 대학원에서 석사 학위를 준비하려고 했으나, 돈이 어지간히도 많이 깨진다는 불편한 사실...과 더불어 아직은 연구보다는 프로덕트에 좀 더 관심이 많다는 변변찮은 이유로 외부 동아리를 택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;다른 외부 동아리도 많긴 하던데, 굳이 더 알아볼 필요는 없다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/depromeet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;디프만 공식 깃헙 페이지&lt;/a&gt;에서 11기부터 18기까지 한 명도 빠짐없이 전직군의 프로필을 훑어보고 만족했기에, 굳이 여기서 선택지를 더 늘려 집중력을 흐리고 싶지 않았다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Resume&lt;/b&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;(500자)&lt;/li&gt;
&lt;li&gt;디프만은&amp;nbsp;약&amp;nbsp;4개월간&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;(500자)&lt;/li&gt;
&lt;li&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;노력을&amp;nbsp;했는지&amp;nbsp;구체적으로&amp;nbsp;서술해&amp;nbsp;주세요.&amp;nbsp;(500자)&lt;/li&gt;
&lt;li&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;(700자)&lt;/li&gt;
&lt;li&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;(700자)&lt;/li&gt;
&lt;li&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;700자)&lt;/li&gt;
&lt;li&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;1,000자)&lt;/li&gt;
&lt;li&gt;자소서 or 포트폴리오&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(요샌 동아리나 해커톤 질문 문항이 회사 지원 서류의 질문 문항보다 많은 것 같다. 정신이 살짝 아득해질 뻔.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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 data-ke-size=&quot;size16&quot;&gt;나도 일정 관리도 못 하면서 열정만으로 일을 벌리는 무능한 사람, 더 이상 인풋은 하지 않고 아웃풋만 하는 사람을 싫어하긴 하나, 이런 요소들은 당췌 증명하기가 까다롭다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 1~6번 문항 전체를 문제 해결 역량보다 커뮤니케이션 역량과 일정 관리 능력, 책임감과 유연성에 초점을 맞춰 작성했고, 기술적인 부분은 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;그들이 판단하기에 내가 디프만과 맞지 않은 성향이라면 마땅히 걸러내주기를 바랐고, 그것이 서로에게 이득이 되는 방향이라고 믿었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 자기 PR을 주장이나 감정 호소로 하는 것을 좋지 않게 보기에, 최대한 실증적인 증거와 구체적 계획을 제시하려고 노력은 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 오래된 포트폴리오까지 하루만에 전부 갱신하려니 시간이 너무 빠듯해서 첨삭은 못하고 그냥 제출했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접 전에 다시 한 번씩 훑어봤는데, 이상한 내용도 적어놓은 걸 뒤늦게 발견해서 '아, 망했네'라고 생각했을 정도였으니 말이 더 필요없지 않을까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직도 서류 왜 붙었는지 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Interview&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 면접도 가장 첫 날 오후 2시에 잡혔었는데, 오후 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;물론 이렇게까지 배짱을 부리게 된 나름의 3가지 이유가 있긴 했다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;제출한 자소서랑 블로그 기반으로 질문이 많이 나온다는 정보를 이미 확인했었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자소서에 적은 내용들은 취준할 때 질릴만큼 봤던 내용들이기도 하고, 평소에도 워낙 많은 회고를 하니까 굳이 특별하게 더 준비할 게 없었다.&lt;/li&gt;
&lt;li&gt;만약 블로그 기반으로 질문을 했는데 답변을 못한다? 있어서는 안 될 일이다. 그런 불상사가 발생하면 합불이 중요한 사안이 아니다. 스스로의 해이해진 기강을 바로 세워야 하는 문제다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커피챗 분위기라고 많은 후기에 적혀있기도 하고, 설마 경력으로 지원했는데 CS를 물어볼까 싶어서 패스했다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설령 CS 질문이 나왔어도 답을 못했다면 문제다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;클로드한테 디프만 정보 조사해서 면접관 페르소나 확립시킨 후에, 내 자소서와 블로그 기반으로 예상 질문을 리스트 업을 시켜봤었다. 100개 질문 정도를 빠르게 스캔해봤는데, 딱히 답변에 걸리는 부분이 없어서 문제 없다고 판단했다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 마인드로 면접 당일 구글밋에 접속했고, 나랑 같은 현직자와 함께 다대다 면접을 봤다.&lt;/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;면접 직전 이번 기수 운영진 구성을 확인했을 때 가장 취약한 쪽은 iOS 쪽이었고, 그렇다면 분명 iOS 유관 경험이 있는 내게 구미가 당길 수밖에 없다고 생각했다.&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;이건 진짜 어떻게 붙은 거지.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가 dramatic한 변화가 있을 거라고는 기대를 하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;</description>
      <category>Review</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/520</guid>
      <comments>https://jaeseo0519.tistory.com/520#entry520comment</comments>
      <pubDate>Sat, 7 Mar 2026 16:41:03 +0900</pubDate>
    </item>
    <item>
      <title>[요즘 개발자를 위한 시스템 설계 수업] 1부 1~3장</title>
      <link>https://jaeseo0519.tistory.com/519</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;설 연휴 기간 동안 하루도 쉰 적이 없는데 불구하고, 너무 바빠서 블로그 포스팅을 할 겨를이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작하기 앞서, 이건 별로 추천하고 싶은 책은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번역이 이상한 부분도 있고, 내용 자체가 틀린 점도 있으며, 설명이 상당히 불친절하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챕터 순서 배치도 뭔가 이상하게 짜여 있어서 이해를 방해한다는 느낌까지 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 시스템 설계 책은 구체적인 usecase를 던져주고 필요한 때에 적절히 지식을 던져주는데, 이 책은 &quot;일단 먹어. 그리고 그걸 먹은 이유는 나중에 설명해줄게&quot;라는 식으로 전개가 되어 혼란을 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 와중에 내용이 워낙 어려우니 쉽게 설명하려고 얕은 부분만 적어놨는데, 필요한 내용까지도 덜어내는 덕에 책만으로는 절대 이해할 수 없는 상황을 만들어 놨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Practical Byzantine Fault Tolerance에 대한 설명은 몽땅 덜어내놓고 직후에 뜬금없이 FLP impossibility 내용이 나오던데, 논문을 읽어보니 전자의 기본 전제가 후자와 연관된 것이었다. 그런데 책에서 이런 관계성을 건너 뛰는 경우가 너무 많고, 하더라도 논문을 제대로 읽은 게 맞나 싶을 정도로 오류도 많아서 당혹스러웠다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 어느 정도 흐름을 이해한 사람들이야 적당히 필요한 부분만 섭취하고 넘기겠지만, 첫 시스템 설계 수업을 이 책으로 공부한다고 하면 말리고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 왜 했냐고? 회사에서 이걸로 스터디를 하니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하여간 이런 이유들로 인해 책과 다르거나, 없는 이야기도 많이 다룰 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;1. 시스템 설계의 기본&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  시스템 설계의 정의&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2347&quot; data-origin-height=&quot;1294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d75AGx/dJMcai98Oob/52jFes8bYX4GAJ8wPRfYZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d75AGx/dJMcai98Oob/52jFes8bYX4GAJ8wPRfYZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d75AGx/dJMcai98Oob/52jFes8bYX4GAJ8wPRfYZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd75AGx%2FdJMcai98Oob%2F52jFes8bYX4GAJ8wPRfYZ0%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;700&quot; height=&quot;386&quot; data-origin-width=&quot;2347&quot; data-origin-height=&quot;1294&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://en.wikipedia.org/wiki/Software_system&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;wikipedia&lt;/a&gt;와 달리, 책에서는 software 관점에서 선을 긋고 운영 및 기능 관점으로 실용적으로 정의를 해두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 데이터 관리, 트랜잭션 처리, 최종 사용자를 위한 서비스 제공 등이 소프트웨어 시스템에 속한다라고 명시하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &quot;시스템을 설계한다&quot;란, 요구 사항 달성을 위해 시스템 아키텍처, 구성 요소, 인터페이스와 같은 여러 특성을 정의해나가는 과정이라고 설명하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;1268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnd8DU/dJMcacPFLLY/vFTir6Arl9t4KbooNXvpG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnd8DU/dJMcacPFLLY/vFTir6Arl9t4KbooNXvpG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnd8DU/dJMcacPFLLY/vFTir6Arl9t4KbooNXvpG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnd8DU%2FdJMcacPFLLY%2FvFTir6Arl9t4KbooNXvpG0%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;700&quot; height=&quot;380&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;1268&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;흔히 아는 서버 한 대로 돌아가는 중앙 집중형 시스템과 물리적으로 분산되어 있는 서버 클러스터로 운영하는 분산 시스템이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Centralized System
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;모든 처리와 데이터가 단일 중앙 노드에 집중&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Distributed System
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;지리적으로 다른 위치와 네트워크에 걸쳐서 여러 노드가 통신하며 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;협력&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;과거에는 단순히 개별 컴퓨터가 물리적으로 분산된 컴퓨터 네트워크만을 의미했었다.&lt;/li&gt;
&lt;li&gt;최근에는 개념이 확장되어 &quot;협력&quot;이라는 단어가 중요해졌다. wiki 정의에서도 &quot;The components of a distributed system communicate and coordinate their actions by passing messages to one another in order to achieve a common goal.&quot;이라고 정의한다.&lt;/li&gt;
&lt;li&gt;다만 분산 시스템에 대한 단일 정의가 없어서, 일반적으로 두 가지 공통 속성을 포함해야 한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;여러 개의 자율적인 컴퓨팅 개체가 존재하고, 각각은 자체 로컬 메모리를 갖는다.&lt;/li&gt;
&lt;li&gt;개체들은 메시지 전달을 통해 서로 통신한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다양한 통신 프로토콜로 소통
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;e.g., RPC(Remote Procedure Call), message passing, publish/subscribe model 등&lt;/li&gt;
&lt;/ul&gt;
&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;p data-ke-size=&quot;size16&quot;&gt;중앙 집중형 시스템을 모놀리식, 분산 시스템의 유형 중 하나를 MSA로 불러도 되는지에 대해서는 의문이 남는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적인 견해로는 중앙 집중 vs. 분산형은 단순히 &quot;어디서 실행하냐&quot;를 논하고, &quot;코드를 어떻게 패키징 하느냐&quot;를 논하는 게 모놀리식 vs. MSA의 가장 큰 차이라고 보는데, 그렇다고 MSA가 단순 배포 관점만 고려하지도 않기 때문에 엄밀하게 구분이 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모놀리식 구조의 코드 베이스라도 지리적으로 분리된 여러 인프라에 분산하는 게 불가능한 것도 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리가 단순히 infra topology 나누었다고 분산 시스템이라고 부르지도 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Decentralized_computing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Decentralized Computing&lt;/a&gt;이라 보는 게 맞을까 싶었는데, 단순 monolithic replica는 wiki 정의(= Decentralized computing is the allocation of resources, both hardware and software, to each individual workstation, or office location. (...) A collection of decentralized computers systems are components of a larger computer network, held together by local stations of equal importance and capability.)와 그리 딱 맞아 떨어지지도 않는다. (자율적이고 대등한 노드로서 독립적 의사 결정을 하기보다는, 중앙 인프라에 종속된 동일한 복제본일 뿐인 것 같다고 여겼기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애초에 단일한 정의가 없는 분산 시스템이나 MSA 같은 용어의 관계성을 억지로 이어 붙이려고 하다보니 이런 문제가 발생하는 듯.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통일 좀 해주면 안 될까??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nk1i4/dJMcah4vSY6/QDiTxoLa8YNmJsBVeM4tiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nk1i4/dJMcah4vSY6/QDiTxoLa8YNmJsBVeM4tiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nk1i4/dJMcah4vSY6/QDiTxoLa8YNmJsBVeM4tiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNk1i4%2FdJMcah4vSY6%2FQDiTxoLa8YNmJsBVeM4tiK%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;700&quot; height=&quot;387&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1297&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;물론 이론적인 내용이고, 실제로 일해보면 이상한 순서로 굴러가는 과정도 많긴 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 대부분 회사는 사용할 수 있는 infra가 고정되어 있다보니, infra를 중심으로 설계를 하게 되는 경우도 많음.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  시스템 설계의 다양한 유형&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;1275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogvhs/dJMcaaYBCJg/sKdZgJvxXMTrXXsx3nOdZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogvhs/dJMcaaYBCJg/sKdZgJvxXMTrXXsx3nOdZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogvhs/dJMcaaYBCJg/sKdZgJvxXMTrXXsx3nOdZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fogvhs%2FdJMcaaYBCJg%2FsKdZgJvxXMTrXXsx3nOdZ1%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;700&quot; height=&quot;383&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;1275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항을 분석했으면, &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;요구사항에 맞는 시스템&lt;/b&gt;&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;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;한정된 자원으로 문제를 해결하여 결과를 창출&lt;/b&gt;&lt;/span&gt;하기 위함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나를 포함한 많은 엔지니어가 &quot;문제를 해결&quot;하는 것에만 너무 많은 관심을 기울이는 나머지, &quot;한정된 자원&quot;과 &quot;결과 창출&quot;의 중요성을 쉽게 망각한다고 느낀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결과를 해결하지 못하는 솔루션을 내오거나, 온갖 상황을 고려하다가 필요 이상의 스펙을 설계하는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lezZ9/dJMcahXJ3Wr/PjoUNN7pmBpU6OMxvrTb7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lezZ9/dJMcahXJ3Wr/PjoUNN7pmBpU6OMxvrTb7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lezZ9/dJMcahXJ3Wr/PjoUNN7pmBpU6OMxvrTb7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlezZ9%2FdJMcahXJ3Wr%2FPjoUNN7pmBpU6OMxvrTb7K%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;700&quot; height=&quot;380&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1271&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  업계에서 시스템 설계가 갖는 중요성&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2pwcI/dJMcaiCj0w6/RJcxur1QkNIVKH9wBsHKr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2pwcI/dJMcaiCj0w6/RJcxur1QkNIVKH9wBsHKr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2pwcI/dJMcaiCj0w6/RJcxur1QkNIVKH9wBsHKr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2pwcI%2FdJMcaiCj0w6%2FRJcxur1QkNIVKH9wBsHKr1%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;700&quot; height=&quot;352&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서 &quot;시스템 설계를 하면 명확한 이해와 협업의 시너지 효과, 설계 검토 및 피드백 가능성, 높은 확장성, 성능, 유지 보수성, 그리고 비용 효율성이 있기 때문에 중요하다&quot;고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리적으로 틀린 설명이다.&lt;/p&gt;
&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: #ef5369;&quot;&gt;&lt;b&gt;시스템 설계 자체가 이를 보장하는 것은 아니다.&lt;/b&gt;&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;&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;2. 분산 시스템의 속성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2304&quot; data-origin-height=&quot;1285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjhcqw/dJMcaa5nX1W/cYzw1xgMnaY7FC83XWe6sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjhcqw/dJMcaa5nX1W/cYzw1xgMnaY7FC83XWe6sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjhcqw/dJMcaa5nX1W/cYzw1xgMnaY7FC83XWe6sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjhcqw%2FdJMcaa5nX1W%2FcYzw1xgMnaY7FC83XWe6sk%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;700&quot; height=&quot;390&quot; data-origin-width=&quot;2304&quot; data-origin-height=&quot;1285&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;핵심 단어들을 열거하는 식으로 진행을 하는데, 일부 내용은 설명을 포기한 수준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일관성, 가용성, 파티션 허용성은 CAP 이론 설명 빌드업이고, 나머지는 CAP 이론의 한계를 확장한 이론들을 설명하기 위함이거나, 분산 시스템을 논할 때 고민하는 다른 factor들이라고 보면 된다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  호텔 객실 예약 시스템으로 살펴보는 분산 시스템 예시&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2323&quot; data-origin-height=&quot;1201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b39cpA/dJMcabXwme8/nMr39t96Oqc3G9kToMzk2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b39cpA/dJMcabXwme8/nMr39t96Oqc3G9kToMzk2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b39cpA/dJMcabXwme8/nMr39t96Oqc3G9kToMzk2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb39cpA%2FdJMcabXwme8%2FnMr39t96Oqc3G9kToMzk2K%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;700&quot; height=&quot;362&quot; data-origin-width=&quot;2323&quot; data-origin-height=&quot;1201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;이런 상황에서 client로부터 &quot;예약(=쓰기 작업)&quot;과 &quot;빈 방 조회(=읽기 작업)&quot;를 어떻게 처리할 수 있을까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 매번 모든 DB에 쓰기를 요청할 수도 있고, master에만 쓰기 요청을 하면 비동기로 slave에 동기화를 할 수도 있을 것이며, 서버가 모든 DB에 요청을 보내지만 threshold개(threshold &amp;lt; N)만큼 성공 응답이 돌아오면 성공으로 간주할 수도 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽기 작업도 마찬가지다.&lt;/p&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에 쓰기 요청을 하고 성공 응답을 받겠다고 한다면 Consistency는 높아지지만 Latency도 함께 높아져서 사용자가 불편함을 겪을 수도 있고, 일부만 쓰기 요청을 하면 Consistency가 떨어져서 사용자가 stale data를 보게 될 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Latency도 낮추고 Consistency도 높일 수 있으면 정말 좋겠지만, 이후 배울 CAP thorem에 의하면 이 둘을 동시에 충족하는 것은 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니, 우리는 policy 선택을 위해 많은 것들을 고려해야 한다.&lt;/p&gt;
&lt;p data-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;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Consistency&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2294&quot; data-origin-height=&quot;1275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vW5gK/dJMcagxJ9s8/zzrnVKgeFZbrp8m2O0gVj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vW5gK/dJMcagxJ9s8/zzrnVKgeFZbrp8m2O0gVj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vW5gK/dJMcagxJ9s8/zzrnVKgeFZbrp8m2O0gVj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvW5gK%2FdJMcagxJ9s8%2FzzrnVKgeFZbrp8m2O0gVj1%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;700&quot; height=&quot;389&quot; data-origin-width=&quot;2294&quot; data-origin-height=&quot;1275&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;DB Transaction ACID 속성에서 consistency가 단순히 &quot;하나의 유효한 상태에서 다른 유효한 상태로 전이시켜야 한다&quot;는 규칙이라면, distributed system에서 consistency는 &quot;모든 노드가 동일한 시점에 동일한 데이터를 보는 것&quot;을 의미하므로 완전히 다른 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CAP에서 Consistency는 Linearizability에 대한 이야기다. (&lt;a href=&quot;https://cs.brown.edu/~mph/HerlihyW90/p463-herlihy.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Linearizability: A Correctness Condition for Concurrent Object(1990)&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 &quot;복제본이 여러 개 있어도, 마치 하나만 있는 것처럼 동작하느냐&quot;, 즉 동시성 환경에서 &quot;올바르다&quot;는 것이 무엇인지를 정의하는 기준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 잘 알려진 Quorum Consensus Protocol의 기준에 따르면, 합의체가 의사를 진행하고 의결하는데 필요한 최소 구성원 출석수를 쓰기/읽기 각각 분리하여 계산한 후에 R+ W 관계에 따라 일관성 모델을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(책에서 R + W &amp;le; N을 최종 일관성 모델이라고 지칭하던데 명백히 틀린 내용이다. 약한 일관성이라고 부르는 것이 맞고, 여기에 추가적인 메커니즘이 도입되어야 최종 일관성 모델이 된다.)&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;2326&quot; data-origin-height=&quot;1272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br3RJp/dJMcaiWB5bZ/TvMXOjWmsVuH0DzujtGsEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br3RJp/dJMcaiWB5bZ/TvMXOjWmsVuH0DzujtGsEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br3RJp/dJMcaiWB5bZ/TvMXOjWmsVuH0DzujtGsEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr3RJp%2FdJMcaiWB5bZ%2FTvMXOjWmsVuH0DzujtGsEK%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;700&quot; height=&quot;383&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1272&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;2325&quot; data-origin-height=&quot;1223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfYKsJ/dJMcahKd33d/2XgKQ9jfLC9392Nf0VeDRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfYKsJ/dJMcahKd33d/2XgKQ9jfLC9392Nf0VeDRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfYKsJ/dJMcahKd33d/2XgKQ9jfLC9392Nf0VeDRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfYKsJ%2FdJMcahKd33d%2F2XgKQ9jfLC9392Nf0VeDRk%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;700&quot; height=&quot;368&quot; data-origin-width=&quot;2325&quot; data-origin-height=&quot;1223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서 2PC, SAGA 패턴은 다루지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 예전에 (전혀 관련도 없는) &lt;a href=&quot;https://jaeseo0519.tistory.com/416&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;일관성 모델에 대한 내용도 &lt;a href=&quot;https://jaeseo0519.tistory.com/452&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Availability&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2315&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqTtJC/dJMcaiWB5dG/FkvPbAtWBaHiZtNA4mrku1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqTtJC/dJMcaiWB5dG/FkvPbAtWBaHiZtNA4mrku1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqTtJC/dJMcaiWB5dG/FkvPbAtWBaHiZtNA4mrku1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqTtJC%2FdJMcaiWB5dG%2FFkvPbAtWBaHiZtNA4mrku1%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;700&quot; height=&quot;378&quot; data-origin-width=&quot;2315&quot; data-origin-height=&quot;1250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어려운 개념은 아닌데, 기존에 알고 있던 Availability의 정의와는 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 Application의 Availability는 SLA(Service Level Aggrement)같은 방법으로 측정을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 정상적인 요청의 99.9%가 1s 이내에 성공적인 응답을 반환해야 한다는 명세가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 CAP에서 A를 측정하는 metric에는 latency가 고려되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 응답에 10s가 소요되어도 아무튼 응답만 하면 Availability를 충족한다고 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 서로 다른 데이터 센터 사이에 network partition이 발생해서 동기화가 되지 않음에도 availability를 보장하기 위해 stale data 응답을 반환하는 것을 허용한다면, 이는 non-linearizable하므로 consistency의 정의에 부합하는 행위가 된다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Partition Tolerance&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2321&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckVICz/dJMb99ZJz2V/ThKJunNlkpPEx1hsdQV9UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckVICz/dJMb99ZJz2V/ThKJunNlkpPEx1hsdQV9UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckVICz/dJMb99ZJz2V/ThKJunNlkpPEx1hsdQV9UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckVICz%2FdJMb99ZJz2V%2FThKJunNlkpPEx1hsdQV9UK%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;700&quot; height=&quot;337&quot; data-origin-width=&quot;2321&quot; data-origin-height=&quot;1116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CAP의 &quot;2 of 3&quot; 선택을 강요하게 만드는 본질적인 문제.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 매우 좁은 영역이 아닌 이상, netwrok partition을 피할 방법이 없다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Latency&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2319&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brU4kn/dJMb99ZJz4V/ns5hqmBemhCM3vAVGI5jFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brU4kn/dJMb99ZJz4V/ns5hqmBemhCM3vAVGI5jFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brU4kn/dJMb99ZJz4V/ns5hqmBemhCM3vAVGI5jFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrU4kn%2FdJMb99ZJz4V%2Fns5hqmBemhCM3vAVGI5jFK%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;700&quot; height=&quot;359&quot; data-origin-width=&quot;2319&quot; data-origin-height=&quot;1190&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Durability &amp;amp; Fault Tolerance &amp;amp; Reliability&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;1257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brPTne/dJMcaaEkA8b/ZJaVf1gU7BUOcD5RhzOQV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brPTne/dJMcaaEkA8b/ZJaVf1gU7BUOcD5RhzOQV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brPTne/dJMcaaEkA8b/ZJaVf1gU7BUOcD5RhzOQV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrPTne%2FdJMcaaEkA8b%2FZJaVf1gU7BUOcD5RhzOQV0%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;700&quot; height=&quot;378&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;1257&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;내구성, 장애 허용성, 신뢰성의 구분을 명확히 해주지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내구성은 &quot;시스템이 죽든 말든, 저장된 데이터만 날아가지 않으면 돼&quot;라고 주장하며 데이터 관점만 고려하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장애 허용성은 &quot;노드 하나 죽어도 서비스가 중단만 안 하면 돼&quot;라고 하며 장애 발생 순간에만 중점을 둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, 신뢰성은 시간 축 위의 종합적인 품질이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;예를 들어, 카카오 데이터 센터 화재 당시에 IDC를 이중화 해둔 평행 세계가 존재한다고 가정해보자.&lt;/p&gt;
&lt;p data-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 style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Scalability&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2303&quot; data-origin-height=&quot;1259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rl9F2/dJMcadViqB2/jx2l50rKO2UlVLmzAXMta1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rl9F2/dJMcadViqB2/jx2l50rKO2UlVLmzAXMta1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rl9F2/dJMcadViqB2/jx2l50rKO2UlVLmzAXMta1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frl9F2%2FdJMcadViqB2%2Fjx2l50rKO2UlVLmzAXMta1%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;700&quot; height=&quot;383&quot; data-origin-width=&quot;2303&quot; data-origin-height=&quot;1259&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://jaeseo0519.tistory.com/390#3.%20%EC%88%98%EC%A7%81%EC%A0%81%20%EA%B7%9C%EB%AA%A8%20%ED%99%95%EC%9E%A5%20vs%20%EC%88%98%ED%8F%89%EC%A0%81%20%EA%B7%9C%EB%AA%A8%20%ED%99%95%EC%9E%A5-1&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;3. 분산 시스템의 이론과 데이터 구조&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  CAP theorem&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2392&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDWaFK/dJMcaaqMYSo/cXAsW9wq7ilsVS00kC75JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDWaFK/dJMcaaqMYSo/cXAsW9wq7ilsVS00kC75JK/img.png&quot; data-alt=&quot;개인적으로 저 벤다이어그램도 구시대 산물이니 지워버려야 한다고 생각한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDWaFK/dJMcaaqMYSo/cXAsW9wq7ilsVS00kC75JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDWaFK%2FdJMcaaqMYSo%2FcXAsW9wq7ilsVS00kC75JK%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;700&quot; height=&quot;394&quot; data-origin-width=&quot;2392&quot; data-origin-height=&quot;1346&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;대중적으로 가장 잘 알려진 CAP 속성은 &quot;2 of 3&quot;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;3개 중 2개만 선택할 수 있다&quot;는 표현이 오해를 불러일으킬 여지가 많다는 건 Brewer가 직접 인정했고, &lt;a href=&quot;https://sites.cs.ucsb.edu/~rich/class/cs293b-cloud/papers/brewer-cap.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CAP Twelve Years Later: How the &amp;ldquo;Rules&amp;rdquo; Have Changed(2012)&lt;/a&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;CAP 이론을 이해하려면, 왜 Distributed System에서 많고 많은 요소 중 CAP를 최우선으로 고려하는지 알 필요가 있다.&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;2333&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpHHNA/dJMcadudhQm/gEyD0Uc72CFxHArNw3griK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpHHNA/dJMcadudhQm/gEyD0Uc72CFxHArNw3griK/img.png&quot; data-alt=&quot;아래 그림에서 X 표시를 node에 해놨는데, edge에 X 표시를 하는 게 더 적절했다. partition이 node 장애를 의미하지는 않기 때문. 옛날에 그렸던 걸 그대로 가져와버려서 수정하기도 어려움.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpHHNA/dJMcadudhQm/gEyD0Uc72CFxHArNw3griK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpHHNA%2FdJMcadudhQm%2FgEyD0Uc72CFxHArNw3griK%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;700&quot; height=&quot;379&quot; data-origin-width=&quot;2333&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아래 그림에서 X 표시를 node에 해놨는데, edge에 X 표시를 하는 게 더 적절했다. partition이 node 장애를 의미하지는 않기 때문. 옛날에 그렸던 걸 그대로 가져와버려서 수정하기도 어려움.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본래 Distributed System이 등장한 초기 목적은 Availability가 가장 큰 비중을 차지했을 것이라 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 제 아무리 고성능 HW로 scale-up을 해도 IDC가 테러라도 당하면 무용지물이었을테니.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 막상 분리하려고 보니 Consistency 문제가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이상적인 환경에서는 Availability와 Consistency를 모두 충족시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CA system을 선택하더라도 애초에 network partition이 발생하지 않으니 P는 고려할 이유가 없어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node1에 기록된 데이터는 언제나 n2, n3에 자동으로 복제될 테니까. (CAP에선 latency를 고려하지 않음을 기억하자.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Network Partition 문제를 피할 수가 없다&lt;/b&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;예를 들어, node1에 write를 하고 node3에서 read를 하고 있었는데 network partition이 발생했다고 치자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여전히 node1에 쓰고, node3에서 읽는 것은 가능하나 stale data를 읽게 될 가능성이 농후하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 CAP 이론은 우리는 둘 중 하나를 선택해야 한다고 이야기를 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node3가 가진 데이터로만 응답한다 = consistency 포기&lt;/li&gt;
&lt;li&gt;지금은 응답할 수 없다고 거부한다 = avilability 포기&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;그런데 node1과 node3 사이에 network partition이 발생했을 뿐, 여전히 application은 모든 node와 통신이 가능하다면 어떨까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application이 node3만 읽지 않고, 다른 nodes도 read를 해서 consensus를 한다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 여전히 system은 linearizable하다고 볼 수 있어야 하지 않을까?&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: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;노드는 살아있지만, 특정 노드 사이의 네트워크가 끊겨 메시지가 지연/손실되는 상황&lt;/li&gt;
&lt;li&gt;node1-node3 간 링크가 끊어졌다면 서로의 상태를 동기화할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;애플리케이션이 모든 노드와 통신 가능하다는 조건&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;node1과 node3 링크는 끊겨 있음에도 양쪽이 독립적으로 write/read를 할 수 있는 구조라면, 선형성을 보장하기 위해 &lt;b&gt;어느 한쪽(또는 일부 연산)은 차단&lt;/b&gt;해야만 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;node3만 읽지 않고 다른 node도 읽어서 consensus를 수행한다면?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;partition이 발생한 쪽에서 quorum을 이루지 못하면 write를 거부하고, read도 linearizability를 보장하도록 만들고, 언제나 application이 그런 경로로만 읽고 쓰게 만든다면 맞는 말이다. 이렇게 하면 partition이 발생해도 linearizability를 보장할 수 있다.&lt;/li&gt;
&lt;li&gt;그러나 이 경우는 CAP의 정의(= 모든 살아있는 노드가 정상적인 요청을 처리해야 한다)와 달리 partition의 소수 쪽 요청을 실패시키거나 차단하므로, CAP-availability를 포기했다고 봐야 한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&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;이런 너무 엄격한 CAP 정의 때문에 실무적 판단과 동떨어져 있다고 비판하는 경우도 많다.&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;2328&quot; data-origin-height=&quot;1187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BhCrC/dJMb99L9kBm/zfVG1T4AHbIwbqNnPCORJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BhCrC/dJMb99L9kBm/zfVG1T4AHbIwbqNnPCORJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BhCrC/dJMb99L9kBm/zfVG1T4AHbIwbqNnPCORJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBhCrC%2FdJMb99L9kBm%2FzfVG1T4AHbIwbqNnPCORJK%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;700&quot; height=&quot;357&quot; data-origin-width=&quot;2328&quot; data-origin-height=&quot;1187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하여간 CAP는 &quot;2 of 3&quot;보다는 가중치의 문제로 봐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가용성은 0~100%의 연속값이고, 일관성도 여러 수준이 있으며, 파티션조차 시스템 내에 파티션이 존재하는지에 대한 의견 불일치까지 고려해야 한다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  PACELC 정리&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o61Th/dJMcaaRSmz7/x2RpYLK3qf5lKxST9k3wek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o61Th/dJMcaaRSmz7/x2RpYLK3qf5lKxST9k3wek/img.png&quot; data-alt=&quot;PACELC가 뭔가 싶을 수 있는데, 위에 나오는 핵심 용어 앞글자만 모두 따서 붙이는 것.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o61Th/dJMcaaRSmz7/x2RpYLK3qf5lKxST9k3wek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo61Th%2FdJMcaaRSmz7%2Fx2RpYLK3qf5lKxST9k3wek%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;700&quot; height=&quot;384&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1289&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PACELC가 뭔가 싶을 수 있는데, 위에 나오는 핵심 용어 앞글자만 모두 따서 붙이는 것.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CAP 이론의 한계는 partition이 발생하지 않았을 때(ELSE)를 고려하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 PACELC는 정상 상태에서 latency와 consistency를 고려하도록 알고리즘을 확장시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 여기서 책이 급발진을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이랬을까 고민을 해봤는데, latency와 consistency를 동시에 만족할 수 없는 이유를 우리의 뇌로 보여주고 싶었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;consistency를 포기할 수 없다면 공부 시간을 늘려서 latency를 희생하고, latency가 너무 길어져서 부담이 되면 consistency를 포기하라는 훌륭한 교훈을 몸소 체감하게 해준다.&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;2334&quot; data-origin-height=&quot;1281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpMjr/dJMcagR4Qep/GP7RJmtNOFzZEYCKTOwMVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpMjr/dJMcagR4Qep/GP7RJmtNOFzZEYCKTOwMVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpMjr/dJMcagR4Qep/GP7RJmtNOFzZEYCKTOwMVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtpMjr%2FdJMcagR4Qep%2FGP7RJmtNOFzZEYCKTOwMVk%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;700&quot; height=&quot;384&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1281&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;스탠포드 대학 학생들도 이해하는데 1년 가까이 걸렸다는 괴담이 존재한다. 농담이 아니라, 그 다음에 나올 Raft 합의 알고리즘이 그런 이유로 탄생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The&amp;nbsp;Part-Time&amp;nbsp;Parliament(1998)&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;a href=&quot;https://en.wikipedia.org/wiki/Paxos_(computer_science)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;wiki&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;2347&quot; data-origin-height=&quot;1295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQJQc0/dJMcagEyrDE/LtpjsA2FxhhlvI751CNEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQJQc0/dJMcagEyrDE/LtpjsA2FxhhlvI751CNEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQJQc0/dJMcagEyrDE/LtpjsA2FxhhlvI751CNEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQJQc0%2FdJMcagEyrDE%2FLtpjsA2FxhhlvI751CNEK1%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;700&quot; height=&quot;386&quot; data-origin-width=&quot;2347&quot; data-origin-height=&quot;1295&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://classpages.cselabs.umn.edu/Spring-2018/csci8980/Papers/Consensus/Raft.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;In&amp;nbsp;Search&amp;nbsp;of&amp;nbsp;an&amp;nbsp;Understandable&amp;nbsp;Consensus&amp;nbsp;Algorithm(2014)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목부터 &quot;Understandable&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;이해가 안 간다는 얘기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Paxos는 단일 값에 대한 합의를 기본으로 놓고, 이를 여러 개 조합해서 로그를 만드는데, 이 기본 단위인 single-decree Paxos 자체가 두 단계(prepare/accept)로 나뉘어져 있으면서, 각 단계가 독립적으로는 직관적 설명이 어려웠다고 한다. (e.g., &quot;왜 prepare 단계에서 promise를 받아야 하는가?&quot;에 대한 답은 accept 단계와 함께 봐야만 이해가 되는 구조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 와중에 실제 시스템 만들려면 multi-Paxos가 필요한데, Lamport 원 논문에서 multi-Paxos는 스케치 수준으로 끝나는 덕에 춘추 전국 시대를 열어젖혀버렸다는 후문이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Raft는 &quot;강한 리더가 있다&quot;는 전제를 먼저 깔고, 리더는 어떻게 선출하고, 리더가 어떻게 로그를 복제하고, 이 과정에서 안전성은 어떻게 보장되는가로 문제를 쪼개버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론적 일반성은 포기했지만, 몇 가지 전제를 더 확고히 깔아버리면서 경우의 수를 줄였다고 봐야한달까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 나도 심심해서 논문 조금 훑어보다가 머리 아파서 닫아버렸다.&lt;/p&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  The Byzantine Generals Problem&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1KlVq/dJMcahKd4bI/zOZ6FL9ubniTnkHPxC3Kgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1KlVq/dJMcahKd4bI/zOZ6FL9ubniTnkHPxC3Kgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1KlVq/dJMcahKd4bI/zOZ6FL9ubniTnkHPxC3Kgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1KlVq%2FdJMcahKd4bI%2FzOZ6FL9ubniTnkHPxC3Kgk%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;700&quot; height=&quot;370&quot; data-origin-width=&quot;2343&quot; data-origin-height=&quot;1240&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://lamport.azurewebsites.net/pubs/byz.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The&amp;nbsp;Byzantine&amp;nbsp;Generals&amp;nbsp;Problem(1982)&lt;/a&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;Paxos, Raft 때와 달리 node 자체를 신뢰할 수 없는 경우까지 고려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 위 논문의 방법은 속도가 너무 느려서 실제로 적용하기엔 무리가 있다.&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;2340&quot; data-origin-height=&quot;1249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBiJEF/dJMb99SVYgt/Kp5DxwISDZd0nZuBqiFyS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBiJEF/dJMb99SVYgt/Kp5DxwISDZd0nZuBqiFyS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBiJEF/dJMb99SVYgt/Kp5DxwISDZd0nZuBqiFyS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBiJEF%2FdJMb99SVYgt%2FKp5DxwISDZd0nZuBqiFyS0%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;700&quot; height=&quot;374&quot; data-origin-width=&quot;2340&quot; data-origin-height=&quot;1249&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://css.csail.mit.edu/6.824/2014/papers/castro-practicalbft.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Practical&amp;nbsp;Byzantine&amp;nbsp;Fault&amp;nbsp;Tolerance(1999)&lt;/a&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;아, 참고로 바로 밑에 나올 FLP 불가능성 정리가 background로 쓰였음을 확인하자.&lt;/p&gt;
&lt;p data-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;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  FLP Impossible&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2340&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJI34/dJMcahpUvNE/kCwlyv0MpgQ0bxmvR5Vv90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJI34/dJMcahpUvNE/kCwlyv0MpgQ0bxmvR5Vv90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJI34/dJMcahpUvNE/kCwlyv0MpgQ0bxmvR5Vv90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJI34%2FdJMcahpUvNE%2FkCwlyv0MpgQ0bxmvR5Vv90%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;700&quot; height=&quot;388&quot; data-origin-width=&quot;2340&quot; data-origin-height=&quot;1296&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://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Impossibility&amp;nbsp;of&amp;nbsp;distributed&amp;nbsp;consensus&amp;nbsp;with&amp;nbsp;one&amp;nbsp;faulty&amp;nbsp;process(1985)&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;쉽게 말해, &quot;모든 node가 언제나 동일한 state에서 동일한 input에 대해 동일한 상태 전이 혹은 output을 내놓는 환경 + 완전 비동기 시스템 환경 + 하나 이상의 프로세스가 장애가 발생할 수 있는 환경&quot;에서 safety와 liveness를 동시에 만족할 수 없다는 이야기.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;safety: replicated state machines가 linerizability를 만족하는 것. 동일한 input에 모든 nodes가 동일한 결과에 도달.&lt;/li&gt;
&lt;li&gt;liveness: 최종적으로 output을 내야 함.&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;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;느린 프로세스와 죽은 프로세스를 구분&lt;/b&gt;&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;Fully Asynchronous System &amp;rarr; 동기화된 클럭이 없으므로 구분 불가&lt;/li&gt;
&lt;li&gt;하나 이상의 결함 프로세스 &amp;rarr; 하나라도 예고 없이 영구히 멈출 수 있다면, 비동기 + 결정론적 알고리즘이 해결할 수 없음.&lt;/li&gt;
&lt;li&gt;결정론적 알고리즘 &amp;rarr; 느린 것과 죽은 것을 구분할 방도가 없는데, 영원히 기다리면 죽은 노드로 인한 liveness 위배, 무시하면 뒤늦게 도착한 메시지 때문에 safety 위배 가능&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;말이 좀 이상한데, &quot;하나 이상의 결함 프로세스&quot;를 포기한다는 의미는 하나도 결함이 없는 환경을 만족시키라는 의미.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 결정론적 알고리즘을 확률적 합의 알고리즘으로 바꾸는 것을 선택한다고 알고 있고, raft도 그 중 한 예라고 알고 있음.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Consisten Hashing&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1771750304616&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;[대규모 시스템 설계] 5장. 안정(일관성 있는) 해시 설계&quot; data-og-description=&quot;1. 수평적 규모 확장에서 고려할 점&amp;nbsp;  수평적 규모 확장 (Horizontal Scaling, Scale-Out)수평적 규모 확장성을 달성하기 위해서는 요청 또는 데이터를 서버에 균등하게 나눌 수 있어야 한다.클라이언&quot; data-og-host=&quot;jaeseo0519.tistory.com&quot; data-og-source-url=&quot;https://jaeseo0519.tistory.com/451&quot; data-og-url=&quot;https://jaeseo0519.tistory.com/451&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QxAV7/dJMb85WP33o/gOHLUOsDRjcrD3syfijv1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cTCA1H/dJMb85vLGz6/ChmIH9X6xQ6MUP0pgz4w90/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Rt3q0/dJMb84p5wja/rtW38NzIbRrf4EG3Ja4BXK/img.png?width=1107&amp;amp;height=765&amp;amp;face=0_0_1107_765&quot;&gt;&lt;a href=&quot;https://jaeseo0519.tistory.com/451&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeseo0519.tistory.com/451&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QxAV7/dJMb85WP33o/gOHLUOsDRjcrD3syfijv1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cTCA1H/dJMb85vLGz6/ChmIH9X6xQ6MUP0pgz4w90/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Rt3q0/dJMb84p5wja/rtW38NzIbRrf4EG3Ja4BXK/img.png?width=1107&amp;amp;height=765&amp;amp;face=0_0_1107_765');&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;[대규모 시스템 설계] 5장. 안정(일관성 있는) 해시 설계&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 수평적 규모 확장에서 고려할 점&amp;nbsp;  수평적 규모 확장 (Horizontal Scaling, Scale-Out)수평적 규모 확장성을 달성하기 위해서는 요청 또는 데이터를 서버에 균등하게 나눌 수 있어야 한다.클라이언&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeseo0519.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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Bloom Filter&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=rIl5G2aVfMQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/sA6Hg/dJMb8WMmlzW/ZrPCV2MQQVQlv8SyVjjTB0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;램값이 비쌀 때 쓰는 자료구조&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rIl5G2aVfMQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Count-Min Sketch&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cs.princeton.edu/courses/archive/spr04/cos598B/bib/CormodeM-hot.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;What&amp;rsquo;s&amp;nbsp;Hot&amp;nbsp;and&amp;nbsp;What&amp;rsquo;s&amp;nbsp;Not:&amp;nbsp;Tracking&amp;nbsp;Most&amp;nbsp;Frequent&amp;nbsp;Items&amp;nbsp;Dynamically(2005)&lt;/a&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;이거랑 이후에 나올 HyperLogLog는 AI한테 사이트 하나 만들어달라고 하고, 직접 만져보는 게 이해가 빠름.&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;1169&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLlovO/dJMcabDeRdC/SA3P2S5VAcmKIK2cGkVlQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLlovO/dJMcabDeRdC/SA3P2S5VAcmKIK2cGkVlQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLlovO/dJMcabDeRdC/SA3P2S5VAcmKIK2cGkVlQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLlovO%2FdJMcabDeRdC%2FSA3P2S5VAcmKIK2cGkVlQk%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;700&quot; height=&quot;586&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 독립적인 hash function 별로 행을 분리하고&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;1163&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZUnjp/dJMcacWp06o/NQv6QPtEm4Ia2FyfCrNjNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZUnjp/dJMcacWp06o/NQv6QPtEm4Ia2FyfCrNjNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZUnjp/dJMcacWp06o/NQv6QPtEm4Ia2FyfCrNjNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZUnjp%2FdJMcacWp06o%2FNQv6QPtEm4Ia2FyfCrNjNK%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;700&quot; height=&quot;501&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input을 hashing한 값을 각 열에 할당.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회할 때도 같은 hash function을 사용하므로 각 행에 대해 같은 열을 참조할 것이고, 그 중 최소값을 반환하는 자료 구조.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  HyperLogLog&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HyperLogLog:&amp;nbsp;the&amp;nbsp;analysis&amp;nbsp;of&amp;nbsp;a&amp;nbsp;near-optimal&amp;nbsp;cardinality&amp;nbsp;estimation&amp;nbsp;algorithm(2007)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유 원소 개수(cardinality)를 근사적으로 추정하는 자료 구조.&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;1075&quot; data-origin-height=&quot;1774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3lH0V/dJMcaaj1AAR/Bwz755ek0ZTUL024QnfKVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3lH0V/dJMcaaj1AAR/Bwz755ek0ZTUL024QnfKVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3lH0V/dJMcaaj1AAR/Bwz755ek0ZTUL024QnfKVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3lH0V%2FdJMcaaj1AAR%2FBwz755ek0ZTUL024QnfKVk%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;700&quot; height=&quot;1155&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;1774&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;HyperLogLog는 고유 원소 개수 정도만 알 수 있고, &quot;A라는 정보가 몇 개 있다&quot;나 &quot;고유 원소 중에 A가 있다&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;</description>
      <category>Reference/요즘 개발자를 위한 시스템 설계 수업</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/519</guid>
      <comments>https://jaeseo0519.tistory.com/519#entry519comment</comments>
      <pubDate>Sun, 22 Feb 2026 18:09:18 +0900</pubDate>
    </item>
    <item>
      <title>Strategy</title>
      <link>https://jaeseo0519.tistory.com/518</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;1. Introduction&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Dissonance&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;행위의 동기가 올바랐고, 결과가 좋았으니 고민하지 않아도 된다&quot;는 타인의 격려는 딱히 도움이 되지는 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세상 모든 사람들을 속일 수 있을 지언정, 나는 그 행위의 동기가 올바르지 않았고, 좋은 결과가 나온 건 내 덕분이 아닌 그들의 역량 덕분이었다는 사실을 스스로에게 속일 수 없기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 자기 만족과 커리어를 위해 뒤처진 이들을 돕는 것이 아닌 이상, 나는 현실과 책무를 직시해야만 한다.&lt;/p&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%에 등장하는 단어인 &quot;전략&quot;은 그만큼 인생에 있어 큰 비중을 차지한다.&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;때문에 나는 나의 위선적인 행위에 매사 역겨움을 느낀다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Purpose&lt;/b&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;&quot;&lt;i&gt;If you were to become a writer, what kind of book would you want to write?&lt;/i&gt;&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;다양한 직종의 사람들이 있었고 대부분 연령대가 40대를 넘어서는 분들이 많으셨기에, 모두 자신들의 삶의 스토리와 노하우들을 담는 책을 적고 싶어하셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다들 사회초년생과 학생들에게 도움을 주고 싶다는 숭고한 목적을 가지고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세상에는 이미 자신들의 성공 혹은 실패, 그리고 삶의 지혜를 담은 수많은 훌륭한 책들이 나와있었기에, 나는 조금 다른 책을 집필하고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;I want to write a book that really reflects my own philosophy. There are already many great books based on personal experiences, but in my experience, directly applying someone else's life lessons to my own often leads to failure. So I want to write about how to build your own strategy for your own life&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&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;나는 지금 오늘 내뱉고 온 말을 실현하기 위해서, 자신만의 전략을 세우는 방법에 대해 이야기하려고 한다.&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;2. Strategy&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Failure&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤늦게 정신차리고 공부를 시작하려던 중학교 3학년 때, 공부의 왕도라는 EBS 프로그램을 보고 그들의 방법을 그대로 따라했었다.&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;수포자가 실은 &quot;수학이 포기한 자&quot;의 줄임말이 아닐까 싶을 정도로 아무리 노력해도 등급이 오를 생각을 하지 않았고, 끝내 나의 재수 도전은 처참하게 망해버렸었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후로 공부는 내 길이 아닌 것 같아 반쯤 포기하고 1년 동안 신나게 놀았었는데, 나중에서야 이 사실을 받아들이는 것이 어지간히도 분하고 수치스러워서 취한 자기방어적 행동이었다는 것을 알게 되었다.&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;그것이 내 인생에서 처음으로 전략에 대해 깊게 생각한 때였다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Process&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전략은 크게 3단계의 절차를 거쳐 세워진다.&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;내가 가진 자원과 현재 상태, 한계점 파악 및 정보 수집&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;p data-ke-size=&quot;size16&quot;&gt;자세한 세부 사항은 밑에서 섹션 별로 나누어 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;3. Goal&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Clarity&lt;/b&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;가능하다면 KPI를 설정하는 것만큼이나 수치적으로 표현 가능할 수록 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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://jaeseo0519.tistory.com/490&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;경쟁을 해서 금메달이라도 수여해주는 것이 아닌 이상 커리어의 정점이라는 목표도 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히나 추상적인 목표는 위기의 순간에 타협이 될 여지가 다분하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자조적인 태도로 &quot;사실 이게 원래 목표였어&quot;라는 변명을 내뱉는 꼴을 더이상 보고 싶지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제때 포기하는 것도 능력이라는 것을 알지만, 어디까지나 자신의 모든 것을 걸고 부딪혀본 이들만 내뱉어도 되는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Scale&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 거시적(macro)인 목표를 달성하기 위한 작은(micro) 목표들을 세우라는 이야기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;4. State&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;가장 쓰기가 조심스러운 파트다.&lt;br /&gt;철학과 사상에 대한 주제를 글에 담을 때마다 조심스러울 수밖에 없다.&lt;br /&gt;나는 N명의 사람이 있으면 N개의 철학이 존재하길 바라는데, 소신이 뚜렷하지 않은 이들은 내 말에 너무 쉽게 영향을 받는다.&lt;br /&gt;&quot;개똥철학&quot;이라고 치부해도 좋으니 매우 경계해서 읽었으면 좋겠다.&lt;/blockquote&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Fact vs. Truth&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실(fact)과 진실(truth)은 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;AI 때문에 취업이 안 된다고 결론을 짓는 것도 구분지어 생각해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 취업 시장에 영향을 준 것, 앞으로 더 강력해질 것이라는 것, 그로 인해 취준 패러다임이 크게 바뀌고 있다는 것, 그리고 당신이 취업을 하지 못했다는 것은 사실이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 단순히 그것만으로 당신이 취업이 안 된다고 분석한 것은 정보 수집이 부족했거나, 그냥 그렇게 믿고 싶기 때문일 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 경우에는 나처럼 살면 불행해질 것이라 많은 이들이 단정했었지만, 그렇게 말하는 이들 중 나처럼 살아본 이가 단 한 명도 없다는 사실을 파악했었기에, 진실은 다수의 의견과는 관련이 없다는 것을 알 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 경력 없이 대학원 혹은 창업을 계획하기도 했었으나, 이는 취업이 어려워 현실 도피성 거짓임을 스스로 인정하고, 다시 원래금 계획대로 되돌린 적도 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실은 현상이고, 진실은 오로지 내면에서 솟아오르는 자신만의 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선과 악, 도덕, 법, 이데올로기, 구호, 프로파간다와 같은 외적인 요소 따위가 당신의 진실이 될 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 둘을 명확하게 구분지어 봐야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜곡되고 편협한 사고가 당신의 시야를 가리는 걸 방치하지 말라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;도덕과 법이 진실은 아니지만, 질서를 유지하기 위해선 반드시 존재해야만 한다.&lt;br /&gt;&lt;br /&gt;질서가 존재하기에 내가 길 한복판에서 봉변을 당할 확률이 줄어들었다.&lt;br /&gt;위법 행위를 처벌해야 하는 이유는 거짓이나 악이기 때문이 아니라, 룰을 위반하여 질서를 무너트리려 하기 때문이다.&lt;br /&gt;&lt;br /&gt;또한 불확실성으로 넘치는 세상에 예측 가능한 가이드 라인을 설정하는데 도움을 준다.&lt;br /&gt;예를 들어, 선이나 도덕을 최고 가치로 두는 팀원에게 동기를 부여하는데, 굳이 &quot;그건 진실이 아니야&quot;같은 사회성 떨어지는 면모를 보일 이유는 없다.&lt;br /&gt;이런 유형 대다수는 믿음을 존중해주는 것만으로도 최선을 다할 것이다. (호구 취급하라는 말이 아니다.)&lt;br /&gt;&lt;br /&gt;멋대로 사회적 합의를 깨부수지 말고 플랜을 이행하는데 있어 도구로 잘 사용해라.&lt;/blockquote&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Experience&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩을 접한 시기도 마침 이 맘 때 쯤이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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 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;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 채워야 할 지식이 무엇이며, 그 지식을 지정한 날짜까지 습득하기 위해 필요한 시간, 심지어 지식을 습득했다는 기준까지도 재정의했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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 data-ke-size=&quot;size16&quot;&gt;이렇게 1년 정도 살면, 슬슬 내가 정한 삶의 의미를 부정하는 이들과 인정해주는 이들이 많아진다.&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Contradiction&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 인간은 영원히 서로를 온전히 이해할 수 없다는 흉폭한 진리를 받아들였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;예를 들어서 &quot;선의는 선의로 남아야 한다&quot;는 나의 말과 실제 나의 행위가 일치하기에 대다수가 내게 칭찬과 감사를 표하는 것이겠지만, 이것이 모두 내게 진실임에도 불구하고 또 다른 진실과의 괴리가 내 기분을 역하게 만든다.&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;이게 전략과 무슨 의미가 있는지 의문이 들 수 있겠지만, 목표까지 세워가면서 나아가는 경우는 소소한 경우보다 거창한 경우가 더 많다고 생각했기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 필히 한정된 자원과 기회를 놓고 경쟁하다보면 이러한 괴리가 스멀스멀 기어올라오는데, 많은 이들이 이쯤에서 번아웃이 찾아와 내려놓고 행복을 찾으러 떠난다는 말을 하곤 했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Foundation&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;또한 진실이 원동력이라면, 사실은 전략을 수립하는데 객관적인 지표로 사용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;5. Plan&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Invariant&lt;/b&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;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;나는 그게 안 되니까 &quot;나보다 2년 앞선 이를 1년 내로 따라잡기 위해, 1년 간 그 사람보다 3배의 노력을 한다&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;사람의 행동과 감정만큼이나 예측 불가능한 것이 없다.&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;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;계획에 변수는 최대한 덜어내야 한다.&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  Path&lt;/b&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;마이크 타이슨이 말하지 않았는가, &quot;누구나 그럴싸한 계획은 있다. 쳐맞기 전까지는&quot;이라고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 정보가 충분하지 않았거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실이 아닌 데이터가 섞여있었거나,&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 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;천재랑 나, 아니 AI와 내가 태생적으로 불합리한 순수 학습 역량으로 대결을 할 이유가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 땐 판을 뒤집거나, 회피하거나, 아니면 그들의 등에 올라타는 것도 한 가지 방법이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 근래 많은 이들이 AI를 경쟁 상대로 여기는 경향이 있는데, 적어도 코드 생산량에 있어 인간은 AI의 경쟁 상대조차 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 만약 인식의 관점을 옮겨서 AI의 등에 올라탄다면 어떠한가.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;비단 개발자에 국한된 이야기가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 지인 중에는 AI로 자동화 프로세스를 구축하고 업무 효율을 증대시킨 이들도 존재한다.&lt;/p&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;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;6. Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #ffa348;&quot;&gt;&lt;b&gt;  .&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 살면 소시오패스, 혹은 AI보다 더 AI같은 인간이라는 말이 줄기차게 뒤따라온다.&lt;/p&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시간을 투자하진 않았을 것이다.&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;전략이 부조리한 삶을 살아가는데 있어 의미가 되어주지는 못하겠지만, 적어도 지금 당장 내가 가야하는 길이 무엇인지는 밝혀줄 것이다.&lt;/p&gt;</description>
      <category>Review</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/518</guid>
      <comments>https://jaeseo0519.tistory.com/518#entry518comment</comments>
      <pubDate>Sun, 8 Feb 2026 19:46:37 +0900</pubDate>
    </item>
    <item>
      <title>[AI Engineering] 9장. Inference Optimization</title>
      <link>https://jaeseo0519.tistory.com/517</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260206_211610015.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CVsHP/dJMcafyJ7uj/FXOe5llWyS7bArM9qjAk21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CVsHP/dJMcafyJ7uj/FXOe5llWyS7bArM9qjAk21/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CVsHP/dJMcafyJ7uj/FXOe5llWyS7bArM9qjAk21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCVsHP%2FdJMcafyJ7uj%2FFXOe5llWyS7bArM9qjAk21%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;306&quot; data-filename=&quot;KakaoTalk_20260206_211610015.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PPT 만든다고 11pm에 퇴근하는 나 ㅋ&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;2541&quot; data-origin-height=&quot;1597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zh89Q/dJMcabJSABf/GJkXGrGUMRp1JrVjdRKOP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zh89Q/dJMcabJSABf/GJkXGrGUMRp1JrVjdRKOP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zh89Q/dJMcabJSABf/GJkXGrGUMRp1JrVjdRKOP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzh89Q%2FdJMcabJSABf%2FGJkXGrGUMRp1JrVjdRKOP0%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;700&quot; height=&quot;440&quot; data-origin-width=&quot;2541&quot; data-origin-height=&quot;1597&quot;/&gt;&lt;/span&gt;&lt;/figure&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;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;/li&gt;
&lt;li&gt;단순&amp;nbsp;GPU&amp;nbsp;연산&amp;nbsp;능력으로&amp;nbsp;평가하는&amp;nbsp;건&amp;nbsp;무리가&amp;nbsp;있음.&lt;/li&gt;
&lt;li&gt;비효율적으로 돌아가는데 단순히 열심히 계산하다고 MFU 높고, Bandwidth 문제인데 GPU 활용도가 떨어진다고 측정될 수 있음. -&amp;gt; 그래서 MBU 개념이 등장함&lt;/li&gt;
&lt;li&gt;목표는&amp;nbsp;처리량&amp;nbsp;높이고&amp;nbsp;지연시간&amp;nbsp;낮추기.&amp;nbsp;그런데&amp;nbsp;어떻게?&lt;/li&gt;
&lt;/ul&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;2834&quot; data-origin-height=&quot;1489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1zqSK/dJMb99ZBfHt/B7cZiMWkp92vAt9fWaDUxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1zqSK/dJMb99ZBfHt/B7cZiMWkp92vAt9fWaDUxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1zqSK/dJMb99ZBfHt/B7cZiMWkp92vAt9fWaDUxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1zqSK%2FdJMb99ZBfHt%2FB7cZiMWkp92vAt9fWaDUxK%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;700&quot; height=&quot;368&quot; data-origin-width=&quot;2834&quot; data-origin-height=&quot;1489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추론의 2단계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Prefill: 사전 계산&lt;/li&gt;
&lt;li&gt;Decoding: 자기회귀 방식으로 token을 순차적 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;decoding&amp;nbsp;단계와&amp;nbsp;다르게&amp;nbsp;prefill은&amp;nbsp;병렬&amp;nbsp;처리가&amp;nbsp;가능하고,&amp;nbsp;그렇게&amp;nbsp;해야&amp;nbsp;효율적
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;덕분에&amp;nbsp;둘의&amp;nbsp;병목&amp;nbsp;원인이&amp;nbsp;다름.&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;prefill:&amp;nbsp;메모리&amp;nbsp;잘&amp;nbsp;써서&amp;nbsp;연산량&amp;nbsp;줄이기&lt;/li&gt;
&lt;li&gt;model:&amp;nbsp;모델을&amp;nbsp;압축시키거나&amp;nbsp;파라미터&amp;nbsp;양자화해서&amp;nbsp;줄이기&lt;/li&gt;
&lt;li&gt;decoding:&amp;nbsp;연산량은&amp;nbsp;얼마&amp;nbsp;안&amp;nbsp;되는데&amp;nbsp;bandwidth가&amp;nbsp;병목이니까&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;해결해보자&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2996&quot; data-origin-height=&quot;1639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ3Kxj/dJMcadgAV2t/lIq7XeKhF1nVKvs8wdFrXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ3Kxj/dJMcadgAV2t/lIq7XeKhF1nVKvs8wdFrXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ3Kxj/dJMcadgAV2t/lIq7XeKhF1nVKvs8wdFrXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ3Kxj%2FdJMcadgAV2t%2FlIq7XeKhF1nVKvs8wdFrXk%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;700&quot; height=&quot;383&quot; data-origin-width=&quot;2996&quot; data-origin-height=&quot;1639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU Bound, I/O Bound를 알고 있다면 무슨 의미인지 금방 알 듯.&lt;/li&gt;
&lt;/ul&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;2945&quot; data-origin-height=&quot;1609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oUUHE/dJMcaiIWrzs/ZmG26Y8s6vYH5VTGWH8P90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oUUHE/dJMcaiIWrzs/ZmG26Y8s6vYH5VTGWH8P90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUUHE/dJMcaiIWrzs/ZmG26Y8s6vYH5VTGWH8P90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUUHE%2FdJMcaiIWrzs%2FZmG26Y8s6vYH5VTGWH8P90%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;700&quot; height=&quot;382&quot; data-origin-width=&quot;2945&quot; data-origin-height=&quot;1609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매번 동일한 토큰 선형 변환 낭비 -&amp;gt; 캐싱을 하자&lt;/li&gt;
&lt;/ul&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;2951&quot; data-origin-height=&quot;1511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFZWxG/dJMcacPxGlK/0xWHJefpahKAyVfI0AWGqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFZWxG/dJMcacPxGlK/0xWHJefpahKAyVfI0AWGqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFZWxG/dJMcacPxGlK/0xWHJefpahKAyVfI0AWGqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFZWxG%2FdJMcacPxGlK%2F0xWHJefpahKAyVfI0AWGqk%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;700&quot; height=&quot;358&quot; data-origin-width=&quot;2951&quot; data-origin-height=&quot;1511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;근데&amp;nbsp;캐시가&amp;nbsp;너무&amp;nbsp;비효율적임&amp;nbsp;(KV&amp;nbsp;cache&amp;nbsp;mem&amp;nbsp;계산)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KV&amp;nbsp;cache&amp;nbsp;size&amp;nbsp;계산
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KV&amp;nbsp;캐시는&amp;nbsp;키,&amp;nbsp;값&amp;nbsp;캐시&amp;nbsp;각각&amp;nbsp;2개&amp;nbsp;저장하므로&amp;nbsp;2&amp;nbsp;곱함.&lt;/li&gt;
&lt;li&gt;모델이&amp;nbsp;사용하는&amp;nbsp;데이터&amp;nbsp;타입&amp;nbsp;크기에&amp;nbsp;맞게&amp;nbsp;곱함&lt;/li&gt;
&lt;li&gt;self&amp;nbsp;attention&amp;nbsp;결과는&amp;nbsp;attention&amp;nbsp;layer&amp;nbsp;수만큼&amp;nbsp;생기므로&amp;nbsp;layer&amp;nbsp;수&amp;nbsp;곱함&lt;/li&gt;
&lt;li&gt;token&amp;nbsp;embedding을&amp;nbsp;표현하는&amp;nbsp;dimension만큼&amp;nbsp;또&amp;nbsp;곱함&lt;/li&gt;
&lt;li&gt;메모리&amp;nbsp;미리&amp;nbsp;확보하기&amp;nbsp;위해&amp;nbsp;최대&amp;nbsp;sequence&amp;nbsp;길이&amp;nbsp;곱함&lt;/li&gt;
&lt;li&gt;배치&amp;nbsp;크기&amp;nbsp;커질수록&amp;nbsp;저장하는&amp;nbsp;데이터&amp;nbsp;많아지니까&amp;nbsp;배치&amp;nbsp;크기도&amp;nbsp;곱함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KV&amp;nbsp;Cache&amp;nbsp;공간을&amp;nbsp;미리&amp;nbsp;계산해서&amp;nbsp;memory&amp;nbsp;할당해줬더니&amp;nbsp;batch&amp;nbsp;크기&amp;nbsp;늘릴&amp;nbsp;공간이&amp;nbsp;부족해짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g. LLama 2 13B 모델은 40 layers, 5,120 dimension인데, 32 batch size, 2,048 sequence length, 2 bytes per value로 단순 계산하면, 2 * 32 * 2,048 * 40 * 5,120 * 2 = 54GB&lt;/li&gt;
&lt;/ul&gt;
&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2870&quot; data-origin-height=&quot;1651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkZkMp/dJMcacPxGlP/xcO2Z4vpsUHOlN9GlDoTn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkZkMp/dJMcacPxGlP/xcO2Z4vpsUHOlN9GlDoTn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkZkMp/dJMcacPxGlP/xcO2Z4vpsUHOlN9GlDoTn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkZkMp%2FdJMcacPxGlP%2FxcO2Z4vpsUHOlN9GlDoTn0%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;700&quot; height=&quot;403&quot; data-origin-width=&quot;2870&quot; data-origin-height=&quot;1651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;multi-head attention
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Attention&amp;nbsp;is&amp;nbsp;All&amp;nbsp;you&amp;nbsp;need에서&amp;nbsp;여러&amp;nbsp;head에&amp;nbsp;attention&amp;nbsp;연산을&amp;nbsp;수행했었음.&lt;/li&gt;
&lt;li&gt;Q,&amp;nbsp;K&amp;nbsp;사이&amp;nbsp;다양한&amp;nbsp;측면&amp;nbsp;관련성&amp;nbsp;반영&amp;nbsp;가능하고&amp;nbsp;성능은&amp;nbsp;높였으나,&amp;nbsp;KV&amp;nbsp;cache에&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;메모리가&amp;nbsp;필요하고&amp;nbsp;로드하는데&amp;nbsp;memory&amp;nbsp;bound.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;multi-query&amp;nbsp;attention
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 head가 단일 K, V 공유&lt;/li&gt;
&lt;li&gt;Q만 head 독립적&lt;/li&gt;
&lt;li&gt;K, V projection param이 1/h로 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;grouped-query attention
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;head를 g개 그룹으로 나누고, 그룹 내에서 K, V 공유&lt;/li&gt;
&lt;li&gt;MQA와 MHA 사이의 중간 지점&lt;/li&gt;
&lt;li&gt;g=1이면 MQA, g=h면 MHA와 동일&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2827&quot; data-origin-height=&quot;1619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYCcPF/dJMcaajSXan/isa1ewdlEDFSPZ7rk7AI7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYCcPF/dJMcaajSXan/isa1ewdlEDFSPZ7rk7AI7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYCcPF/dJMcaajSXan/isa1ewdlEDFSPZ7rk7AI7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYCcPF%2FdJMcaajSXan%2Fisa1ewdlEDFSPZ7rk7AI7K%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;700&quot; height=&quot;401&quot; data-origin-width=&quot;2827&quot; data-origin-height=&quot;1619&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS의 virtual memory 개념과 유사함.&lt;/li&gt;
&lt;/ul&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;2904&quot; data-origin-height=&quot;1539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oH9Tl/dJMcaajSXbd/sPhrlmTMyODo0RwfJYJOo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oH9Tl/dJMcaajSXbd/sPhrlmTMyODo0RwfJYJOo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oH9Tl/dJMcaajSXbd/sPhrlmTMyODo0RwfJYJOo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoH9Tl%2FdJMcaajSXbd%2FsPhrlmTMyODo0RwfJYJOo1%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;700&quot; height=&quot;371&quot; data-origin-width=&quot;2904&quot; data-origin-height=&quot;1539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델&amp;nbsp;자체의&amp;nbsp;용량&amp;nbsp;줄여서&amp;nbsp;HW&amp;nbsp;요구&amp;nbsp;사항을&amp;nbsp;줄이자
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FP16, BF16, ...&lt;/li&gt;
&lt;li&gt;W4A16(Weight&amp;nbsp;4bits&amp;nbsp;and&amp;nbsp;Activation&amp;nbsp;16bits)&amp;nbsp;같은&amp;nbsp;것도&amp;nbsp;쓴다&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;PTQ
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bits-and-bytes:&amp;nbsp;QLoRA&amp;nbsp;저자가&amp;nbsp;썼던&amp;nbsp;논문&lt;/li&gt;
&lt;li&gt;GPTQ:&amp;nbsp;양자화할&amp;nbsp;때&amp;nbsp;모델도&amp;nbsp;업데이트&amp;nbsp;하자&lt;/li&gt;
&lt;li&gt;AWQ:&amp;nbsp;양자화할&amp;nbsp;파라미터를&amp;nbsp;선별하자&lt;/li&gt;
&lt;li&gt;GGUF: CPU에서도 양자화가 된다면?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;QAT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;PTQ는 vision 했을 때 빼놓고는 잘 안 쓸 듯. LLM 스케일이 압도적으로 커서 함부로 양자화하면 성능이 어떻게 떨어질지 알 수 없다.&lt;/li&gt;
&lt;/ul&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;2950&quot; data-origin-height=&quot;1622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W6gao/dJMcaia9VCF/NggPhgKyDWrSGdQGkV8xY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W6gao/dJMcaia9VCF/NggPhgKyDWrSGdQGkV8xY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W6gao/dJMcaia9VCF/NggPhgKyDWrSGdQGkV8xY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW6gao%2FdJMcaia9VCF%2FNggPhgKyDWrSGdQGkV8xY1%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;700&quot; height=&quot;385&quot; data-origin-width=&quot;2950&quot; data-origin-height=&quot;1622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작은&amp;nbsp;모델을&amp;nbsp;똑똑하게&amp;nbsp;만들자&lt;/li&gt;
&lt;li&gt;Knowledge&amp;nbsp;Distillation&amp;nbsp;(이미&amp;nbsp;앞에서&amp;nbsp;배웠으므로&amp;nbsp;패스)
&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;희소성(Sparsification)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;희소&amp;nbsp;행렬은&amp;nbsp;많은&amp;nbsp;요소가&amp;nbsp;0인&amp;nbsp;행렬로,&amp;nbsp;전체&amp;nbsp;밀도&amp;nbsp;행렬보다&amp;nbsp;공간을&amp;nbsp;덜&amp;nbsp;차지하는&amp;nbsp;압축된&amp;nbsp;형태로&amp;nbsp;표현&lt;/li&gt;
&lt;li&gt;가장&amp;nbsp;흔하게&amp;nbsp;신경망&amp;nbsp;구성&amp;nbsp;요소를&amp;nbsp;선택적으로&amp;nbsp;제거(pruning)하는&amp;nbsp;방식&amp;nbsp;사용&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2883&quot; data-origin-height=&quot;1460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAj6L0/dJMcag5tMSE/nyUIjVYku3AKELefbNGK0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAj6L0/dJMcag5tMSE/nyUIjVYku3AKELefbNGK0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAj6L0/dJMcag5tMSE/nyUIjVYku3AKELefbNGK0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAj6L0%2FdJMcag5tMSE%2FnyUIjVYku3AKELefbNGK0k%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;700&quot; height=&quot;354&quot; data-origin-width=&quot;2883&quot; data-origin-height=&quot;1460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;batch 없을 때 문제점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPU는&amp;nbsp;테라플롭,&amp;nbsp;심지어&amp;nbsp;페타플롭&amp;nbsp;범위&amp;nbsp;연산&amp;nbsp;속도를&amp;nbsp;자랑함.&lt;/li&gt;
&lt;li&gt;그런데 model parameter 로드하느라 memory bandwidth bound 걸려서 툭하면 포화상태 도달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;naive&amp;nbsp;batching&amp;nbsp;=&amp;nbsp;static&amp;nbsp;batching
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;처리해버리자.&lt;/li&gt;
&lt;li&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;N개&amp;nbsp;쌓일&amp;nbsp;때까지&amp;nbsp;기다릴&amp;nbsp;거임??&lt;/li&gt;
&lt;li&gt;그리고&amp;nbsp;token&amp;nbsp;sequence&amp;nbsp;차이가&amp;nbsp;많이&amp;nbsp;날&amp;nbsp;수록&amp;nbsp;짧은&amp;nbsp;질문한&amp;nbsp;애들은&amp;nbsp;손해&amp;nbsp;+&amp;nbsp;GPU도&amp;nbsp;놀고&amp;nbsp;있음.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2966&quot; data-origin-height=&quot;1676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buXe0M/dJMcadgAV22/PvIPGdjkmY13lVgI64DYZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buXe0M/dJMcadgAV22/PvIPGdjkmY13lVgI64DYZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buXe0M/dJMcadgAV22/PvIPGdjkmY13lVgI64DYZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuXe0M%2FdJMcadgAV22%2FPvIPGdjkmY13lVgI64DYZ0%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;700&quot; height=&quot;396&quot; data-origin-width=&quot;2966&quot; data-origin-height=&quot;1676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dynamic&amp;nbsp;batching
&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;continuous&amp;nbsp;batching
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Continuous&amp;nbsp;Batching&amp;nbsp;=&amp;nbsp;Ragged&amp;nbsp;Batching&amp;nbsp;+&amp;nbsp;Dynamic&amp;nbsp;Scheduling&amp;nbsp;+&amp;nbsp;Chunked&amp;nbsp;Prefill
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ragged Batching: 패딩 없이 여러 시퀀스를 처리할 수 있게 함&lt;/li&gt;
&lt;li&gt;Dynamic Scheduling: 완료된 시퀀스를 즉시 새 시퀀스로 교체&lt;/li&gt;
&lt;li&gt;Chunked Prefill: 긴 프롬프트를 메모리 제약에 맞게 분할&lt;/li&gt;
&lt;/ul&gt;
&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2943&quot; data-origin-height=&quot;1637&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5f7Yd/dJMcagqQ2Tl/vxqM2CDJ7UqAryyF5CuF41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5f7Yd/dJMcagqQ2Tl/vxqM2CDJ7UqAryyF5CuF41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5f7Yd/dJMcagqQ2Tl/vxqM2CDJ7UqAryyF5CuF41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5f7Yd%2FdJMcagqQ2Tl%2FvxqM2CDJ7UqAryyF5CuF41%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;700&quot; height=&quot;389&quot; data-origin-width=&quot;2943&quot; data-origin-height=&quot;1637&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Decoding할&amp;nbsp;때&amp;nbsp;memory&amp;nbsp;bandwidth&amp;nbsp;병목&amp;nbsp;좀&amp;nbsp;제거하자&lt;/li&gt;
&lt;li&gt;kernel&amp;nbsp;fusion
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반복적&amp;nbsp;수행하는&amp;nbsp;연산(e.g.&amp;nbsp;메모리&amp;nbsp;로드/저장)은&amp;nbsp;하나로&amp;nbsp;묶어서&amp;nbsp;오버헤드&amp;nbsp;줄이자.&lt;/li&gt;
&lt;li&gt;flash&amp;nbsp;attention이&amp;nbsp;대표적인&amp;nbsp;예시&lt;/li&gt;
&lt;li&gt;MS에서&amp;nbsp;21년에&amp;nbsp;공개한&amp;nbsp;deep&amp;nbsp;fusion이란&amp;nbsp;것도&amp;nbsp;있음&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2881&quot; data-origin-height=&quot;1562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tanwT/dJMcajnxaf7/ekBDg7BDfMTncepOLNtGC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tanwT/dJMcajnxaf7/ekBDg7BDfMTncepOLNtGC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tanwT/dJMcajnxaf7/ekBDg7BDfMTncepOLNtGC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtanwT%2FdJMcajnxaf7%2FekBDg7BDfMTncepOLNtGC1%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;700&quot; height=&quot;380&quot; data-origin-width=&quot;2881&quot; data-origin-height=&quot;1562&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;2909&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQn8Ia/dJMcadOnozp/m1RqnVCKIwnhfa69WHlxk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQn8Ia/dJMcadOnozp/m1RqnVCKIwnhfa69WHlxk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQn8Ia/dJMcadOnozp/m1RqnVCKIwnhfa69WHlxk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQn8Ia%2FdJMcadOnozp%2Fm1RqnVCKIwnhfa69WHlxk1%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;700&quot; height=&quot;385&quot; data-origin-width=&quot;2909&quot; data-origin-height=&quot;1598&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;2990&quot; data-origin-height=&quot;1625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQbBU/dJMcaf6yqAo/MlKrLJhqRwaKhULX9OtgRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQbBU/dJMcaf6yqAo/MlKrLJhqRwaKhULX9OtgRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQbBU/dJMcaf6yqAo/MlKrLJhqRwaKhULX9OtgRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQbBU%2FdJMcaf6yqAo%2FMlKrLJhqRwaKhULX9OtgRk%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;700&quot; height=&quot;380&quot; data-origin-width=&quot;2990&quot; data-origin-height=&quot;1625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tiling으로&amp;nbsp;NxN&amp;nbsp;행렬을&amp;nbsp;BLOCK로&amp;nbsp;나눠&amp;nbsp;SRAM에&amp;nbsp;저장&lt;/li&gt;
&lt;li&gt;kernel&amp;nbsp;fusion으로&amp;nbsp;쪼갠&amp;nbsp;block&amp;nbsp;연산들을&amp;nbsp;하나의&amp;nbsp;kernel로&amp;nbsp;합침&lt;/li&gt;
&lt;li&gt;기존에도&amp;nbsp;행렬&amp;nbsp;곱셈이긴&amp;nbsp;한데,&amp;nbsp;HBM&amp;nbsp;왔다갔다하는&amp;nbsp;게&amp;nbsp;병목점&amp;nbsp;-&amp;gt;&amp;nbsp;SRAM만&amp;nbsp;쓰자&lt;/li&gt;
&lt;li&gt;AI&amp;nbsp;개발자가&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;영역은&amp;nbsp;아님
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CUDA:&amp;nbsp;NVIDIA&amp;nbsp;GPU&amp;nbsp;프로그래밍하기&amp;nbsp;위한&amp;nbsp;platform/language&lt;/li&gt;
&lt;li&gt;CUDA&amp;nbsp;개발자가&amp;nbsp;NVIDIA&amp;nbsp;LIB&amp;nbsp;수준에서&amp;nbsp;attention&amp;nbsp;전체를&amp;nbsp;하나로&amp;nbsp;합친&amp;nbsp;커스텀&amp;nbsp;CUDA&amp;nbsp;kernel을&amp;nbsp;추가해줘야&amp;nbsp;함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;softmax 연산을 분할하는 트릭을 보는 게 묘미.&lt;/li&gt;
&lt;/ul&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;2788&quot; data-origin-height=&quot;1578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/12uTe/dJMcagRWwZ5/5ENfRkL4hGwKVcyK2mv8k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/12uTe/dJMcagRWwZ5/5ENfRkL4hGwKVcyK2mv8k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/12uTe/dJMcagRWwZ5/5ENfRkL4hGwKVcyK2mv8k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F12uTe%2FdJMcagRWwZ5%2F5ENfRkL4hGwKVcyK2mv8k1%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;700&quot; height=&quot;396&quot; data-origin-width=&quot;2788&quot; data-origin-height=&quot;1578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPU는 행렬 곱셈 연산은 빠른데, 비행렬 곱셈 연산은 16배 정도 느림.&lt;/li&gt;
&lt;li&gt;비행렬 곱셈이 빈번하게 발생하는 곳이 flash attention에서 softmax 분할하다가 생겼는데, 정규화를 마지막에 한 번만 수행하는 것으로 횟수 자체를 줄여버림.&lt;/li&gt;
&lt;li&gt;역전파를 위한 상태 저장도 m, l이 아니라, L만 계산해서 저장해두면 됨.&lt;/li&gt;
&lt;/ul&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;2793&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJHH7b/dJMcaioGS1k/ukqIpKbauvy5kSBY8B6qDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJHH7b/dJMcaioGS1k/ukqIpKbauvy5kSBY8B6qDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJHH7b/dJMcaioGS1k/ukqIpKbauvy5kSBY8B6qDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJHH7b%2FdJMcaioGS1k%2FukqIpKbauvy5kSBY8B6qDk%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;700&quot; height=&quot;416&quot; data-origin-width=&quot;2793&quot; data-origin-height=&quot;1660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;batch&amp;nbsp;size가&amp;nbsp;작거나,&amp;nbsp;어텐션&amp;nbsp;헤드&amp;nbsp;수가&amp;nbsp;작아서&amp;nbsp;충분한&amp;nbsp;수의&amp;nbsp;thread&amp;nbsp;block을&amp;nbsp;모으지&amp;nbsp;못하면,&amp;nbsp;GPU의&amp;nbsp;SM을&amp;nbsp;충분히&amp;nbsp;활용하기&amp;nbsp;어려움&lt;/li&gt;
&lt;li&gt;그러니 입력 시퀀스로도 병렬화를 추가해버리자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;1647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAG7SL/dJMcabJSAGP/CdJ2crjUcONra8uGMoonR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAG7SL/dJMcabJSAGP/CdJ2crjUcONra8uGMoonR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAG7SL/dJMcabJSAGP/CdJ2crjUcONra8uGMoonR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAG7SL%2FdJMcabJSAGP%2FCdJ2crjUcONra8uGMoonR0%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;700&quot; height=&quot;396&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;1647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이게 효과가 있는 게 맞나 의심스러워서 안 찾아보다가, 여기저기서 언급되길래 호다닥 추가한 내용. (나도 잘 몰라..)&lt;/p&gt;</description>
      <category>Reference/AI Engineering</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/517</guid>
      <comments>https://jaeseo0519.tistory.com/517#entry517comment</comments>
      <pubDate>Fri, 6 Feb 2026 21:20:08 +0900</pubDate>
    </item>
    <item>
      <title>[LLM 실전 AI 애플리케이션 개발] 5장 그림 5.13 텐서 병렬화 이미지 오류 수정</title>
      <link>https://jaeseo0519.tistory.com/516</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260131_142419.jpg&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d05ODN/dJMcaa5cVgx/1LdnJsT4qeJpz5VX7atUtk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d05ODN/dJMcaa5cVgx/1LdnJsT4qeJpz5VX7atUtk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d05ODN/dJMcaa5cVgx/1LdnJsT4qeJpz5VX7atUtk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd05ODN%2FdJMcaa5cVgx%2F1LdnJsT4qeJpz5VX7atUtk%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;700&quot; height=&quot;591&quot; data-filename=&quot;20260131_142419.jpg&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을 읽다가 self-attention 열 병렬화의 그림이 이상한 것을 발견&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;GPU 0: Q₁ &amp;otimes; K₁ᵀ &amp;rarr; Softmax &amp;rarr; Dropout &amp;rarr; &amp;otimes; V₁ &amp;rarr; Y₁&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GPU 1: Q₂ &amp;otimes; V₂ &amp;rarr; Softmax &amp;rarr; Dropout &amp;rarr; &amp;otimes; K₂ᵀ &amp;rarr; Y₂&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;GPU1에서 Q₂ &amp;otimes; V₂를 먼저 계산하고 나중에 K₂ᵀ를 곱함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Self-Attention 표준 공식인 Attention(Q, K, V) = Softmax(Q &amp;middot; Kᵀ / &amp;radic;d) &amp;middot; V와 다르고, 위 방식대로 계산하면 수학적으로 완전히 다른 연산으로 보는 게 타당함.&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;596&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcqcXS/dJMcagj239K/sxGMM8S59lRLlGWHRCJSK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcqcXS/dJMcagj239K/sxGMM8S59lRLlGWHRCJSK0/img.png&quot; data-alt=&quot;https://huggingface.co/docs/transformers/v4.15.0/parallelism#tensor-parallelism&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcqcXS/dJMcagj239K/sxGMM8S59lRLlGWHRCJSK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcqcXS%2FdJMcagj239K%2FsxGMM8S59lRLlGWHRCJSK0%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;700&quot; height=&quot;413&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://huggingface.co/docs/transformers/v4.15.0/parallelism#tensor-parallelism&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니나 다를까 K2와 V2의 위치가 바뀌어 있더라..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간중간 트랩이 있는 걸 주의하면서 읽어야 할 듯.&lt;/p&gt;</description>
      <category>Reference/LLM을 활용한 실전 AI 애플리케이션 개발</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/516</guid>
      <comments>https://jaeseo0519.tistory.com/516#entry516comment</comments>
      <pubDate>Sat, 31 Jan 2026 16:03:53 +0900</pubDate>
    </item>
    <item>
      <title>[AI Engineering] 8장. Dataset Engineering</title>
      <link>https://jaeseo0519.tistory.com/515</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내용이&amp;nbsp;거의&amp;nbsp;고이즈미&amp;nbsp;신지로&amp;nbsp;화법.&lt;br /&gt;&quot;1&amp;nbsp;더하기&amp;nbsp;1은&amp;nbsp;2다.&amp;nbsp;왜냐면&amp;nbsp;그것이&amp;nbsp;수학이기에.&quot;&amp;nbsp;(끄덕)&lt;br /&gt;그만큼&amp;nbsp;당연한&amp;nbsp;말을&amp;nbsp;늘어놓고&amp;nbsp;있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data&amp;nbsp;Curation
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;curation
&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;다른 사람이 만들어놓은 콘텐츠를 목적에 따라 분류하고 배포하는 일 (양질의 콘텐츠만을 취합&amp;middot;선별&amp;middot;조합&amp;middot;분류해 특별한 의미를 부여하고 가치를 재창출하는 행위)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data with COT&lt;/li&gt;
&lt;li&gt;Data with Tool use&lt;/li&gt;
&lt;li&gt;Data with Conversation
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Single Turn&lt;/li&gt;
&lt;li&gt;Multi Turn&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data Quality
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;There's&amp;nbsp;many&amp;nbsp;factors&amp;nbsp;for&amp;nbsp;data&amp;nbsp;quality
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relevant -&amp;gt; 이커머스는 얘가 중요한 듯&lt;/li&gt;
&lt;li&gt;Aligned with task requirements -&amp;gt; 개발할 땐 이거 아닌가 ㅋㅋ&lt;/li&gt;
&lt;li&gt;Consistent -&amp;gt; 제조업에서 가장 중요한 듯&lt;/li&gt;
&lt;li&gt;Correctly formatted&lt;/li&gt;
&lt;li&gt;Sufficiently unique&lt;/li&gt;
&lt;li&gt;Compliant&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What's&amp;nbsp;the&amp;nbsp;most&amp;nbsp;important&amp;nbsp;factor&amp;nbsp;for&amp;nbsp;data&amp;nbsp;quality&amp;nbsp;in&amp;nbsp;LLM?
&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;Aligned with task requirements 아닐까? LLM이 결국 input이 있을 때 output이 있는데, 요새는 코딩이나 수학같은 것들을 tuning함. 그러기 위해선 LLM이 얼마나 복잡성을 담고 있는가가 중요하다고 생각.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What's&amp;nbsp;the&amp;nbsp;most&amp;nbsp;important&amp;nbsp;factor&amp;nbsp;for&amp;nbsp;data&amp;nbsp;quality&amp;nbsp;in&amp;nbsp;ML?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data&amp;nbsp;Coverage
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A&amp;nbsp;model's&amp;nbsp;training&amp;nbsp;data&amp;nbsp;should&amp;nbsp;cover&amp;nbsp;the&amp;nbsp;range&amp;nbsp;of&amp;nbsp;problems&amp;nbsp;you&amp;nbsp;expect&amp;nbsp;it&amp;nbsp;to&amp;nbsp;solve&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/pdf/2203.02155&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Training&amp;nbsp;language&amp;nbsp;models&amp;nbsp;to&amp;nbsp;follow&amp;nbsp;instructions&amp;nbsp;with&amp;nbsp;human&amp;nbsp;feedback(2022)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data&amp;nbsp;Quantity
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;There're&amp;nbsp;3&amp;nbsp;factors&amp;nbsp;deciding&amp;nbsp;how&amp;nbsp;much&amp;nbsp;data&amp;nbsp;you&amp;nbsp;need
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fine-tuning&amp;nbsp;technique
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Less&amp;nbsp;total&amp;nbsp;tokens:&amp;nbsp;LoRA&lt;/li&gt;
&lt;li&gt;Much&amp;nbsp;total&amp;nbsp;tokens:&amp;nbsp;Full&amp;nbsp;Fine-Tuning&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Task&amp;nbsp;complexity:&amp;nbsp;More&amp;nbsp;complex&amp;nbsp;task&amp;nbsp;-&amp;gt;&amp;nbsp;More&amp;nbsp;data&amp;nbsp;you&amp;nbsp;need
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경험&amp;nbsp;상&amp;nbsp;얘가&amp;nbsp;제일&amp;nbsp;중요함.&amp;nbsp;complexity만&amp;nbsp;잘&amp;nbsp;되어있으면&amp;nbsp;LoRA를&amp;nbsp;하든&amp;nbsp;Full&amp;nbsp;Fine-Tuning을&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Base&amp;nbsp;model's&amp;nbsp;performance:&amp;nbsp;Smarter&amp;nbsp;base&amp;nbsp;model&amp;nbsp;-&amp;gt;&amp;nbsp;Less&amp;nbsp;data&amp;nbsp;you&amp;nbsp;need
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;당연한&amp;nbsp;얘기&amp;nbsp;아님???&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data&amp;nbsp;Acquisition&amp;nbsp;and&amp;nbsp;Annotation
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The&amp;nbsp;goal&amp;nbsp;of&amp;nbsp;data&amp;nbsp;acquisition&amp;nbsp;is&amp;nbsp;to&amp;nbsp;produce&amp;nbsp;a&amp;nbsp;sufficiently&amp;nbsp;large&amp;nbsp;dataset&amp;nbsp;with&amp;nbsp;the&amp;nbsp;quality&amp;nbsp;and&amp;nbsp;diversity&amp;nbsp;you&amp;nbsp;need&lt;/li&gt;
&lt;li&gt;Pipeline
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Raw data archiving&lt;/li&gt;
&lt;li&gt;Preprocessing&amp;nbsp;with&amp;nbsp;LLM
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤&amp;nbsp;경우에&amp;nbsp;해야&amp;nbsp;할까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What&amp;nbsp;Database?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;text면&amp;nbsp;뭘&amp;nbsp;쓸까?&amp;nbsp;-&amp;gt;&amp;nbsp;당연히&amp;nbsp;RDB는&amp;nbsp;안&amp;nbsp;씀.&amp;nbsp;mongoDB&amp;nbsp;같은&amp;nbsp;NoSQL이나&amp;nbsp;FileStorage&amp;nbsp;쓸&amp;nbsp;듯?&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;내가&amp;nbsp;원하던&amp;nbsp;답이&amp;nbsp;다&amp;nbsp;나왔다!&quot;&amp;nbsp;ㅋㅋㅋ&lt;/li&gt;
&lt;li&gt;Ontology&amp;nbsp;요새&amp;nbsp;많이&amp;nbsp;씀&amp;nbsp;-&amp;gt;&amp;nbsp;근데&amp;nbsp;이거&amp;nbsp;관리&amp;nbsp;너무&amp;nbsp;어렵지&amp;nbsp;않냐?&amp;nbsp;-&amp;gt;&amp;nbsp;맞음.&amp;nbsp;relationship을&amp;nbsp;사전에&amp;nbsp;모두&amp;nbsp;정의해야&amp;nbsp;함.&amp;nbsp;Graph&amp;nbsp;DB의&amp;nbsp;장점이&amp;nbsp;확장성인데,&amp;nbsp;relationship을&amp;nbsp;사전에&amp;nbsp;다&amp;nbsp;준비한다는&amp;nbsp;게&amp;nbsp;모순임.&amp;nbsp;그래서&amp;nbsp;이&amp;nbsp;relation을&amp;nbsp;어떻게&amp;nbsp;잘&amp;nbsp;정의하냐가&amp;nbsp;숙제임.&lt;/li&gt;
&lt;li&gt;Graph&amp;nbsp;DB&amp;nbsp;vs.&amp;nbsp;Graph&amp;nbsp;RAG
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Q.&amp;nbsp;그냥&amp;nbsp;retreiver를&amp;nbsp;Graph&amp;nbsp;DB로&amp;nbsp;두면&amp;nbsp;Graph&amp;nbsp;RAG임??&lt;/li&gt;
&lt;li&gt;A.&amp;nbsp;얘는&amp;nbsp;골&amp;nbsp;때리는&amp;nbsp;게&amp;nbsp;Embedding&amp;nbsp;할&amp;nbsp;때는&amp;nbsp;vector&amp;nbsp;DB가&amp;nbsp;필요했는데,&amp;nbsp;Graph&amp;nbsp;RAG는&amp;nbsp;LLM을&amp;nbsp;필요로&amp;nbsp;함.&amp;nbsp;LLM이&amp;nbsp;scheme를&amp;nbsp;보고&amp;nbsp;가장&amp;nbsp;적절한&amp;nbsp;driver를&amp;nbsp;연결해서&amp;nbsp;응답을&amp;nbsp;뿌림.&amp;nbsp;(판단의&amp;nbsp;주체가&amp;nbsp;LLM)&amp;nbsp;-&amp;gt;&amp;nbsp;세부&amp;nbsp;파라미터&amp;nbsp;튜닝하는&amp;nbsp;옵션이&amp;nbsp;없어서&amp;nbsp;일관성이&amp;nbsp;떨어짐.&amp;nbsp;-&amp;gt;&amp;nbsp;일관성을&amp;nbsp;유지하려면&amp;nbsp;relationship을&amp;nbsp;잘&amp;nbsp;정의해야&amp;nbsp;하는데,&amp;nbsp;그러면&amp;nbsp;graph&amp;nbsp;DB의&amp;nbsp;장점이&amp;nbsp;떨어짐.&amp;nbsp;진퇴양난에&amp;nbsp;빠졌다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Model&amp;nbsp;Distillation
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Large&amp;nbsp;models&amp;nbsp;require&amp;nbsp;very&amp;nbsp;very&amp;nbsp;large&amp;nbsp;resource&amp;nbsp;usage&lt;/li&gt;
&lt;li&gt;Distillate&amp;nbsp;knowledge&amp;nbsp;from&amp;nbsp;teacher&amp;nbsp;model&amp;nbsp;(large)&amp;nbsp;to&amp;nbsp;student&amp;nbsp;model&amp;nbsp;(small)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;시도.)&lt;/li&gt;
&lt;li&gt;가장&amp;nbsp;유명한&amp;nbsp;게&amp;nbsp;deepseek.&amp;nbsp;(metrics&amp;nbsp;보면&amp;nbsp;정신이&amp;nbsp;나간&amp;nbsp;수준)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Deepseek&amp;nbsp;Knowledge&amp;nbsp;Distillation&lt;/li&gt;
&lt;li&gt;SOTA&amp;nbsp;performance&amp;nbsp;in&amp;nbsp;parameter&amp;nbsp;scale&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그럼&amp;nbsp;large&amp;nbsp;model의&amp;nbsp;환각&amp;nbsp;현상을&amp;nbsp;잡는&amp;nbsp;것이&amp;nbsp;중요할&amp;nbsp;듯.&lt;/li&gt;
&lt;li&gt;지식의&amp;nbsp;확장보다는&amp;nbsp;small&amp;nbsp;model의&amp;nbsp;performance를&amp;nbsp;끌어올릴&amp;nbsp;때&amp;nbsp;쓰는&amp;nbsp;것.&amp;nbsp;(large&amp;nbsp;model을&amp;nbsp;넘기&amp;nbsp;어려움.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;근데&amp;nbsp;Distillation할&amp;nbsp;때&amp;nbsp;썼던&amp;nbsp;testset&amp;nbsp;이외의&amp;nbsp;다른&amp;nbsp;입력에&amp;nbsp;들어왔을&amp;nbsp;때도&amp;nbsp;비슷한&amp;nbsp;성능을&amp;nbsp;발휘할&amp;nbsp;수&amp;nbsp;있나?&amp;nbsp;-&amp;gt;&amp;nbsp;맞음.&amp;nbsp;근데&amp;nbsp;이건&amp;nbsp;distillation&amp;nbsp;구상의&amp;nbsp;문제로&amp;nbsp;봐야&amp;nbsp;함.&lt;/li&gt;
&lt;li&gt;애초에&amp;nbsp;Distillation의&amp;nbsp;목적이&amp;nbsp;specific&amp;nbsp;task의&amp;nbsp;일을&amp;nbsp;처리하게&amp;nbsp;하려고&amp;nbsp;했는데,&amp;nbsp;large&amp;nbsp;model은&amp;nbsp;과하니까&amp;nbsp;small&amp;nbsp;model&amp;nbsp;쓰려는&amp;nbsp;거&amp;nbsp;아닌가?&amp;nbsp;그렇다면&amp;nbsp;앞선&amp;nbsp;질문은&amp;nbsp;당연한&amp;nbsp;현상&amp;nbsp;아님?&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;질문&amp;nbsp;수준에&amp;nbsp;감동했다&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data&amp;nbsp;Augmentation&amp;nbsp;and&amp;nbsp;Synthesis
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI&amp;nbsp;generate&amp;nbsp;training&amp;nbsp;data&amp;nbsp;for&amp;nbsp;weak&amp;nbsp;model&lt;/li&gt;
&lt;li&gt;Science,&amp;nbsp;Math&amp;nbsp;related&amp;nbsp;topic:&amp;nbsp;Froniter&amp;nbsp;Models&lt;/li&gt;
&lt;li&gt;Non-English&amp;nbsp;data:&amp;nbsp;Language&amp;nbsp;specific&amp;nbsp;model
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Upstage&amp;nbsp;Solar가&amp;nbsp;한국어에서&amp;nbsp;대표적인&amp;nbsp;예시&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.nvidia.com/nemo-framework/user-guide/24.12/datacuration/syntheticdata.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;NVIDIA&amp;nbsp;NeMo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;문제점: synthesis가 편향적일 수 있음. 가장 대표적 예시가 deepseek. 중국어가 자꾸 나오거나, 중국 친화적인 답변이 나올 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deduplicate&amp;nbsp;Data
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Active&amp;nbsp;Learning
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Find&amp;nbsp;representive&amp;nbsp;data&amp;nbsp;for&amp;nbsp;Dataset&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AI&amp;nbsp;learns&amp;nbsp;mapping&amp;nbsp;between&amp;nbsp;variable&amp;nbsp;variance&amp;nbsp;and&amp;nbsp;output&amp;nbsp;variance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Reference/AI Engineering</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/515</guid>
      <comments>https://jaeseo0519.tistory.com/515#entry515comment</comments>
      <pubDate>Wed, 28 Jan 2026 21:11:26 +0900</pubDate>
    </item>
    <item>
      <title>[AI Engineering] 7. Finetuning</title>
      <link>https://jaeseo0519.tistory.com/514</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스터디원 어록.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;영어 원문 자료가 있음에도 번역기 딸깍하면서 원문으로 읽지 않는 건 공부할 자세가 되어있지 않은 것이다.&quot;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Transfer Learning
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;학습시키고 싶은데 데이터 적으니까, 방대한 데이터셋이 있는 기존의 모델에 pre-training 시키고, 적은 양의 데이터셋으로 학습시켜야 하는 나만의 model을 post-training 시키는 것&lt;/li&gt;
&lt;li&gt;원래 image 쪽에서만 주로 사용했었는데, &lt;a href=&quot;https://arxiv.org/abs/2210.11416&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Scaling Instruction-Finetuned Language Models(2022)&lt;/a&gt;에서 NLP(Natural Language Processing)에도 잘 되는 것을 보임 -&amp;gt; NLP 필수 교양서 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;position&amp;nbsp;encoding&amp;nbsp;왜&amp;nbsp;함?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;s&gt;K-NN&lt;/s&gt;(수정: RNN)에서 Transformer Architecture로 넘어오면서 attention 하면 위치 정보 사라짐.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&quot;나는 사과를 먹는다&quot; -&amp;gt; 입력 받는 행렬이 5차원이면? -&amp;gt; 벡터화 시켜서 넣었더니 위치 정보가 다 날아감.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그래서&amp;nbsp;sin,&amp;nbsp;cos&amp;nbsp;파를&amp;nbsp;썼는데,&amp;nbsp;긴&amp;nbsp;context를&amp;nbsp;넣으면&amp;nbsp;한&amp;nbsp;주기를&amp;nbsp;넘어버려서&amp;nbsp;문제가&amp;nbsp;됨.&amp;nbsp;(e.g.&amp;nbsp;최대&amp;nbsp;1,000&amp;nbsp;tokens로&amp;nbsp;했는데&amp;nbsp;1,500&amp;nbsp;tokens&amp;nbsp;들어오면?&amp;nbsp;주기를&amp;nbsp;늘릴&amp;nbsp;거임?)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;RoPE&amp;nbsp;(Rotary&amp;nbsp;Positioning&amp;nbsp;Embedding)는&amp;nbsp;더하지&amp;nbsp;않고,&amp;nbsp;position&amp;nbsp;m에&amp;nbsp;해당하는&amp;nbsp;각도만큼&amp;nbsp;vector를&amp;nbsp;회전시킴.&amp;nbsp;-&amp;gt;&amp;nbsp;행렬&amp;nbsp;곱셈(선형&amp;nbsp;변환)이&amp;nbsp;일어남.&amp;nbsp;-&amp;gt;&amp;nbsp;위치&amp;nbsp;정보&amp;nbsp;손실&amp;nbsp;최소화
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Rm&amp;nbsp;*&amp;nbsp;Rm'&amp;nbsp;:&amp;nbsp;길이&amp;nbsp;확장&amp;nbsp;해야&amp;nbsp;했던&amp;nbsp;걸&amp;nbsp;각도만&amp;nbsp;쪼개면&amp;nbsp;됨.&amp;nbsp;(interpolation)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LongLoRA&amp;nbsp;(Shifted&amp;nbsp;Sparse&amp;nbsp;Attention)&lt;/li&gt;
&lt;li&gt;Flash&amp;nbsp;Attention
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&quot;finetuning 파튼데 이걸 왜 들고 왔냐. 들어나 보자.&quot; (ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ)&lt;/li&gt;
&lt;li&gt;O(N^2)을 줄여주지는 않는데, 그냥 bandwidth 늘려서 한 번에 가져와서 융합(fusion)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이런 것도 솔루션이라고 봐도 되는 건가? HW 비싼 거 써서 성능 높인다는 아이디어를 누가 못 내냐. -&amp;gt; 생각보다&amp;nbsp;안&amp;nbsp;비쌈.&amp;nbsp;요새&amp;nbsp;많이&amp;nbsp;쓴다.&lt;/li&gt;
&lt;li&gt;소비자용은 별 의미 없고, 기업용 끌고 와야 속도 체감될 것. -&amp;gt; &quot;9장에서 재서님이 더 깊게 파주시길 기대합니다.&quot; (제가요?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;연산량은&amp;nbsp;동일한데&amp;nbsp;메모리&amp;nbsp;사용량을&amp;nbsp;줄여줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;finetuning&amp;nbsp;왜&amp;nbsp;함?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;AI 쓰면서 불편한 점. 지식(fact)이 부족하거나, 행동(act)이 멍청. -&amp;gt; fact는 RAG로 보완 가능하니 act를 고쳐라.&lt;/li&gt;
&lt;li&gt;근데 prompt 먼저 체크하고, degration risk, RAG로 fact 주입하고, 도메인 특화 지식 넣어주면 대부분 해결될 수도 있음.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ahnGLM-RC1Y&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;A survey of techniques for maximizing LLM Performance&lt;/a&gt; 3:29 부터 나오는 그림 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;범용 모델이 너무 좋으면, 니가 백날 finetuning한 모델을 쉽게 뛰어넘을 수도 있다. -&amp;gt; 대부분 few-shot learning으로 해결됨.&lt;/li&gt;
&lt;li&gt;근데 또 요새 RAG도 잘 안 씀. 너무 long long long long context가 되니까 agent를 쓰자는 방향으로 가는 추세.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Memory&amp;nbsp;Bottleneck
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;왜&amp;nbsp;역전파는&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;메모리가&amp;nbsp;필요한가?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;추론에는&amp;nbsp;생각보다&amp;nbsp;별로&amp;nbsp;안&amp;nbsp;씀.&lt;/li&gt;
&lt;li&gt;gradients,&amp;nbsp;weight,&amp;nbsp;optimizer&amp;nbsp;states,&amp;nbsp;activations&amp;nbsp;등의&amp;nbsp;정보를&amp;nbsp;들고&amp;nbsp;있어야&amp;nbsp;함.&lt;/li&gt;
&lt;li&gt;Adam(Optimizer)의&amp;nbsp;경우&amp;nbsp;momentum,&amp;nbsp;variznce&amp;nbsp;두&amp;nbsp;개&amp;nbsp;상태&amp;nbsp;필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요즘 LLM들은 모두 Adam 쓰는데, weights + gradients + optimizer states + activations 하면 거의 기존 memory의 4배가 필요. 13M Model이면 거의 78GB 이상.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Floating&amp;nbsp;Point&amp;nbsp;Formats
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;FP32,&amp;nbsp;FP16,&amp;nbsp;BF16,&amp;nbsp;TF32&lt;/li&gt;
&lt;li&gt;정확도 좀 줄이면, 메모리 사용률 줄이고 성능 높일 수 있지 않냐. -&amp;gt;&amp;nbsp;Quantization을&amp;nbsp;꿈꿀&amp;nbsp;수&amp;nbsp;있지&amp;nbsp;않을까.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PTQ,&amp;nbsp;QAT&amp;nbsp;중&amp;nbsp;QAT를&amp;nbsp;더&amp;nbsp;많이&amp;nbsp;씀.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;양자화&amp;nbsp;고려한다&amp;nbsp;=&amp;nbsp;edge&amp;nbsp;device에서&amp;nbsp;하겠다.&lt;/li&gt;
&lt;li&gt;PTQ 문제점은 정밀도 줄어서 성능이 너무 떨어짐.&lt;/li&gt;
&lt;li&gt;그래서&amp;nbsp;QAT를&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;많이&amp;nbsp;쓰는&amp;nbsp;추세.&amp;nbsp;(성능&amp;nbsp;감소가&amp;nbsp;원본&amp;nbsp;모델의&amp;nbsp;98%&amp;nbsp;정도,&amp;nbsp;근데&amp;nbsp;mem&amp;nbsp;사용량은&amp;nbsp;엄청&amp;nbsp;줄어듦.)&amp;nbsp;-&amp;gt;&amp;nbsp;근데&amp;nbsp;양자화했다가&amp;nbsp;복호화했다가&amp;nbsp;하느라&amp;nbsp;속도는&amp;nbsp;좀&amp;nbsp;느릴&amp;nbsp;수도.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PEFT&amp;nbsp;(Parameter&amp;nbsp;Efficient&amp;nbsp;Fine-Tuning)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;transformer에&amp;nbsp;adapter를&amp;nbsp;하나씩&amp;nbsp;더&amp;nbsp;끼운&amp;nbsp;것.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;soft prompt -&amp;gt; 대학원에서 이쪽은 잘 안 쓴다고 패스함. ㅋㅋ&lt;/li&gt;
&lt;li&gt;LoRA(Low-Rank&amp;nbsp;Adaptation)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/pdf/2106.09685&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS(2021)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PEFT면 사실상 다 LoRA 쓴다고 봐도 무방.&lt;/li&gt;
&lt;li&gt;아까&amp;nbsp;multihead&amp;nbsp;뒤에&amp;nbsp;adapter를&amp;nbsp;붙였는데,&amp;nbsp;이제&amp;nbsp;옆에&amp;nbsp;붙일&amp;nbsp;거임.&amp;nbsp;(병렬&amp;nbsp;처리)&amp;nbsp;-&amp;gt;&amp;nbsp;pretrained&amp;nbsp;weight는&amp;nbsp;건들지&amp;nbsp;않고&amp;nbsp;adapter의&amp;nbsp;weight만&amp;nbsp;건들&amp;nbsp;거임.&amp;nbsp;-&amp;gt;&amp;nbsp;adapter는&amp;nbsp;attention&amp;nbsp;지나고&amp;nbsp;나서&amp;nbsp;학습,&amp;nbsp;attention&amp;nbsp;연산을&amp;nbsp;할&amp;nbsp;때&amp;nbsp;그&amp;nbsp;값&amp;nbsp;자체를&amp;nbsp;바꾸(문장이&amp;nbsp;들어오면&amp;nbsp;Q,&amp;nbsp;K,&amp;nbsp;V로&amp;nbsp;projection을&amp;nbsp;직접&amp;nbsp;만듦)는&amp;nbsp;게&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;차이라고&amp;nbsp;생각.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;value, output이 제일 중요함. -&amp;gt; 뭘 finetuning해야 할 지 모르겠다? value, output tuning 해라~&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요새는&amp;nbsp;학습할&amp;nbsp;때&amp;nbsp;Iteration&amp;nbsp;횟수를&amp;nbsp;많이&amp;nbsp;봐야하지&amp;nbsp;않을까.&amp;nbsp;epoch로&amp;nbsp;보게&amp;nbsp;되면&amp;nbsp;large&amp;nbsp;data를&amp;nbsp;너무&amp;nbsp;많이&amp;nbsp;되지&amp;nbsp;않을까&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/pdf/2305.18290&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; Direct Preference Optimization: Your Language Model is Secretly a Reward Model(2023)&lt;/a&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;(그냥 요새 finetuning 안 하는 방향으로 많이 가더라, ranking할 때도 PPO말고 DPO 많이 쓰는 거 같더라. 이런 말 하려고 공유했는데 DPO 논문도 반드시 읽어야 할 논문 중 하나라고 열광함.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Reference/AI Engineering</category>
      <author>나죽못고나강뿐</author>
      <guid isPermaLink="true">https://jaeseo0519.tistory.com/514</guid>
      <comments>https://jaeseo0519.tistory.com/514#entry514comment</comments>
      <pubDate>Thu, 22 Jan 2026 11:39:09 +0900</pubDate>
    </item>
  </channel>
</rss>