<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>퇴근 후 개발공부</title>
    <link>https://tuigun.tistory.com/</link>
    <description>개발괴발 기록</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 22:32:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>tuigun</managingEditor>
    <image>
      <title>퇴근 후 개발공부</title>
      <url>https://tistory1.daumcdn.net/tistory/4005382/attach/07b12af0b79143c28eb645fdc7def0b5</url>
      <link>https://tuigun.tistory.com</link>
    </image>
    <item>
      <title>시작하는 이들을 위한 mongoDB Aggregation 가이드</title>
      <link>https://tuigun.tistory.com/132</link>
      <description>&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;a href=&quot;https://studio3t.com/knowledge-base/articles/mongodb-aggregation-framework/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://studio3t.com/knowledge-base/articles/mongodb-aggregation-framework/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669362680390&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MongoDB Aggregation: tutorial with examples and exercises | Studio 3T&quot; data-og-description=&quot;Master the MongoDB aggregation pipeline. Follow along with query examples using the most important aggregation stages, and test your skills!&quot; data-og-host=&quot;studio3t.com&quot; data-og-source-url=&quot;https://studio3t.com/knowledge-base/articles/mongodb-aggregation-framework/&quot; data-og-url=&quot;https://studio3t.com/knowledge-base/articles/mongodb-aggregation-framework/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/byrfze/hyQGlspfdU/bu3aYgPnVTy98uhCvDQVNK/img.png?width=720&amp;amp;height=225&amp;amp;face=0_0_720_225&quot;&gt;&lt;a href=&quot;https://studio3t.com/knowledge-base/articles/mongodb-aggregation-framework/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://studio3t.com/knowledge-base/articles/mongodb-aggregation-framework/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/byrfze/hyQGlspfdU/bu3aYgPnVTy98uhCvDQVNK/img.png?width=720&amp;amp;height=225&amp;amp;face=0_0_720_225');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB Aggregation: tutorial with examples and exercises | Studio 3T&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Master the MongoDB aggregation pipeline. Follow along with query examples using the most important aggregation stages, and test your skills!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;studio3t.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mongoDB를 시작할 때, 당신은 넓은 범위의 쿼리를 위해 find()명령어를 사용할 것이다. 하지만, 당신의 쿼리가 점점 진화할 수록, 당신은 Aggregation에 대해 알아야할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서, 몽고DB의 aggregation query를 작성하는 주요 원칙과 인덱스를 활용한 최적화 방법을 설명합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Aggregation 이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Aggregation은 여러 단계를 거치는 방법을 통해 collection 내의 많은양의 문서들을 처리하는 방법입니다. stage들은 파이프라인을 생성합니다. 파이프라인 내에서 filter, sort, group, reshape, 문서 수정을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Aggregation의 가장 전형적인 유형중 하나는 문서의 그룹을 집계값을 계산하는 것입니다. 이는 SQL의 기본적인 집계인 GROUP BY절과 COUNT, SUM, AVG 기능과 비슷합니다. MongoDB Aggregation은 더 나아가 join과 같은 수행을 할 수 있고, 문서의 형태를 변경하거나, 새롭게 만들거나, 기존 컬렉션을 업데이트 하는 등의 기능을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mongoDB에서 집계 데이터를 얻기위한 방법이 있지만, aggregation framework는 대부분의 작업에 권장되는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;find() 쿼리에 붙어 빠르게 사용할 수 있는 단일 목적의 estimateDocumentCount(), count(), distinct()가 있지만, 범위가 제한됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map-reduce 프레임워크는 aggregation framework의 처리기이고, 사용하기 더 어렵습니다. mongoDB는 해당 기능을 더이상 사용하지 않습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;mongoDB aggregation 파이프라인은 어떻게 동작하나요&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mongo.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmccQ/btrR744sbnM/0NUh0qhseJ5qdYYYTBrFpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmccQ/btrR744sbnM/0NUh0qhseJ5qdYYYTBrFpk/img.png&quot; data-alt=&quot;전형적인 mongoDB aggregation 파이프라인을 나타낸 그림입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmccQ/btrR744sbnM/0NUh0qhseJ5qdYYYTBrFpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmccQ%2FbtrR744sbnM%2F0NUh0qhseJ5qdYYYTBrFpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;225&quot; data-filename=&quot;mongo.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전형적인 mongoDB aggregation 파이프라인을 나타낸 그림입니다.&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;$match stage - 필요한 문서를 필터합니다.&lt;/li&gt;
&lt;li&gt;$group stage - 집계 작업을 합니다.&lt;/li&gt;
&lt;li&gt;$sort stage - (오름차순, 내림차순) 으로 필요로하는 결과 문서를 정렬합니다.&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;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;h3 data-ke-size=&quot;size23&quot;&gt;MongoDB 집계 파이프라인 구문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aggregation query 빌드를 어떻게하는가에 대한 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db.collectionName.aggregate(pipeline, options)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;collectionName - 콜렉션의 이름&lt;/li&gt;
&lt;li&gt;pipeline - aggregation stage를 포함한 array&lt;/li&gt;
&lt;li&gt;options - aggregation을 위한 선택적인 파라미터&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1669362912006&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline = [
        { $match : { &amp;hellip; } },
        { $group : { &amp;hellip; } },
        { $sort : { &amp;hellip; } }
       ]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MongoDB aggregation stage의 한계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aggregation은 메모리에서 작업합니다. 각각의 스테이지는 100MB의 램을 사용합니다. 이 한계를 넘는 작업을 한다면 에러를 마주치게됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 피할 수 없는 경우, 디스크에서 페이징하도록 선택할 수 있지만 메모리보다 디스크에서 작업하는것이 더 느리기 때문에 시간상의 단점이 있습니다. 디스크에서 읽는 방식을 선택하기 위해 alloDiskUser 옵션을 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669362939792&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;db.collectionName.aggregate(pipeline, { allowDiskUse : true })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 옵션은 샤드 서비스에서 항상 사용 가능한것이 아님을 기억하세요. 예를들어 아틀라스 M0, M2, M5 클러스터는 해당 옵션을 사용할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 콜렉션에서 $out 을 경유해 저장되거나 cursor, aggregation query 에 의해 반환되는 문서들은 16MB의 한계를 가집니다. 즉, mongoDB의 문서크기보다 클 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 한계치에 다다를 것 같다면, aggregation query 출력 문서가 아닌 커서로 표시되도록 지정해야합니다.&lt;/p&gt;</description>
      <category>whatIRead</category>
      <category>MongoDB</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/132</guid>
      <comments>https://tuigun.tistory.com/132#entry132comment</comments>
      <pubDate>Fri, 25 Nov 2022 16:56:52 +0900</pubDate>
    </item>
    <item>
      <title>DBMS Connection pool 이 뭐임</title>
      <link>https://tuigun.tistory.com/131</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Postgresql_elephant.svg.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ub2Qi/btrNqusBC3E/zUHr0aKbApkZd0p8RjEPP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ub2Qi/btrNqusBC3E/zUHr0aKbApkZd0p8RjEPP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ub2Qi/btrNqusBC3E/zUHr0aKbApkZd0p8RjEPP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fub2Qi%2FbtrNqusBC3E%2FzUHr0aKbApkZd0p8RjEPP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;660&quot; data-filename=&quot;Postgresql_elephant.svg.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;postgresql Connection pool&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RDBMS connection pool&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS는 자체적으로 서버와 클라이언트를 갖고있다. (데이터를 요청하는쪽이 클라이언트, 요청을 받아 처리하는쪽이 서버.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;connection pool 이란 DB의 서버-클라이언트간의 연결 객체를 의미한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스 연결에 드는 비용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에 연결하는 것은 아래처럼 여러 단계를 거쳐야하는 리소스가 많이 필요한 작업이다. 그러나 연결을 닫지않고 열린 상태로 유지하는 것 또한 리소스를 소모한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션은 연결을 하기위해 DB driver를 사용한다.&lt;/li&gt;
&lt;li&gt;네트워크 소켓이 애플리케이션과 DB를 연결하기위해 열린다.&lt;/li&gt;
&lt;li&gt;유저 인증됨&lt;/li&gt;
&lt;li&gt;작업이 완료되고 연결은 닫힌다.&lt;/li&gt;
&lt;li&gt;네트워크 소켓이 닫힌다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DB connection pooling을 하는 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 작업의 경우, 연결을 하고, 닫는 프로세스에 들이는 비용을 걱정하지 않아도 된다. 하지만 애플리케이션이 확장됨에 따라 연결을 지속적으로 열고, 닫는데 드는 비용이 더 많이 들고 애플리케이션에 영향을 줄 수 있다. 따라서, 새로운 연결을 열고 닫는 것 보다 열린 상태로 유지하고 필요한 작업에 전달하는 방법이 더 효율적이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적절한 Connection pool의 크기?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 connection pool이 실제 연산의 빈도수보다 적으면, 가능한 연결이 열릴 때 까지 기다려야하므로 대기시간이 발생한다. 반면 너무 많은 연결을 열어놓는다면 한정된 서버 프로세서가 Connection pool을 연결하는것에 대한 대기시간이 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 완벽한 공식은 없지만 아래 문서가 참고할 만 하여 첨부했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m_20170529224738_lvoowmoo.jpeg&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ngQYH/btrNqsn3Whx/O2ENd88iZyxmSA1xfwbOv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ngQYH/btrNqsn3Whx/O2ENd88iZyxmSA1xfwbOv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ngQYH/btrNqsn3Whx/O2ENd88iZyxmSA1xfwbOv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FngQYH%2FbtrNqsn3Whx%2FO2ENd88iZyxmSA1xfwbOv0%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;294&quot; height=&quot;300&quot; data-filename=&quot;m_20170529224738_lvoowmoo.jpeg&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 수의 connection pool도 답이 아니고&lt;/li&gt;
&lt;li&gt;적은 수의 connection pool도 답이 아니다.&lt;/li&gt;
&lt;li&gt;최대 pool의 절반 정도로 시작해서 성능에 따라 조절하는 것이 좋다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.digitalocean.com/products/databases/postgresql/how-to/manage-connection-pools/&quot;&gt;https://docs.digitalocean.com/products/databases/postgresql/how-to/manage-connection-pools/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664468950212&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;How to Manage Connection Pools for PostgreSQL Database Clusters :: DigitalOcean Documentation&quot; data-og-description=&quot;How to Manage Connection Pools for PostgreSQL Database Clusters Validated on 8 August 2019 &amp;bull; Posted on 14 February 2019 PostgreSQL is an open source, object-relational database built with a focus on extensibility, data integrity, and speed. Its concurren&quot; data-og-host=&quot;docs.digitalocean.com&quot; data-og-source-url=&quot;https://docs.digitalocean.com/products/databases/postgresql/how-to/manage-connection-pools/&quot; data-og-url=&quot;https://docs.digitalocean.com/products/databases/postgresql/how-to/manage-connection-pools/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oUAoG/hyPXKFDhMK/K0FYq9F0Ul3ZMi3CQtQZx1/img.png?width=1012&amp;amp;height=565&amp;amp;face=0_0_1012_565,https://scrap.kakaocdn.net/dn/oTKmu/hyPXC1SIMS/khxxMHpkKwl4u4rsK3g5C0/img.png?width=1172&amp;amp;height=410&amp;amp;face=0_0_1172_410,https://scrap.kakaocdn.net/dn/cYD1NG/hyPXLq1fAv/w8GC4TsDjYYnDS6pn6a3Jk/img.png?width=1212&amp;amp;height=344&amp;amp;face=0_0_1212_344&quot;&gt;&lt;a href=&quot;https://docs.digitalocean.com/products/databases/postgresql/how-to/manage-connection-pools/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.digitalocean.com/products/databases/postgresql/how-to/manage-connection-pools/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oUAoG/hyPXKFDhMK/K0FYq9F0Ul3ZMi3CQtQZx1/img.png?width=1012&amp;amp;height=565&amp;amp;face=0_0_1012_565,https://scrap.kakaocdn.net/dn/oTKmu/hyPXC1SIMS/khxxMHpkKwl4u4rsK3g5C0/img.png?width=1172&amp;amp;height=410&amp;amp;face=0_0_1172_410,https://scrap.kakaocdn.net/dn/cYD1NG/hyPXLq1fAv/w8GC4TsDjYYnDS6pn6a3Jk/img.png?width=1212&amp;amp;height=344&amp;amp;face=0_0_1212_344');&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;How to Manage Connection Pools for PostgreSQL Database Clusters :: DigitalOcean Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;How to Manage Connection Pools for PostgreSQL Database Clusters Validated on 8 August 2019 &amp;bull; Posted on 14 February 2019 PostgreSQL is an open source, object-relational database built with a focus on extensibility, data integrity, and speed. Its concurren&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.digitalocean.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TypeORM에서의 connection pool&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queryRunner를 통해 connection pool을 관리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업이 완료된 연결은 다른 작업을 위해 release 시켜줘야한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;make sure to release it when it is not needed anymore to make it available to the connection pool again:&lt;/blockquote&gt;
&lt;pre id=&quot;code_1664466834081&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;await queryRunner.release()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queryRunner instance는&lt;a href=&quot;https://typeorm.io/working-with-entity-manager&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; EntityManager&lt;/a&gt; 인스턴스가 가지고있는 메서드를 갖고있다.&lt;br /&gt;EntityManager는 엔티티를 삽입,수정,삭제,업데이트하는 역할을한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고한 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cockroachlabs.com/blog/what-is-connection-pooling/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.cockroachlabs.com/blog/what-is-connection-pooling/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664469070121&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;What is Connection Pooling, and Why Should You Care&quot; data-og-description=&quot;Database connections can get expensive at scale. Pooling connections can help, so here's what connection pooling is and how to do it!&quot; data-og-host=&quot;www.cockroachlabs.com&quot; data-og-source-url=&quot;https://www.cockroachlabs.com/blog/what-is-connection-pooling/&quot; data-og-url=&quot;https://www.cockroachlabs.com/blog/what-is-connection-pooling/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DCRLV/hyPXJzYc1z/gMnF6wsaauyMLaGTdqrVR1/img.jpg?width=1200&amp;amp;height=400&amp;amp;face=0_0_1200_400,https://scrap.kakaocdn.net/dn/yZCsJ/hyPXFYDmbJ/sxbyZkabM5KaJdpPiw2Z21/img.jpg?width=1185&amp;amp;height=395&amp;amp;face=0_0_1185_395&quot;&gt;&lt;a href=&quot;https://www.cockroachlabs.com/blog/what-is-connection-pooling/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cockroachlabs.com/blog/what-is-connection-pooling/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DCRLV/hyPXJzYc1z/gMnF6wsaauyMLaGTdqrVR1/img.jpg?width=1200&amp;amp;height=400&amp;amp;face=0_0_1200_400,https://scrap.kakaocdn.net/dn/yZCsJ/hyPXFYDmbJ/sxbyZkabM5KaJdpPiw2Z21/img.jpg?width=1185&amp;amp;height=395&amp;amp;face=0_0_1185_395');&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;What is Connection Pooling, and Why Should You Care&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Database connections can get expensive at scale. Pooling connections can help, so here's what connection pooling is and how to do it!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cockroachlabs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/634&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jojoldu.tistory.com/634&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664469074214&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;NodeJS 와 PostgreSQL Connection Pool&quot; data-og-description=&quot;Database에 관해 기본적인 id/pw 외에 해야할 설정들이 여러개 있는데요. 그 중 실제 서비스 운영에 가장 중요한 설정 중 하나가 이전 글인 쿼리 타임아웃 과 함께 커넥션 풀 (Connection Pool) 설정입니&quot; data-og-host=&quot;jojoldu.tistory.com&quot; data-og-source-url=&quot;https://jojoldu.tistory.com/634&quot; data-og-url=&quot;https://jojoldu.tistory.com/634&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Im0BP/hyPXFdgupf/QRbMr4zCCAScnkH7T2deY0/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/udgqN/hyPXESWSJF/EplGIUYmIlnqkwfpQ6wqgK/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/SsU5Z/hyPXFK47Jr/lSkvxEvnI4RGHvTu9GRxu0/img.png?width=1513&amp;amp;height=1834&amp;amp;face=0_0_1513_1834&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/634&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jojoldu.tistory.com/634&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Im0BP/hyPXFdgupf/QRbMr4zCCAScnkH7T2deY0/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/udgqN/hyPXESWSJF/EplGIUYmIlnqkwfpQ6wqgK/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/SsU5Z/hyPXFK47Jr/lSkvxEvnI4RGHvTu9GRxu0/img.png?width=1513&amp;amp;height=1834&amp;amp;face=0_0_1513_1834');&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;NodeJS 와 PostgreSQL Connection Pool&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Database에 관해 기본적인 id/pw 외에 해야할 설정들이 여러개 있는데요. 그 중 실제 서비스 운영에 가장 중요한 설정 중 하나가 이전 글인 쿼리 타임아웃 과 함께 커넥션 풀 (Connection Pool) 설정입니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jojoldu.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;</description>
      <category>TodayILearned/TILWIL</category>
      <category>DBMS</category>
      <category>typeORM</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/131</guid>
      <comments>https://tuigun.tistory.com/131#entry131comment</comments>
      <pubDate>Fri, 30 Sep 2022 01:36:04 +0900</pubDate>
    </item>
    <item>
      <title>Nest Cache</title>
      <link>https://tuigun.tistory.com/130</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nest.svg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xcogu/btrNcX9GN0u/GGydPyAaU96bWzXFkYJm6K/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xcogu/btrNcX9GN0u/GGydPyAaU96bWzXFkYJm6K/tfile.svg&quot; data-alt=&quot;nest.js&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xcogu/btrNcX9GN0u/GGydPyAaU96bWzXFkYJm6K/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxcogu%2FbtrNcX9GN0u%2FGGydPyAaU96bWzXFkYJm6K%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;800&quot; data-filename=&quot;nest.svg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nest.js&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cache&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최근에 요청된 데이터가 금방 다시 요청 될 가능성이 높을 때 캐시에 저장한다&lt;/li&gt;
&lt;li&gt;DB에 접근하여 데이터를 가져오는 것 보다 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Nest cache&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nest.js에서 자체적으로 캐싱을 제공하고있다.&lt;/li&gt;
&lt;li&gt;캐시 인터셉터에 대한 코드는 &lt;a title=&quot;nest.js github&quot; href=&quot;https://github.com/nestjs/nest/blob/ad39c3cfd78e94f191d51ae5799ad9dadb522d38/packages/common/cache/interceptors/cache.interceptor.ts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;nest.js 레포지토리&lt;/a&gt;에서 제공하고있다.&lt;/li&gt;
&lt;li&gt;캐싱된 데이터는 기본적으로 서버의 메모리 내에 저장된다. (로컬캐시)&lt;/li&gt;
&lt;li&gt;로드밸런서가 요청을 분산하는 경우, 동일한 요청이 다른 노드로 이동하면서 캐시 누락이 될 수 있음&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot; href=&quot;https://docs.nestjs.com/techniques/caching&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식문서&lt;/a&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;에 따르면 Nest.js의 캐시를 사용하다가 Redis와 같은 인메모리 DB로도 쉽게 마이그레이션 가능한 것 같다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Cache interceptor code&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1664297749719&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Injectable()
export class CacheInterceptor implements NestInterceptor {
  @Optional()
  @Inject(HTTP_ADAPTER_HOST)
  protected readonly httpAdapterHost: HttpAdapterHost;

  protected allowedMethods = ['GET'];
  constructor(
    @Inject(CACHE_MANAGER) protected readonly cacheManager: any,
    @Inject(REFLECTOR) protected readonly reflector: any,
  ) {}

  async intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Promise&amp;lt;Observable&amp;lt;any&amp;gt;&amp;gt; {
    // 캐시처리할 수 있는 요청인지 확인
    const key = this.trackBy(context);

    // ttl 확인
    const ttlValueOrFactory =
      this.reflector.get(CACHE_TTL_METADATA, context.getHandler()) ?? null; 

    if (!key) { // key 생성이 안되었을 때, 비즈니스 로직으로 돌아간다.
      return next.handle();
    }
    try {
      // 캐시된 데이터를 검색, 없으면 null을 리턴
      const value = await this.cacheManager.get(key); 
      if (!isNil(value)) { // 캐시된 데이터가 있는 경우, 해당 데이터 리턴
        return of(value);
      }

      // 캐시된 데이터가 없는 경우, 캐시 데이터를 추가한다.
      const ttl = isFunction(ttlValueOrFactory)
        ? await ttlValueOrFactory(context)
        : ttlValueOrFactory;
      return next.handle().pipe(
        tap(response =&amp;gt; {
          // ttl을 수동으로 지정하거나 기본값인 5초로 지정할 수 있음
          const args = isNil(ttl) ? [key, response] : [key, response, { ttl }];
          // 캐시에 데이터를 추가
          this.cacheManager.set(...args); 
        }),
      );
    } catch {
      return next.handle(); 
    }
  }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고한 글&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.nestjs.com/techniques/caching#different-stores&quot;&gt;https://docs.nestjs.com/techniques/caching#different-stores&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/nestjs/nest/blob/ad39c3cfd78e94f191d51ae5799ad9dadb522d38/packages/common/cache/interceptors/cache.interceptor.ts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/nestjs/nest/blob/ad39c3cfd78e94f191d51ae5799ad9dadb522d38/packages/common/cache/interceptors/cache.interceptor.ts&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664299068654&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - nestjs/nest: A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applica&quot; data-og-description=&quot;A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications on top of TypeScript &amp;amp; JavaScript (ES6, ES7, ES8)   - GitHub - nestjs/nest: A pro...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/nestjs/nest/blob/ad39c3cfd78e94f191d51ae5799ad9dadb522d38/packages/common/cache/interceptors/cache.interceptor.ts&quot; data-og-url=&quot;https://github.com/nestjs/nest&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cOLkrW/hyPVnrtgWU/EtE2w9MPR45wcpnmo5VK90/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/nestjs/nest/blob/ad39c3cfd78e94f191d51ae5799ad9dadb522d38/packages/common/cache/interceptors/cache.interceptor.ts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/nestjs/nest/blob/ad39c3cfd78e94f191d51ae5799ad9dadb522d38/packages/common/cache/interceptors/cache.interceptor.ts&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cOLkrW/hyPVnrtgWU/EtE2w9MPR45wcpnmo5VK90/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - nestjs/nest: A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applica&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications on top of TypeScript &amp;amp; JavaScript (ES6, ES7, ES8)   - GitHub - nestjs/nest: A pro...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1664299008975&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Documentation | NestJS - A progressive Node.js framework&quot; data-og-description=&quot;Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac&quot; data-og-host=&quot;docs.nestjs.com&quot; data-og-source-url=&quot;https://docs.nestjs.com/techniques/caching#different-stores&quot; data-og-url=&quot;https://docs.nestjs.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kEVci/hyPVjo4dbG/7yUg1UKh0NhUKY56ekvnV1/img.png?width=820&amp;amp;height=429&amp;amp;face=0_0_820_429&quot;&gt;&lt;a href=&quot;https://docs.nestjs.com/techniques/caching#different-stores&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.nestjs.com/techniques/caching#different-stores&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kEVci/hyPVjo4dbG/7yUg1UKh0NhUKY56ekvnV1/img.png?width=820&amp;amp;height=429&amp;amp;face=0_0_820_429');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Documentation | NestJS - A progressive Node.js framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.nestjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hwasurr.io/nestjs/caching/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hwasurr.io/nestjs/caching/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664298989047&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Nestjs REST 애플리케이션의 캐시 처리와 캐시 무효화&quot; data-og-description=&quot;Nestjs REST 애플리케이션에서 캐시에 대한 전반적인 내용을 다룹니다. 캐시를 등록하는 방법과 캐시를 무효화하는 방법에 대해서 살펴보며 더 효율적인 방식을 찾아나갑니다.&quot; data-og-host=&quot;hwasurr.io&quot; data-og-source-url=&quot;https://hwasurr.io/nestjs/caching/&quot; data-og-url=&quot;https://hwasurr.io/nestjs/caching/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eDM94Y/hyPWMwpJEL/gO15KJ8y7cRKAyBXggcnE1/img.png?width=590&amp;amp;height=299&amp;amp;face=0_0_590_299&quot;&gt;&lt;a href=&quot;https://hwasurr.io/nestjs/caching/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwasurr.io/nestjs/caching/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eDM94Y/hyPWMwpJEL/gO15KJ8y7cRKAyBXggcnE1/img.png?width=590&amp;amp;height=299&amp;amp;face=0_0_590_299');&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;Nestjs REST 애플리케이션의 캐시 처리와 캐시 무효화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Nestjs REST 애플리케이션에서 캐시에 대한 전반적인 내용을 다룹니다. 캐시를 등록하는 방법과 캐시를 무효화하는 방법에 대해서 살펴보며 더 효율적인 방식을 찾아나갑니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwasurr.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TodayILearned/TILWIL</category>
      <category>cache</category>
      <category>nest</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/130</guid>
      <comments>https://tuigun.tistory.com/130#entry130comment</comments>
      <pubDate>Wed, 28 Sep 2022 02:29:00 +0900</pubDate>
    </item>
    <item>
      <title>gRPC 동작순서</title>
      <link>https://tuigun.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;출처&quot; href=&quot;https://developers.google.com/protocol-buffers/docs/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;protocol buffers의 동작 순서&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXQpMF/btrJApBNL0D/Pljvvxp8Gx75ySIOPohImk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXQpMF/btrJApBNL0D/Pljvvxp8Gx75ySIOPohImk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXQpMF/btrJApBNL0D/Pljvvxp8Gx75ySIOPohImk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXQpMF%2FbtrJApBNL0D%2FPljvvxp8Gx75ySIOPohImk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;160&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;.proto파일에 데이터 구조를 정의한다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;.proto file 생성&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ProtoC compiler로 해당하는 언어로 된 PB code를 생성한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;프로젝트 코드와 PB코드를 컴파일한다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;컴파일 된 class들이 생성된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;PB클래스를 사용해 (데이터를) &lt;a title=&quot;직렬화&quot; href=&quot;https://ko.wikipedia.org/wiki/%EC%A7%81%EB%A0%AC%ED%99%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;직렬화&lt;/b&gt;&lt;/a&gt;하고 &lt;b&gt;역직렬화&lt;/b&gt;한다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.proto file에서 정의한 데이터 형식대로 데이터를 매핑&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://developers.google.com/protocol-buffers/docs/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developers.google.com/protocol-buffers/docs/overview&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660283506589&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Overview &amp;nbsp;|&amp;nbsp; Protocol Buffers &amp;nbsp;|&amp;nbsp; Google Developers&quot; data-og-description=&quot;Protocol buffers provide a language-neutral, platform-neutral, extensible mechanism for serializing structured data in a forward-compatible and backward-compatible way. It&amp;rsquo;s like JSON, except it's smaller and faster, and it generates native language bind&quot; data-og-host=&quot;developers.google.com&quot; data-og-source-url=&quot;https://developers.google.com/protocol-buffers/docs/overview&quot; data-og-url=&quot;https://developers.google.com/protocol-buffers/docs/overview&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/caSa6v/hyPpJ8JJot/KtgCKlPrkEBaPSEQnz1ti1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://developers.google.com/protocol-buffers/docs/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.google.com/protocol-buffers/docs/overview&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/caSa6v/hyPpJ8JJot/KtgCKlPrkEBaPSEQnz1ti1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Overview &amp;nbsp;|&amp;nbsp; Protocol Buffers &amp;nbsp;|&amp;nbsp; Google Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Protocol buffers provide a language-neutral, platform-neutral, extensible mechanism for serializing structured data in a forward-compatible and backward-compatible way. It&amp;rsquo;s like JSON, except it's smaller and faster, and it generates native language bind&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TodayILearned/TILWIL</category>
      <category>gRPC</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/129</guid>
      <comments>https://tuigun.tistory.com/129#entry129comment</comments>
      <pubDate>Fri, 12 Aug 2022 14:50:39 +0900</pubDate>
    </item>
    <item>
      <title>비전공자를 위한 이해할 수 있는 it 지식</title>
      <link>https://tuigun.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 시간을 들여 틈틈히 책을 읽는 중.. 책책책 책을 읽읍시다 같은 프로가 또 유행했음 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 내가 읽으려고 샀다기보다 누군가에게 선물하려고 산 책인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽어보지도 않고 주는게 별로 성에 안차서 저녁에 빠르게 읽고 다음날 선물해드렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비전공자가 읽기에 아주 어렵지도 않고, 또 나도 읽으면서 아 이건 이거구나 했던 부분이 안드로이드의 SDK부분..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱개발은 정확히 어떻게 진행되는지 알기 어려웠고, 그 중에서도 SDK가 뭔지 몰랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책에서 프론트엔드, 백엔드를 모두 아울러 설명해주기 때문에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹개발에 대해 한 눈에 톺아보기 좋은 책인 것 같다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 책을 진짜 개발자와 비개발자가 소통하기 위해 읽어야할까 하는 생각은 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버, 클라이언트같은 기초지식 부터 API 등.. 이런 부분까지 비개발자가 알고 소통을 하기 보다는 개발자가 알기 쉽게 설명하는 노력이 필요할 것 같다는 생각이 들었다. 물론 나는 개발자가 알기 쉽게 설명하는것도 잘 못하는 중이다. 내가 처한 상황이나 에러에 대해 설명하려고하면 갑자기 횡설수설함.. 왜이러는걸까 생각을 해봤는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 내가 완벽하게 해당 에러에 대해 파악하지 못한것이 원인이 아닐까? 내 머릿속에서 문제 원인이 파악이 된 다음에나 질문하는 습관을 가져야겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;말못.jpeg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjP1q1/btrBpVDaaOC/FnN6gWZJGGGQy6nEoDQJV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjP1q1/btrBpVDaaOC/FnN6gWZJGGGQy6nEoDQJV1/img.jpg&quot; data-alt=&quot;책..책을 안읽은게 문제는 아닌 것 같은..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjP1q1/btrBpVDaaOC/FnN6gWZJGGGQy6nEoDQJV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjP1q1%2FbtrBpVDaaOC%2FFnN6gWZJGGGQy6nEoDQJV1%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;1280&quot; height=&quot;720&quot; data-filename=&quot;말못.jpeg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;책..책을 안읽은게 문제는 아닌 것 같은..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 처한 상황을 알기쉽게 설명하는 것. 개발자가 잘 해야하는 것 중 하나고, 내가 개선해야할 점이라는 생각이 들게하는 책이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하.. 다음엔 뭐읽지.&lt;/p&gt;</description>
      <category>whatIRead</category>
      <category>책</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/128</guid>
      <comments>https://tuigun.tistory.com/128#entry128comment</comments>
      <pubDate>Fri, 6 May 2022 18:03:17 +0900</pubDate>
    </item>
    <item>
      <title>CODE</title>
      <link>https://tuigun.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지금 한 1/4 남았나..&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;codebook.jpeg&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxPIHO/btrA2BrXRQ9/iWirorFWB6mTmvjQV8MTT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxPIHO/btrA2BrXRQ9/iWirorFWB6mTmvjQV8MTT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxPIHO/btrA2BrXRQ9/iWirorFWB6mTmvjQV8MTT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxPIHO%2FbtrA2BrXRQ9%2FiWirorFWB6mTmvjQV8MTT1%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;526&quot; height=&quot;765&quot; data-filename=&quot;codebook.jpeg&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 공학의 유명한 근본, 운영체제, 네트워크, 자료구조와 알고리즘 강의들은 한번씩 들어봤지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 구조는 굳이 들을필요 없다! 라고해서 한눈에 보는 컴퓨터 구조 책을 한번 슥 보는것으로 마무리했었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 이렇게 다시 만날 줄 몰랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한눈에 보는 컴퓨터 구조책은.. 시험에 특화된 책 같은 느낌이라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CODE는 진하게 뽑은 샷같은 책이었다. 근데 샷인데 양은 아메리카노인..?&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;말그대로 CODE에 대한 이야기로 시작하는데, 점자, 모스부호 등을 시작으로 점점 이야기가 깊어진다.&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;맞아 컴퓨터도 기계였지. VSC 앞에서 타이핑을 하다보면 컴퓨터가 전자회로로 이루어진 기계라는걸 잊게되는데,&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>whatIRead</category>
      <category>책</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/127</guid>
      <comments>https://tuigun.tistory.com/127#entry127comment</comments>
      <pubDate>Tue, 3 May 2022 01:34:33 +0900</pubDate>
    </item>
    <item>
      <title>asynchronous-synchronous programming</title>
      <link>https://tuigun.tistory.com/126</link>
      <description>&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;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동기, 비동기는 무엇과 동기되고 비동기된다는 뜻일까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스레드*&lt;/b&gt;의 흐름이 공통자원의 데이터와 동기, 비동기 된다고 생각하면 될 것 같다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;노드.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqJz2t/btrA0X0P4ND/Eh2J40Rg0bsqp1vQ6bc0qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqJz2t/btrA0X0P4ND/Eh2J40Rg0bsqp1vQ6bc0qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqJz2t/btrA0X0P4ND/Eh2J40Rg0bsqp1vQ6bc0qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqJz2t%2FbtrA0X0P4ND%2FEh2J40Rg0bsqp1vQ6bc0qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;300&quot; data-filename=&quot;노드.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;300&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;공통 자원에 여러명이 동시에 접근할 때, &lt;a title=&quot;위키백과 임계구역&quot; href=&quot;https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD_%EB%AC%B8%EC%A0%9C&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 title=&quot;위키백과 세마포어&quot; href=&quot;https://ko.wikipedia.org/wiki/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;세마포어&lt;/a&gt;가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세마포어는 공통된 자원에 접근하는 여러 프로세스들을 관리하는 것인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 내 은행계좌(인데 천만원이 있는) 에서 A가 천만원을 빼간 후, B가 동시에 천만원을 또 출금하겠다고하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;은행앱은 당연히 둘 중 한명의 천만원만 빼주겠지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A,B 두개의 프로세스가 관리되지않는다면, 문제가 일어날 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세마포어는 이 프로세스들을 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 공통 자원에 하나의 프로세스의 출입을 허락하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기화는 공통 자원에 대한 프로세스의 순서 제어라고 봐도되는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 node.js에서의 동기화는 어떻게 받아들이면 좋을까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js에서 실행되는 코드들은 이벤트루프의 큐를 이용해 이런 동시성 문제를 해결한다.&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;호출 스택을 여러개의 스레드가 동시에 접근하려고 한다면, 예를들어 스택에 A함수의 결과가 저장되지 않았는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B함수가 스택에 접근해서 실행되려한다면 당연히 B함수가 문제를 일으킬 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 얘기한 은행 이야기와 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js에서의 동기화도 스레드와 프로세스의 동기화와 다르지 않은 것 같다.&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;그러니까,, 동기, 비동기의 개념에 대해 설명할 때 보통 블로킹, 논블로킹과 함께 설명되었던 이유도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 좀 알 것 같은.. 하지만 굳이 묶어 설명이 되어야했나? 싶기도 하고..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;u&gt;스레드 : 프로그램 내부에 흐르는 맥&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;</description>
      <category>TodayILearned/TILWIL</category>
      <category>노드</category>
      <category>동기</category>
      <category>비동기</category>
      <category>운영체제</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/126</guid>
      <comments>https://tuigun.tistory.com/126#entry126comment</comments>
      <pubDate>Mon, 2 May 2022 02:31:46 +0900</pubDate>
    </item>
    <item>
      <title>왜 타입스크립트 마이그레이션을 해야할까</title>
      <link>https://tuigun.tistory.com/125</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;왜 멀쩡히 잘 돌아가고있는 JS를 코드를 굳이 TS로 바꿔야하는가?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능이 좋아지는건가? 개발속도가 빨라지나? 하는 의문을 가졌다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으론 성능이 좋아지는 것과는 상관이 없고 개발속도도 조금 느려질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 서비스가 발전할 수록, API가 많아질 수록, 나의 코드를 다른 개발자들이 작업해야하는 경우가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남의 코드를 읽고 이해하는것도 시간이 필요한 작업이고, 이것을 해소하는데&amp;nbsp; 타입스크립트를 사용하는것이 도움이 된다고 생각했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Typescript_logo_2020.svg&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZiRGv/btrATdEH1Px/b1LJNmAfog18EjLbc8hZ70/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZiRGv/btrATdEH1Px/b1LJNmAfog18EjLbc8hZ70/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZiRGv/btrATdEH1Px/b1LJNmAfog18EjLbc8hZ70/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZiRGv%2FbtrATdEH1Px%2Fb1LJNmAfog18EjLbc8hZ70%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;512&quot; data-filename=&quot;Typescript_logo_2020.svg&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트를 처음 접했을 때, 타입이 존재함으로 인해서 장점이 생긴다는 것이 와닿지않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 타입스크립트를 이용해 만든 API를 다루다가 아직 마이그레이션되지 않은 API로 넘어가면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트의 장점을 느끼게됐다.. 있다 없으니까..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 운송장을 발송하는 기존 API에 대해 알림을 추가한다던지 하는 보수를 한다고 할 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 API에 작성된 코드들이 어떻게 동작하는 지 파악하는 것을 가장 먼저 해야한다.&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;API내 여러 함수가 순차적으로 실행될 때, 이 함수의 인자는 어디서 오는거고 어떤 형식을 띄어야하는것인지,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알아내기 위해 콘솔로그를 찍어보곤 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트의 경우 변수에 마우스만 올리면 어떤 형식을 갖고있는 변수인지 알려줘 파악이 편리하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, API명세에 대해 확인하러 직접 갈 필요 없이 인터페이스로 정의된 내용만으로도 필요한 데이터에 대한 정보를 얻는것이 가능했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 처음 타입스크립트로 짤 때, 인터페이스를 지정해주거나, 타입을 입력해주는 등의 번거로움은 존재하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 API를 계속해서 같은 개발자가 개발하는 경우가 아니라면 코드를 파악하는데 사용되는 시간도 자원이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약간의 시간을 투자해서 지속적인 병목을 줄일 수 있다면 좋은 것 아닐까..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또다른 좋은점은 내 코드가 실행되기 전에 컴파일러가 알려줘서, 빌드하기 전에 오류를 알 수 있다는 점..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 동적타이핑이라 컴파일러에서는 에러가 잡히지 않고, 런타임 환경에서 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트는 컴파일러가 검사를 먼저 해주기 때문에 실행 전&lt;span&gt;&amp;nbsp;&lt;/span&gt;버그를 찾을 수 있는 것도 장점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TodayILearned/TILWIL</category>
      <category>마이그레이션</category>
      <category>타입스크립트</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/125</guid>
      <comments>https://tuigun.tistory.com/125#entry125comment</comments>
      <pubDate>Sun, 1 May 2022 22:20:58 +0900</pubDate>
    </item>
    <item>
      <title>투포인터</title>
      <link>https://tuigun.tistory.com/124</link>
      <description>&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0pkWD/btrz4N0D0e1/KV67RdlUXIl01WqtZNzOYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0pkWD/btrz4N0D0e1/KV67RdlUXIl01WqtZNzOYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0pkWD/btrz4N0D0e1/KV67RdlUXIl01WqtZNzOYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0pkWD%2Fbtrz4N0D0e1%2FKV67RdlUXIl01WqtZNzOYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;280&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;280&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;투포인터를 치면 블로그에서는 보통 배열 내 요소들의 합에 대한 것을 예시로 들어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 예에만 한정된 문제인 줄 알았는데, 알고보니 투포인터는 그런 용도로만 사용되는 기법은 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어, 배열 내 요소들끼리 비교를 하려면 순차적으로 모든 요소들을 하나씩 비교해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 for문을 이중으로 돌려서 O(n^2)의 시간복잡도를 만들면서 문제를 풀이 할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 투포인터를 이용하면 O(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;각각의 포인터가 가르키는 값끼리 비교하거나, 순서를 바꾸는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 굳이 이중 반복문을 돌지 않고도 O(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;자주 나오는 유형은&amp;nbsp;&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;- 배열 내 요소들의 합이 N이 되는 경우의 수, 또는 인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TodayILearned</category>
      <category>알고리즘</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/124</guid>
      <comments>https://tuigun.tistory.com/124#entry124comment</comments>
      <pubDate>Fri, 22 Apr 2022 00:30:47 +0900</pubDate>
    </item>
    <item>
      <title>우당탕탕 회사코드 적응기</title>
      <link>https://tuigun.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;입사하고 얼마되지 않아서 회사 코드를 봤을 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;express로 된 코드는 그래도 쉽게 이해할 수 있지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 생각했는데 망상이었다는걸 쉽게 깨달았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;어느날 CTO님이 코드 공부하는데 도움이 될 것이라면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CS로 들어온 건을 하나 주셨는데(감격)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 원인을 찾아가는 중에 코드를 이해하기 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽고 읽어봤지만 읽는걸로는 머릿속에서 정리가 딱 되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩔 수 없어. 내 머리의 한계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 포기가 필요한 시점이었는데 그 때는 그것도 잘 안됐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸.. 질문을 하라고 준건가..? 아니면 질문을 하지말고 혼자 풀어야되는 부분인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 시점에서 질문을 해야하는가..? 번뇌가 일었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런..이런 의미에선 좋은 질문이란건.. 아 그런 단어는 좀 없어졌으면..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 때 시간을 버리고 얻은 코드를 빠르게 이해할 수 있는 방법을 깨달았는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 순서도를 그려서 이해하는 것.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1637&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bctRuf/btryzp6IYOV/tF9JSlmfYZUGFiUP4xQrz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bctRuf/btryzp6IYOV/tF9JSlmfYZUGFiUP4xQrz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bctRuf/btryzp6IYOV/tF9JSlmfYZUGFiUP4xQrz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbctRuf%2Fbtryzp6IYOV%2FtF9JSlmfYZUGFiUP4xQrz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;682&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1637&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 당연한 것이었을까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 코드는 실행되는 데 필요한 코드가 여러 파일에 걸쳐져 있기도 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 꽤나 길 때도 있어서 이렇게 순서도를 그려서 이해를 하면 엄청 편했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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>blablabla</category>
      <category>순서도</category>
      <category>잡담</category>
      <author>tuigun</author>
      <guid isPermaLink="true">https://tuigun.tistory.com/123</guid>
      <comments>https://tuigun.tistory.com/123#entry123comment</comments>
      <pubDate>Wed, 6 Apr 2022 00:16:09 +0900</pubDate>
    </item>
  </channel>
</rss>