<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>mystery</title>
    <link>https://think0wise.tistory.com/</link>
    <description>공부는 평생 하는 거라 했습니다.</description>
    <language>ko</language>
    <pubDate>Thu, 25 Jun 2026 08:00:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Creative_Lee</managingEditor>
    <image>
      <title>mystery</title>
      <url>https://tistory1.daumcdn.net/tistory/4424508/attach/75f5e7891a654e5698599275fa0c3d43</url>
      <link>https://think0wise.tistory.com</link>
    </image>
    <item>
      <title>25년의 이도현</title>
      <link>https://think0wise.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1년만에 쓰는 글이라 어색하면서도 설렌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 나온김에 최근 2년동안 단 하나의 개발 관련 글을 작성하지 않은 나 자신에 대한 반성으로 회고를 시작해보자.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2년간 조용했던 블로그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취업을 하고 나서부터는 갖은 핑계를 다 갖다 붙였다.&lt;/p&gt;
&lt;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;&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;462&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF0DEC/dJMcacV3aYg/9f0SIhBnYkd5UyZblOVxuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF0DEC/dJMcacV3aYg/9f0SIhBnYkd5UyZblOVxuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF0DEC/dJMcacV3aYg/9f0SIhBnYkd5UyZblOVxuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF0DEC%2FdJMcacV3aYg%2F9f0SIhBnYkd5UyZblOVxuk%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;361&quot; height=&quot;221&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;283&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;정말 귀찮을 수 있다.&lt;/p&gt;
&lt;p 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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학습한 내용을 스스로 정리하고 다른 누군가에게 설명하는 행위를 블로그 포스팅으로 대신했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;애초에 지식을 전하기보다는 내가 아는 것을 단단히 굳히는 역할로 활용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한창 개발 공부에 전념하던 시기에도 지금처럼 충분히 바빴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때도 정말 귀찮았지만 글을 작성했었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제와서 아쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 겪었던 다양한 사건 사고들이 희미한 기억으로만 남아있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그때의 경험이 하나의 포스트로 남아있었다면... 하는 마음이 든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉬웠다면, 다음에는 아쉽지 않게 행동하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내년에는 사건 사고들 중 일부라도 블로그에 남겨보자!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;우테코 7기 FE 리뷰어 활동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우테코 7기 FE분들의 리뷰어로 지원 및 선정되어 4개월간 활동했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 과정에서 리뷰어에게 받는 코멘트 하나하나가 얼마나 소중하고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;간절한 지&lt;/span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;5기 수료생으로서&lt;span&gt;&amp;nbsp;잘&amp;nbsp;&lt;/span&gt;&lt;/span&gt;알고 있기에 이 부분을 녹여 지원서를 작성했고, 이런 진심이 통했는지 리뷰어로 선정되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YvRW5/dJMcahJPYFd/P5kKcfmk8S3LhqR717SqRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YvRW5/dJMcahJPYFd/P5kKcfmk8S3LhqR717SqRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YvRW5/dJMcahJPYFd/P5kKcfmk8S3LhqR717SqRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYvRW5%2FdJMcahJPYFd%2FP5kKcfmk8S3LhqR717SqRK%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;294&quot; height=&quot;262&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;진심을 다하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우테코의 교육과정은 총 5개의 레벨로 구성되어있으며, 리뷰어는 레벨 1과 2에서 리뷰이들의 미션(과제)를 리뷰하는 역할을 담당한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;미션은 총 8개이고 1개의 미션마다 리뷰어에게 &lt;/span&gt;&lt;/span&gt;3~4명의 리뷰이가 배정되므로 &lt;b&gt;거진 20명 이상의 교육생과 코드를 사이에 두고 마주하게 된다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 교육생들은 첫 리뷰에 달린 코멘트만 봐도 &lt;b&gt;이것이 정성이 들어간 리뷰인지, 아닌지 다 알 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 리뷰어들도 자신이 남긴 리뷰가 리뷰이에게 어떻게 느껴지고 전달될 지 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;때문에 스스로에게 부끄럽지 않은 리뷰를 남기고 싶었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇듯, 리뷰이 미션 코드의 A~Z 까지 모든 부분을 다 이해하고 리뷰하려고 하다보니 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1인당 3시간은 기본으로&lt;span&gt; &lt;/span&gt;&lt;/span&gt;투자해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(훗날, 리뷰어 회고 모임에서 이야기해보니 1인 리뷰 완료 시간은 평균 30분~60분 남짓이었다.)&lt;/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: #333333; text-align: start;&quot;&gt;내가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;교육생이었을 때 리뷰를 보고 아쉬웠던 마음, 다른 교육생들은 다 받았는데 나만 못받아서 기다렸던 기억들을 생각하면 양심이 찔렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;더욱 더 진심을 다 할 수 밖에 없었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;함께 성장하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇몇 교육생 분들은 그시절 나처럼, &lt;b&gt;내가 작성하는 코드가&lt;/b&gt;&amp;nbsp;&lt;b&gt;정답이 맞는지를 확인하고 싶은 마음이 있는것 같았다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대해서는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;정답인지 아닌지를 결정해주기 보다, &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;옳은 방향성이라고 생각한다면 왜 그러한지 이유를 묻고 함께 확인하는 방식의&lt;/b&gt; 리뷰를 주고 받으려고 했다. PR을 벗어나 개인 DM이나, 구글밋등으로도 최대한 대화를 나누려고 노력했다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정으로 나 또한 관습처럼 작성하던 코드들이 왜 더 나은 방향인지, 왜 더 좋은 코드라고 불리는지 생각할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;교육생들이 남긴 평가를 전달 받아 읽었던 순간이다!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1643&quot; data-origin-height=&quot;981&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MrdCT/dJMcaa40ei0/HExfampOIAEyG2ISaYFTb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MrdCT/dJMcaa40ei0/HExfampOIAEyG2ISaYFTb1/img.png&quot; data-alt=&quot;레벨1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MrdCT/dJMcaa40ei0/HExfampOIAEyG2ISaYFTb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMrdCT%2FdJMcaa40ei0%2FHExfampOIAEyG2ISaYFTb1%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;870&quot; height=&quot;519&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1643&quot; data-origin-height=&quot;981&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레벨1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzezJz/dJMcadm4yYR/XUUElZkD1bYmuygpXeOqVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzezJz/dJMcadm4yYR/XUUElZkD1bYmuygpXeOqVk/img.png&quot; data-alt=&quot;레벨2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzezJz/dJMcadm4yYR/XUUElZkD1bYmuygpXeOqVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzezJz%2FdJMcadm4yYR%2FXUUElZkD1bYmuygpXeOqVk%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;1646&quot; height=&quot;975&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;975&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레벨2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;교육생들은 리뷰어의&amp;nbsp;어떤 부분이 좋았고 나빴는지 정말 솔직하게 피드백한다.(나 또한 그랬었고...)&lt;br /&gt;'팀원으로 함께 일할 수 있는 기회가 된다면, 같이 일하고 싶은 리뷰어인가?(10점)' 문항에 대해서는 최하 4점까지 남긴것을 본것 같다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;노력했던 부분들이 '&lt;/span&gt;팀원으로 함께 일하고 싶은 사람'이라는 칭찬과 함께 피드백 내용에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;고스란히&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;담겨 있어서 행복했던 순간이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리뷰어중 점수 합산 1등도 너무 뿌듯했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 리뷰어 활동을 하면서 느낀점을 정리해보자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'함께 배우고 성장할 수 있는 사람이 되는 것이 중요하다는 것'&lt;/b&gt; 과 이를 위해 '&lt;b&gt;&lt;b&gt;진심으로&lt;span&gt; &lt;b&gt;동료를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;대해야 한다는 것' 이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리뷰어 활동에 도움주신 코치분들과 만났던 리뷰이 분들께 정말 감사하다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결혼&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23살부터 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;지금처럼.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회사와 커리어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느덧 근속한지 2년이 되었다.&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;서비스를&amp;nbsp;&lt;/span&gt;성장시키는 과정이 즐겁다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로도 지금처럼 서로가 서로를 믿으며 나아가면 좋겠다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여러 부분에서 성장했지만, 특히 인격적으로 많이 성장한 25년이 아니었나 싶다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;원래도 사람과의 관계에서 장난치는 법이 없지만, 진심의 중요성을 다시 알게되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;26년에는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;가식없이 진심으로 대하자&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;온전히 나아가자&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;행복하자!&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/129</guid>
      <comments>https://think0wise.tistory.com/129#entry129comment</comments>
      <pubDate>Wed, 31 Dec 2025 16:41:53 +0900</pubDate>
    </item>
    <item>
      <title>24년의 이도현</title>
      <link>https://think0wise.tistory.com/128</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;연말 회고를 작성할 때면 참 많은 생각을 하게 된다. (절대로 하루 뒤면 30대가 되어서 그런 건 아니다. 아무튼 아니다)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오랜만에 글을 쓰려니 생각이 많아져 아무것도 못 적고 있길래 아무거나 끄적이며 시작해본다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일의 본질&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;신입 개발자로 보낸 첫해기에 가장 먼저 일에 대한 생각을 정리해 본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DALL&amp;amp;middot;E 2024-12-31 16.47.45 - A semi-mature cartoon-style illustration of defining a problem, showing a thoughtful adult character standing in front of a complex and artistic maze.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8nWkF/btsLCH0UDcZ/Kw1JSAwMQV4G0NuYQjxCh0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8nWkF/btsLCH0UDcZ/Kw1JSAwMQV4G0NuYQjxCh0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8nWkF/btsLCH0UDcZ/Kw1JSAwMQV4G0NuYQjxCh0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8nWkF%2FbtsLCH0UDcZ%2FKw1JSAwMQV4G0NuYQjxCh0%2Fimg.webp&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;302&quot; height=&quot;302&quot; data-filename=&quot;DALL&amp;middot;E 2024-12-31 16.47.45 - A semi-mature cartoon-style illustration of defining a problem, showing a thoughtful adult character standing in front of a complex and artistic maze.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제를 가장 단순하고 효율적인 방법으로 해결한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 위해 &lt;b&gt;문제를 올바르게 정의한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 1년차 뉴비 개발자가 생각하는 개발업의 본질이자 진리이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실무에서 다양한 문제를 마주하며 &lt;b&gt;이를 올바르게 정의하고 해결하는 것이 얼마나 어려운 일인지 알게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간단한 문제임에도 굳이 복잡하게 돌아간 적도 있었고, 간단한 문제라고 생각했는데 파면 팔수록 복잡하게 얽혀있을 때도 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수많은 자충수로 뒤통수를 처맞고 다시 처음으로 돌아가고를 반복하며 깨달음을 얻는 중이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 역량에 따라 문제를 바라보는 시선이 달라질 것이고 해결할 수 있는 문제의 범위가 넓어질 것이라고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자연스럽게 주어지는 권한과 책임 또한 많아지겠지.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;열심히 살까? 말까?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;'열심히 살까? 말까?' 고민하며 '불편'한 '평온'을 즐긴 한 해&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;24년은 이렇게 정리하면 되겠다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 초, 취업 이후 모 코치님께 식사를 대접하며 하소연 아닌 하소연을 늘어놨었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;뭐 대충 요약하면, '취업 후에도 여전히&amp;nbsp;&lt;b&gt;열심히 살아야 하는데, 지금은 그냥 흘러가는 대로 살고 있다. 어떻게 하냐?'는 답정너 질문이었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코치님은&amp;nbsp;&lt;b&gt;'열심히 살까? 말까?'&lt;/b&gt;라는 문구가 적힌 와펜을 선물해 주시며, 그런 대로도 살아보라는 우문현답을 해주셨었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2262&quot; data-origin-height=&quot;1220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCzj8/btsLBsREUEM/3Vmz7F0bzdfTsRXHNlUAy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCzj8/btsLBsREUEM/3Vmz7F0bzdfTsRXHNlUAy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCzj8/btsLBsREUEM/3Vmz7F0bzdfTsRXHNlUAy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCzj8%2FbtsLBsREUEM%2F3Vmz7F0bzdfTsRXHNlUAy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;1220&quot; data-origin-width=&quot;2262&quot; data-origin-height=&quot;1220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원하는 것을 이루고 바라는 삶을 살기 위해서는 의식적인 노력이 필요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비교를 떠나, 당연하다&lt;b&gt;. 다른 사람들보다 더 큰 노력을 해야 비로소 가까워진다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 올해는 취업이라는 큰 산을 하나 넘고 나서는 별다른 목표를 세우지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스스로의 나태함을 꾸짖으며 자책하면서도 그냥 적당히 흘러가는 하루하루가 나쁘지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사 업무 열심히 하고, 사내 스터디 몇 개 참여해서 강제로 공부도 조금 하고, 잊혀질만 하면 한번 씩 운동하고.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IpInJ/btsLACmDp0J/eHClCasaHLkTIBZt5ESWd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IpInJ/btsLACmDp0J/eHClCasaHLkTIBZt5ESWd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IpInJ/btsLACmDp0J/eHClCasaHLkTIBZt5ESWd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIpInJ%2FbtsLACmDp0J%2FeHClCasaHLkTIBZt5ESWd0%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;390&quot; height=&quot;271&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'뭔가 이상한데...' 싶다면 정확하다. 그냥 내가 그런 사람이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나태함을 인지하면서도 쉽게 목표를 세우지는 않는다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;&lt;b&gt;적당히 자책하며&lt;/b&gt; 또 나름대로 밀도 있는 하루, 일주일을 보내고 그렇게 흘러가는 삶에 만족한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이런 싸이클이 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;여러 번&amp;nbsp;&lt;/span&gt;돌다 보면 &lt;b&gt;버닝 타임이 오고 그 때 목표와 향해 미친 듯이 달려 나간다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;굳이 따지면 건강한 사이클은 아닌 것 같지만, &lt;b&gt;어쨌든 돌아가고 그 안에서 발전이 있으니&lt;/b&gt; 아무렴 어떤가.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원하는 것을 얻기도, 잃기도 했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;있다가도 없었고, 없다가도 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;끝이 어디든 데굴데굴 굴러서 도착할 수만 있다면 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;행복을 잃지 말고 지금처럼 나아가자!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정말 고생 많았고 2025도 힘내보자!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pOgrb/btsLA7UdpWT/7bCXm1rXsy5V5F2zTsT5uK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pOgrb/btsLA7UdpWT/7bCXm1rXsy5V5F2zTsT5uK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pOgrb/btsLA7UdpWT/7bCXm1rXsy5V5F2zTsT5uK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpOgrb%2FbtsLA7UdpWT%2F7bCXm1rXsy5V5F2zTsT5uK%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>2024회고</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/128</guid>
      <comments>https://think0wise.tistory.com/128#entry128comment</comments>
      <pubDate>Wed, 1 Jan 2025 17:38:09 +0900</pubDate>
    </item>
    <item>
      <title>신입 개발자 이도현 시작!</title>
      <link>https://think0wise.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 프론트엔드 개발자 취업에 도움되는 내용이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;신입&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;개발자로 취업했다고 호들갑떠는 글이니, 키워드로 유입된 분들은 돌아가셔도 좋다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3년&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1706929523182&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;21년의 이도현&quot; data-og-description=&quot;이런 글을 쓴다는게 어딘가 상당히 어색하고 부끄럽기도 하다. 초등학교 시절 쓰던 일기 이후에는 내 생각을 정리하는 글을 써본적이 없기 때문이다. 이곳에는 정말 하고 싶은 아무 말이나 다 &quot; data-og-host=&quot;think0wise.tistory.com&quot; data-og-source-url=&quot;https://think0wise.tistory.com/52&quot; data-og-url=&quot;https://think0wise.tistory.com/52&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/M1wN0/hyVf3M1soG/vkv3ZufKFAje05DW0MTzd1/img.jpg?width=800&amp;amp;height=261&amp;amp;face=143_38_173_71,https://scrap.kakaocdn.net/dn/bpGyn6/hyVca77i2S/FC5Lqpg47G3FtjURNGphMk/img.jpg?width=800&amp;amp;height=261&amp;amp;face=143_38_173_71,https://scrap.kakaocdn.net/dn/GaDIC/hyVgdozG9q/OAk31RmV9TFK73STkzJJKk/img.jpg?width=1333&amp;amp;height=2000&amp;amp;face=587_268_733_427&quot;&gt;&lt;a href=&quot;https://think0wise.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://think0wise.tistory.com/52&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/M1wN0/hyVf3M1soG/vkv3ZufKFAje05DW0MTzd1/img.jpg?width=800&amp;amp;height=261&amp;amp;face=143_38_173_71,https://scrap.kakaocdn.net/dn/bpGyn6/hyVca77i2S/FC5Lqpg47G3FtjURNGphMk/img.jpg?width=800&amp;amp;height=261&amp;amp;face=143_38_173_71,https://scrap.kakaocdn.net/dn/GaDIC/hyVgdozG9q/OAk31RmV9TFK73STkzJJKk/img.jpg?width=1333&amp;amp;height=2000&amp;amp;face=587_268_733_427');&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;21년의 이도현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이런 글을 쓴다는게 어딘가 상당히 어색하고 부끄럽기도 하다. 초등학교 시절 쓰던 일기 이후에는 내 생각을 정리하는 글을 써본적이 없기 때문이다. 이곳에는 정말 하고 싶은 아무 말이나 다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;think0wise.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22년도 1월 1일.&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;&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;figure id=&quot;og_1706930576641&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;22년의 이도현&quot; data-og-description=&quot;다니던 회사를 그만두고 프로그래밍 공부에 전념해야겠다고 다짐한 후 벌써 1년이 흘렀다. 22년을 마무리하는 시점에서 지난 1년 동안 이루어 낸 것들과 아쉬웠던 부분을 정리해 보고, 23년 목표&quot; data-og-host=&quot;think0wise.tistory.com&quot; data-og-source-url=&quot;https://think0wise.tistory.com/105&quot; data-og-url=&quot;https://think0wise.tistory.com/105&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/44Rlk/hyVb4z3bQU/cHv57Wrl6sHQ2lHKK6xyrk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/EWFYv/hyVb1Dk6Rx/CtlsjLz4KYlaWS83gDdqLK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bKgwhH/hyVb8P1vJZ/5fNHNkjZX8EC17CQQtGOWk/img.jpg?width=1333&amp;amp;height=2000&amp;amp;face=587_268_733_427&quot;&gt;&lt;a href=&quot;https://think0wise.tistory.com/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://think0wise.tistory.com/105&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/44Rlk/hyVb4z3bQU/cHv57Wrl6sHQ2lHKK6xyrk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/EWFYv/hyVb1Dk6Rx/CtlsjLz4KYlaWS83gDdqLK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bKgwhH/hyVb8P1vJZ/5fNHNkjZX8EC17CQQtGOWk/img.jpg?width=1333&amp;amp;height=2000&amp;amp;face=587_268_733_427');&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;22년의 이도현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;다니던 회사를 그만두고 프로그래밍 공부에 전념해야겠다고 다짐한 후 벌써 1년이 흘렀다. 22년을 마무리하는 시점에서 지난 1년 동안 이루어 낸 것들과 아쉬웠던 부분을 정리해 보고, 23년 목표&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;think0wise.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22년도 12월 30일.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사를 그만두고 프로그래밍에 본격적으로 몰입하며 보냈던 22년을 돌아본 회고이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우테코에서 &lt;b&gt;좋은 동료&lt;/b&gt;가 되고 싶다는 작은 소망, 나아가 취업을 할 수 있는 &lt;b&gt;좋은 개발 실력&lt;/b&gt;을 갖추길 기대하는 모습이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1706931123828&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;23년의 이도현&quot; data-og-description=&quot;우아한테크코스와 함께한 23년 분명 많은 것을 이루었을 23년 처절하게 노력했던 지난날을 돌이켜 보자. 우아한테크코스 시작 합격 메일을 받고 나서 곧바로 알바를 구했고 열심히 서빙을 했다. &quot; data-og-host=&quot;think0wise.tistory.com&quot; data-og-source-url=&quot;https://think0wise.tistory.com/126&quot; data-og-url=&quot;https://think0wise.tistory.com/126&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g4XDE/hyVfXzfATx/4atx1sKKjBcxpYlNb9ktok/img.jpg?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/Q1QNf/hyVcbTwtCT/ZXca5x5pbQjRrSWDN5Heo1/img.jpg?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/dOALKH/hyVb7cuD2x/NffYvb5lYOhsKuCnYcDfek/img.jpg?width=1512&amp;amp;height=1512&amp;amp;face=0_0_1512_1512&quot;&gt;&lt;a href=&quot;https://think0wise.tistory.com/126&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://think0wise.tistory.com/126&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g4XDE/hyVfXzfATx/4atx1sKKjBcxpYlNb9ktok/img.jpg?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/Q1QNf/hyVcbTwtCT/ZXca5x5pbQjRrSWDN5Heo1/img.jpg?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/dOALKH/hyVb7cuD2x/NffYvb5lYOhsKuCnYcDfek/img.jpg?width=1512&amp;amp;height=1512&amp;amp;face=0_0_1512_1512');&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;23년의 이도현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;우아한테크코스와 함께한 23년 분명 많은 것을 이루었을 23년 처절하게 노력했던 지난날을 돌이켜 보자. 우아한테크코스 시작 합격 메일을 받고 나서 곧바로 알바를 구했고 열심히 서빙을 했다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;think0wise.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24년 1월 1일.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우테코 생활을 통해 더 단단한 개발자가 되어가는, 다사다난 했던 23년을 돌아본 회고이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 회사에 취업하겠다는 의지와 함께 더욱 더 정신없는 24년을 보내길 기대하는 모습이다.&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;취업&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그로부터 대략 2주가 채 지나지 않은 시점에 &lt;b&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.kcd.co.kr/&quot;&gt;한국신용데이터&lt;/a&gt;에 &lt;/b&gt;최종 합격 및 오퍼를 진행하고&amp;nbsp;&lt;b&gt;합류하게 되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;내 인터뷰를 긍정적으로 평가해준 회사 구성원들.&lt;/p&gt;
&lt;p 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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;일 잘 하는 개발자 VS 개발 잘 하는 개발자&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;둘 중에는 우선&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;일 잘 하는 개발자&lt;/b&gt;를 목표로 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어느 회사를 가든 기본이라고 생각하기도 하고... 신입은 쫌 굴러야 되지 않겠나.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;당장은 사수의 업무를 최대한 분담해서 사수의 야근을 줄이고?!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 빠르게 적응하는 윈윈 구조를 만드려고 노력중이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정신없는 24년&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;신입 개발자가 된 이 시점에 내가 어떤 한 해를 보내고 싶은지 생각해 봤는데, 잘 모르겠다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 지금처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'정신 없음'&lt;/b&gt;으로 꽉찬 24년이 됐으면 좋겠다. ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(벌써 첫 출근으로부터 2주가 지났다는게 믿기지 않는 걸 보면 무난하게 이뤄질듯 싶다... ㅋㅋㅋㅋㅋㅋ)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rbAFF/btsEkBH3c27/7FpVrpdrdLbmNlUmHthtvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rbAFF/btsEkBH3c27/7FpVrpdrdLbmNlUmHthtvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rbAFF/btsEkBH3c27/7FpVrpdrdLbmNlUmHthtvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrbAFF%2FbtsEkBH3c27%2F7FpVrpdrdLbmNlUmHthtvK%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>신입개발자</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/127</guid>
      <comments>https://think0wise.tistory.com/127#entry127comment</comments>
      <pubDate>Sat, 3 Feb 2024 15:08:14 +0900</pubDate>
    </item>
    <item>
      <title>23년의 이도현</title>
      <link>https://think0wise.tistory.com/126</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우아한테크코스와 함께한 23년&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분명 많은 것을 이루었을 23년&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처절하게 노력했던 지난날을 돌이켜 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2004&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY0Ham/btsCMpiFhgJ/ryoXK0rfPpo8n2NMacGJW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY0Ham/btsCMpiFhgJ/ryoXK0rfPpo8n2NMacGJW0/img.png&quot; data-alt=&quot;정말로 고생이 많았구나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY0Ham/btsCMpiFhgJ/ryoXK0rfPpo8n2NMacGJW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY0Ham%2FbtsCMpiFhgJ%2FryoXK0rfPpo8n2NMacGJW0%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;2004&quot; height=&quot;488&quot; data-origin-width=&quot;2004&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정말로 고생이 많았구나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;우아한테크코스&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #7e98b1;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;시작&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-12 001jpeg.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCxLbu/btsCTXLtbw2/NntIcukX9ry9tn9nk6brf0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCxLbu/btsCTXLtbw2/NntIcukX9ry9tn9nk6brf0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCxLbu/btsCTXLtbw2/NntIcukX9ry9tn9nk6brf0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCxLbu%2FbtsCTXLtbw2%2FNntIcukX9ry9tn9nk6brf0%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;375&quot; height=&quot;375&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-12 001jpeg.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;합격 메일을 받고 나서 곧바로 알바를 구했고 열심히 서빙을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;알바와 부모님 찬스로 생활비를 구했고 서울 고시원으로 향했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;태어나서 처음 공부를 위해 금전적 지원을 해줄 수 있냐는 말에 적잖이 당황하면서도 알겠다 말하던 아빠 얼굴이 선하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;덕분에 이 철부지는 무사히 1년을 버텨낼 수 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고시원&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-12 002jpeg.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mg394/btsCTxGfwQN/xm5bBxiw7MlPmv3o0Viz00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mg394/btsCTxGfwQN/xm5bBxiw7MlPmv3o0Viz00/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mg394/btsCTxGfwQN/xm5bBxiw7MlPmv3o0Viz00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmg394%2FbtsCTxGfwQN%2Fxm5bBxiw7MlPmv3o0Viz00%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;495&quot; height=&quot;495&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-12 002jpeg.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;무개념 입주자로 인해 고시원에 대한 추억은... 뭐 그리 좋지는 않다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;제발 오늘은 조용히 잠만 자자고 기도했지만, 침대에 누운 지 5분 만에 들려오는 온갖 소음에 허탈하게 웃어버린 적도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;그래도 뭐... 옥상 실외기 위 판자에 올려놓고 먹던 라면은... 참 좋았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;라면이 뭐라고 ㅋㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레벨 1, 2&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 006jpeg.jpeg&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wLztc/btsCMw22Jvq/ovoJA2gIH68ygmw2lVm4k1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wLztc/btsCMw22Jvq/ovoJA2gIH68ygmw2lVm4k1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wLztc/btsCMw22Jvq/ovoJA2gIH68ygmw2lVm4k1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwLztc%2FbtsCMw22Jvq%2FovoJA2gIH68ygmw2lVm4k1%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;528&quot; height=&quot;974&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 006jpeg.jpeg&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우아한테크코스의 레벨 1, 2 과정은 작은 프로그래밍 미션을 수행하고 선배 프로그래머에게 코드 리뷰를 받는 식으로 진행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시작은 분명 패딩이었는데, 어느새 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;형&lt;/span&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;광&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;색&lt;/span&gt; 반바지&lt;/b&gt;를 입고 있었고 그렇게 레벨 1, 2가 끝났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 005jpeg.jpeg&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMniTO/btsCTxsHFrK/ySkRVzbuJLPw63niSk5R60/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMniTO/btsCTxsHFrK/ySkRVzbuJLPw63niSk5R60/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMniTO/btsCTxsHFrK/ySkRVzbuJLPw63niSk5R60/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMniTO%2FbtsCTxsHFrK%2FySkRVzbuJLPw63niSk5R60%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;544&quot; height=&quot;1040&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 005jpeg.jpeg&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 기간에는 개발도 개발이지만, &lt;b&gt;리뷰어와의 소통&lt;/b&gt;이 더 기억에 남는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단 하나의 코드라도 이야기 나눠보기 위해 뒤죽박죽인 생각을 정리하고 어떻게든 글로 표현하려 노력했기에 그런 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 PR에 남긴 내용 외에도 &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;무수히 많았던 고민을 했겠지만 &lt;/span&gt;기억나는 게 거의 없다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;레벨 3, 4 그리고&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;S&lt;/span&gt;-HOOK&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-01 024jpeg.jpeg&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciHbHX/btsCN7IK4qr/WDr3QODb8NHs20GVxGkLr1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciHbHX/btsCN7IK4qr/WDr3QODb8NHs20GVxGkLr1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciHbHX/btsCN7IK4qr/WDr3QODb8NHs20GVxGkLr1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciHbHX%2FbtsCN7IK4qr%2FWDr3QODb8NHs20GVxGkLr1%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;352&quot; height=&quot;352&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-01 024jpeg.jpeg&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;1321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_Photo_2023-12-31-21-20-01 023jpeg.jpeg&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l8tdF/btsCOCaC9Pm/DKjgiDzf9gAWrSELZrwdQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l8tdF/btsCOCaC9Pm/DKjgiDzf9gAWrSELZrwdQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l8tdF/btsCOCaC9Pm/DKjgiDzf9gAWrSELZrwdQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl8tdF%2FbtsCOCaC9Pm%2FDKjgiDzf9gAWrSELZrwdQK%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;353&quot; height=&quot;277&quot; data-filename=&quot;edited_KakaoTalk_Photo_2023-12-31-21-20-01 023jpeg.jpeg&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1175&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;조금만 깊이 있는 사람을 만나면 바로 밑천이 드러난다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그런데도 계속 알려주다 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;어느 순간&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스스로 정리되는 때가 있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;혹은 깊이 있는 사람이 정정해 주거나 더 나은 방식을 알려주곤 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 정리된 상태의 온전한 지식으로 다시 알려주면서 공부하곤 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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; 결과적으로는 1번의 테코톡과 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;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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-01 028jpeg.jpeg&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yNVQd/btsCQ4YSj4D/R7IXUHxJesZfBWG9QmtG00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yNVQd/btsCQ4YSj4D/R7IXUHxJesZfBWG9QmtG00/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yNVQd/btsCQ4YSj4D/R7IXUHxJesZfBWG9QmtG00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyNVQd%2FbtsCQ4YSj4D%2FR7IXUHxJesZfBWG9QmtG00%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;419&quot; height=&quot;1094&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-01 028jpeg.jpeg&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하고 싶은 무언가를 밤새 해본 적이 있는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새벽에 떠오르는 해를 보고 뿌듯했던 적이 있는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;아침.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo4rDs/btsCNZYkt7V/hhFKgTwWs7SuJ1BLHLbIeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo4rDs/btsCNZYkt7V/hhFKgTwWs7SuJ1BLHLbIeK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo4rDs/btsCNZYkt7V/hhFKgTwWs7SuJ1BLHLbIeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo4rDs%2FbtsCNZYkt7V%2FhhFKgTwWs7SuJ1BLHLbIeK%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;339&quot; height=&quot;1512&quot; data-filename=&quot;아침.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;내 인생에는 지금까지 &lt;b&gt;3번의 큰 도전&lt;/b&gt;이 있었는데, 신기하게도 &lt;b&gt;매번 떠오르는 새벽 해를 봤다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠을 줄여 무언가를 이루기 위해 노력하는 사람에게 &lt;b&gt;이거라도 보고 힘내...&lt;/b&gt;라는 의미가 아닐까? ...하하&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_Photo_2023-12-31-21-20-00 021jpeg.jpeg&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;1121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0dRK/btsCQpvk8nF/xLAtBktEnrz2sHmr02kZO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0dRK/btsCQpvk8nF/xLAtBktEnrz2sHmr02kZO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0dRK/btsCQpvk8nF/xLAtBktEnrz2sHmr02kZO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0dRK%2FbtsCQpvk8nF%2FxLAtBktEnrz2sHmr02kZO0%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;311&quot; height=&quot;483&quot; data-filename=&quot;edited_KakaoTalk_Photo_2023-12-31-21-20-00 021jpeg.jpeg&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;1121&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;b&gt;참... 이렇게 오만한 생각이 따로 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드는 마치 필터와 같았고, 이를 뚫고 생각을 전달하는 것은 쉽지 않았다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 가운데 낀 상태로 사람과 대화를 하다 보면, 내 생각은 &lt;b&gt;상당 부분 걸러져 의도와는 다르게 전달되곤 했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;작성 의도와 생각은 온전히 전달하면서&lt;span&gt;&amp;nbsp;&lt;/span&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;정말 과분한 팀원을 만났고 그들의 많은 이해와 배려 덕분에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;보완해야 할 부분과 더 키워나가면 좋을 부분&lt;/b&gt;을 명확하게 인지할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무나 감사하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-58 010jpeg.jpeg&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;1411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNvbIZ/btsCQ3yQG6i/DyPiJ1Gr2vtCmygV0jXdL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNvbIZ/btsCQ3yQG6i/DyPiJ1Gr2vtCmygV0jXdL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNvbIZ/btsCQ3yQG6i/DyPiJ1Gr2vtCmygV0jXdL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNvbIZ%2FbtsCQ3yQG6i%2FDyPiJ1Gr2vtCmygV0jXdL0%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;289&quot; height=&quot;385&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-58 010jpeg.jpeg&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;1411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-58 013jpeg.jpeg&quot; data-origin-width=&quot;1411&quot; data-origin-height=&quot;1058&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k58ng/btsCQpa1GSu/w3rEW7T8bEwTOr0z8SKDq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k58ng/btsCQpa1GSu/w3rEW7T8bEwTOr0z8SKDq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k58ng/btsCQpa1GSu/w3rEW7T8bEwTOr0z8SKDq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk58ng%2FbtsCQpa1GSu%2Fw3rEW7T8bEwTOr0z8SKDq1%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;480&quot; height=&quot;360&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-58 013jpeg.jpeg&quot; data-origin-width=&quot;1411&quot; data-origin-height=&quot;1058&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사진을 보고 다시 한번 느꼈다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 내 결과물을 자랑하고 인정받는 것을 정말 좋아하는 사람이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인정을 다음으로 나아가기 위한 에너지원으로 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인정 외에 다른 에너지원을 찾으려고 노력한다면 더 나은 사람이 될 것 같다.&lt;/p&gt;
&lt;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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-57 001jpeg.jpeg&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eADcqr/btsCMyNiOz5/4DyiK7gAuzKhbDgYmkcBe1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eADcqr/btsCMyNiOz5/4DyiK7gAuzKhbDgYmkcBe1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eADcqr/btsCMyNiOz5/4DyiK7gAuzKhbDgYmkcBe1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeADcqr%2FbtsCMyNiOz5%2F4DyiK7gAuzKhbDgYmkcBe1%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;393&quot; height=&quot;245&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-57 001jpeg.jpeg&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;307&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;b&gt;'우리의 목표는 킥보드를 만드는 거야 !!'&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;킥보드로 각인된 애자일... 팀 프로젝트의 전부였다고 생각해서 담았다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;레벨 5&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-00 019jpeg.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nvdri/btsCVGCA8Qx/8Rjx0h2YxckUeIdwIqhFKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nvdri/btsCVGCA8Qx/8Rjx0h2YxckUeIdwIqhFKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nvdri/btsCVGCA8Qx/8Rjx0h2YxckUeIdwIqhFKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNvdri%2FbtsCVGCA8Qx%2F8Rjx0h2YxckUeIdwIqhFKK%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;268&quot; height=&quot;268&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-00 019jpeg.jpeg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨날 여기저기 신청하면 다 떨어져서 가보지 못한 컨퍼런스도 갔었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;열정을 가진 사람들이 이렇게나 많구나. &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;그리고 무대에 있는 저 사람 정말 대단하고 멋있구나.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한참 운동을 많이 할 때, 바디빌딩 대회를 구경하러 가서 느꼈던 가슴 뛰는 기분을 또 한 번 느낄 수 있었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-57 006jpeg.jpeg&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caLQIV/btsCWLX3fPp/yFKTFJCDhLMnkZR1WAwrt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caLQIV/btsCWLX3fPp/yFKTFJCDhLMnkZR1WAwrt0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caLQIV/btsCWLX3fPp/yFKTFJCDhLMnkZR1WAwrt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaLQIV%2FbtsCWLX3fPp%2FyFKTFJCDhLMnkZR1WAwrt0%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;516&quot; height=&quot;1040&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-57 006jpeg.jpeg&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_잔병.jpeg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxL8Dz/btsCNZRxDNF/qCmlCy1JyTXRkR3AQoWkl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxL8Dz/btsCNZRxDNF/qCmlCy1JyTXRkR3AQoWkl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxL8Dz/btsCNZRxDNF/qCmlCy1JyTXRkR3AQoWkl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxL8Dz%2FbtsCNZRxDNF%2FqCmlCy1JyTXRkR3AQoWkl0%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;513&quot; height=&quot;109&quot; data-filename=&quot;edited_잔병.jpeg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;85&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;우테코를 하면서 6시 퇴근 시간이 다 되어도 집에 안 가는 사람들이 꽤나 많았다.&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;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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-00 020jpeg.jpeg&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;1411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o8Uoa/btsCOETUjgw/5mydjJAbqZL2sFYLBYDwn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o8Uoa/btsCOETUjgw/5mydjJAbqZL2sFYLBYDwn1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o8Uoa/btsCOETUjgw/5mydjJAbqZL2sFYLBYDwn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo8Uoa%2FbtsCOETUjgw%2F5mydjJAbqZL2sFYLBYDwn1%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;374&quot; height=&quot;499&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-00 020jpeg.jpeg&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;1411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;취준은 단어만으로도 뭔가 측은하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;실제로 많은 사람들이 힘들어했다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나도 마찬가지고.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이건 내 최애짤인데, 커피 두 잔으로 풀 도핑을 했지만 졸고 있는 내 모습에 짠한 마음과 열심히 했다는 생각이 들어 좋아한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 008jpeg.jpeg&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD04kD/btsCTzRuZAP/TK7j2ayAaH1PToGAwiWX40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD04kD/btsCTzRuZAP/TK7j2ayAaH1PToGAwiWX40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD04kD/btsCTzRuZAP/TK7j2ayAaH1PToGAwiWX40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD04kD%2FbtsCTzRuZAP%2FTK7j2ayAaH1PToGAwiWX40%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;352&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 008jpeg.jpeg&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 009jpeg.jpeg&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;1121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SwC4m/btsCUxTo1Cc/5gkDXf8aBJUqBAxQwIeqsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SwC4m/btsCUxTo1Cc/5gkDXf8aBJUqBAxQwIeqsk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SwC4m/btsCUxTo1Cc/5gkDXf8aBJUqBAxQwIeqsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSwC4m%2FbtsCUxTo1Cc%2F5gkDXf8aBJUqBAxQwIeqsk%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;525&quot; height=&quot;1121&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 009jpeg.jpeg&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;1121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 동료들과 함께해서 너무 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 정말 재미있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 007jpeg.jpeg&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tHegW/btsCTy562oT/6XJKdqOkxzZ8qRKhnIFj60/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tHegW/btsCTy562oT/6XJKdqOkxzZ8qRKhnIFj60/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tHegW/btsCTy562oT/6XJKdqOkxzZ8qRKhnIFj60/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtHegW%2FbtsCTy562oT%2F6XJKdqOkxzZ8qRKhnIFj60%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;522&quot; height=&quot;311&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-20-13 007jpeg.jpeg&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후배라는 이유만으로 많은 부분을 도와주고 알려주셨던 선배 기수분들과 리뷰어 분들 너무 감사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 어린애처럼 징징거리는 거 다 받아주시고 응원해 주신 코치님들 너무 감사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-59 015jpeg.jpeg&quot; data-origin-width=&quot;1411&quot; data-origin-height=&quot;1058&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFfKzq/btsCWMQdorW/eICMHec0k12sRdBiVDMOO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFfKzq/btsCWMQdorW/eICMHec0k12sRdBiVDMOO1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFfKzq/btsCWMQdorW/eICMHec0k12sRdBiVDMOO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFfKzq%2FbtsCWMQdorW%2FeICMHec0k12sRdBiVDMOO1%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;533&quot; height=&quot;400&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-59 015jpeg.jpeg&quot; data-origin-width=&quot;1411&quot; data-origin-height=&quot;1058&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 고생 많았고 24년도에는 원하는 것 다 이루었으면 좋겠다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;24년에는 어떻게?&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실 23년에 아쉬운 것, 못 이룬 것 천지이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;근데 그 모든 것을 다 이룰 수 있었냐? 하면 절대 아니다. 이건 확실해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 그냥 넘어가려 한다. 충분히 열심히 살았으니깐.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;24년도에는 원하는 회사에 취업하고 싶다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 나 자신에게 정말 순수한 휴식과 안정을 주고싶다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;좋은 동료를 만나고 싶고 당연하지만 맡은 일 잘 쳐내는 사람이 되고 싶다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또 재미있는 서비스를 개발하고 발전시키며&amp;nbsp;성장하고 싶다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우테코와 같이, 아니 더 정신없는 한 해가 되기를 소망한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정말 고생 많았고 2024도 힘내자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-57 004jpeg.jpeg&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edq3i6/btsCTCOdLoD/sBkqUaZJEp6OxbLHOQ4lWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edq3i6/btsCTCOdLoD/sBkqUaZJEp6OxbLHOQ4lWK/img.jpg&quot; data-alt=&quot;진짜 개구장이 그 자체네&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edq3i6/btsCTCOdLoD/sBkqUaZJEp6OxbLHOQ4lWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fedq3i6%2FbtsCTCOdLoD%2FsBkqUaZJEp6OxbLHOQ4lWK%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;362&quot; height=&quot;241&quot; data-filename=&quot;KakaoTalk_Photo_2023-12-31-21-19-57 004jpeg.jpeg&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진짜 개구장이 그 자체네&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>2023 회고</category>
      <category>2024</category>
      <category>ON</category>
      <category>끝</category>
      <category>우테코</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/126</guid>
      <comments>https://think0wise.tistory.com/126#entry126comment</comments>
      <pubDate>Mon, 1 Jan 2024 01:59:00 +0900</pubDate>
    </item>
    <item>
      <title>Tanstack Query, TkDodo 도아일체 (1)</title>
      <link>https://think0wise.tistory.com/125</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tkdodo.eu/blog/practical-react-query&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://tkdodo.eu/blog/practical-react-query&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702644116537&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;Practical React Query&quot; data-og-description=&quot;Let me share with you the experiences I have made lately with React Query. Fetching data in React has never been this delightful...&quot; data-og-host=&quot;tkdodo.eu&quot; data-og-source-url=&quot;https://tkdodo.eu/blog/practical-react-query&quot; data-og-url=&quot;https://tkdodo.eu/blog/practical-react-query&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bEQJdh/hyULXnegmt/HGK2YtBwc4hROGDD7UerIK/img.png?width=1200&amp;amp;height=630&amp;amp;face=84_487_125_532,https://scrap.kakaocdn.net/dn/yVvyo/hyUL5ZSzwe/zKWleUgPUhb6SxWVRXHK21/img.png?width=1200&amp;amp;height=630&amp;amp;face=84_487_125_532&quot;&gt;&lt;a href=&quot;https://tkdodo.eu/blog/practical-react-query&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tkdodo.eu/blog/practical-react-query&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bEQJdh/hyULXnegmt/HGK2YtBwc4hROGDD7UerIK/img.png?width=1200&amp;amp;height=630&amp;amp;face=84_487_125_532,https://scrap.kakaocdn.net/dn/yVvyo/hyUL5ZSzwe/zKWleUgPUhb6SxWVRXHK21/img.png?width=1200&amp;amp;height=630&amp;amp;face=84_487_125_532');&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;Practical React Query&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Let me share with you the experiences I have made lately with React Query. Fetching data in React has never been this delightful...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tkdodo.eu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;2018년경 &lt;b&gt;GraphQL과 아폴로 클라이언트&lt;/b&gt;가 핫하던 시기에 사람들은 &lt;b&gt;리덕스를 대체할 것&lt;/b&gt;이라며 난리법석이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;나는 전혀 이해하지 못했다&lt;b&gt; '데이터 패칭 라이브러리가 어떻게 전역상태 관리라이브러리인 Redux를 대체하지?'&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;아폴로는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터 패칭 기능&lt;/b&gt;뿐만 아니라,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;서버 데이터 캐싱&lt;/b&gt;도 지원했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러 컴포넌트에서 동일한 쿼리를 사용하면 캐싱된 데이터를 제공&lt;/b&gt;하는 기능이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;당시 사람들은 서버 데이터를 전역으로 사용하기 위해 리덕스를 사용하고 있었다.(불편함을 느끼면서도?)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;자연스럽게 서버상태를 클라이언트 상태랑 별다를 것 없이 취급했었던 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;생각해보니, &lt;b&gt;서버상태는&lt;/b&gt; &lt;/span&gt;&lt;b&gt;화면에 표시하는 것 외에는 딱히 사용하지 않더라.&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;화면에 표시할&lt;span&gt;&amp;nbsp;상태를&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서버 상태로 따로 분리한다고 하면, &lt;b&gt;막상 진짜 전역 상태는 몇 개 없더라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #292c32;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그제야 사람들이 Redux를 대체할 수 있다며 열광했던 것을 이해했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #292c32;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;나는 아폴로가 제공하는 &lt;b&gt;로딩/오류 상태, 데이터를 가져오는 방식&lt;/b&gt;이 부러웠다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #292c32;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;REST API에도 비슷한 것이 있다면...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;React query 기본옵션&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 옵션의 기본값은 이미 완벽하게 설정해두었지만, 기호에 따라 커스텀할 수 있다.&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;또 사람들이 흔하게 실수하는 쿼리 옵션의 기본값에 대해 몇 가지 조언을 하려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;1. &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;b&gt;staleTime의 기본값은 0인데,&lt;/b&gt; 그렇다고 &lt;b&gt;매 랜더링마다 queryFn을 호출하지 않는다!!&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 예상치 못한 refetch가 발생한다면, 아마 &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;refetchOnWindowFocus 때문일거다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 옵션 덕분에 사용자가 탭이동 후 복귀 했을 때, 로딩 상태 없이 자연스럽게 refetch를 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 &lt;b&gt;변경사항이 있다면 캐시와 화면 데이터를 업데이트 한다. 랜더링을 다시 한다는 말이지.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없다면 그대로 둔다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;2. gcTime과 staleTime 혼동하지 마라.&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;b&gt;staleTime:&lt;/b&gt; 쿼리가 &lt;b&gt;fresh -&amp;gt; stale 로 전환되기까지 시간이다.&lt;/b&gt;&lt;br /&gt;쿼리가 &lt;b&gt;fresh면 데이터는 캐시에서 가져오는거다. 네트워크 요청 없이!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;쿼리가 &lt;b&gt;stale 이여도 캐시의 데이터를 가져와 보여준다.&lt;/b&gt; but 너가 설정한 조건에 따라 &lt;b&gt;백그라운드에서 refetch할 수도 있다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;b&gt;gcTime:&lt;/b&gt; &lt;b&gt;inactive 상태의 쿼리가&lt;/b&gt; &lt;b&gt;delete 로 전환되기까지&amp;nbsp;&lt;/b&gt;&lt;b&gt;시간이다&lt;/b&gt;. gcTime이 시간이 지나면 캐시는 삭제된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;해당 쿼리를 사용하는 모든 컴포넌트가 언마운트되면 &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;inactive상태가 된다.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 옵션중 뭔가를 바꾸고 싶다는 생각이 들면, &lt;b&gt;대부분 staleTime일 거다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;query key를 dependency array 라고 생각해!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐면 React query는 &lt;b&gt;query key가 변경될 때 마다 refetch를 하거든!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 생각해봐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 경우에 &lt;b&gt;너는 queryFn에 넘기려는 인자가 바뀔 때, 새로운 데이터를 불러오길 원할거야.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보통 인자는 상태로 관리되겠지. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 queryKey에 그 인자를 추가해주는 것 만으로도 새 데이터를 fetch할 수 있어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'상태(인자)가 변경되면, effect로 fetch를 해주세요.' 라는 코드를 작성할 필요가 없다는거야.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;queryKey만 변경해주면 된다는거지!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 &lt;b&gt;queryFn에&amp;nbsp;전달하는 인자를 queryKey에 포함하지 않았던 적이 없는 것 같아.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거의 모든 상황에 함수의 인자를 queryKey에도 포함했어.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;하드로딩이 보고싶지 않다면, initialData&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 투두 앱을 예시로 탭 컴포넌트가 있다고 가정할게.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탭 전환마다 [모든 일정] / [완료 일정]을 각각 fetch 한다고 하면, &lt;b&gt;첫 탭 전환시에는(query 캐시가 없을 때) 하드 로딩 상태가 돼.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 스피너가 표시될 수 있다는 거지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스피너보다 더 앞서나가서 로딩 상태를 아예 안 보여주고 싶다면, &lt;b&gt;initialData 옵션&lt;/b&gt;을 사용할 수 있어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702889349211&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export const useTodosQuery = (state: State) =&amp;gt;
  useQuery({
    queryKey: ['todos', state],
    queryFn: () =&amp;gt; fetchTodos(state),
    initialData: () =&amp;gt; {
      const allTodos = queryClient.getQueryData&amp;lt;Todos&amp;gt;([
        'todos',
        'all',
      ])
      const filteredData =
        allTodos?.filter((todo) =&amp;gt; todo.state === state) ?? []

      return filteredData.length &amp;gt; 0 ? filteredData : undefined
    },
  })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queryClient로 부터 [모든 일정] Query를 가져오고 클라이언트에서 필터링 한 결과를 &lt;b&gt;미리 보여주는거야.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[완료 일정] fetch가 백그라운드에서 완료되면 리스트는 업데이트 되겠지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적절한 상황에 사용해 보도록 해.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서버 상태와 클라이언트 상태를 나눠라!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;b&gt;useQuery로 가져온 서버 데이터를 로컬 state에 넣지 마.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;React Query가 수행하는 모든 백그라운드 업데이트를 암시적으로 무시할거야.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 만약 &lt;b&gt;데이터의 기본값을 가져온 후에 랜더링 하려는 것&lt;/b&gt; 같이 명확한 목적을 가지고 있다면 사용해도 좋아.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대신 이 경우에는 첫 1회 fetch 외에 백그라운드 업데이트가 일어날 필요는 없겠지?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 땐 &lt;b&gt;staleTime을 Infinity&lt;/b&gt;로 설정해서 캐시를 무한대로 설정해서 불필요한 업데이트를 막아보자.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; enabled 옵션으로 많은 것을 할 수 있다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 종속 쿼리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종속 쿼리는 &lt;b&gt;A api에서 가져온 결과값&lt;/b&gt;으로 &lt;b&gt;B api를 보내야 하는 경우&lt;/b&gt;를 말해.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션으로 A query의 결과값을 성공적으로 가져왔을 때에만 B query를 실행하도록 할 수 있어.&lt;br /&gt;(다만 네트워크 워터폴이 발생하니, 가능하면 병렬적으로 가져올 수 있도록 api를 구성하는게 좋아. 항상 가능한건 아니겠지만...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 쿼리 on/off&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;refetchInterval 옵션으로 데이터 폴링을 하고있는 경우라고 가정해봐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 모달이 열려있다면, 백드롭 뒤쪽 화면은 업데이트 되지 않는게 자연스러울거야.&lt;br /&gt;이런 경우에도 쿼리를 중단할 수 있어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 사용자 입력을 기다렸다 실행하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿼리키에 필터 옵션들을 포함시키면서도, 유저가 필터기능을 사용하지 않는 동안&lt;/b&gt;에는 쿼리를 비활성화 할 수 있어.&lt;/p&gt;
&lt;pre id=&quot;code_1703221539273&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Test = () =&amp;gt; {
  const [filterOption, setFilterOption] = useState(null)
	
  const { data } = useQuery({
    queryKey: ['', filterOption],
    queryFn: () =&amp;gt; {...},
    enabled: filterOption !== null
  })

  return &amp;lt;div&amp;gt;{data}&amp;lt;/div&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 사용자 입력 후엔 쿼리 비활성화 하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제와 비슷해. 서버 데이터 보다 우선시 해서 보여줘야하는 초기 데이터가 있을 때 유용해.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; query Cache를 로컬 상태로 사용하지 말것.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿼리 캐시&lt;/b&gt;(queryClient.setQeuryData)는 &lt;b&gt;낙관적 업데이트&lt;/b&gt;를 해야 하거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mutation후에 서버에게 받은 데이터로 덮어 써야할 때&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;기억해! 모든 백그라운드 refetch는 기존 데이터를 덮어 쓸 수 있어.&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 커스텀훅을 만들어라.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 익숙하겠지만,&lt;b&gt; 단지 useQuery 하나를 래핑하는 용도라도 커스텀 훅은 의미가 있어.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 &lt;b&gt;데이터 패칭 코드는 ui 밖으로&lt;/b&gt; 빼면서, &lt;b&gt;useQuery 호출에 대해서는 co-location을 유지&lt;/b&gt;할 수 있지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿼리키도 하나의 파일에서 관리&lt;/b&gt;할 수 있고 말이야.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션을 변경&lt;/b&gt;해야한다거나,&lt;b&gt; 데이터의 형태를 변경&lt;/b&gt;해야할 때에도 &lt;b&gt;한 곳에서 해결&lt;/b&gt;할 수 있어.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 도도형의 실전압축 reactQuery 포스팅 1편을 읽고 정리해봤다.&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;staleTime 0 이라고 리랜더링 마다 쿼리쏘는게 아니라는 것,&amp;nbsp;쿼리키를 디펜던시 어레이로 바라보는 시선,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;initialData, enabled 옵션의 올바른 사용예시까지...&lt;/p&gt;
&lt;p 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-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqxMw2/btsCsqPrKCs/KkG3ZVKWEynvCemBKefJy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqxMw2/btsCsqPrKCs/KkG3ZVKWEynvCemBKefJy1/img.png&quot; data-alt=&quot;아직도 역시나 기본이 중요하구만.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqxMw2/btsCsqPrKCs/KkG3ZVKWEynvCemBKefJy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqxMw2%2FbtsCsqPrKCs%2FKkG3ZVKWEynvCemBKefJy1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Frontend/TanStack Query</category>
      <category>enabled</category>
      <category>initialData</category>
      <category>queryKey</category>
      <category>React Query</category>
      <category>staleTime</category>
      <category>tanstack query</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/125</guid>
      <comments>https://think0wise.tistory.com/125#entry125comment</comments>
      <pubDate>Fri, 22 Dec 2023 15:20:02 +0900</pubDate>
    </item>
    <item>
      <title>Tanstack Query, TkDodo 도아일체</title>
      <link>https://think0wise.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라이브러리를 학습하다보면, 공식문서만큼 해당 라이브러리에 대한 철학이 잘 드러난 곳이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 컨트리뷰터의 블로그...!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 잘 알려진 컨트리뷰터들은 개인의 철학보다는 &lt;b&gt;해당 라이브러리의 철학을 기반으로 글을 작성하는 경향이 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신이 곧 라이브러리가 되어버렸다고도 할 수 있겠다.(Dan Abramov형 처럼...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인간 Tanstack Query, TkDodo형&lt;/b&gt;의 블로그에 총 23편의 장편으로 구성된 &lt;b&gt;실전 압축 팁&lt;/b&gt;이 모여있다. ( 도도형이 직접 언급)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도도형은 어떤 생각을 가지고 라이브러리를 만들었으며, 각 꿀팁들에 대한 생각을 흡수해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bueKKn/btsB3uKU3iH/ljJLJwdP1mAMgZdRtY86R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bueKKn/btsB3uKU3iH/ljJLJwdP1mAMgZdRtY86R1/img.png&quot; data-alt=&quot;기본이 중요하다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bueKKn/btsB3uKU3iH/ljJLJwdP1mAMgZdRtY86R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbueKKn%2FbtsB3uKU3iH%2FljJLJwdP1mAMgZdRtY86R1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Frontend/TanStack Query</category>
      <category>tanstack query</category>
      <category>tkdodo</category>
      <category>생각 정리</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/124</guid>
      <comments>https://think0wise.tistory.com/124#entry124comment</comments>
      <pubDate>Fri, 15 Dec 2023 21:32:25 +0900</pubDate>
    </item>
    <item>
      <title>우테코 레벨3, 4 학습 내용 총정리</title>
      <link>https://think0wise.tistory.com/122</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;배너.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r2XN2/btsA9hFYIXo/8f6Osdc2R3kp7bytU02hg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r2XN2/btsA9hFYIXo/8f6Osdc2R3kp7bytU02hg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r2XN2/btsA9hFYIXo/8f6Osdc2R3kp7bytU02hg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr2XN2%2FbtsA9hFYIXo%2F8f6Osdc2R3kp7bytU02hg1%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;900&quot; height=&quot;300&quot; data-filename=&quot;배너.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;레벨3, 4 학습 내용 총정리 &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;팀 프로젝트 S-HOOK과 함께한 레벨3, 4&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소중한 기억을 정리해보자!&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;그래서 뭘 배웠어? &amp;zwj;♂️&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프론트엔드 개발 환경&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프론트엔드 최적화 + AWS&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;찐~한 협업과 찐~한 소프트 스킬&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;1. 프론트엔드 개발 환경&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀 프로젝트를 위한 개발 환경을 밑바닥부터 하나하나 설정했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;오만가지 설정법과 설명이 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;webpack&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;docs&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;를 보고있자면 토가 나오는 것 같았지만 아무렴 어때!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 환경 구성에 필요한 기술들을 접하고 이해하면서 프론트엔드 개발환경의 큰 그림을 이해하게 됐다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;webpack, babel, eslint, TS, react... 이외에도 자잘한 부수 기능까지...!&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입맛대로 환경대로 골라서 적용하는게 점점 재미가 붙었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'아는 만큼 더 잘 쓸 수 있는 번들러의 세계'&lt;/b&gt;라고 할 수 있을 것 같다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CRA와는 이별이다. &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕...!&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2. 프론트엔드 최적화 + AWS&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최적화. 단어만 들어도 묵직하고 엄청난 지식과 스킬이 있어야 할 것 같다.&lt;br /&gt;하지만 막상 부딪혀 보면 별거 없고, 하나도 어렵지 않다.&lt;br /&gt;알아야 할게 많을 뿐.&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;레벨4 무렵에는 최적화 미션을 통해 프론트엔드에서 고려할 수 있는 전반적인 &lt;b&gt;최적화 방법&lt;/b&gt;에 대해 배웠다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-1. 요청 크기 줄이기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;minify, uglify&lt;/li&gt;
&lt;li&gt;소스맵 타협&lt;/li&gt;
&lt;li&gt;css파일 추출&lt;/li&gt;
&lt;li&gt;gzip, brotli 와 같은 압축 포멧 적용&lt;/li&gt;
&lt;li&gt;정적 asset의 사이즈 줄이기 ex) 이미지, 비디오&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이외에도 다양한 방법으로 요청하는 리소스의 크기를 줄일 수 있다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-2. 필요한 것만 요청하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&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;code spliting&lt;/li&gt;
&lt;li&gt;Tree shaking&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-3. 같은 건 매번 새로 요청하지 않기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&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;CDN(cloud front), 브라우저 캐싱&lt;/li&gt;
&lt;li&gt;api 응답 캐싱&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-4. 최소한의 변경만 일으키기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&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;React.memo&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Repaint, Reflow 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-4. AWS 환경 이해&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;EC2, S3, CloudFront 를 직접 구성하여 프로젝트를 배포하고, 캐시 정책을 설정하면서 AWS의 각 환경에 대한 이해도가 높아졌다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;다음 프로젝트에서는 혼자서 거의 모든 환경 구축이 가능한 수준이 되었다!&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;3. 찐~한 협업, 소프트 스킬&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;단언컨데 가장 성장한 부분이 아닐까 싶다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;평소 새로운 사람들을 사귀는 것을 좋아하고, 서글서글한 성격을 가져 사람과 소통하는 것에 자신있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;물론 코드를 사이에 두고 대화해보기 전까지 말이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;찐한 협업을 진행하면서, 내 코드에 대한 확증편향을 내려놓을 수 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이게 좋다, 저게 좋다. 이런건 사실 크게 의미가 없었을지도 모른다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;  꽉꽈라꽉꽉&lt;/b&gt; 눌러담은 레벨3, 4  &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKB3by/btsv5j3FK5I/umVFL9YxxTFvFy0JjNPZpK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKB3by/btsv5j3FK5I/umVFL9YxxTFvFy0JjNPZpK/img.webp&quot; data-alt=&quot;꺼억~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKB3by/btsv5j3FK5I/umVFL9YxxTFvFy0JjNPZpK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKB3by%2Fbtsv5j3FK5I%2FumVFL9YxxTFvFy0JjNPZpK%2Fimg.webp&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;346&quot; height=&quot;242&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;꺼억~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우테코 생활이 마무리 되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;얼마나 많은 밥을 먹었을까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나는 얼마나 많은 성장을 했을까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 증명할 시간이 왔다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;취준 드가자!&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>AWS</category>
      <category>개발환경</category>
      <category>최적화</category>
      <category>취준</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/122</guid>
      <comments>https://think0wise.tistory.com/122#entry122comment</comments>
      <pubDate>Mon, 2 Oct 2023 13:29:07 +0900</pubDate>
    </item>
    <item>
      <title>HTTP cache(with. MDN)</title>
      <link>https://think0wise.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;HTTP &lt;/b&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;cache에 대해&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;&amp;nbsp;알아보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;포스팅의 전반적인 내용은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching&quot;&gt;MDN - HTTP caching 문서&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기반입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다루지 않은 디렉티브나 내용에 대해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;더 자세하게 알아보고 싶다면 문서를 참고하세요!&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695532904191&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;HTTP caching - HTTP | MDN&quot; data-og-description=&quot;The HTTP cache stores a response associated with a request and reuses the stored response for subsequent requests.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjvxW3/hyTY9WvXQg/2nSf48x3Vi0QXpyFx7Ov81/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/VjdZx/hyTY8J2FmL/SAoDrUreeBMF2bdSYSlmhK/img.png?width=1045&amp;amp;height=651&amp;amp;face=0_0_1045_651,https://scrap.kakaocdn.net/dn/M879P/hyTZaHR0ZZ/yksGUuYL7Xq1art2VBuhZk/img.png?width=1185&amp;amp;height=434&amp;amp;face=0_0_1185_434&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjvxW3/hyTY9WvXQg/2nSf48x3Vi0QXpyFx7Ov81/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/VjdZx/hyTY8J2FmL/SAoDrUreeBMF2bdSYSlmhK/img.png?width=1045&amp;amp;height=651&amp;amp;face=0_0_1045_651,https://scrap.kakaocdn.net/dn/M879P/hyTZaHR0ZZ/yksGUuYL7Xq1art2VBuhZk/img.png?width=1185&amp;amp;height=434&amp;amp;face=0_0_1185_434');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;HTTP caching - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;The HTTP cache stores a response associated with a request and reuses the stored response for subsequent requests.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;캐시(cache)란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자주 사용되는 자원(데이터, 값)을&lt;b&gt; 임시로 복사해서 보관하는 장소를 말합니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;기존 자원에&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;접근하는 시간&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;혹은&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;다시 계산하는&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;시간&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;을&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;절약하고자 사용합니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;HTTP cache&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;cache는 &lt;b&gt;웹 통신 과정에서도 사용합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;프로젝트 성향에 맞게&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;JS, CSS, image와 같은 파일들을&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;cache해서 불필요한 통신 리소스를 줄일 수 있습니다.&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;통신 시간의 절약은, &lt;b&gt;곧 빠른 페이지 로딩으로 이어지고 &lt;span style=&quot;color: #409d00;&quot;&gt;사용자 경험을 향상시킵니다!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&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;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. HTTP cache의 종류&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HTTP cache는 크게 &lt;b&gt;private, shared&lt;/b&gt; 2가지로 나뉩니다.&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pgrfV/btsvndadaRB/0diHxDwmBRO0pImuz7adCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pgrfV/btsvndadaRB/0diHxDwmBRO0pImuz7adCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pgrfV/btsvndadaRB/0diHxDwmBRO0pImuz7adCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpgrfV%2FbtsvndadaRB%2F0diHxDwmBRO0pImuz7adCk%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;770&quot; height=&quot;282&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-1. private cache(비공개 캐시)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;클라이언트에 (일반적으로 웹 브라우저)에 저장되는 캐시입니다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다른 클라이언트와 &lt;b&gt;공유되지 않으므로,&lt;/b&gt; 사용자의 개인 응답을 저장할 수 있습니다.&lt;/span&gt;&lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-2. shared cache(공유 캐시)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;클라이언트와 서버(origin) 사이에 저장되는 캐시입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;shared cache는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot;&gt;다시 &lt;b&gt;Proxy Cache&lt;/b&gt;와&amp;nbsp;&lt;b&gt;Managed Cache&lt;/b&gt;&amp;nbsp;2가지로 나뉩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Proxy Cache(프록시 캐시)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot;&gt;&lt;b&gt;클라이언트의 바로 다음단에 위치&lt;/b&gt;하는&amp;nbsp;&lt;/span&gt;포워드 프록시에 저장되는 캐시입니다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot;&gt;HTTPS가 점차 대중화 되면서 &lt;b&gt;캐시의 역할보다는 필터링, 익명 접근, 접근 제한 등의 역할로 사용되고 있습니다.&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;(종단간 암호화를 보장하는 HTTPS 특성 상&lt;/b&gt; 포워드 프록시에서 그 내용에 접근하기 어렵기 때문입니다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot;&gt;&lt;b&gt;Managed Cache(관리형 캐시)&lt;br /&gt;&lt;/b&gt;오늘 포스팅의 주인공인&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;b&gt;CDN 서비스 그리고 리버스 프록시, &lt;span style=&quot;color: #292c32;&quot;&gt;캐시 API와 결합된 서비스 워커&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #292c32;&quot;&gt;와 같은&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;환경에 저장되는 캐시입니다.&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;관리형 캐시 서비스는 대부분 캐시 제어 헤더(Cache-Control)와 자체 구성 파일 또는 대시보드로 캐시의 동작을 제어하는 기능을 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. HTTP cache의 &lt;b&gt;유효 기간&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;저장된 HTTP cache는 &lt;b&gt;Fresh, Stale&lt;/b&gt; &lt;b&gt;&lt;b&gt;상태로 나뉩니다.&lt;/b&gt;&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;Fresh&lt;/span&gt; - 일반적으로 응답이 아직 유효하며 재사용할 수 있음을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;Stale&lt;/span&gt; - 응답이 만료되었음을 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;의미합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-1. &lt;b&gt;Cache-Control&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt; header&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Cache-Control&lt;/b&gt;은 HTTP 에서 캐시 메커니즘을 지정하기 위해 사용되는 헤더입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Cache-Control &lt;/b&gt;헤더에 작성하는 지시문을 디렉티브(directive) 라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;HTTP는 가능한 한 많이 캐시하도록 설계되었기 때문에&amp;nbsp;&lt;/span&gt;&lt;b&gt;Cache-Control 헤더가 없더라도&lt;/b&gt;&lt;b&gt;&amp;nbsp;캐싱을 합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;이를 휴리스틱 캐싱이라고 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1-1. max-age, s-maxage 디렉티브와 age&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;max-age는 &lt;b&gt;캐시가 유지될 최대 시간을, &lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;s-maxage는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #191919;&quot;&gt;&lt;b&gt;shared cache(공유 캐시)에 유지될 최대 시간을 의미합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;age는&amp;nbsp;&lt;/span&gt;&lt;b&gt;응답이 생성된 후 경과된 시간을 의미합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot; data-language=&quot;text&quot;&gt;
&lt;pre id=&quot;code_1695521665585&quot; class=&quot;http&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Cache-Control: max-age=604800
Age: 86400

&amp;lt;!doctype html&amp;gt;
&amp;hellip;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 예제에서 응답에 대한 캐싱은 604,800초 동안 유지되며, 응답이 생성된지 86,400초가 경과했음을 의미합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;max-age에 명시한 시간내에 중복된 요청에 대해서는 캐시에 저장된 응답을 제공합니다. - &lt;span style=&quot;color: #409d00;&quot;&gt;Fresh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;age가 max-age를 넘어선 후 부터는 origin(원본서버)에 요청합니다. - &lt;span style=&quot;color: #ef6f53;&quot;&gt;Stale&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;*HTTP/1.0 에서는 Expires 헤더를 사용하기도 했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1695522772822&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Expires: Tue, 28 Feb 2022 22:22:22 GMT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;하지만 위 시간 형식은 의도치 못한 버그가 많았고, &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;HTTP/1.1 에서는 &lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;max-age 디렉티브가 채&lt;/span&gt;택되었습니다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Expires 헤더는 사용하지 않는 것이 좋겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. Validation&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;cache가 Stale 하다면 origin으로 요청을 해야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 origin에서 받아올 데이터가 &lt;b&gt;이전과 변함이 없다면,&lt;/b&gt; &lt;b&gt;같은 데이터를 또 받아오는 것은 낭비가 될 수 있겠죠.&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;&lt;span style=&quot;background-color: #ffffff; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이러한 이유로 Stale한 캐시는 즉시 폐기되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HTTP는 origin에 요청할 때 Stale한 캐시를 그대로 갱신하여 사용할지, 새로운 응답으로 갱신할지 검증하는 메커니즘이 있는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;이를 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#validation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;revalidate&lt;/a&gt; 라고 부르고 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;conditional requests&lt;/a&gt; 과정을 통해 진행됩니다.&amp;nbsp;(캐시 유효성 재검증 및 조건부 요청)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시 유효성 재검증 방식은 &lt;b&gt;크게 2가지로 나뉩니다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Last-Modified&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; /&amp;nbsp;&lt;/span&gt;If-Modified-Since&lt;/b&gt; - &lt;b&gt;리소스의 마지막 변경 시간으로&lt;/b&gt;&lt;/span&gt; 검증하는 방법&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ETag&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; /&amp;nbsp;&lt;/span&gt;If-None-Match&lt;/b&gt; - &lt;b&gt;리소스 식별자로&lt;/b&gt;&lt;/span&gt; 검증하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 2가지 방식 모두 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리소스가 &lt;b&gt;변경 되지 않았다면,&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;304 Not-Modified 상태 코드&lt;/span&gt;와 함께 Stale한 캐시를 그대로 갱신하여 재사용 합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변경이 없는 사실만을 전달하면 되므로,&amp;nbsp;&lt;b&gt;응답 body가 없어 전송 크기 자체가 매우 작고 빠릅니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;변경 되었다면, &lt;span style=&quot;color: #409d00;&quot;&gt;200 상태 코드&lt;/span&gt;와 함께 새로운 응답으로 캐시를 갱신합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;2-2-1. &lt;/b&gt;Last-Modified&lt;span style=&quot;background-color: #ffffff; color: #191919; text-align: start;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;If-Modified-Since&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;방식&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1695525929559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Last-Modified: Tue, 22 Feb 2022 22:00:00 GMT
Cache-Control: max-age=3600

&amp;lt;!doctype html&amp;gt;
&amp;hellip;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리소스 응답에 &lt;b&gt;Last-modified 헤더가 포함되고, 마지막 변경 시간이 담겨있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1695525869994&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-Modified-Since: Tue, 22 Feb 2022 22:00:00 GMT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 Stale cache에 대한 재검증 시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 응답으로 받은 Last-modified 헤더의 마지막 변경 시간을&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;If-Modified-Since 헤더에 &lt;/span&gt;담아 리소스의 변경을 검증합니다.&amp;nbsp;&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #292c32; background-color: #ffffff; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파일의 수정 시간은 비교적 쉽게 얻을 수 있기에 간단하게 재검증을 구현할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #292c32; background-color: #ffffff; text-align: start;&quot;&gt;정적 파일을 제공하는 경우에 유용하죠.&lt;/span&gt;&lt;span style=&quot;color: #292c32; background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #292c32; background-color: #ffffff; text-align: start;&quot;&gt;그러나 1초 미만의 &lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;단위로 조정이 불가능 하고, 주석/개행의 수정과 같이 유의미한 변경이 아닌 경우에도 변경으로 취급하기에 불편함이 있습니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #292c32; background-color: #ffffff; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #292c32; background-color: #ffffff; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;2-2-2. &lt;/b&gt;&lt;/b&gt;ETag&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;If-None-Match 방식&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리소스 식별자 기반의 재검증 방식이 위와 같은 불편함을 해결해 줄 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ETag 응답 헤더에 포함되는 식별자는 서버에서 생성하는 임의의 값입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #292c32; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이 값의 형식에는 제한이 없어, 자유롭게 생성 가능합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1695527541235&quot; class=&quot;http&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
ETag: &quot;33a64df5&quot;
Cache-Control: max-age=3600

&amp;lt;!doctype html&amp;gt;
&amp;hellip;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;리소스 응답에 &lt;/span&gt;&lt;b&gt;Etag 헤더가 포함되고, 식별자가 담겨있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1695527609210&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-None-Match: &quot;33a64df5&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 Stale cache에 대한 재검증 시&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 응답으로 받은 Etag 헤더의 식별자를 &lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;If-None-Match 헤더에&amp;nbsp;&lt;/span&gt;담아 리소스의 변경을 검증합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-3. no-cache / no-store&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Cache-Control의 디렉티브&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;no-cache&lt;/b&gt; - &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;캐시를 사용하되,&amp;nbsp;&lt;/span&gt;&lt;b&gt;매번 재검증을 통해 Origin의 신선한 리소스를 가져오도록 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;no-store - 캐시를 사용하지 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-4. private / public&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Cache-Control의 디렉티브&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;private&lt;/b&gt; - &lt;b&gt;브라우저에만&lt;/b&gt; 캐싱을 허용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;pubilc - 공유캐시(Shared cache)에서도 &lt;/b&gt;캐싱을 허용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vSkrS/btsvjdCMv2i/vd75AZRuJ2aMveedMPeGt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vSkrS/btsvjdCMv2i/vd75AZRuJ2aMveedMPeGt1/img.png&quot; data-alt=&quot;네트워크 재밌자네?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vSkrS/btsvjdCMv2i/vd75AZRuJ2aMveedMPeGt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvSkrS%2FbtsvjdCMv2i%2Fvd75AZRuJ2aMveedMPeGt1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Network</category>
      <category>cache-control</category>
      <category>HTTP</category>
      <category>HTTP cache</category>
      <category>max-age</category>
      <category>s-maxage</category>
      <category>조건부 요청</category>
      <category>캐시 유효성 재검증</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/121</guid>
      <comments>https://think0wise.tistory.com/121#entry121comment</comments>
      <pubDate>Sun, 24 Sep 2023 14:26:24 +0900</pubDate>
    </item>
    <item>
      <title>CloudFront(CDN), S3란?</title>
      <link>https://think0wise.tistory.com/120</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. CDN(Content &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Delivery Network)이란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFqhCW/btstXz0ik7d/ptTs05qh5kIKiu67s15mZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFqhCW/btstXz0ik7d/ptTs05qh5kIKiu67s15mZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFqhCW/btstXz0ik7d/ptTs05qh5kIKiu67s15mZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFqhCW%2FbtstXz0ik7d%2FptTs05qh5kIKiu67s15mZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;229&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클라이언트와 서버의 &lt;b&gt;물리적 통신거리가 긴 경우&lt;/b&gt;(ex. 한국에서 미국 웹사이트에 접속) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;동영상 또는 웹 사이트 이미지와 같은 대용량 파일을 로드하는 데 &lt;b&gt;시간이 오래 걸립니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;CDN은 클라이언트와 &lt;/span&gt;서버 중간에서 통신에 관여해&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;위와 같은 문제를 해결해 줍니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클라이언트와 물리적으로 가까운 CDN을 통해 데이터를 주고받아&lt;b&gt; 웹 트래픽을 줄이고 빠른 로딩으로 사용자 경험을 개선할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-1. CDN 적용 시 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;물리적 거리 감소 및 캐싱을 통해 페이지 로드 시간 단축되고&lt;/b&gt;, 이로 인해 사용자 경험이 좋아집니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자체 캐싱 및 최적화를 통해 서버가 제공해야하는 데이터 양을 줄일 수 있고, &lt;/b&gt;이로 인해 서버 호스팅비용을 절감할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;트래픽 급증시 트래픽을 분산하여 서버에 미치는 영향을 줄일 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. CloudFront란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTXPLm/btstXvEB7yE/OKGVbHkcq96K460mn5LejK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTXPLm/btstXvEB7yE/OKGVbHkcq96K460mn5LejK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTXPLm/btstXvEB7yE/OKGVbHkcq96K460mn5LejK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTXPLm%2FbtstXvEB7yE%2FOKGVbHkcq96K460mn5LejK%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;159&quot; height=&quot;182&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS에서 제공하는 CDN 서비스입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전세계의 각 지역마다 &lt;b&gt;엣지 로케이션(임시 데이터 저장소)를 가지고 있으며&lt;/b&gt;, 오리진으로부터 데이터를 받아 보관합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자는 가까운 엣지 로케이션으로부터 데이터를 받아 빠르게 서비스를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. 캐시 정책&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AR9RL/btst0azU4GF/KK5VCY6MqFdK54YDRZg8S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AR9RL/btst0azU4GF/KK5VCY6MqFdK54YDRZg8S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AR9RL/btst0azU4GF/KK5VCY6MqFdK54YDRZg8S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAR9RL%2Fbtst0azU4GF%2FKK5VCY6MqFdK54YDRZg8S1%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;591&quot; height=&quot;133&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;CloudFront가&lt;/span&gt; 어떤 방식으로 캐싱할 지 지정하는 옵션입니다&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;제공되는 캐시 정책을 선택해도 되고, 새로운 캐시정책을 만들수도 있습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;정책 내부로 들어가면 &lt;b&gt;TTL, 압축 지원 등의 세부 정책을 설정할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2-1-1. TTL(Time To Live)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcfb84/btst0a7KsQb/MbsZqO3lWJKh8IEstnLRxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcfb84/btst0a7KsQb/MbsZqO3lWJKh8IEstnLRxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcfb84/btst0a7KsQb/MbsZqO3lWJKh8IEstnLRxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcfb84%2Fbtst0a7KsQb%2FMbsZqO3lWJKh8IEstnLRxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1295&quot; height=&quot;166&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;CloudFront가 &lt;/span&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;origin(원본 데이터를 소유하고 있는 곳)으로 부터 받은 데이터&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TTL 옵션은 &lt;b&gt;origin의 &lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;Cache-Control(max-age, s-maxage) 및 Expires 설정에 따라 선택적으로 적용됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세한 정책은 &lt;b&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationDownloadDist&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 문서를 참고하세요!&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1-2. 압축 지원&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2WleZ/btstVgA1MQj/wIXfk9KvbtkrRhLHtNzCYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2WleZ/btstVgA1MQj/wIXfk9KvbtkrRhLHtNzCYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2WleZ/btstVgA1MQj/wIXfk9KvbtkrRhLHtNzCYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2WleZ%2FbtstVgA1MQj%2FwIXfk9KvbtkrRhLHtNzCYk%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;950&quot; height=&quot;163&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CloudFront가 지원할 압축 형식을 지정하는 옵션입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;뷰어(브라우저)가 지원한다면, &lt;span style=&quot;background-color: #ffffff; color: #292c32; text-align: start;&quot;&gt;객체를&amp;nbsp;&lt;/span&gt;Gzip 또는 Brotli 형식으로 압축하여 전달합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. 응답 헤더 정책&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXT87A/btst54Mxhv9/LzkJGeZj3mRTxgdaAkaRyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXT87A/btst54Mxhv9/LzkJGeZj3mRTxgdaAkaRyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXT87A/btst54Mxhv9/LzkJGeZj3mRTxgdaAkaRyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXT87A%2Fbtst54Mxhv9%2FLzkJGeZj3mRTxgdaAkaRyK%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;589&quot; height=&quot;117&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;CloudFront가&lt;/span&gt; 뷰어(브라우저)에게 응답을 전달할 때 &lt;/b&gt;함께 실어 보낼 HTTP Header를 지정하는 옵션입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반대로 제거할 Header를 지정할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보안, CORS, 사용자 지정 헤더(Cache-Control등) 를 지정할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1-1. 사용자 지정 헤더, origin 재정의&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQDIqQ/btstX1DmegD/Py5eBR81fsJYjvaEV0na30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQDIqQ/btstX1DmegD/Py5eBR81fsJYjvaEV0na30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQDIqQ/btstX1DmegD/Py5eBR81fsJYjvaEV0na30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQDIqQ%2FbtstX1DmegD%2FPy5eBR81fsJYjvaEV0na30%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;436&quot; height=&quot;181&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;CloudFront가&lt;/span&gt; 뷰어(브라우저)에게 전달할 &lt;/b&gt;커스텀 헤더(예시에선 Cache-Control)를 지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오리진 재정의는&amp;nbsp;&lt;b&gt;원본&lt;/b&gt;(Origin에서 전달받은 CloudFront에 캐시된 데이터)에 &lt;b&gt;동일한 헤더가 포함되어 있을 때,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원본의 헤더를 &lt;b&gt;덮어쓸지(무시) 선택하는 옵션입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세한 정책은 &lt;b&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/understanding-response-headers-policies.html#understanding-response-headers-policies-custom&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식문서를 참고하세요!&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. S3(Simple Storage Service)란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coSRGf/btst7vCU1VN/QMVzi55DukXexZwK6Vk1y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coSRGf/btst7vCU1VN/QMVzi55DukXexZwK6Vk1y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coSRGf/btst7vCU1VN/QMVzi55DukXexZwK6Vk1y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoSRGf%2Fbtst7vCU1VN%2FQMVzi55DukXexZwK6Vk1y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;141&quot; height=&quot;157&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;AWS에서 제공하는 인터넷 파일 서버 서비스입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;텍스트파일, 이미지, 비디오 어떤 종류의 파일이던지 저장할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-1. S3 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;S3는 &lt;b&gt;트래픽, 용량, 데이터 유실, 서버 다운, 보안 등&lt;/b&gt; 여러 이슈에 대한 부분을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;대행합니다. &lt;br /&gt;때문에 사용자는 &lt;b&gt;본래 목적인 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;저장&lt;/span&gt;에만 집중하여 사용할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-2. 기본 용어 개념&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;객체&lt;b&gt;(Object)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터가 저장되는 기본 단위이며 파일과 메타데이터로 구성됩니다.&lt;br /&gt;key value 형식의 객체 개념을 생각하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하나에 객체에는 여러개의 또 다른 객체가 있을수도 있고, 여러개의 파일이 있을수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;버킷&lt;b&gt;(Bucket)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;S3에서 최상위 디렉터리의 개념입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버킷 단위로 지역(region)을 지정할 수 있고, 버킷에 포함된 객체에 대해 일괄적인 설정이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-3. 메타데이터&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ68uP/btstXZesjFV/HikvcAdYe9Qfmqa7886Iq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ68uP/btstXZesjFV/HikvcAdYe9Qfmqa7886Iq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ68uP/btstXZesjFV/HikvcAdYe9Qfmqa7886Iq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ68uP%2FbtstXZesjFV%2FHikvcAdYe9Qfmqa7886Iq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;359&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;key-value 형태로&lt;/span&gt;&lt;span style=&quot;color: #16191f; text-align: start;&quot;&gt; &lt;/span&gt;객체의 정보를 나타내는 속성입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주로 Cache-Control 과 같은 헤더를 정의하는데 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bytTaV/btst5rOLeut/oZwowXIUxkFUQ1Mjxgbopk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bytTaV/btst5rOLeut/oZwowXIUxkFUQ1Mjxgbopk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bytTaV/btst5rOLeut/oZwowXIUxkFUQ1Mjxgbopk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbytTaV%2Fbtst5rOLeut%2FoZwowXIUxkFUQ1Mjxgbopk%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;644&quot; height=&quot;446&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;각 객체마다 개별 메타데이터 설정이 가능합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해 &lt;b&gt;객체 별 캐싱 전략을 다르게 가져갈 수 있습니다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;CloudFront와 같이 사용하는 경우, &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;캐시 정책과 관련된 헤더의 값 및 &lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;우선 순위에 변동이 생길 수 &lt;/span&gt;&lt;/b&gt;있으므로 주의해야 합니다.&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clzdnm/btstVh7NQ0M/YHYcK1XB3KyV6ujKZaKT9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clzdnm/btstVh7NQ0M/YHYcK1XB3KyV6ujKZaKT9k/img.png&quot; data-alt=&quot;infra도 기본이 중요하다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clzdnm/btstVh7NQ0M/YHYcK1XB3KyV6ujKZaKT9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclzdnm%2FbtstVh7NQ0M%2FYHYcK1XB3KyV6ujKZaKT9k%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;infra도 기본이 중요하다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Infra</category>
      <category>CDN</category>
      <category>Cloudfront</category>
      <category>Infra</category>
      <category>S3</category>
      <category>캐시</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/120</guid>
      <comments>https://think0wise.tistory.com/120#entry120comment</comments>
      <pubDate>Thu, 14 Sep 2023 22:43:41 +0900</pubDate>
    </item>
    <item>
      <title>[삽질] - imagemin 패키지의 Unknown plugin 오류</title>
      <link>https://think0wise.tistory.com/119</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 사건의 발단&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;이미지 최적화 관련 webpack플러그인&lt;/b&gt; 중 하나인 &lt;/span&gt;ImageMinimizerPlugin은 여러 하위 플러그인과 함께 사용하는 패키지이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTjO3U/btssPvZ1O7c/YNHdf6HZG4wtIF4PTTtVR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTjO3U/btssPvZ1O7c/YNHdf6HZG4wtIF4PTTtVR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTjO3U/btssPvZ1O7c/YNHdf6HZG4wtIF4PTTtVR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTjO3U%2FbtssPvZ1O7c%2FYNHdf6HZG4wtIF4PTTtVR0%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;464&quot; height=&quot;103&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;하위 플러그인인 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;imagemin-xxx 패키지들&lt;/b&gt;&lt;/span&gt;을 설치하여 &lt;b&gt;빌드할 때 해당 패키지들을 찾지 못하는 오류 발생&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3djpL/btssPvyWBZZ/gh6dFxg2jXckVxQuGoLQaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3djpL/btssPvyWBZZ/gh6dFxg2jXckVxQuGoLQaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3djpL/btssPvyWBZZ/gh6dFxg2jXckVxQuGoLQaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3djpL%2FbtssPvyWBZZ%2Fgh6dFxg2jXckVxQuGoLQaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;159&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 문제 원인 분석&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드 관련 &lt;b&gt;패키지의 종속성의 버전이 낮았던 것이 원인.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*build 스크립트에서 webpack-cli 패키지를 사용하고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*&lt;b&gt;실행 일자 기준 2년전 생성한 프로젝트로&lt;/b&gt; webpack-cli 패키지의 버전이 4.x.x 버전이었다.(최신 5.x.x)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 원인에 대한 학습&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미지 최적화 관련 패키지를 설치하기 전까지 build 커멘드는 문제없이 작동했기에, &lt;b&gt;새로 설치한 패키지(이미지 최적화 관련)에 대한 부분만 의심한 &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;케이스. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;build 자체는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;관련이 없다고 생각했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;하지만 원인은 build 커멘드와 가장 밀접한 패키지의 버전에 있었고, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;오류가 발생한&amp;nbsp;&lt;/span&gt;&lt;b&gt;원인 동작(build)부터 &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;의심해 볼 필요성을 느꼈다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;또한 해당 프로젝트는 생성된지 2년이 넘은 레포였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오래된 프로젝트에서 관련된 종속성을 업데이트 하거나, 새로운 패키지를 설치할 때는&amp;nbsp;&lt;b&gt;package.json에 명시된 각 패키지의 버전이 낮아 관련한 문제가 발생할 수 있다는 것을 알 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. 문제의 해결&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;해당 패키지의 github issue에 해당 에러 키워드를 입력해 &lt;a href=&quot;https://github.com/webpack-contrib/image-minimizer-webpack-plugin/issues/237#issuecomment-1075044200&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;관련된 코멘트를 찾았고&lt;/a&gt;,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;webpack-cli 패키지를 업데이트하여 해결하였다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에러 추적은 발생지부터, 오래된 프로젝트는 버전체크부터!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F6zT7/btssUbsJloP/Y0AiPaaHb1I4IdShBpCkX0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F6zT7/btssUbsJloP/Y0AiPaaHb1I4IdShBpCkX0/img.jpg&quot; data-alt=&quot;배웠다 배웠어!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F6zT7/btssUbsJloP/Y0AiPaaHb1I4IdShBpCkX0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF6zT7%2FbtssUbsJloP%2FY0AiPaaHb1I4IdShBpCkX0%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&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;</description>
      <category>나를 죽이지 못한 삽질들</category>
      <category>imagemin</category>
      <category>package.json</category>
      <category>삽질</category>
      <category>에러</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/119</guid>
      <comments>https://think0wise.tistory.com/119#entry119comment</comments>
      <pubDate>Sat, 2 Sep 2023 20:52:48 +0900</pubDate>
    </item>
    <item>
      <title>S-HOOK - 서비스 런칭 [Week 7 ~ 8]</title>
      <link>https://think0wise.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;어느덧 레벨3 마지막 스프린트를 진행했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;성공적인 런칭 페스티벌! &lt;/span&gt;&lt;/b&gt;&lt;span&gt;그 마지막 여정은 어땠는지 되돌아 봅시다!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 사용성 위주의 피드백 반영&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에도 역시 지난 데모데이 피드백을 반영했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;사용성 위주의 피드백이 많았던 만큼 &lt;b&gt;실제 유저가 느낄 수 있는 불편함을 해결하고자 노력했어요.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;1-1. 듣기 / 등록&amp;nbsp; -&amp;nbsp; 플로우 분리&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;등록과 듣기&lt;/b&gt;라는 정책을 함께 묶어 제공하던 기존의 방식은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;오히려 듣기 기능을 주로 사용하는 유저에게 불편함을 줄 수 있었습니다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;관련한 문제점에 대해서는 이미 우려했던 부분이기에 관련하여 정책을 변경하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;별도의 페이지에서 &lt;/span&gt;한정된 기간 동안 특정 노래에 대해 킬링파트를 등록할 수 있도록 하고,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;듣기 페이지에서는 이미 선정된 킬링파트를 들을 수 있게 하여 &lt;b&gt;플로우를 완전히 분리하였습니다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;1-2. 듣기 버튼 강조 &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;듣기 페이지에 대한 피드백중&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;'상대적으로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;듣기 버튼이&amp;nbsp;&lt;/span&gt;영상에 비해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;잘&amp;nbsp;&lt;/span&gt;눈에 띄지 않는다. 강조되어야 할 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;'&amp;nbsp; 라는 피드백도 있었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byyXsJ/btsrB2L1rTD/sEqRLRL7OAktd4StkHE5V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byyXsJ/btsrB2L1rTD/sEqRLRL7OAktd4StkHE5V1/img.png&quot; data-alt=&quot;기존 UI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byyXsJ/btsrB2L1rTD/sEqRLRL7OAktd4StkHE5V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyyXsJ%2FbtsrB2L1rTD%2FsEqRLRL7OAktd4StkHE5V1%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;317&quot; height=&quot;175&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존 UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프로그레스 바.gif&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgyuIk/btsrDHtAKeW/NDgetFv2NwKjxNvAvCialK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgyuIk/btsrDHtAKeW/NDgetFv2NwKjxNvAvCialK/img.gif&quot; data-alt=&quot;개선된 UI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgyuIk/btsrDHtAKeW/NDgetFv2NwKjxNvAvCialK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bgyuIk/btsrDHtAKeW/NDgetFv2NwKjxNvAvCialK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;218&quot; data-filename=&quot;프로그레스 바.gif&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개선된 UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;이 부분에 대해 팀원 모두 공감하였고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;'듣기 기능'을 &lt;/b&gt;제공한다는 것을 유저가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;명확하게&amp;nbsp;&lt;/span&gt;알 수 있도록 &lt;b&gt;버튼 UI를 변경&lt;/b&gt;했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-3. 스와이프를 통해 더 쉽게, 더 편하게 듣기 &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존의 듣기 플로우는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;메인페이지 노래 리스트의 노래 &lt;/span&gt;선택 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&amp;nbsp;&amp;nbsp;&lt;/span&gt;듣기 페이지 이동 후 듣기 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr; 다시 메인 페이지로 이동 후 노래 선택 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;듣기 페이지 이동 후&amp;nbsp;&lt;/span&gt;듣기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;위 플로우에 대해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;'유입된 초기 유저는 킬링 파트를 등록하기보다는 &lt;/span&gt;&lt;b&gt;빠르게 여러 노래를 듣고자 할 것 같다.&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;'&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'&lt;b&gt;빠르게 많은 노래를 소비할 수 있도록&lt;/b&gt; 하는 것이 중요하다고 생각한다.' 라는 피드백이 있었습니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스와이프.gif&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brrUf8/btsrEqkOPCY/hw2KewKjpIJVRWVyuLk6i0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brrUf8/btsrEqkOPCY/hw2KewKjpIJVRWVyuLk6i0/img.gif&quot; data-alt=&quot;스와이프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brrUf8/btsrEqkOPCY/hw2KewKjpIJVRWVyuLk6i0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/brrUf8/btsrEqkOPCY/hw2KewKjpIJVRWVyuLk6i0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;490&quot; data-filename=&quot;스와이프.gif&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;490&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대해 &lt;b&gt;기존보다 더 빠르게 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;새로운&amp;nbsp;&lt;/span&gt;노래를 탐색할 수 있는 방법&lt;/b&gt;을 생각해 보았고, &lt;b&gt;스와이프 기능&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;을 도입했습니다!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해 화면 &lt;b&gt;드래그 한 번이면&lt;/b&gt; 다음 노래를 들을 수 있게 되었습니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 보다 더! 편하게 &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;피드백 반영 이후에도 &lt;b&gt;사용자가 느낄 수 있는 불편함&lt;/b&gt;에 대해 깊게 생각해 보았고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음과 같은&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파트 재생 중임을 시각적으로 알려줄 수 있는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;progress bar 구현&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파트 재생 중 스와이프 시 &lt;b&gt;기존 파트 자동 정지 기능&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;신뢰할 수 있는 데이터를 위한 &lt;b&gt;로그인 기능&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;좋아요를 통한 &lt;b&gt;파트 아카이빙 기능&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 런칭 페스티벌&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230822_182131067_01.jpg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1p3jT/btsrR25koBT/4UjmZZHKVRkptKAGmm0zK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1p3jT/btsrR25koBT/4UjmZZHKVRkptKAGmm0zK1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1p3jT/btsrR25koBT/4UjmZZHKVRkptKAGmm0zK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1p3jT%2FbtsrR25koBT%2F4UjmZZHKVRkptKAGmm0zK1%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;436&quot; height=&quot;436&quot; data-filename=&quot;KakaoTalk_20230822_182131067_01.jpg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이 모든 내용을 담아 대망의 런칭 페스티벌&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(4차 데모데이)&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;을 진행했습니다 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_20230822_182131067.jpg&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnpz9T/btsrVtnwSD2/EcVAjndTRTL6jw8vGHSWRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnpz9T/btsrVtnwSD2/EcVAjndTRTL6jw8vGHSWRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnpz9T/btsrVtnwSD2/EcVAjndTRTL6jw8vGHSWRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnpz9T%2FbtsrVtnwSD2%2FEcVAjndTRTL6jw8vGHSWRK%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;445&quot; height=&quot;520&quot; data-filename=&quot;edited_KakaoTalk_20230822_182131067.jpg&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;많은 사용자를 대상으로 실사용 피드백을 받을 수 있었어요!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;생각하지도 못했던 부분에 대한 피드백을 많이 주셔서 너무 감사했습니다 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. Week 7 ~ 8&amp;nbsp; 돌아보기 &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레벨 3의&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;모든 스프린트를 통틀어 가장 바쁘고 정신없었던 스프린트가 아닐까 싶어요.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발해야 할&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;기능이 쏟아졌고 자연스레&amp;nbsp;&lt;/span&gt;밤을 새우기 일쑤였죠.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;이런&amp;nbsp;&lt;/span&gt;정신없는&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;상황 속에서&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;&lt;b&gt;팀원이 무엇을, 어떻게 개발해 나가고 있는지 놓치기도 했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인적으로 &lt;b&gt;나와 같은 목표를 가지고 나아가는 팀원이 무엇을 하는지, 또 어떤 생각을 가지고 있는지 알아야 한다고 생각해요.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;팀이라는 울타리 안에서 문제를 해결하기 위해서 제일 기본이 되는 요소&lt;/b&gt;가 아닐까 싶습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;기본이라고 생각한 부분을 놓쳐서 여러모로&amp;nbsp;&lt;/span&gt;아쉬운 점도&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;많고 반성하게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;shook 슬로건 4대3.png&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1toWZ/btsrDFvTjqu/OXVDA8EE1JyaWfh5Qp9hi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1toWZ/btsrDFvTjqu/OXVDA8EE1JyaWfh5Qp9hi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1toWZ/btsrDFvTjqu/OXVDA8EE1JyaWfh5Qp9hi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1toWZ%2FbtsrDFvTjqu%2FOXVDA8EE1JyaWfh5Qp9hi1%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;489&quot; height=&quot;235&quot; data-filename=&quot;shook 슬로건 4대3.png&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가슴 뛰는&amp;nbsp;&lt;a href=&quot;https://s-hook.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;S-HOOK&lt;/b&gt;&lt;/a&gt;의 런칭과 함께&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;'&lt;/b&gt;&lt;b&gt;이상적인 협업'&lt;/b&gt;에 대해 생각해 보게 된 마지막 스프린트였습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레벨3 팀 프로젝트 회고는 여기까지 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;레벨4 팀 프로젝트 고도화와 함께 돌아올게요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>5기</category>
      <category>shook</category>
      <category>사용자</category>
      <category>서비스 런칭</category>
      <category>우테코</category>
      <category>팀프로젝트</category>
      <category>프론트엔드</category>
      <category>회고</category>
      <category>후기</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/118</guid>
      <comments>https://think0wise.tistory.com/118#entry118comment</comments>
      <pubDate>Wed, 23 Aug 2023 00:13:54 +0900</pubDate>
    </item>
    <item>
      <title>컴포넌트 관심사 분리의 중요성 뼈 속까지 직접 느껴보기(feat. 의식적인 리팩터링)</title>
      <link>https://think0wise.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 포스팅에서는 진행중인 프로젝트의 &lt;b&gt;Page 단위 컴포넌트를 리팩터링 하는 과정과&lt;/b&gt; &lt;b&gt;느낀점&lt;/b&gt;을 담아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;도메인이 듬뿍 담긴&lt;/b&gt; 컴포넌트의 리팩터링 과정을 담다보니 다소 복잡합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드를 이해하기 보다는 가볍게 &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;느낌만&lt;/span&gt; 봐주세요. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(느낌만 봐도 충분히 복잡합니다..ㅎ)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과정과 설명 없이 Page컴포넌트의 &lt;b&gt;Before / After 만 보고 싶으시면&lt;/b&gt; 아래 접힌글을 펼쳐서 코드를 확인해 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맨밑으로 가서 &lt;b&gt;느낀점만 보셔도 됩니다...&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #ef5369;&quot;&gt;&lt;b&gt;Before&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;초기 page.png&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;6378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmlr26/btsp63kPt3E/p7dUNhdng3UDr1Y6q4hLX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmlr26/btsp63kPt3E/p7dUNhdng3UDr1Y6q4hLX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmlr26/btsp63kPt3E/p7dUNhdng3UDr1Y6q4hLX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmlr26%2Fbtsp63kPt3E%2Fp7dUNhdng3UDr1Y6q4hLX0%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;996&quot; height=&quot;3199&quot; data-filename=&quot;초기 page.png&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;6378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #409d00;&quot;&gt;&lt;b&gt;After&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;최종 페이지.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;1362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAUJiO/btsqh3KjExB/ROuk9URngqgbbaQVUsH6n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAUJiO/btsqh3KjExB/ROuk9URngqgbbaQVUsH6n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAUJiO/btsqh3KjExB/ROuk9URngqgbbaQVUsH6n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAUJiO%2Fbtsqh3KjExB%2FROuk9URngqgbbaQVUsH6n1%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;1760&quot; height=&quot;1362&quot; data-filename=&quot;최종 페이지.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;1362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. Page 컴포넌트의 문제점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 리팩토링 대상 컴포넌트 코드를 살펴봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;미리&amp;nbsp;&lt;/span&gt;주요 관심사들에 대해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;주석으로&lt;/span&gt; 표시해 두었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드를 하나하나 이해하는 것 보다는, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;주석 부분만 읽으면서 '관심사가 이렇게 많구나~' 정도만 파악하시면 좋을것 같아요.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;초기 page.png&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;6378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmlr26/btsp63kPt3E/p7dUNhdng3UDr1Y6q4hLX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmlr26/btsp63kPt3E/p7dUNhdng3UDr1Y6q4hLX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmlr26/btsp63kPt3E/p7dUNhdng3UDr1Y6q4hLX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmlr26%2Fbtsp63kPt3E%2Fp7dUNhdng3UDr1Y6q4hLX0%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;952&quot; height=&quot;6378&quot; data-filename=&quot;초기 page.png&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;6378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;위 page 컴포넌트를 보고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;제가&amp;nbsp;&lt;/span&gt;느낀 문제점은 다음과 같습니다.&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;수&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;많은 관심사를 처리&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하고 있기 때문에 한눈에 파악하기 힘들다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;각 하위 컴포넌트로 전달되는 &lt;b&gt;props와 그 역할이 구분되지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;페이지의 DOM 구조 또한 파악되지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약 기획이 변경되어 해당 페이지가 &lt;b&gt;수정되어야 한다면?&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발자는 우선 코드 흐름을 파악하는데 많은 시간을 들여야겠죠. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 기존 기능을 유지하며 특정 기능을 수정하기 매우 어려울겁니다.&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어디를 어떻게 수정해야 하는지 감을 잡고나면, &lt;b&gt;이미 많은 시간이 흘렀을 겁니다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(&lt;/b&gt;실제로 저는 코드를 파악하는 데만&lt;b&gt; 꼬박 2일이 걸렸습니다...&lt;/b&gt; )&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 관심사 분리 시작&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인적으로는&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;해당 페이지의 레이아웃을 나타내는 것&lt;/b&gt;이&amp;nbsp;&lt;/span&gt;&lt;b&gt;Page 단위 컴포넌트의 주 역할&lt;/b&gt;이라고 생각합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나머지 역할을 최대한 분리해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. 투표 관련 컴포넌트를 총괄하는 상위 컴포넌트 생성&lt;/b&gt;(컴포넌트 분리)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;VoteInterface 추가.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNHATr/btsp3l0tC2T/FZ9dMaHXyZ81NIcL81rRB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNHATr/btsp3l0tC2T/FZ9dMaHXyZ81NIcL81rRB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNHATr/btsp3l0tC2T/FZ9dMaHXyZ81NIcL81rRB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNHATr%2Fbtsp3l0tC2T%2FFZ9dMaHXyZ81NIcL81rRB1%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;458&quot; height=&quot;439&quot; data-filename=&quot;VoteInterface 추가.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Page 컴포넌트에 존재하던 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;투표 관련 컴포넌트를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;총괄하는 &lt;/span&gt;&lt;b&gt;VoteInterface 컴포넌트를 생성합니다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 &lt;b&gt;투표와 관련된 모든 로직을 옮겨봅니다.&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;VoteInterface&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;초기분리 VoteInterface 컴포넌트.png&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;3794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uBkok/btsp6rlQkQ2/LDc2RRlLaE523McQK6ikdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uBkok/btsp6rlQkQ2/LDc2RRlLaE523McQK6ikdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uBkok/btsp6rlQkQ2/LDc2RRlLaE523McQK6ikdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuBkok%2Fbtsp6rlQkQ2%2FLDc2RRlLaE523McQK6ikdk%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;930&quot; height=&quot;3794&quot; data-filename=&quot;초기분리 VoteInterface 컴포넌트.png&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;3794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;VoteInterface 컴포넌트에 &lt;b&gt;&lt;b&gt;투표 관련 상태,&amp;nbsp; 핸들러 함수 및 &lt;/b&gt;&lt;/b&gt;유틸 함수를 모두 옮겼습니다.&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;VideoPlayer 관련 로직은 우선 주석처리 했습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;로직이 분리된 Page 컴포넌트를 봅시다.&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;SongDetailPage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;초기분리 page컴포넌트.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PBOpb/btsp91TJUF5/Gcx3mVd7qHn4O1zVQzdWTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PBOpb/btsp91TJUF5/Gcx3mVd7qHn4O1zVQzdWTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PBOpb/btsp91TJUF5/Gcx3mVd7qHn4O1zVQzdWTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPBOpb%2Fbtsp91TJUF5%2FGcx3mVd7qHn4O1zVQzdWTk%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;1982&quot; height=&quot;1818&quot; data-filename=&quot;초기분리 page컴포넌트.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴포넌트와 로직이 총괄 컴포넌트로 묶여 비교적 가벼워진 모습입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보이지 않던 DOM 구조가 보이기 시작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. &lt;b&gt;투표 관련 상태 및 로직 &lt;b&gt;&lt;b&gt;Context로&amp;nbsp;&lt;/b&gt;&lt;/b&gt;분리하기 &lt;/b&gt;&lt;/b&gt;(복잡하게 얽혀있는 상태와 Props 정리)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 여전히 여러개의 상태가 어떻게 사용되는지, 어디서 어디로 흐르는지 알기 어렵습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;투표 관련 컴포넌트들이 &lt;b&gt;공통적으로 필요로 하는 상태를 찾아 Context로 분리하겠습니다.&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;VoteInterfaceContext&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;보트 컨텍스트.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Xhac/btsp8AI4oTJ/3ZaivE2KSrwGAth9DQZYd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Xhac/btsp8AI4oTJ/3ZaivE2KSrwGAth9DQZYd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Xhac/btsp8AI4oTJ/3ZaivE2KSrwGAth9DQZYd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Xhac%2Fbtsp8AI4oTJ%2F3ZaivE2KSrwGAth9DQZYd1%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;1884&quot; height=&quot;1286&quot; data-filename=&quot;보트 컨텍스트.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Context를 SongDetailPage의 &lt;b&gt;VoteInterface 컴포넌트에 적용해 줍니다.&amp;nbsp;&lt;/b&gt;&lt;b&gt;&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;SongDetailPage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;보트 컨텍스트 적용.png&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;1894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsowPl/btsp35cbBr3/6AraUYvYAOMQ9LVJfOGf4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsowPl/btsp35cbBr3/6AraUYvYAOMQ9LVJfOGf4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsowPl/btsp35cbBr3/6AraUYvYAOMQ9LVJfOGf4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsowPl%2Fbtsp35cbBr3%2F6AraUYvYAOMQ9LVJfOGf4k%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;2008&quot; height=&quot;1894&quot; data-filename=&quot;보트 컨텍스트 적용.png&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;1894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Context를 적용한 VoteInterface 컴포넌트를 봅시다.&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;VoteInterface&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;보트 컨텍스트 적용한 보트인터페이스.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;3224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KkiBv/btsqaPTkuFv/tbhFKzLKJsKAGXV2ljWumk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KkiBv/btsqaPTkuFv/tbhFKzLKJsKAGXV2ljWumk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KkiBv/btsqaPTkuFv/tbhFKzLKJsKAGXV2ljWumk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKkiBv%2FbtsqaPTkuFv%2FtbhFKzLKJsKAGXV2ljWumk%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;1820&quot; height=&quot;3224&quot; data-filename=&quot;보트 컨텍스트 적용한 보트인터페이스.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;3224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;표시된 부분처럼 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;각 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;투표 관련&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;컴포넌트에서&lt;b&gt; 공통으로 요구하던 상태를 Context로 부터 제공받습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과도한 props가 줄어들었습니다.&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-3. VideoPlayer 관련 상태 및 로직 &lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;Context로&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;분리하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;투표와 관련된 분리 외에도 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유튜브 API에 의해 제공되는&lt;b&gt; player 객체를 초기화하고 사용하기 위해서는 상태가 필요했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(초기화는 Youtube컴포넌트에서 이뤄집니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;각&amp;nbsp;&lt;/span&gt;투표 관련 컴포넌트에서는 &lt;b&gt;이 상태를 통해 VideoPlayer를 조작할 수 있어야 했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;이를 위해 VideoPlayer 관련 상태와 로직도 Context로 분리해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;VideoPlayerContext&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;비디오 컨텍스트.png&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DlS5c/btsp9qM1RkK/lt8KbiZHMTksN0JkUkOQmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DlS5c/btsp9qM1RkK/lt8KbiZHMTksN0JkUkOQmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DlS5c/btsp9qM1RkK/lt8KbiZHMTksN0JkUkOQmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDlS5c%2Fbtsp9qM1RkK%2Flt8KbiZHMTksN0JkUkOQmk%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;1792&quot; height=&quot;1020&quot; data-filename=&quot;비디오 컨텍스트.png&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;Youtube 컴포넌트(player상태가 초기화되는 곳)와의 재사용을 고려하여&lt;b&gt; 투표 도메인과 관련된 로직을 두지 않았습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Context를 SongDetailPage의&lt;b&gt; Youtube, VoteInterface 컴포넌트에 적용해 줍니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;SongDetailPage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;비디오 컨텍스트 적용한 page.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VMCQU/btsp34YPqWU/cH52uyK5CqVsZQKWItZYg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VMCQU/btsp34YPqWU/cH52uyK5CqVsZQKWItZYg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VMCQU/btsp34YPqWU/cH52uyK5CqVsZQKWItZYg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVMCQU%2Fbtsp34YPqWU%2FcH52uyK5CqVsZQKWItZYg0%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;1508&quot; height=&quot;1324&quot; data-filename=&quot;비디오 컨텍스트 적용한 page.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 의도대로 VideoPlayerProvider를&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;Youtube 컴포넌트와 재사용할 수 있도록&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;재사용 가능성이 없는&amp;nbsp;&lt;/span&gt;VoteInterfaceProvider 보다 상위에 두었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이제 Page 컴포넌트에 존재하던 &lt;b&gt;player 반복재생 effect 로직&lt;/b&gt;도 분리 가능해졌습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;투표 관련 상태들의 변화에 의존하던 effect를 VoteInterfaceContext에 격리해 봅시다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;VoteInterfaceContext&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;비디오 컨텍스트로 인한 반복재생 이팩트 분리.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;1552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4ZJOw/btsqd4vYNNX/kIuHeOHT9kAAJ4GCP8Yda1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4ZJOw/btsqd4vYNNX/kIuHeOHT9kAAJ4GCP8Yda1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4ZJOw/btsqd4vYNNX/kIuHeOHT9kAAJ4GCP8Yda1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4ZJOw%2Fbtsqd4vYNNX%2FkIuHeOHT9kAAJ4GCP8Yda1%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;1882&quot; height=&quot;1552&quot; data-filename=&quot;비디오 컨텍스트로 인한 반복재생 이팩트 분리.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;1552&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-4. 유틸함수 분리 및 메세지 관련 로직 정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;마지막으로 Page컴포넌트에 존재하던 클립보드 복사 관련 함수를 유틸로 분리해주고&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;기획의 변경으로 인해 더이상 사용하지 않는 메세지 관련 함수를 삭제합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;코드는 따로&amp;nbsp; 담지 않겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 관심사 분리 끝 &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이제 관심사가 분리된 각 컴포넌트를 확인해 봅시다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;3-1. SongDetailPage&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;최종 페이지.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;1362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eVtQiB/btsp7qNTK6B/sHYnAtE9cOHd7twgrc0mVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eVtQiB/btsp7qNTK6B/sHYnAtE9cOHd7twgrc0mVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eVtQiB/btsp7qNTK6B/sHYnAtE9cOHd7twgrc0mVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeVtQiB%2Fbtsp7qNTK6B%2FsHYnAtE9cOHd7twgrc0mVk%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;1760&quot; height=&quot;1362&quot; data-filename=&quot;최종 페이지.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;1362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;관심사 분리를 통해 &lt;b&gt;DOM 구조를 파악하기 비교적 쉬워졌으며, &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Page 컴포넌트가 &lt;b&gt;어떤 역할을 하는지도 명확하게 알 수 있습니다.&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;초기 Page 컴포넌트와 비교하면&lt;b&gt; 책임이 상당히 줄어든 것을 확인할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;api 통신의 결과를 하위 컴포넌트로 전달하는 책임정도만 가지고 있네요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-2. VoteInterfaceContext&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;최종 보트 컨텍스트.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbDdOS/btsqj3DtJ6m/yS77DnzhVzEvjXfWb15Ju0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbDdOS/btsqj3DtJ6m/yS77DnzhVzEvjXfWb15Ju0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbDdOS/btsqj3DtJ6m/yS77DnzhVzEvjXfWb15Ju0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbDdOS%2Fbtsqj3DtJ6m%2FyS77DnzhVzEvjXfWb15Ju0%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;1884&quot; height=&quot;1552&quot; data-filename=&quot;최종 보트 컨텍스트.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;투표 관련 상태와 핸들러, 이에 영향을 받는 effect 로직까지 &lt;b&gt;Context에 잘 모여 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;투표 플로우와 관련된 에러가 발생한다고 가정했을 때, &lt;b&gt;더이상 Page 컴포넌트까지 가지 않아도 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Context 선에서 해결할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-2. VideoPlayerContext&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;최종 비디오 컨텍스트.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7YpCG/btsqocNEJgl/ntOGXNLUM6keTU9WTqbB0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7YpCG/btsqocNEJgl/ntOGXNLUM6keTU9WTqbB0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7YpCG/btsqocNEJgl/ntOGXNLUM6keTU9WTqbB0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7YpCG%2FbtsqocNEJgl%2FntOGXNLUM6keTU9WTqbB0K%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;1800&quot; height=&quot;1020&quot; data-filename=&quot;최종 비디오 컨텍스트.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;자세하게 설명하진 않았지만, &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;YouTube 컴포넌트에서 video&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Player 상태를&amp;nbsp;&lt;/span&gt;초기화한 후&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;VideoPlayerContext를 통해&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;b&gt;어디서든&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Player를&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 컨트롤 할 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체적으로는 여전히 개선할 부분이 많지만, 기존과 비교하면 정말 많이 나아졌네요!&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4.&amp;nbsp; 기능 개발 vs 리팩터링 (feat. &lt;b&gt;한정된 시간...⌛)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이번 스프린트에서 페이지 단위 &lt;/span&gt;리팩토링을 진행하면서, &lt;b&gt;기술적인 부분을 제외하고도 여러 가지 생각을 하게 됐습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-1. 기능 개발이 우선인가? 리팩터링이 우선인가? &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당연히 무엇 하나 놓치지 않는게 베스트이겠지만 현실적으로 쉽지않죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이건 정답이 없는 문제인것을 알지만 조금 오래 고민했던것 같아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작업을 진행하면서 &lt;b&gt;'당장 프로젝트에서 개발해야 하는 기능은 많은데, 리팩터링을 하고있는게 맞나?'&lt;/b&gt; 생각하기도 했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한편으로는&lt;b&gt; '주요 기능이 모여있는 컴포넌트인데... 이거 이대로 두면 안되는데...'&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;당장 서비스의 상황만 놓고 보면 &lt;b&gt;우선도가 높지 않았을 수도 있어요.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;하지만 머지않은 미래에 해당 코드를 수정해야 하는 개발자는&lt;b&gt; 제 노력만큼의 시간을 아낄 수 있겠죠.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-2. 의식적인 리팩터링의 중요성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;답이 없는 고민을 반복하다가 내린 결론은 &lt;b&gt;코드를 작성하면서, 의식적으로 코드 흐름을 정리해야 한다는 것입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작성한 코드 흐름이 내 머리속에서는 자연스럽다고 생각 하더라도,&amp;nbsp;잠시 되돌아 본다면 운좋게 어색한 부분을 찾을 수도 있겠죠.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;결국&amp;nbsp;&lt;/span&gt;언젠가는 눈덩이가 구르겠지만, 마당이라도 한번 더 쓸어놓으면 혹시 모르지 않을까요...?&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;대왕 눈덩이가 되는 것은 막을 수 있을지도... &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-3. 마무리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI7X0k/btsqaPFPKTk/aAmrQqKO7qAWLMksmBK3SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI7X0k/btsqaPFPKTk/aAmrQqKO7qAWLMksmBK3SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI7X0k/btsqaPFPKTk/aAmrQqKO7qAWLMksmBK3SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI7X0k%2FbtsqaPFPKTk%2FaAmrQqKO7qAWLMksmBK3SK%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;443&quot; height=&quot;267&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이건 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;메모장에다가 &lt;/span&gt;코드를 파악하면서 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;적어놓은&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;내용중 일부입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음에 해당 코드를 수정하는 팀원은 이와 같은 수고를 덜 수 있었으면 좋겠습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;이 모든 과정이 저에게도 큰 경험치가 되었을 거라고 믿습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;한정된 시간에서의 리팩토링이 하나의 기능 개발보다 의미 있었기를 바라면서&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ytSo2/btsqaONIHh7/kqykNsux2Ob4ZvJZaO9TBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ytSo2/btsqaONIHh7/kqykNsux2Ob4ZvJZaO9TBK/img.jpg&quot; data-alt=&quot;S-HOOK 최고!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ytSo2/btsqaONIHh7/kqykNsux2Ob4ZvJZaO9TBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FytSo2%2FbtsqaONIHh7%2FkqykNsux2Ob4ZvJZaO9TBK%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;S-HOOK 최고!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/React</category>
      <category>shook</category>
      <category>관심사분리</category>
      <category>리팩토링</category>
      <category>성장</category>
      <category>책임</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/117</guid>
      <comments>https://think0wise.tistory.com/117#entry117comment</comments>
      <pubDate>Mon, 7 Aug 2023 01:32:08 +0900</pubDate>
    </item>
    <item>
      <title>S-HOOK - 좋은 서비스를 위한 길 [Week 5 ~ 6]</title>
      <link>https://think0wise.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;눈 깜짝할 사이 시간이 흘러 3차 데모데이를 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 스프린트에서는 어떤 일이 있었는지 한번 돌아봅시다!&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 이전 데모데이 피드백 반영&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이번에도 역시 지난 데모데이 피드백을 반영했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-1. 플로우에 혼동이 생기는 여러 요소&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2차 데모 플로우에서는 사용자에게 &lt;b&gt;만족감&lt;/b&gt;을 주려던 목적으로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;등록 후 자신이 등록한 킬링파트의 순위에 따른 메세지를 보여주거나, 득표수를 보여주었는데요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'등록과 공유라는 핵심 가치외의 &lt;b&gt;부가적인 가치를 제공하기 위한 수단이 플로우에 혼동을 준다'&lt;/b&gt;는 피드백을 받았습니다.&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 '등록과 투표라는 용어의 혼동이 있다'는 의견도 있었어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwqeQ9/btsp7Vfb3cp/kfjlRm5mWRrLL9CgAgBmRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwqeQ9/btsp7Vfb3cp/kfjlRm5mWRrLL9CgAgBmRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwqeQ9/btsp7Vfb3cp/kfjlRm5mWRrLL9CgAgBmRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwqeQ9%2Fbtsp7Vfb3cp%2FkfjlRm5mWRrLL9CgAgBmRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;733&quot; height=&quot;423&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 만족감이라는 가치가 현 상태의 S-HOOK에서 고려되어야 하는 가치인지 &lt;a href=&quot;https://github.com/woowacourse-teams/2023-shook/discussions/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;깊이있게 생각해 보았습니다.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회의 끝에 핵심 가치 관련 기능이 모두 개발 된 이후에 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;만족감과 같은 부가 가치를 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;고려하기로 결정했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종적으로 위 사진처럼 모달에서 애매한 만족감을 주는 문구를 삭제하였고, 용어를 통일했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 스프린트 진행&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 전략 수정 및 자동화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 웹접근성 개선 및 개발&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS EC2 + Nginx 환경에 배포&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. 테스트 전략 수정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트 파트는 크게 유닛테스트와 단일 컴포넌트 테스트를 진행했었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매 스프린트가 진행되면서 기획과 디자인의 변경이 이루어 졌는데요!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 따라 컴포넌트 수정이 불가피했고, 자연스레&amp;nbsp;&lt;b&gt;테스트 케이스에 대한 수정 리소스가 증가했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;배보다 배꼽이 더 큰 상황이 발생한거죠.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkmGmV/btsp1fF3tn5/lAdzKAm863kUdHYEXGrK51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkmGmV/btsp1fF3tn5/lAdzKAm863kUdHYEXGrK51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkmGmV/btsp1fF3tn5/lAdzKAm863kUdHYEXGrK51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkmGmV%2Fbtsp1fF3tn5%2FlAdzKAm863kUdHYEXGrK51%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;756&quot; height=&quot;259&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이런 문제점들을 해결하기 위해 테스트 &lt;a href=&quot;https://github.com/woowacourse-teams/2023-shook/discussions/203&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;전략 회의를 진행&lt;/a&gt;했고, &lt;/span&gt;&lt;b&gt;단일 컴포넌트의 기능테스트를 작성하지 않기로 했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또, 이런 &lt;b&gt;단일 컴포넌트들이 여러개 조합되어 동작하는 기능&lt;/b&gt;에 대한 통합 테스트를 추후 고려해보기로 했습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. 테스트 자동화&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트를 통과하지 못했거나, 빌드가 실패하는 작업물을 merge하면 안되겠죠.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 과정들을 매번 수동으로 확인하는 것은 매우 귀찮은 일입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NmfUr/btsp9qTmh5z/rkT62kiiBmbgeMWxl27f4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NmfUr/btsp9qTmh5z/rkT62kiiBmbgeMWxl27f4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NmfUr/btsp9qTmh5z/rkT62kiiBmbgeMWxl27f4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNmfUr%2Fbtsp9qTmh5z%2FrkT62kiiBmbgeMWxl27f4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;732&quot; height=&quot;366&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; 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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 스프린트에서는&lt;b&gt; merge를 위한 코드 확인 과정을 자동화했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PR을 작성하면 github actions에 등록한 CI task가 돌아가면서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Lint &amp;rarr; 테스트 케이스 &amp;rarr; build 순으로 확인합니다. 이 중 하나라도 실패한다면 수정 후 재시도 하도록 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 코드 병합 과정을 보다 간편하고 안전하게 진행할 수 있게 되었습니다!&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-3. 웹접근성 고려&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다양한 사용자를 위해&amp;nbsp;&lt;b&gt;접근성도 개선했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제일 기본적인 접근성 관련 속성을 적용하고 시멘틱하지 못한 태그를 수정했어요. (현재 진행형입니다.__.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기에 저시력자를 위한&amp;nbsp;&lt;b&gt;명도 대비 기준을 준수하기 위해&lt;/b&gt;&amp;nbsp;프로젝트의 primary 컬러를 조정했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트가 다크모드 기반이라(검정 배경 흰 글씨) 명도 기준을 만족하기는 어렵지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dD5yws/btsp1jog0Gp/HLfiwkA6zyMqh0T7knEk7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dD5yws/btsp1jog0Gp/HLfiwkA6zyMqh0T7knEk7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dD5yws/btsp1jog0Gp/HLfiwkA6zyMqh0T7knEk7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdD5yws%2Fbtsp1jog0Gp%2FHLfiwkA6zyMqh0T7knEk7K%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;799&quot; height=&quot;287&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;접근성 관련 학습을 하면서&lt;b&gt; 접근성이 장애를 가진 사용자만을 위한 것은 아니라는 것을 알게 되었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;예시로 마우스 없이 키보드만 사용하는 유저는&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;focusable&lt;/span&gt;한 요소가 없는 서비스를 사용하지 못하고 떠나버린다는 거죠.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;여태까지 접근성 관련 개선을 미뤄왔던것을 반성하는 계기가 되었습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-4. 개발&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 스프린트는&amp;nbsp;&lt;span&gt;투표와 공유라는 핵심 가치가 제공되는 상태에서 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;더 다양한 노래를 제공하고, 킬링파트를 소비하도록 하는것이 중점이라고 생각했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서&lt;b&gt; '인기있는 노래를 빠르게 접하고 소비할 수 있도록 하자'&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;를 목표로 했어요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV56AU/btsp3l0cIkU/vHwRNrdGEkah2zHcVQQiXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV56AU/btsp3l0cIkU/vHwRNrdGEkah2zHcVQQiXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV56AU/btsp3l0cIkU/vHwRNrdGEkah2zHcVQQiXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV56AU%2Fbtsp3l0cIkU%2FvHwRNrdGEkah2zHcVQQiXK%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;710&quot; height=&quot;313&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이에 따라 위와 같은 기능을 도출하고 개발했습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-5. AWS EC2 + Nginx 환경에 배포&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프론트엔드 배포관련 설정&lt;/b&gt;을 팀 협업으로 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8nKwG/btsp6p2nA6V/whzaNm4No4OfEUmQUoZ5TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8nKwG/btsp6p2nA6V/whzaNm4No4OfEUmQUoZ5TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8nKwG/btsp6p2nA6V/whzaNm4No4OfEUmQUoZ5TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8nKwG%2Fbtsp6p2nA6V%2FwhzaNm4No4OfEUmQUoZ5TK%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;786&quot; height=&quot;417&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드 결과물(정적 파일)을 EC2 내부에 위치시키고 이를 Nginx가 서빙하도록 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EC2는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;무엇인지, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;배포 과정 중에 Nginx는 어떤 역할을 수행 하는지 이해할 수 있게 되었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 데모데이 및 피드백&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GSTaK/btsp92rmvdE/kms0TOKpsdpTxo3yxKzBq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GSTaK/btsp92rmvdE/kms0TOKpsdpTxo3yxKzBq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GSTaK/btsp92rmvdE/kms0TOKpsdpTxo3yxKzBq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGSTaK%2Fbtsp92rmvdE%2Fkms0TOKpsdpTxo3yxKzBq1%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;596&quot; height=&quot;647&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 모든 내용을 담아 &lt;b&gt;3차 데모데이를 진행했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서비스 플로우 관련 피드백이 주를 이뤘는데요! 정리하면 다음과 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 특정 기능을 귀찮다고 느낄 사용자들에게 확실하게 소비시키려면 어떻게 해야할지 고민해보기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 이미 갖추어진 컨텐츠를 더 많이 소비하게끔 개선하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- &lt;b&gt;서비스 이용이 더 편하게, 더 자연스럽게&amp;nbsp; 개선하기&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;이번에 받은 피드백을 통해 다음 4차 데모데이에는 &lt;b&gt;사용자 경험을 위주로 개선해야겠습니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. Week 5 ~ 6&amp;nbsp; 돌아보기 &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;웹 표준, AWS, Nginx, CI, 개발까지..!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;머리속으로 들어오는 정보가 많아 꼭꼭 눌러 담느라 쉽지 않았던 3번째 스프린트였습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한편으로는 그만큼 성장한거라고 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또, 한정된 시간안에 서비스를 개발하는데 있어서 &lt;b&gt;기존의 코드를 개선하는 일&lt;/b&gt;과 &lt;b&gt;새로운 기능을 개발하는 것.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;둘을 어느정도 비율로 가져가야 할지 깊게 생각해보기도 했네요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(이 부분에 대해서는 느낀점이 많아 &lt;a href=&quot;https://think0wise.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;리팩터링 과정과 더불어 별도의 포스팅으로 다뤄보겠습니다.&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ka8uz/btsp9qeQBR4/By2Izs8fSvbIRAKBXzPUVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ka8uz/btsp9qeQBR4/By2Izs8fSvbIRAKBXzPUVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ka8uz/btsp9qeQBR4/By2Izs8fSvbIRAKBXzPUVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKa8uz%2Fbtsp9qeQBR4%2FBy2Izs8fSvbIRAKBXzPUVk%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;386&quot; height=&quot;290&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Week 5~6 회고는 여기까지 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4차 데모 데이 내용으로 다시 만나요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>AWS</category>
      <category>CI</category>
      <category>EC2</category>
      <category>nginx</category>
      <category>shook</category>
      <category>데모데이</category>
      <category>배포</category>
      <category>우테코</category>
      <category>테스트 자동화</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/116</guid>
      <comments>https://think0wise.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 5 Aug 2023 22:15:39 +0900</pubDate>
    </item>
    <item>
      <title>TS + React + webpack 기반의 개발 환경 구성(feat. loader, HMR)</title>
      <link>https://think0wise.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지난 webpack 핵심 컨셉 포스트에 이어서 프로젝트에 사용할 webpack 설정 파일을 작성한 과정에 대해 담아 보려 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;webpack 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;babel-loader 적용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ts-loader 적용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;react 설정&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HMR 적용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 키워드 외 eslint, prettier, jest 등 기타 설정에 대한 내용은 추가로 포스팅하겠습니다.&amp;nbsp;&lt;/span&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: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;React + TS 환경을 구성하는 각 과정을 패키지별로 나누어 설명하기에는 패키지 간 의존이 다소 깊습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;&lt;b&gt;개연성이 다소 떨어질 수 있어요.&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;꼬리의 꼬리를 무는 구조이다 보니&amp;nbsp;&lt;b&gt;전체 설정이 끝나기 전까지 설정에 대한 피드백을 받기 어렵습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;차근히 따라 해 보는 용도로 봐주시면 감사하겠습니다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;(모든 설정이 끝나고 로컬에서 띄워지는 화면을 보면 희열이 있답니다 )&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. webpack 설정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 webpack 관련 패키지를 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIDHOR/btsnEWPhOq5/D86BDmcikpCBRvJRkE9VYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIDHOR/btsnEWPhOq5/D86BDmcikpCBRvJRkE9VYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIDHOR/btsnEWPhOq5/D86BDmcikpCBRvJRkE9VYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIDHOR%2FbtsnEWPhOq5%2FD86BDmcikpCBRvJRkE9VYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;265&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;564&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;webpack-cli : 웹팩의 커멘드라인 인터페이스를 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;webpack-dev-server : 웹팩의 개발 서버 관련 기능을 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;html-webpack-plugin : html 파일 생성 및 번들 파일 자동주입 플러그인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-1. 설정 파일 작성 방식&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설정 파일을 커스텀할 때 &lt;b&gt;development 환경과 production환경을 구분하여 처리하는 방법&lt;/b&gt;은 크게 2가지가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하나의 설정 파일 내부에서 환경에 따라 분기하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;환경에 따라 설정 파일을 나누어 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인적으로는 어떤 속성을 어떻게 사용했는지 &lt;b&gt;명확하게 구분하여 보고 싶었고&lt;/b&gt;, 이를 위해 &lt;b&gt;후자를 선택했습니다.&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-2. webpack.common.js&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 환경에서 적용될 공통 속성을 정의하는 파일입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;common.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;982&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxxMZJ/btsnOe8qSlp/5rgjEIQlA4zKU35lY03Vu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxxMZJ/btsnOe8qSlp/5rgjEIQlA4zKU35lY03Vu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxxMZJ/btsnOe8qSlp/5rgjEIQlA4zKU35lY03Vu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxxMZJ%2FbtsnOe8qSlp%2F5rgjEIQlA4zKU35lY03Vu1%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;578&quot; height=&quot;498&quot; data-filename=&quot;common.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보편적인 &lt;b&gt;react 렌더링 시작점 파일(root) 경로를 &lt;/b&gt;entry 속성으로 지정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: left;&quot;&gt;또한 root div가 포함된 html 파일을 번들파일을 주입될 템플릿으로 지정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;resolve.extensions:&lt;/b&gt; 웹팩에게 모듈의 확장자를 해석하는 방식을 알려주어 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;import시 &lt;/span&gt;배열에 나열한 확장자들에 대해 &lt;b&gt;확장자 생략이 가능하게 하는 속성&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-3. webpack.dev.js&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;development 환경에서 적용될 속성을 정의하는 파일입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;&lt;b&gt;merge 메서드&lt;/b&gt;를 통해 공통 설정파일과 dev 환경 설정을&lt;b&gt; 병합할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dev.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNsaE/btsnLaSOezO/iW6xxCqso9k7jzzcsWIyeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNsaE/btsnLaSOezO/iW6xxCqso9k7jzzcsWIyeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNsaE/btsnLaSOezO/iW6xxCqso9k7jzzcsWIyeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNsaE%2FbtsnLaSOezO%2FiW6xxCqso9k7jzzcsWIyeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;830&quot; data-filename=&quot;dev.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;830&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;devServer.historyApiFallback:&lt;/b&gt; URL 직접 접근 혹은 새로고침시 404 page 대신 index.html로 이동시키는 기능&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;devServer.open:&lt;/b&gt; 서버 시작후 바로 브라우저가 열리도록 하는 기능&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-4. webpack.prod.js&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;production 환경에서 적용될 속성을 정의하는 파일입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;prod.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bExnr7/btsnFL0ODlS/LxjvQMyiPLUxmZhoVLwjt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bExnr7/btsnFL0ODlS/LxjvQMyiPLUxmZhoVLwjt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bExnr7/btsnFL0ODlS/LxjvQMyiPLUxmZhoVLwjt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbExnr7%2FbtsnFL0ODlS%2FLxjvQMyiPLUxmZhoVLwjt1%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;542&quot; height=&quot;437&quot; data-filename=&quot;prod.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;868&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;output.filename의 contenthash:&lt;/b&gt; 파일의 내용 변경에 따라 해시값을 변경하는 옵션&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;b&gt;브라우저의 캐싱으로 인해&lt;/b&gt; 사용자가 새로운 배포 &lt;/span&gt;버전을 사용하지 못하는 상황을 방지하기 위해 사용&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;output.clean:&lt;/b&gt; 번들링 시 기존 번들링 결과물을 삭제하는 옵션. 예상치 못한 충돌을 방지할 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적인 설정은 끝났습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 구조를 바탕으로 여러 &lt;b&gt;loader&lt;/b&gt;와 &lt;b&gt;plugin&lt;/b&gt;을 적용하며 설정 파일이 더 커지게 됩니다...!&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. babel-loader 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;다음으로 babel 관련 패키지를 설치하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;babel.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2P8l/btsnGOJDtx5/ZsTWD5hA49qM38dGQdKZ40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2P8l/btsnGOJDtx5/ZsTWD5hA49qM38dGQdKZ40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2P8l/btsnGOJDtx5/ZsTWD5hA49qM38dGQdKZ40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2P8l%2FbtsnGOJDtx5%2FZsTWD5hA49qM38dGQdKZ40%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;627&quot; height=&quot;280&quot; data-filename=&quot;babel.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;602&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;@babel/core:&lt;/b&gt; 바벨의 트랜스 파일링 수행을 위한 기능을 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;@babel/preset-env&lt;/span&gt;:&amp;nbsp;&lt;/b&gt; 트랜스 파일링할 기능을 지정하는 플러그인을 번들로 묶어 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;@babel/preset-react&lt;/span&gt;:&amp;nbsp;&lt;/b&gt;jsx를 js 코드로 변환하기 위한 기능을 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;core-js: &lt;/b&gt;바벨의 트랜스 파일 과정에서 &lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: left;&quot;&gt;폴리필(polyfill)을 제공&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;babel-loader:&amp;nbsp;&lt;/b&gt;webpack 번들 과정에서 바벨의 트랜스 파일링을 수행하도록 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. bable&lt;b&gt;.config.js&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;프로젝트 전역으로&lt;/b&gt; 적용할 바벨 속성을 정의하는 파일입니다.&lt;/span&gt;(root 경로에 위치)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;babelconfig.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqYrWT/btsnOsFSQf7/OjPSktmo9qe1QogNwXgZDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqYrWT/btsnOsFSQf7/OjPSktmo9qe1QogNwXgZDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqYrWT/btsnOsFSQf7/OjPSktmo9qe1QogNwXgZDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqYrWT%2FbtsnOsFSQf7%2FOjPSktmo9qe1QogNwXgZDk%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;457&quot; height=&quot;794&quot; data-filename=&quot;babelconfig.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;presets - preset-env&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;useBuiltIns:&lt;/b&gt; 'usage', 'entry' 옵션 중 선택&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;usage: &lt;/b&gt;실제로 사용한 코드의 폴리필만 삽입&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;entry: &lt;/b&gt;전체 폴리필 삽입&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;corejs:&lt;/b&gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;polifill을 제공하는 주체인 corejs의 버전 명시&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;presets - preset-react:&amp;nbsp;&lt;/b&gt;react에서 필요한&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*프로젝트에서는 브라우저 지원범위를 포함한 기타 옵션들을 아직 확정하지 않았습니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. babel&lt;b&gt;-loader 적용&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;webpack.common.js 파일에 babel-loader 관련 설정을 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;babel-loader.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS5HqW/btsnLcpKLzY/dUIWKjuZULlvaQJ6IZsNl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS5HqW/btsnLcpKLzY/dUIWKjuZULlvaQJ6IZsNl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS5HqW/btsnLcpKLzY/dUIWKjuZULlvaQJ6IZsNl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS5HqW%2FbtsnLcpKLzY%2FdUIWKjuZULlvaQJ6IZsNl0%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;586&quot; height=&quot;756&quot; data-filename=&quot;babel-loader.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.ts, .tsx 확장자를 가진 파일에 대해서만 babel-loader를 적용하도록 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;node_modules 는 babel의 트랜스 파일 대상에서 제외했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*프로젝트에서는 ts-loader를 사용해 ts -&amp;gt; js 트랜스파일 하기로 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 .ts, .tsx를 대상으로 적어두고 넘어갑니다. &lt;span style=&quot;text-align: start;&quot;&gt;(아래 ts-loader 문단에서 나옵니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. ts-loader 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;다음으로 ts 관련 패키지를 설치하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ts depd.png&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rLa5A/btsoqdPoyZZ/S7yq43JQex4R7LxbngWn51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rLa5A/btsoqdPoyZZ/S7yq43JQex4R7LxbngWn51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rLa5A/btsoqdPoyZZ/S7yq43JQex4R7LxbngWn51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrLa5A%2FbtsoqdPoyZZ%2FS7yq43JQex4R7LxbngWn51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;246&quot; data-filename=&quot;ts depd.png&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;490&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;ts-loader: &lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;webpack 번들 과정에서 ts -&amp;gt; js 트랜스 파일을 수행하도록 함&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-1. tsconfig&lt;b&gt;.json&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;프로젝트 전역으로&lt;/b&gt;&amp;nbsp;적용할 &lt;b&gt;tsc 설정&lt;/b&gt;을 정의하는 파일입니다.&lt;/span&gt;(root 경로에 위치)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tsconfig.png&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7ytQX/btsopvi4t6f/uy9cXWpX1N081v62kdcnWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7ytQX/btsopvi4t6f/uy9cXWpX1N081v62kdcnWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7ytQX/btsopvi4t6f/uy9cXWpX1N081v62kdcnWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7ytQX%2Fbtsopvi4t6f%2Fuy9cXWpX1N081v62kdcnWk%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;582&quot; height=&quot;1022&quot; data-filename=&quot;tsconfig.png&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;1022&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;compilerOptions&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;target:&amp;nbsp;어떤 버전의 js 파일로&lt;/b&gt; 트랜스 파일링 할것인지 정하는 옵션 (보통 es6를 많이 사용하고 기본값이다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;lib: &lt;/b&gt;프로젝트에서 사용할 특정 문법에 대한 &lt;b&gt;type 파일을 제공하는 옵션 &lt;/b&gt;(target 옵션에 따라 기본값이 지정된다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;jsx:&lt;/b&gt; &lt;b&gt;.tsx 파일의 트랜스 파일링 방식을 지정&lt;/b&gt;하는 옵션 (_jsx 함수의 호출로 반환하도록 react-jsx 옵션을 사용)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;module:&amp;nbsp;&lt;/b&gt;트랜스 파일된&lt;b&gt; 결과물이 사용할&lt;/b&gt; &lt;b&gt;모듈방식을 지정&lt;/b&gt;하는 옵션(target 옵션에 따라 기본값이 지정된다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;moudleResolution: 트랜스 파일링시&lt;/b&gt; 모듈의 &lt;b&gt;해석방식&lt;/b&gt;을 지정하는 옵션&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;resolveJsonModule:&lt;/b&gt; &lt;b&gt;.json 파일&lt;/b&gt;을 모듈로 해석할 수 있게 하는 옵션(.json 파일의 import가 가능해진다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;allowJs: &lt;/b&gt;.js 파일을 허용하는 옵션&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;isolatedModules&lt;/b&gt;: 프로젝트 내 모듈 생성을 강제하는 옵션(단일 파일 기반 트랜스 파일러에서 발생할 수 있는 문제 해결)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;esModuleInterop: &lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;CommonJS, AMD, UMD 같은 모듈 &lt;/span&gt;방식을&lt;/span&gt; es6 모듈 인것 처럼 사용하게 해주는 옵션&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;forceConsistentCasingInFileNames:&amp;nbsp;&lt;/b&gt;파일의 대소문자를 구문하게 해주는 옵션&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;strict:&lt;/b&gt; &lt;span style=&quot;background-color: #ffffff; color: #373e48; text-align: left;&quot;&gt;타입스크립트의 각종 타입 체킹 동작을 전부 활성화하는 옵션&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;noFallthroughCasesInSwitch: &lt;/b&gt;switch 문을 올바르게 사용하도록 강제하는 옵션&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;skipLibCheck: &lt;/b&gt;&lt;/b&gt;모든 선언 파일(.d.ts)의 타입 체킹을 스킵하는 설정이다. (라이브러리에서 제공하는 .d.ts 파일은 이미 타입 체킹이 된 파일일 것이라는 가정)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-2.&amp;nbsp; ts&lt;b&gt;-loader 적용&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;webpack.common.js 파일에 ts-loader 관련 설정을 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ts-loader.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3gHes/btsoKZKRrR9/FGNLck2dBahwJH3ccKEUak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3gHes/btsoKZKRrR9/FGNLck2dBahwJH3ccKEUak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3gHes/btsoKZKRrR9/FGNLck2dBahwJH3ccKEUak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3gHes%2FbtsoKZKRrR9%2FFGNLck2dBahwJH3ccKEUak%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;552&quot; height=&quot;344&quot; data-filename=&quot;ts-loader.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. React 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;react 관련 패키지를 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;react.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo7JJW/btsoRjoeMna/VsB2fM6k6utKcDtREOAX60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo7JJW/btsoRjoeMna/VsB2fM6k6utKcDtREOAX60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo7JJW/btsoRjoeMna/VsB2fM6k6utKcDtREOAX60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo7JJW%2FbtsoRjoeMna%2FVsB2fM6k6utKcDtREOAX60%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;509&quot; height=&quot;264&quot; data-filename=&quot;react.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-1. react 프로젝트 기본 디렉터리 및 파일 추가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;root를 생성할 &lt;b&gt;index.tsx,&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;root div를 포함하는 &lt;b&gt;index.html 파일&lt;/b&gt;을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;5. HMR 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;HMR 관련 패키지를 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HMR.png&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvFZPc/btsoKYFbnrI/8f8S0H43TBLtZraaQEjsk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvFZPc/btsoKYFbnrI/8f8S0H43TBLtZraaQEjsk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvFZPc/btsoKYFbnrI/8f8S0H43TBLtZraaQEjsk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvFZPc%2FbtsoKYFbnrI%2F8f8S0H43TBLtZraaQEjsk1%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;577&quot; height=&quot;224&quot; data-filename=&quot;HMR.png&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;5-1. react-refresh/babel 적용&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HMR babel.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba0SyF/btsoYVHGFAI/1qjlw8Dv19ktClgiQu4wWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba0SyF/btsoYVHGFAI/1qjlw8Dv19ktClgiQu4wWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba0SyF/btsoYVHGFAI/1qjlw8Dv19ktClgiQu4wWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba0SyF%2FbtsoYVHGFAI%2F1qjlw8Dv19ktClgiQu4wWk%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;573&quot; height=&quot;270&quot; data-filename=&quot;HMR babel.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;plugins 속성에 추가해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;5-1. &lt;b&gt;react-refresh-webpack-plugin &lt;/b&gt;적용&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HMR webpack.png&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VV5m8/btsoXyMYW1W/2ALA4rgo6qLFedtMkFVup1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VV5m8/btsoXyMYW1W/2ALA4rgo6qLFedtMkFVup1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VV5m8/btsoXyMYW1W/2ALA4rgo6qLFedtMkFVup1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVV5m8%2FbtsoXyMYW1W%2F2ALA4rgo6qLFedtMkFVup1%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;570&quot; height=&quot;439&quot; data-filename=&quot;HMR webpack.png&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;plugins 속성에 추가해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;6. 최종 확인!!!&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 지금까지의 설정이 잘 동작하는지 확인해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HMR성공!.gif&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9sxde/btsoYO25uP9/N7UIKtnOfrhwaIsOwV7qv1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9sxde/btsoYO25uP9/N7UIKtnOfrhwaIsOwV7qv1/img.gif&quot; data-alt=&quot;HMR 동작까지 확인!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9sxde/btsoYO25uP9/N7UIKtnOfrhwaIsOwV7qv1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/9sxde/btsoYO25uP9/N7UIKtnOfrhwaIsOwV7qv1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;368&quot; height=&quot;518&quot; data-filename=&quot;HMR성공!.gif&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HMR 동작까지 확인!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 설정들이 잘 적용되어 번들링이 성공했음을 알 수 있고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 서버 실행 + HMR도 잘 동작하는 것을 확인할 수 있습니다 &lt;/span&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지금까지 TS + React + webpack 기반의 개발환경을 직접 구성해봤습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 설정만으로도 개발을 시작할 수 있지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일관된 코드 스타일을 유지하기 위한 &lt;b&gt;eslint, prettier와 같은 설정이 필요할 수도 있습니다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;eslint, prettier, jest 등 기타 설정에 대한 추가 포스팅으로 다시 돌아오겠습니다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rNIIc/btsoTpQqqFK/wpHXQzpB8jkj5pXDk9hfz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rNIIc/btsoTpQqqFK/wpHXQzpB8jkj5pXDk9hfz0/img.jpg&quot; data-alt=&quot;기본이 중요하다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rNIIc/btsoTpQqqFK/wpHXQzpB8jkj5pXDk9hfz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrNIIc%2FbtsoTpQqqFK%2FwpHXQzpB8jkj5pXDk9hfz0%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본이 중요하다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발 환경</category>
      <category>Babel</category>
      <category>hmr</category>
      <category>loader</category>
      <category>react</category>
      <category>ts</category>
      <category>webpack</category>
      <category>개발환경구성</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/115</guid>
      <comments>https://think0wise.tistory.com/115#entry115comment</comments>
      <pubDate>Tue, 25 Jul 2023 22:30:50 +0900</pubDate>
    </item>
    <item>
      <title>S-HOOK - 기초가 중요하다 [Week 3 ~ 4]</title>
      <link>https://think0wise.tistory.com/114</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어느새 2주라는 시간이 흘러 2번째 데모데이를 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;git branch 전략 및 &lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;페르소나 변경 &lt;/b&gt;이에 따른 &lt;b&gt;핵심 가치 기능의 변경까지&lt;/b&gt; 정말 많은 일이 있었어요!&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기초의 중요성을 느낀 스프린트! &lt;/b&gt;그 내용을 차근히 정리해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. git branch 전략 변경&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;지난 &lt;a href=&quot;https://think0wise.tistory.com/111&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1차 데모데이 포스팅에서&lt;/a&gt; git flow의 &lt;b&gt;release 브랜치를 제외 한&amp;nbsp;&lt;/b&gt;브랜치 전략을 사용하기로 했었는데요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대한 피드백을 받았어요~!&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;말씀하신대로 배포한 상황이 없을 텐데, 조금 더 간소한 브랜치 전략을 가져가는 것은 어떨지?&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-1. github flow로 변경&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTfcrV/btsoyYEIowv/8KEzucZTUq1TCKqpQ8tXPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTfcrV/btsoyYEIowv/8KEzucZTUq1TCKqpQ8tXPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTfcrV/btsoyYEIowv/8KEzucZTUq1TCKqpQ8tXPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTfcrV%2FbtsoyYEIowv%2F8KEzucZTUq1TCKqpQ8tXPK%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;708&quot; height=&quot;334&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대해 팀원들과 회의를 진행하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기에 정한 전략이 틀린건 아니지만, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기 배포 버전이 없는 현 상황에서 브랜치 관리 리소스는 빠른 개발을 방해하는 요소라고 판단했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;피드백을 적극 수용해서 배포를 시작하고 규모가 커지기 전까지 사용할 전략을 찾게 되었고, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;github flow&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;를 사용하기로 결정했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;모든 기능 단위 브랜치를 main 브랜치에서 파생시키고 merge하게 되는 간단한 흐름입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;현 상황처럼 작은 규모의 프로젝트에서 적당하다고 생각했어요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;추후 규모가 커지면 변경을 고려하는 것으로 마무리 되었습니다!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 페르소나 변경&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;페르소나에 대한 피드백도 받았었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기능에 맞춘 페르소나가 아닌지?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존 페르소나는 기획을 통해 이미 기능을 도출한 뒤, 기능에 맞춰 페르소나를 작성했기에 다소 어색했어요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해 도출한 핵심 기능인 &lt;b&gt;킬링파트 등록과 조회 &lt;/b&gt;역시 프로젝트의 가치를 나타내기 어려웠죠.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. 새로운 페르소나&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 피드백을 적극 수용하여 페르소나 재정의 회의를 진행했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기획에 맞춰진 페르소나 탈피&lt;/b&gt;와 &lt;b&gt;핵심 가치를 좁히는 것&lt;/b&gt;을 중점으로 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/En4wZ/btsoysGaUxV/3K4MHMaG8CTdI0oHZMA3r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/En4wZ/btsoysGaUxV/3K4MHMaG8CTdI0oHZMA3r0/img.png&quot; data-alt=&quot;일반적인 사람들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/En4wZ/btsoysGaUxV/3K4MHMaG8CTdI0oHZMA3r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEn4wZ%2FbtsoysGaUxV%2F3K4MHMaG8CTdI0oHZMA3r0%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;530&quot; height=&quot;307&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반적인 사람들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnKJtE/btsoxdQxbsg/xAb27uP1WtQaYUMGKDOBk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnKJtE/btsoxdQxbsg/xAb27uP1WtQaYUMGKDOBk1/img.png&quot; data-alt=&quot;핵심기능 재정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnKJtE/btsoxdQxbsg/xAb27uP1WtQaYUMGKDOBk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnKJtE%2FbtsoxdQxbsg%2FxAb27uP1WtQaYUMGKDOBk1%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;274&quot; height=&quot;316&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;핵심기능 재정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;조금 더 일반적인 페르소나(노래를 공유하고 싶은 사람)를 지정했고,&amp;nbsp;&lt;/span&gt;이를 통해 &lt;b&gt;공유가 핵심이라는 결론을 도출할 수 있었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(S-hook의 s가 share 였다는 사실을 다시 한번 상기했죠 )&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;등록과 공유.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;목표가 기존보다 더욱더 명확해져, 빠르게&amp;nbsp;&lt;/span&gt;달려나갈 수 있는 발판이 되었어요~ &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 개발 시작!&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;그리고 드디어! 개발을 시작했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-1. 와이어 프레임 및 디자인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;피그마를 사용해 각자 &lt;b&gt;와이어 프레임&lt;/b&gt;을 만들고 회의를 통해 &lt;b&gt;디자인&lt;/b&gt;을 취합했어요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;핵심 기능으로 정한 킬링파트 등록, 공유에 대한 페이지를 우선으로 고려했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TIHJg/btsoyICkAii/t8TxxPkfdouc0fkkcY8NhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TIHJg/btsoyICkAii/t8TxxPkfdouc0fkkcY8NhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TIHJg/btsoyICkAii/t8TxxPkfdouc0fkkcY8NhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTIHJg%2FbtsoyICkAii%2Ft8TxxPkfdouc0fkkcY8NhK%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;495&quot; height=&quot;252&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BFBHK/btsozTQITZS/cyDztu2Ujxw9LOPLCOnmpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BFBHK/btsozTQITZS/cyDztu2Ujxw9LOPLCOnmpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BFBHK/btsozTQITZS/cyDztu2Ujxw9LOPLCOnmpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBFBHK%2FbtsozTQITZS%2FcyDztu2Ujxw9LOPLCOnmpk%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;530&quot; height=&quot;283&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m8idB/btsoKYwNlFv/p8Nt32FSkkaByf904KAdnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m8idB/btsoKYwNlFv/p8Nt32FSkkaByf904KAdnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m8idB/btsoKYwNlFv/p8Nt32FSkkaByf904KAdnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm8idB%2FbtsoKYwNlFv%2Fp8Nt32FSkkaByf904KAdnk%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;449&quot; height=&quot;286&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-2. 이슈 단위 기능 개발&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;페이지 시안을 확정한 뒤 본격적으로 코드를 작성했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHAPv1/btsoxEAsdYx/cQfQF7oQi6HU1jHacohHCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHAPv1/btsoxEAsdYx/cQfQF7oQi6HU1jHacohHCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHAPv1/btsoxEAsdYx/cQfQF7oQi6HU1jHacohHCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHAPv1%2FbtsoxEAsdYx%2FcQfQF7oQi6HU1jHacohHCK%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;467&quot; height=&quot;280&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기능을 이슈 단위로 작게 나누고 이슈단위로 개발하는 구조로 진행했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1 issue === 1 PR 작성으로 작업내용이 명확하게 나뉘어 있어서 편했답니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-3. PR 코드 리뷰&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트엔드 팀원의 코드리뷰도 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DCNkV/btsozlfNRXB/BGDfXAkZRregYzka8oyDl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DCNkV/btsozlfNRXB/BGDfXAkZRregYzka8oyDl1/img.png&quot; data-alt=&quot;주고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DCNkV/btsozlfNRXB/BGDfXAkZRregYzka8oyDl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDCNkV%2FbtsozlfNRXB%2FBGDfXAkZRregYzka8oyDl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;249&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iq0Mx/btsoxehAC6N/b1chQxKaVbHTiJV51Mk4LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iq0Mx/btsoxehAC6N/b1chQxKaVbHTiJV51Mk4LK/img.png&quot; data-alt=&quot;받고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iq0Mx/btsoxehAC6N/b1chQxKaVbHTiJV51Mk4LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIq0Mx%2FbtsoxehAC6N%2Fb1chQxKaVbHTiJV51Mk4LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;764&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;764&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역시나 코드리뷰를 통해 팀원에게 배울게 정말 많았습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 코드에 대해 합당한 이유를 들어 설명하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 더 나은 코드를 위한 조언을 받고 수용하면서 &lt;b&gt;많이 발전할 수 있다고 생각해요!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;때문에 코드 리뷰는 정말 중요하다고 생각합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 데모데이 및 피드백&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5PRI2/btsoxb6hH90/onwIYjVPkAJFJsppkt4OY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5PRI2/btsoxb6hH90/onwIYjVPkAJFJsppkt4OY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5PRI2/btsoxb6hH90/onwIYjVPkAJFJsppkt4OY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5PRI2%2Fbtsoxb6hH90%2FonwIYjVPkAJFJsppkt4OY0%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;514&quot; height=&quot;290&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 변경사항과 데모 시연을 담아 &lt;b&gt;2차 데모데이를 진행했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주요 피드백 사항을 정리하면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- &lt;b&gt;핵심 기능 목표&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;와 데모&lt;/b&gt;가 일치했으면 좋겠다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 다음에 구현할 기능이라고 넣기보다는 완성시켜서 다음 데모에 포함하면 좋을 것 같다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 사용자가 자신이 뭘 하는지 &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;설명없이&amp;nbsp;&lt;/span&gt;이해할 수 있으려면&lt;/b&gt; &lt;b&gt;플로우가 조금 더 확실한게 좋겠다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체적으로 재정의한 핵심 가치와 기능을 잘 구현하였고 목표를 달성했기에 뿌듯했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt; 이번에 받은 피드백을 통해 다음 3차 데모데이에는 &lt;b&gt;설정한 목표에 맞는 정확한 플로우를 제공하는 것&lt;/b&gt;을 기준으로 잡아야겠네요!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. Week 3 ~ 4&amp;nbsp; 돌아보기&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;페르소나 및 기획 재정의로 인한 많은 회의, 본격적인 개발의 시작으로 여전히 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;바쁜 두번째 스프린트였습니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀문화를 비롯한 여러 규칙들 아래 &lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;개발을 시작하면서 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 지켜지는 것과 현실적으로 지키기 어려운 것들을 확인할 수 있었어요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빠르게 업데이트 해야할 부분이네요 ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 다시 한번 기초가 중요하다는 것을 느낄 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;페르소나 재정의 없이 이전 목표 그대로 진행했다면, 팀원 모두가 한 곳을 바라보며 나아가기 어렵지 않았을까 싶습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음엔 또 어떤 시련을 이겨내고, 어떤 목표를 달성할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 기대됩니다! &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&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;480&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tydJ0/btsoxHxgWTe/RAJZsk5SUU2nuOaEp2k0GK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tydJ0/btsoxHxgWTe/RAJZsk5SUU2nuOaEp2k0GK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tydJ0/btsoxHxgWTe/RAJZsk5SUU2nuOaEp2k0GK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtydJ0%2FbtsoxHxgWTe%2FRAJZsk5SUU2nuOaEp2k0GK%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;480&quot; height=&quot;270&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Week 3~4 회고는 여기까지 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 스프린트로 다시 만나요!&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>Git</category>
      <category>git 전략</category>
      <category>shook</category>
      <category>데모데이</category>
      <category>와이어프레임</category>
      <category>우테코</category>
      <category>코드리뷰</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/114</guid>
      <comments>https://think0wise.tistory.com/114#entry114comment</comments>
      <pubDate>Mon, 24 Jul 2023 00:28:57 +0900</pubDate>
    </item>
    <item>
      <title>path.resolve, __dirname</title>
      <link>https://think0wise.tistory.com/112</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Webpack 공식 문서를 읽다보면 &lt;b&gt;경로 관련 속성에서 자주 등장하는 키워드&lt;/b&gt;가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;path.resolve&lt;/b&gt;&lt;/span&gt; 와 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;__dirname&lt;/b&gt;&lt;/span&gt; 인데요. 대체 무엇인지 한번 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. path&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 &lt;b&gt;path를 먼저 알아볼게요.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;path 모듈은&lt;/b&gt; node.js 내장 API 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;운영체제별로&amp;nbsp;&lt;/span&gt;&lt;b&gt;경로 구분자가 달라&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;발생하는 문제를 해결하기 위해 탄생했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;path 모듈.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQeyYI/btsnwqH7dZs/ZoWIKZE1L5TvBdXOuN9CT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQeyYI/btsnwqH7dZs/ZoWIKZE1L5TvBdXOuN9CT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQeyYI/btsnwqH7dZs/ZoWIKZE1L5TvBdXOuN9CT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQeyYI%2FbtsnwqH7dZs%2FZoWIKZE1L5TvBdXOuN9CT1%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;379&quot; height=&quot;219&quot; data-filename=&quot;path 모듈.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영체제는 크게 &lt;b&gt;Window 진영,&lt;/b&gt;&amp;nbsp;&lt;b&gt;POSIX 진영(macOS, Linux)&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Window: ' \ ' &lt;/b&gt;(역슬레시)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;POSIX:&amp;nbsp; &amp;nbsp;' / '&lt;/b&gt; (슬레시)&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각각 위와 같은 &lt;b&gt;구분자로&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;path 모듈의 메서드로 위와 같은 구분자 문제를 쉽게 해결할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-1. path.resolve&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;path.resolve([...paths])&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;경로 인자들을 오른쪽에서 부터 왼쪽으로 읽고, 조합하여 &lt;b&gt;root 경로를 고려한 절대경로로 반환합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;path-무시.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ts4Cn/btsnz7BNNHt/1Xb8DsRm8RZ73T1a9rzirk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ts4Cn/btsnz7BNNHt/1Xb8DsRm8RZ73T1a9rzirk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ts4Cn/btsnz7BNNHt/1Xb8DsRm8RZ73T1a9rzirk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fts4Cn%2Fbtsnz7BNNHt%2F1Xb8DsRm8RZ73T1a9rzirk%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;660&quot; height=&quot;258&quot; data-filename=&quot;path-무시.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;오른쪽부터 읽다가&amp;nbsp;&lt;/span&gt;&lt;b&gt;'/디렉터리'&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;같은 절대 경로&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;형식을 발견하면 해당 경로를 바로 반환합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본 path.resolve.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CqGfo/btsnvwJPbCs/EK3KlK1EVUr0V3Q9doHtfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CqGfo/btsnvwJPbCs/EK3KlK1EVUr0V3Q9doHtfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CqGfo/btsnvwJPbCs/EK3KlK1EVUr0V3Q9doHtfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCqGfo%2FbtsnvwJPbCs%2FEK3KlK1EVUr0V3Q9doHtfk%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;663&quot; height=&quot;222&quot; data-filename=&quot;기본 path.resolve.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약 인자를 전달하지 않으면&amp;nbsp;&lt;/span&gt;&lt;b&gt;작업 중인 디렉터리(working directory)를 절대경로로 반환합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. __dirname&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;파일의 현재 경로를 나타내는 전역 변수입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 역시 &lt;b&gt;운영체제별로 구분자가 다르게 표시됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dirname.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dew2mz/btsnwq3oCNk/SYmR9nU3P3UVQPW2ZX9b50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dew2mz/btsnwq3oCNk/SYmR9nU3P3UVQPW2ZX9b50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dew2mz/btsnwq3oCNk/SYmR9nU3P3UVQPW2ZX9b50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdew2mz%2Fbtsnwq3oCNk%2FSYmR9nU3P3UVQPW2ZX9b50%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;648&quot; height=&quot;450&quot; data-filename=&quot;dirname.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. path.resolve( __dirname, 'dist' ) 의 의미&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;드디어 webpack 설정파일에 자주 등장하던 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;path.resolve( __dirname, 'dist')의 의&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;미를 알 수 있습니다!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dirname+dist.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxtvFy/btsnvDWEr0q/uHk3Fh7CKu03gZbBBvmkz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxtvFy/btsnvDWEr0q/uHk3Fh7CKu03gZbBBvmkz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxtvFy/btsnvDWEr0q/uHk3Fh7CKu03gZbBBvmkz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxtvFy%2FbtsnvDWEr0q%2FuHk3Fh7CKu03gZbBBvmkz1%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;641&quot; height=&quot;234&quot; data-filename=&quot;dirname+dist.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;일반적으로 dist 폴더와 webpack.config.js 파일은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;프로젝트&lt;/span&gt;&lt;b&gt;&amp;nbsp;root 경로에 &lt;/b&gt;위치하게 되는데요~!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;이때 __dirname을 통해 root 경로를 기준으로하게 되고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;resolve 메서드로 인해 &lt;b&gt;root + dist의 절대 경로&lt;/b&gt;를 반환하게 되는 것이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 절대경로를 권장하는 output.path&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GiHxd/btsnwqCPwuO/OZryV3y1fcjUkLd8rUW8iK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GiHxd/btsnwqCPwuO/OZryV3y1fcjUkLd8rUW8iK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GiHxd/btsnwqCPwuO/OZryV3y1fcjUkLd8rUW8iK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGiHxd%2FbtsnwqCPwuO%2FOZryV3y1fcjUkLd8rUW8iK%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;730&quot; height=&quot;383&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹팩 공식문서에서는 &lt;b&gt;output.path&lt;/b&gt; 속성을 &lt;b&gt;절대경로&lt;/b&gt;로 설정할 것을 요구하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(공식적인 이유는 찾을 수 없었어요. 추후 찾으면 추가하도록 하겠습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 팀원의 운영체제가 다름으로 인해 발생하는 구분자 이슈를 방지하기 위해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;path.resolve와 __dirname을 함께 사용해 볼 수 있겠네요!&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;포스팅은 여기까지 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmHJGD/btsnvWB7LfJ/PPtJNQfHxJE9ziswym0DW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmHJGD/btsnvWB7LfJ/PPtJNQfHxJE9ziswym0DW1/img.png&quot; data-alt=&quot;기본이 중요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmHJGD/btsnvWB7LfJ/PPtJNQfHxJE9ziswym0DW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmHJGD%2FbtsnvWB7LfJ%2FPPtJNQfHxJE9ziswym0DW1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본이 중요하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발 환경</category>
      <category>config</category>
      <category>path.resolve</category>
      <category>webpack</category>
      <category>__dirname</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/112</guid>
      <comments>https://think0wise.tistory.com/112#entry112comment</comments>
      <pubDate>Fri, 14 Jul 2023 13:44:50 +0900</pubDate>
    </item>
    <item>
      <title>S-HOOK - 그토록 바라던 첫 팀 프로젝트의 시작 [Week1 ~ 2]</title>
      <link>https://think0wise.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 우테코 자소서 내용중 이런 부분이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;우테코에서 동료들과 함께 흔들리지 않고 단단하게 성장하고 싶습니다.&lt;br /&gt;제게 동료들과 함께 배울 수 있는 소중한 기회가 주어진다면,&lt;br /&gt;이 글에 미처 담지 못한 열정 괴물 이도현의 성장을 우테코에서 꼭 보여드리겠습니다!&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레벨 1, 2가 흘러 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;어느덧&amp;nbsp;&lt;/span&gt;레벨3.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;드디어 그토록 바라던 팀 프로젝트를 진행하게 되었습니다...!!&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우테코에서는 2주 단위로 &lt;b&gt;*데모데이&lt;/b&gt;를 진행하는데요~!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로 데모데이를 기준으로 &lt;b&gt;프로젝트 주요 이슈와 피드백 사항에 &lt;/b&gt;대해 간략하게 정리하고 회고하려 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*데모 데이:&amp;nbsp; 각 팀이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;추구하는 목표와 방향성 공유하고&lt;/b&gt;, &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;피드백을 주고 받는 날&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 'S-HOOK' 이 뭔데?&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfIidy/btsnoJaQQZt/Mnn2ImIx9ztNIfQHmwY9h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfIidy/btsnoJaQQZt/Mnn2ImIx9ztNIfQHmwY9h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfIidy/btsnoJaQQZt/Mnn2ImIx9ztNIfQHmwY9h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfIidy%2FbtsnoJaQQZt%2FMnn2ImIx9ztNIfQHmwY9h0%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;713&quot; height=&quot;401&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;노래의 도입부만 듣고 취향이 아니라고 생각하여 놓친, &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;알고보면 좋은 노래들이 많습니다.&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이런 노래들도&amp;nbsp;&lt;b&gt;킬링파트만 들어볼 수 있었다면&lt;/b&gt; &lt;b&gt;어땠을까요?&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;Share의 약자인&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;'S'와&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;b&gt;hook을 합쳐 S-HOOK!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;사용자가 투표한 킬링파트(Hook)를 기반으로 노래를 공유하자!&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfNEhI/btsngJJlaoc/jsFhIPUhy2EhIbPoaGMOX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfNEhI/btsngJJlaoc/jsFhIPUhy2EhIbPoaGMOX1/img.png&quot; data-alt=&quot;고심 끝에 고른 서비스 명 'S-HOOK'&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfNEhI/btsngJJlaoc/jsFhIPUhy2EhIbPoaGMOX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfNEhI%2FbtsngJJlaoc%2FjsFhIPUhy2EhIbPoaGMOX1%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;257&quot; height=&quot;291&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;고심 끝에 고른 서비스 명 'S-HOOK'&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 주요 작업 내용&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 2주 동안 진행한 &lt;b&gt;주요 작업은 다음과 같습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;주로 팀원간의 생각 차이를 좁이는데 사용했네요!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;사용자 스토리 맵핑&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;페르소나 정하기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;컨벤션 및 브랜치 전략&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;데모데이 발표&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. 사용자 스토리 맵핑&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EdOPc/btsnjb5FClV/ntMC9KXqiqYFdIzsd76Up1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EdOPc/btsnjb5FClV/ntMC9KXqiqYFdIzsd76Up1/img.png&quot; data-alt=&quot;각자 다른 것을 상상한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EdOPc/btsnjb5FClV/ntMC9KXqiqYFdIzsd76Up1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEdOPc%2Fbtsnjb5FClV%2FntMC9KXqiqYFdIzsd76Up1%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;350&quot; height=&quot;272&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;각자 다른 것을 상상한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리는 보통 요구사항에 대한 부분을 문서화 하여 공유합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빠르게 소통할 수 있지만,&amp;nbsp;&lt;b&gt;같은 문서를 읽고도&amp;nbsp;서로 다른 것을 상상한다는 문제점이 있죠.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리가 같은 것을 생각하지 않았음을 깨닫는 순간은&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;소프트웨어를 한참 개발하는 도중이거나 소프트웨어를 고객에게 전달한 후 입니다.&amp;nbsp;&lt;br /&gt;&lt;/b&gt;이런 문제를 어떻게 해결할 수 있을까요?&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;사용자 스토리 맵핑&lt;/span&gt; 활동을 통해 위와 같은 문제를 해결해 볼 수 있습니다.&lt;/b&gt;(더 궁금하신 분들은 &lt;a href=&quot;https://miro.com/ko/templates/user-story-map/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에서 확인하세요)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일전에 근로 워크샵에서 '사용자 스토리 맵핑'을 처음 접했었는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;구성원 모두의 생각이 일치되는 경험이 너무 좋았어요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;팀원에게 사용자 스토리 맵핑 활동을 제안했고 흔쾌히 승락해 주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_스토리 매핑.jpg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbGPvH/btsnkLneltr/dKkkXrKVTmi9JpqjoJ722k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbGPvH/btsnkLneltr/dKkkXrKVTmi9JpqjoJ722k/img.png&quot; data-alt=&quot;스케치북에 진행한 스토리 맵핑&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbGPvH/btsnkLneltr/dKkkXrKVTmi9JpqjoJ722k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbGPvH%2FbtsnkLneltr%2FdKkkXrKVTmi9JpqjoJ722k%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;457&quot; height=&quot;380&quot; data-filename=&quot;edited_edited_스토리 매핑.jpg&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;1257&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스케치북에 진행한 스토리 맵핑&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmpDW1/btsngqXAxYc/oOMLbdwcXtnp3hYuJnlvXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmpDW1/btsngqXAxYc/oOMLbdwcXtnp3hYuJnlvXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmpDW1/btsngqXAxYc/oOMLbdwcXtnp3hYuJnlvXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmpDW1%2FbtsngqXAxYc%2FoOMLbdwcXtnp3hYuJnlvXk%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;684&quot; height=&quot;447&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;활동은 *&lt;b&gt;작업(Task) 나열하기&lt;/b&gt;&amp;nbsp;  *&lt;/span&gt;&lt;b&gt;활동(Activity) 구성하기&lt;/b&gt;&amp;nbsp;  *&lt;b&gt;스토리(Story) 나열하기 순으로 진행했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기 기획이 확실하지 않던 상태에서 진행해서 다소 시간이 걸리긴 했지만,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;팀원 모두가 생각이 일치되어 가는 것에 만족했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*Task:&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;사용자가 제품을 사용하는 동안 필요한 모든 작업&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*Activity:&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;Task 중 조금 더 큰 단위로 묶을 수 있는 그룹&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;*Story:&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;Activity를 달성하기 위해 고려해야하는 상황을 정리한 것&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. 페르소나 정하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh7sKU/btsnrslC87t/qiXSTPC3m0uTVvE4lNxwQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh7sKU/btsnrslC87t/qiXSTPC3m0uTVvE4lNxwQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh7sKU/btsnrslC87t/qiXSTPC3m0uTVvE4lNxwQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh7sKU%2FbtsnrslC87t%2FqiXSTPC3m0uTVvE4lNxwQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;400&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;S-HOOK을 사용할 페르소나&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ensE6a/btsnoE8L8vw/thvyWKrFBgesU6IKiZ3jk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ensE6a/btsnoE8L8vw/thvyWKrFBgesU6IKiZ3jk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ensE6a/btsnoE8L8vw/thvyWKrFBgesU6IKiZ3jk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FensE6a%2FbtsnoE8L8vw%2FthvyWKrFBgesU6IKiZ3jk0%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;671&quot; height=&quot;385&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자 스토리 맵핑 활동과 더불어,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;'무엇이 우리 서비스의 핵심 기능인가?' 를 도출하는 데 도움이 됐습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-3. 컨벤션 및 브랜치 전략&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회의를 통해 팀내 &lt;a href=&quot;https://github.com/woowacourse-teams/2023-shook/wiki/PR-%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0-Rule%E2%9C%8D&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;PR 코드 리뷰 Rule&lt;/b&gt;&lt;/a&gt;과 각 파트별 &lt;b&gt;&lt;a href=&quot;https://github.com/woowacourse-teams/2023-shook/wiki/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-%EC%BB%A8%EB%B2%A4%EC%85%98%F0%9F%94%A7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코드 컨벤션&lt;/a&gt;을&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드리뷰 Rule은 최대한 &lt;b&gt;팀원의 성장을&lt;/b&gt; 도모할 수 있는 방향으로 정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드 컨벤션은 과한 제약으로 생산성이 떨어지지 않도록 큰 틀 부터 정해보려고 노력했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 &lt;b&gt;브랜치 전략에 대해 학습&lt;/b&gt;하고 나름의 이유를 가지고 &lt;b&gt;flow를 정해봤어요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8iKuY/btsnqTRl0yk/efKwTKA6q15VUG1Tj0Ij5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8iKuY/btsnqTRl0yk/efKwTKA6q15VUG1Tj0Ij5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8iKuY/btsnqTRl0yk/efKwTKA6q15VUG1Tj0Ij5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8iKuY%2FbtsnqTRl0yk%2FefKwTKA6q15VUG1Tj0Ij5K%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;493&quot; height=&quot;630&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Git flow 전략에서&lt;b&gt; release 브랜치를 제외한&lt;/b&gt; 흐름으로 가져가보기로 했는데요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 개발 서버가 존재하지 않고 규모가 크지 않기에 제외하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추후 서비스의 규모가 커짐에 따라 개발 서버의 필요성을 느끼는 순간에 release 브랜치를 추가하기로 했습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 데모데이 및 피드백&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YsC5o/btsnqeam2SG/RfC7CAXSrvH097x9eNpdu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YsC5o/btsnqeam2SG/RfC7CAXSrvH097x9eNpdu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YsC5o/btsnqeam2SG/RfC7CAXSrvH097x9eNpdu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYsC5o%2Fbtsnqeam2SG%2FRfC7CAXSrvH097x9eNpdu0%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;596&quot; height=&quot;647&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그리고 드디어 1차 데모데이를 진행했습니다...!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좋은 피드백도 많이 받았어요~!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;주요 피드백 사항을 정리하면 다음과 같습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 현재 배포한 상황이 없을 텐데, &lt;b&gt;조금 더 간소한 브랜치 전략을 가져가는 것은 어떨지?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 주어진 기능에 맞춰서 &lt;b&gt;페르소나를 맞춘 것은 아닌지?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 아무도 이 파트를 지정하지 않으면 아무도 킬링파트를 들을 수 없는 것이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &lt;b&gt;초창기에는 노가다&lt;/b&gt;가 들어가야할 것 같고. 어느정도 정해지면&lt;b&gt; 악의적인 사용자의 어뷰징을 막아야 할것 같다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- &lt;/b&gt;가능한 저작권 문제 없고, 노래를 들을 수 있으면서 구간을 지정할 수 있는 기능을 완료하는 것이 먼저.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 위 피드백을 바탕으로 &lt;b&gt;브랜치 전략을 간소화&lt;/b&gt; 중에 있고, &lt;b&gt;페르소나 및 기획을 조정&lt;/b&gt;하고 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;기초 공사를 조금 더 단단히 해야할 필요가 있다고 느꼈습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. Week1 ~ 2&amp;nbsp; 돌아보기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;아무래도 기획 관련된 내용으로 회의가 많기도 했고, 컨벤션 외 기타&amp;nbsp;&lt;/span&gt;여러 것들을&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;논의하느라&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전반적으로 정말 바쁜 첫 사이클이었습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본격적인 개발에 앞서 팀 문화를 비롯한 여러 규칙을 정하고 따르고 있는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;실제&amp;nbsp;&lt;/span&gt;개발 단계에서도&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;이런 것들이 정말 잘 지켜지는지,&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px; background-color: #ffffff; color: #424242;&quot;&gt;얼마나 도움이 되는지 얼른 다음 사이클을 진행해&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;보고 싶네요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또 &lt;b&gt;반성해야 할&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&lt;b&gt;&amp;nbsp;부분&lt;/b&gt;이 생각나는데요.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;팀원과 페르소나 or 아이디어&amp;nbsp;&lt;/span&gt;회의 중에&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;&lt;b&gt;'보통의 경우, 일반적인&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;경우'&lt;/b&gt;라는&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;말을 많이 사용한 것 같아요.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;개인의 기준으로 전체를 판단한 경우가 생겨&amp;nbsp;&lt;/span&gt;조심해야겠다고&lt;span style=&quot;background-color: #ffffff; color: #424242; text-align: start;&quot;&gt;&amp;nbsp;생각했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또&lt;b&gt; 개발자는&lt;/b&gt; 코드를 짜는 직업이 아니라, &lt;b&gt;문제를 해결하는 직업&lt;/b&gt;이라는 것을 몸소 느낄 수 있었어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수 많은 기획과 서비스들은 &lt;b&gt;결국 사람들이 겪고 있는 문제를 해결하기 위함&lt;/b&gt;이라는 거죠&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로의 개발 인생에서도 계속 되뇌이면 좋을 부분이라고 생각합니다.☝&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;700&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dESdCH/btsnvIhS2ob/NGWJnxF5rvwebQlgl3vbe0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dESdCH/btsnvIhS2ob/NGWJnxF5rvwebQlgl3vbe0/img.jpg&quot; data-alt=&quot;이제 시작..!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dESdCH/btsnvIhS2ob/NGWJnxF5rvwebQlgl3vbe0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdESdCH%2FbtsnvIhS2ob%2FNGWJnxF5rvwebQlgl3vbe0%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;611&quot; height=&quot;262&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이제 시작..!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Week 1~2 회고는 여기까지 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 사이클에 다시 만나요!&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>기획</category>
      <category>데모데이</category>
      <category>사용자스토리맵</category>
      <category>우테코</category>
      <category>페르소나</category>
      <category>프로젝트</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/111</guid>
      <comments>https://think0wise.tistory.com/111#entry111comment</comments>
      <pubDate>Thu, 13 Jul 2023 14:32:09 +0900</pubDate>
    </item>
    <item>
      <title>webpack이란?(feat. 핵심 컨셉)</title>
      <link>https://think0wise.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 팀 프로젝트를 시작하면서 프로젝트 성향에 맞는 &lt;b&gt;커스텀한 개발 환경 설정이 필요했습니다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;직접 개발 환경을 구성해 보면서 전반적인 개발 환경에 대해 이해하고자 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 첫 주제는 바로&lt;b&gt; webpack입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. webpack 이란?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webpack.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drNjrR/btsmQDJqIaL/c2Z2Qt1CMcCDTFtRoECjyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drNjrR/btsmQDJqIaL/c2Z2Qt1CMcCDTFtRoECjyk/img.png&quot; data-alt=&quot;webpack&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drNjrR/btsmQDJqIaL/c2Z2Qt1CMcCDTFtRoECjyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrNjrR%2FbtsmQDJqIaL%2Fc2Z2Qt1CMcCDTFtRoECjyk%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;138&quot; height=&quot;138&quot; data-filename=&quot;webpack.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;webpack&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;웹팩은 대표적인 *&lt;/span&gt;&lt;b&gt;번들러&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;중 하나로&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹을 구성하는 &lt;b&gt;자원을 각각의 모듈로 취급&lt;/b&gt;하고 이를 병합하여 &lt;b&gt;하나의 결과물로 만들어 주는&lt;/b&gt; &lt;b&gt;도구&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(js 파일 뿐만 아니라 css, 이미지, 폰트와 같은 기타 파일도 모듈로 취급할 수 있습니다.)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;번들러(bundler):&lt;/b&gt; 의존성이 있는 여러 개의 js파일(모듈)을 하나의 js파일로 합쳐주는 도구&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. webpack의 핵심 컨셉&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹팩 공식문서에서는 &lt;b&gt;웹팩을 이해하기 위한 핵심 컨셉을 소개하고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. entry&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;entry 속성&lt;/b&gt;을 통해 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;번들링을 시작할 파일의 경로&lt;/b&gt;&lt;/span&gt;를 지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹팩은 이 속성에 명시된 모듈에서부터 시작하여 각 모듈의&lt;b&gt; 의존성 그래프를 생성하게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;config-entry2.png&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zsqUw/btsm1UpnuCs/aGszACmytkYtBMn5JkMI00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zsqUw/btsm1UpnuCs/aGszACmytkYtBMn5JkMI00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zsqUw/btsm1UpnuCs/aGszACmytkYtBMn5JkMI00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzsqUw%2Fbtsm1UpnuCs%2FaGszACmytkYtBMn5JkMI00%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;557&quot; height=&quot;488&quot; data-filename=&quot;config-entry2.png&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. output&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반대로 &lt;b&gt;output 속성&lt;/b&gt;으로 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;번들링 된 결과물이 저장될 경로 및 파일명&lt;/span&gt;&lt;/b&gt;을&amp;nbsp;지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;config-output2.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYvr3j/btsmO5mqSbF/S2bjkTyLupW5YKlNMPbuR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYvr3j/btsmO5mqSbF/S2bjkTyLupW5YKlNMPbuR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYvr3j/btsmO5mqSbF/S2bjkTyLupW5YKlNMPbuR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYvr3j%2FbtsmO5mqSbF%2FS2bjkTyLupW5YKlNMPbuR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;355&quot; data-filename=&quot;config-output2.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;*path: &lt;/b&gt;node.js api로 파일의 경로를 지정하기 위해 사용&lt;br /&gt;&lt;b&gt;*path.resolve, __dirname : &lt;/b&gt;&lt;a href=&quot;https://think0wise.tistory.com/112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;path.resolve, __dirname란?&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-3. loader&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;로더&lt;/b&gt;는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;js파일 외의 파일들도 모듈로 취급할 수 있도록 합니다.&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;즉 번들링 결과물에 포함시킬 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #2b3a42; text-align: start;&quot;&gt;또한 특정 유형의 모듈을 변환할 수 &lt;/span&gt;있습니다. &lt;/b&gt;(ex. ts --&amp;gt; js 변환, babel로 코드 변환)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;module 속성으로 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;config-module1.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qFWHJ/btsmQEaxAJB/rwcZS3mKXLwZ8lB0gkGG9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qFWHJ/btsmQEaxAJB/rwcZS3mKXLwZ8lB0gkGG9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qFWHJ/btsmQEaxAJB/rwcZS3mKXLwZ8lB0gkGG9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqFWHJ%2FbtsmQEaxAJB%2FrwcZS3mKXLwZ8lB0gkGG9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;514&quot; data-filename=&quot;config-module1.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;*&lt;b&gt;로더는 역순으로 실행됨에 유의&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;css-loader:&lt;/b&gt; css파일을 js코드로 변환(모듈화)해 주는 로더&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;style-loader:&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #3d3d3f; text-align: start;&quot;&gt;js로 변경된 css를 동적으로 돔에 추가해 주는 로더&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-4. &lt;b&gt;plugin&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;플러그인&lt;/b&gt;은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;번들링된 결과물의 후처리를 담당합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이외에도 에셋 관리, 환경변수 주입 등, &lt;b&gt;번들링 과정 전반에 걸쳐 여러가지 기능을 합니다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;plugins 속성으로 설정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;config-plugin1.png&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;1172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mF1sR/btsmSuZEXB4/4frTxjQIuaQzqqznbmlPN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mF1sR/btsmSuZEXB4/4frTxjQIuaQzqqznbmlPN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mF1sR/btsmSuZEXB4/4frTxjQIuaQzqqznbmlPN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmF1sR%2FbtsmSuZEXB4%2F4frTxjQIuaQzqqznbmlPN0%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;541&quot; height=&quot;493&quot; data-filename=&quot;config-plugin1.png&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;1172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;HtmlWebpackPlugin:&lt;/b&gt; HTML 파일을 생성하고, 번들 파일을 script 태그로 주입해주는 플러그인&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-5. mode&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모드 속성&lt;/b&gt;으로 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;webpack에 내장된 환경별 최적화를 활성화 할 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;옵션은&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;'development', 'production', 'none' 이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;각 모드별로 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;process.env.NODE_ENV &lt;/span&gt;&lt;/b&gt;환경 변수가 자동으로 설정됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;또한 'production' 모드에서는 최적화와 관련된 여러 플러그인이 적용됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 번들링 / 결과물 확인&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;핵심 컨셉을 바탕으로 작성한 설정파일로 아래의 간단한 예시코드를 번들링 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2개의 모듈에 의존하고 있는&amp;nbsp;&lt;/span&gt;&lt;b&gt;index.js를 준비했습니다.&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtOnpy/btsmROjRhvm/V0Kar29B6LdOiJcB7FzTZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtOnpy/btsmROjRhvm/V0Kar29B6LdOiJcB7FzTZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtOnpy/btsmROjRhvm/V0Kar29B6LdOiJcB7FzTZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtOnpy%2FbtsmROjRhvm%2FV0Kar29B6LdOiJcB7FzTZ1%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;1006&quot; height=&quot;395&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과물을 확인해보면...&lt;/b&gt;&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcIAY1/btsmQe4lbKh/uYcfkPdN22Xvh7vrJTCQ1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcIAY1/btsmQe4lbKh/uYcfkPdN22Xvh7vrJTCQ1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcIAY1/btsmQe4lbKh/uYcfkPdN22Xvh7vrJTCQ1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcIAY1%2FbtsmQe4lbKh%2FuYcfkPdN22Xvh7vrJTCQ1k%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;1078&quot; height=&quot;521&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;&lt;b&gt;webpack&lt;/b&gt;은 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;&lt;b&gt;entry&lt;/b&gt; 경로로 지정한 &lt;b&gt;index.js 파일로 부터 의존성을 분석하여&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;&lt;b&gt;output&lt;/b&gt; 경로에 맞게 &lt;b&gt;번들 파일이 생성되었고,&lt;/b&gt;&lt;br /&gt;&lt;b&gt;loader&lt;/b&gt;가 잘 적용되어 &lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #2b3a42; text-align: start;&quot;&gt;css코드도 &lt;/span&gt;번들에 합쳐졌습니다.&amp;nbsp;&lt;/b&gt; &lt;br /&gt;&lt;b&gt;plugin&lt;/b&gt;도 잘 동작하여 &lt;b&gt;html 파일 및 삽입된 script태그를 확인할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. 마치며...&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;여기까지 webpack의 핵심 컨셉에 대해 알아보았습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42;&quot;&gt; &lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;webpack에는 위에서 &lt;b&gt;소개한 속성 외에도 &lt;/b&gt;&lt;/span&gt;&lt;b&gt;수 많은 속성과 세부 속성이 있습니다...!&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42;&quot;&gt;필요할 때 마다 그때그때 공식문서로 학습하는게 좋아보이네요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2b3a42;&quot;&gt;&lt;span style=&quot;color: #2b3a42; text-align: start;&quot;&gt;시간을 두고 천천히 알아가보도록 합시다.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BZ0fe/btsmPGthoFO/IIiLO8EuruVw0MKviTH1T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BZ0fe/btsmPGthoFO/IIiLO8EuruVw0MKviTH1T0/img.png&quot; data-alt=&quot;기본이 중요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BZ0fe/btsmPGthoFO/IIiLO8EuruVw0MKviTH1T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBZ0fe%2FbtsmPGthoFO%2FIIiLO8EuruVw0MKviTH1T0%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>개발 환경</category>
      <category>webpack</category>
      <category>번들러</category>
      <category>웹팩</category>
      <category>핵심컨셉</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/110</guid>
      <comments>https://think0wise.tistory.com/110#entry110comment</comments>
      <pubDate>Sun, 9 Jul 2023 22:35:27 +0900</pubDate>
    </item>
    <item>
      <title>우테코 레벨2 학습 내용 총정리</title>
      <link>https://think0wise.tistory.com/109</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;레벨2 총정리.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHJxIo/btsjZzKuSMd/083ZorhtoiWMIrD2J7Ibqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHJxIo/btsjZzKuSMd/083ZorhtoiWMIrD2J7Ibqk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHJxIo/btsjZzKuSMd/083ZorhtoiWMIrD2J7Ibqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHJxIo%2FbtsjZzKuSMd%2F083ZorhtoiWMIrD2J7Ibqk%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;900&quot; height=&quot;300&quot; data-filename=&quot;레벨2 총정리.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;레벨2 학습 내용 총정리 &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;그야말로 대 환장 파티...! 레벨2를 마무리했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;레벨1의&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;고된 시절이&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;생각나지 않을 만큼 정말 빠르게&amp;nbsp;&lt;/span&gt;지난 간&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;8주였다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;학습 내용을 정리하며 흐려지는 기억들을 주워 담아보자!&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;그래서 뭘 배웠어? &amp;zwj;♂️&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;React&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CDD(with storybook)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;UI / UX&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;협업&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;1. React&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvIXeF/btskhaPFp67/sQ4QyohJ2zhqlUNhDs12OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvIXeF/btskhaPFp67/sQ4QyohJ2zhqlUNhDs12OK/img.png&quot; data-alt=&quot;질긴 인연&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvIXeF/btskhaPFp67/sQ4QyohJ2zhqlUNhDs12OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvIXeF%2FbtskhaPFp67%2FsQ4QyohJ2zhqlUNhDs12OK%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;321&quot; height=&quot;182&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질긴 인연&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2년 전 이맘때에 React를 처음 배웠었다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그저 문법을 외우고 작업물을 찍어내기 바빴다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;'React란 무엇이고, 왜 많은 사람들이 사용하는가?'&lt;/b&gt; 제일 기본이 되는 것조차 모르고 사용했었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번 레벨 2에서는&lt;b&gt;&amp;nbsp;React의 '근본'에 대한 것을 많이 학습했다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;1-1. why React? &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;누군가&lt;b&gt;&amp;nbsp;'왜 react를 사용하는 거야?'&amp;nbsp;&lt;/b&gt;물으면 나는 이렇게 답변할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;React는 복잡한 사용자 인터렉션과 이벤트, 이에 따른 UI의 변화를&amp;nbsp;&lt;b&gt;직접 컨트롤 할 필요없게&lt;/b&gt;&amp;nbsp;&lt;b&gt;추상화되고 최적화된&amp;nbsp;라이브러리야.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;때문에 개발자는 UI에 집중해서 선언적인 개발이 가능해~!&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;레벨1에서 바닐라JS만으로 어플리케이션을 구현하면서&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;여러 불폄함을 느꼈기 때문에,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;비로소 이해하게 되었다고 생각한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #409d00;&quot;&gt;&lt;b&gt;1-2. React - keyword&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;virtual dom&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;jsx&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;key&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;context API&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;controlled &amp;amp; uncontrolled Components&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;memoization&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;custom hook&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;재사용 가능한 컴포넌트&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;위 키워드 외에도 정말 많은 React 관련 키워드를 학습했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;각 키워드마다 기억에 남는 에피소드 하나씩은 꼭 있는것 같다...ㅋㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;React 코어와 관련된 내용도 내용이지만,&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;개인적으로는&lt;b&gt; custom hook과 같은 로직 분리 부분에서 많이 성장한 것 같다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;컴포넌트 하나에&amp;nbsp;&lt;b&gt;1000라인이 넘어갔던 옛 시절은&lt;/b&gt;&amp;nbsp;이제 상상도 할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;1-3. 결국 여전히 중요한것은 관심사의 분리 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;레벨1에서부터 이어져서 결국 특정&amp;nbsp;&lt;b&gt;컴포넌트의 관심사는&lt;/b&gt;&amp;nbsp;무엇인지, 어디까지 알고 어디까지 몰라야 하는지가 중요하다고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;비동기 통신과 같은 방해꾼들을 어떻게 잘 분리할 것인지 더 많이 고민해 봐야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2. CDD(with&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;storybook&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Component Driven Development&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작은 부품 단위의&amp;nbsp;&lt;b&gt;컴포넌트에서 시작해&lt;/b&gt;&amp;nbsp;페이지 단위까지,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Bottom -&amp;nbsp; Up 방식으로&lt;/b&gt;&amp;nbsp;UI를 만들어 나가는 개발 방법론을 말한다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOozcF/btskyoHwNYZ/4GytoIkVbvKnX2wnKf7Uz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOozcF/btskyoHwNYZ/4GytoIkVbvKnX2wnKf7Uz0/img.png&quot; data-alt=&quot;밋밋해서 재탕&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOozcF/btskyoHwNYZ/4GytoIkVbvKnX2wnKf7Uz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOozcF%2FbtskyoHwNYZ%2F4GytoIkVbvKnX2wnKf7Uz0%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;225&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;밋밋해서 재탕&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-1. CDD / Bottom - Up 개발의 짜릿함 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;과거의 나는 컴포넌트라는 개념이 전무했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Top-down 방식, 어쩌면 아무런 방식도 없이&amp;nbsp;&lt;b&gt;그저 적당히 커지면 나누면서 개발했었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;파일이 커져가는 것을 인지하지 못했고, 어디서부터 어느 정도를 컴포넌트로 구분해야 하는지 기준이 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;때문에 어수선한 코드와 애매한 크기의 컴포넌트들이 즐비했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그런 내가&amp;nbsp;어쩌면 인생 처음으로&lt;b&gt;&amp;nbsp;찐 Bottom-Up 방식&lt;/b&gt;의 개발을 해본 것이 아닐까 싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;가장 작은 단위의 컴포넌트부터 설계하고&lt;/b&gt;&amp;nbsp;storybook의 도움을 받아 UI로 확인하며 작성하는 경험은 정말 신세계였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비록 내가 적용하고 경험한 것은 일부분이겠지만, 앞으로의 컴포넌트 설계에 큰 도움이 될것이라 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-2. storybook&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J3K7w/btskg7lmDft/GEpJNhzARUIUm5UdvDb4H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J3K7w/btskg7lmDft/GEpJNhzARUIUm5UdvDb4H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J3K7w/btskg7lmDft/GEpJNhzARUIUm5UdvDb4H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ3K7w%2Fbtskg7lmDft%2FGEpJNhzARUIUm5UdvDb4H1%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;347&quot; height=&quot;145&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴포넌트 단위의 독립적인 UI 개발 환경을 지원하는 툴&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평생을 Top-down으로 개발했던 사람으로서 스토리북을 잘 사용하기까지 다소 긴 시간이 걸렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;작은 단위의 컴포넌트를 만들어 가면서 차차 그 가치를 알게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프로젝트와 독립적인 환경에서 컴포넌트 개발이 가능하다는 점&lt;/b&gt;&amp;nbsp;외에도&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문서화와 배포를 통해&amp;nbsp;&lt;b&gt;다른 개발자 및 타 직군에게도&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;컴포넌트를 보여주고&amp;nbsp;&lt;/span&gt;설명할 수 있다는 점이 좋았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(크루들의 질문에 컴포넌트만 쏙쏙 보여주는 게 얼마나 편했는지 모른다.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로의 모든 react 프로젝트에는 무조건적으로 사용할 것이다. &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;3. UI / UX  &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bARgdF/btskhCMaHC9/3u9IWtcBshFYSgnW4gRayK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bARgdF/btskhCMaHC9/3u9IWtcBshFYSgnW4gRayK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bARgdF/btskhCMaHC9/3u9IWtcBshFYSgnW4gRayK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbARgdF%2FbtskhCMaHC9%2F3u9IWtcBshFYSgnW4gRayK%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;459&quot; height=&quot;104&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레벨 1에서 레벨 2 초반부까지는 기술, 지식적인 것에 치중한 면이 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 모든건&amp;nbsp;&lt;b&gt;사용자를 위함임을 잠시 잊었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;깔끔하고 좋은 코드 vs&lt;/b&gt;&amp;nbsp;&lt;b&gt;UI / UX&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 'vs'라고 표현해도 될까 싶은 정도로 둘 다 놓칠 수 없는 것들이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;둘 사이의 경계를 잘 잡아 발전시켜 나가야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한정된 기간 안에 결과를 만들어 내면서 밸런스 있게 둘 다 챙기는 법을 조금씩 알아가고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 협업&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;아! 재밌다...! &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;인생 첫&lt;/b&gt;&amp;nbsp;백엔드와의 협업이었는데 정말 재밌었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사람도 너무 좋았고, 첫 협업 회의도 재미있었고, 개발하는 과정도 재미있었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;우여곡절 끝에 API를 적용하고&amp;nbsp; 정상적으로 돌아가는 어플리케이션을 확인했을 때 정말 기분 좋았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;배운 것도 참 많았고 마냥 신기했다ㅋㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #f89009;&quot;&gt;&lt;b&gt;4-1. MSW&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyIaIH/btskg7eOeLg/3WKCsusLP742BhOYMLKHzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyIaIH/btskg7eOeLg/3WKCsusLP742BhOYMLKHzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyIaIH/btskg7eOeLg/3WKCsusLP742BhOYMLKHzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyIaIH%2Fbtskg7eOeLg%2F3WKCsusLP742BhOYMLKHzK%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;321&quot; height=&quot;157&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Mock Service Worker&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서비스 워커(Service Worker)를 사용하여&amp;nbsp;&lt;b&gt;네트워크 호출을 가로채는 API 모킹(mocking) 라이브러리&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;백엔드와의 협업을 진행하기 앞서,&lt;b&gt;&amp;nbsp;MSW의 덕을 봤다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API 완성을 기다릴 필요 없이&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;예상 명세를 토대로 mocking 로직을 작성해두고, 이를 기반으로 개발을 진행했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로는 성공, 실패 응답에 대해서 mocking을 작성하고 테스트했는데,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;백엔드의 작업이 예상치 못하게 길어지는 경우에는&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;백엔드 로직의 일부를 작성해서 더 다양한 경우를 테스트해도 좋을 것 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #ee2323;&quot;&gt;&lt;b&gt;4-2. SOP / CORS 관련 에러와의 첫 만남&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Same Origin Poilcy(동일 출처 정책)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동일한 Origin(Protocol, host, port) 사이에서만 리소스를 공유할 수 있다는 정책&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Cross Origin Resource Sharing(교차 출처 리소스 공유)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Origin이 다르더라도 리소스를 공유할 수 있도록 하는 정책.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SOP정책에 의해 제한되었던 교차 출처간 리소스 공유가 가능해졌다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;'왜 안돼?'를 가장 많이 외치게 한 에러가 아닐까 싶다...&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개발 환경(http)에서&lt;/b&gt;&amp;nbsp;&lt;b&gt;배포 서버(https)로&lt;/b&gt; API 요청을 해놓고 안된다고 징징거린 적도 있었고&lt;b&gt;(혼자 )&lt;/b&gt;,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;백엔드 로직의 설정 누락인 경우도 있었다.&lt;b&gt;(ex. Access Control expose headers)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;무엇 하나 쉽게 내어주지 않는 &lt;b&gt;브라우저의 보안정책에&lt;/b&gt; 시원하게 담궈지고 나서야 방향을 잡아갈 수 있었다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본격적인 프로젝트를 진행하게 되는 레벨3, 4에서는 간단한 에러나 &lt;b&gt;빠르게 해결된 해프닝도 기록해보는 습관을 가지려고 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;  더 &lt;/b&gt;꽉꽉 눌러담은 레벨2  &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWCsif/btskAFvgfy2/qqbpTh8IwKbIYkPruFoX5K/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWCsif/btskAFvgfy2/qqbpTh8IwKbIYkPruFoX5K/img.webp&quot; data-alt=&quot;꺼억~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWCsif/btskAFvgfy2/qqbpTh8IwKbIYkPruFoX5K/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWCsif%2FbtskAFvgfy2%2FqqbpTh8IwKbIYkPruFoX5K%2Fimg.webp&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;346&quot; height=&quot;242&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;꺼억~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고봉밥 만큼 적절하게 표현되는 짤이 없더라.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에도 아쉽긴 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;워낙 방대한 내용이었기 때문에 놓친 부분도 많다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼에도 매 순간 노력했기에 한 공기 가득 채워졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 절반을 마쳤다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로 진행하게 될 프로젝트도 정말 기대된다!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;힘내보자 도현아!&lt;/span&gt;&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>5기</category>
      <category>Fe</category>
      <category>레벨2</category>
      <category>우아한테크코스</category>
      <category>우테코</category>
      <category>프론트엔드</category>
      <category>후기</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/109</guid>
      <comments>https://think0wise.tistory.com/109#entry109comment</comments>
      <pubDate>Mon, 19 Jun 2023 16:24:22 +0900</pubDate>
    </item>
    <item>
      <title>react - key props(feat. 공식문서)</title>
      <link>https://think0wise.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 포스팅에서는 react의 &lt;b&gt;key props&lt;/b&gt;에 대해 탐구하는 시간을 가져보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;024&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/024.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/024.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. Key란 ?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #23272f; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://ko.legacy.reactjs.org/docs/lists-and-keys.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;React 구 공식문서에는&lt;/a&gt; 이렇게 나와 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #23272f; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #23272f; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Key는&lt;/b&gt; &lt;b&gt;React가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는 것을 돕습니다.&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;key는 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정해야 합니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://react-ko.dev/learn/rendering-lists#why-does-react-need-keys&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;React 신 공식문서에는&lt;/a&gt; 이렇게 나와있구요.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;key는 각 컴포넌트가 어떤 배열 항목에 해당하는지 React에 알려주어 나중에 매칭할 수 있도록 합니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 배열 항목이 (정렬 등으로 인해) &lt;b&gt;이동하거나, 삽입되거나, 삭제될 수 있는 경우 중요해집니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잘 만들어진 key는 React가 정확히 &lt;b&gt;무슨 일이 일어났는지 추론하고 &lt;/b&gt;DOM 트리를 올바르게 업데이트하는 데 도움이 됩니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 잘 모르겠네요...!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;key가 등장한 이유를 먼저 알아봅시다...!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. key가 등장한 이유(feat. diffing Algorithm)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;key의 등장은 &lt;b&gt;react의 diffing Algorithm과 밀접하게 연관되어 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설명에 앞서 위 내용에 대한 &lt;a href=&quot;https://ko.legacy.reactjs.org/docs/reconciliation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;구 공식문서 링크&lt;/a&gt;를 첨부합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가볍게 정리하면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;react는 보다 효과적으로 UI를 갱신하기 위해 &lt;b&gt;diffing Algorithm을 사용합니다. &lt;br /&gt;&lt;/b&gt;이를 통해 기존과 비교해&lt;span style=&quot;font-weight: bold; color: #333333; text-align: left;&quot;&gt;&amp;nbsp;어떤&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;b&gt;변화가 있었는지 &lt;/b&gt;판단하고&lt;/span&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt; 변경된 사항만을 실제 DOM에 반영합니다.&lt;/span&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;(기존 react element tree와 새로운 react element tree를 비교합니다.)&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 트리 변환을 위한 최첨단의 알고리즘도 O(n3)의 복잡도로 매우 비싼 연산비용이 발생했고, &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;react는 &lt;/span&gt;&lt;b&gt;2가지 가정을 기반으로 &lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;이를 &lt;/span&gt;O(&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;n) 복잡도까지 최적화 했습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 2가지 가정 중 하나가 &lt;b&gt;바로 key props입니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발자가 list element의 자식 element에&lt;b&gt;&amp;nbsp;key를 명시하여 어떤 자식 element가 변경되는지 알려줄 수 있습니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. key를 명시하지 않았을 때 발생하는 비효율&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그렇다면, 하라는대로 하지 않았을 때 어떤 비효율이 발생할까요?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS8pDs/btsjNL40svo/lFer7Wz3XWoecO5G4iIHYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS8pDs/btsjNL40svo/lFer7Wz3XWoecO5G4iIHYK/img.png&quot; data-alt=&quot;key가 없을 때 볼 수 있는 경고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS8pDs/btsjNL40svo/lFer7Wz3XWoecO5G4iIHYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS8pDs%2FbtsjNL40svo%2FlFer7Wz3XWoecO5G4iIHYK%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;639&quot; height=&quot;85&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;key가 없을 때 볼 수 있는 경고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;특정 위치에 있는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;요소에&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이동,&amp;nbsp;&lt;/span&gt;삽입, 삭제 등의 작업&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이 일어날 경우 &lt;/span&gt;react는&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;각 자식 element를 고유하게 식별할 수 없기에&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 존재하는 자식 element 임에도 다시 랜더링 할 수 밖에 없습니다. 상당히 비효율적이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이는 배열의 규모가 크고 복잡할수록 더욱더 비효율적이게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #23272f; text-align: start;&quot;&gt;4. 배열의 index를 key로 사용하는 것을 지양해야 하는 이유(버그 가능성)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;한편, react는 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;key가 명시되지 않은 경우&amp;nbsp;&lt;/span&gt;기본적으로 &lt;b&gt;배열의 index를&lt;/b&gt; key로 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이는 공식 문서에도 나와 있듯 성능 문제뿐만 아니라,&amp;nbsp; &lt;b&gt;버그를 야기하기도 합니다.&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;예시를 통해 직접 보며 알아봅시다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-1. 예시 코드 &amp;amp;&amp;nbsp; 설명&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시 코드는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686664937999&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 부모 컴포넌트
const Parent = () =&amp;gt; {
  const [names, setNames] = useState([&quot;도밥&quot;, &quot;세인&quot;, &quot;참새&quot;]); // 부모의 배열 상태

  // 배열 요소 삭제 함수
  const deleteName = (targetName) =&amp;gt; {
    const updatedNames = names.filter((name) =&amp;gt; name !== targetName);
    setNames(updatedNames);
  };

  return (
    &amp;lt;div className=&quot;App&quot;&amp;gt;
      {names.map((name, idx) =&amp;gt; (
        &amp;lt;Child key={idx} name={name} deleteName={deleteName} /&amp;gt; // index를 key로 사용
      ))}
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부모 컴포넌트는 크루들의 이름으로 이루어진 배열을 순회하며 자식 컴포넌트를 랜더합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이때 index를 key로 사용했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;pre id=&quot;code_1686665205195&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 자식 컴포넌트
const Child = ({ name, deleteName }) =&amp;gt; {
  const [text, setText] = useState(&quot;&quot;); // 각 자식의 고유 상태

  return (
    &amp;lt;&amp;gt;
      &amp;lt;input
        value={text}
        onChange={(e) =&amp;gt; setText(e.target.value)}
      /&amp;gt;
      &amp;lt;div&amp;gt;{name}&amp;lt;/div&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; deleteName(name)}&amp;gt;
        {`이름 배열에서 ${name} 지우기`}
      &amp;lt;/button&amp;gt;
    &amp;lt;/&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;각 자식 컴포넌트는 고유한 text 상태를 가지고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;독립.gif&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u2uVg/btsjRV6aaxa/VYuSknWwUolGJduBnz4XKk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u2uVg/btsjRV6aaxa/VYuSknWwUolGJduBnz4XKk/img.gif&quot; data-alt=&quot;독립적으로 입력 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u2uVg/btsjRV6aaxa/VYuSknWwUolGJduBnz4XKk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/u2uVg/btsjRV6aaxa/VYuSknWwUolGJduBnz4XKk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;282&quot; height=&quot;284&quot; data-filename=&quot;독립.gif&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;368&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 각 텍스트 상자에 독립적으로 입력이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-2. 삭제 실행 결과... 버그 발생!&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 이름 배열의 &lt;b&gt;맨앞에 있는&lt;/b&gt; '도밥'을 &lt;b&gt;삭제하면 어떻게 될까요?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;의도대로라면 다음과 같이 동작해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;'세인', '참새' 만을 포함한 배열로 &lt;b&gt;리렌더링&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;자식 element는 각 text 상태를 그대로 유지함&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;한번 삭제해 봅시다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;의도하지 않은 동작.gif&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o8ytl/btsjJU2jCMe/JkLsXH3IdbSQaMOGTnEkk0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o8ytl/btsjJU2jCMe/JkLsXH3IdbSQaMOGTnEkk0/img.gif&quot; data-alt=&quot;????&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o8ytl/btsjJU2jCMe/JkLsXH3IdbSQaMOGTnEkk0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/o8ytl/btsjJU2jCMe/JkLsXH3IdbSQaMOGTnEkk0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;279&quot; height=&quot;281&quot; data-filename=&quot;의도하지 않은 동작.gif&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;368&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;삭제는 되었으나, &lt;b&gt;text 상태가 이상합니다! &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이미 삭제된 '도밥'의 text 상태를 '세인'이 가지고 있네요. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;'참새'의 text 상태는 사라지고 엄한 '세인'의 text 상태를 가지고 있습니다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버그가 발생했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-3. 버그의 이유&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버그의 이유는 &lt;a href=&quot;https://ko.legacy.reactjs.org/docs/reconciliation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;구 공식 문서에&lt;/a&gt; 다음과 같이 나와 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;컴포넌트 인스턴스는 key를 기반으로 갱신되고 재사용됩니다.&lt;/b&gt; &lt;br /&gt;배열의 index를 key로 사용하면 항목의 순서가 바뀌었을 때 &lt;b&gt;key 또한 바뀔 것입니다.&lt;/b&gt; &lt;br /&gt;그 결과로&lt;b&gt; 컴포넌트의 state가 엉망이 되거나 의도하지 않은 방식으로 바뀔 수도 있습니다.&lt;br /&gt;&lt;/b&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구 공식문서에서 추천하는 &lt;a href=&quot;https://robinpokorny.medium.com/index-as-a-key-is-an-anti-pattern-e0349aece318&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;index를 key로 사용했을 때의 부정적인 영향 상세 설명 블로그&lt;/a&gt;를 보면 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다음과 같이 말합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;If the key&amp;nbsp;is same as before React assumes that the DOM element represents the same component as before.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;키가 이전과 동일한 경우&lt;/b&gt; React는 DOM 요소가 &lt;b&gt;이전과 동일한 구성 요소를 나타낸다고 가정합니다.&lt;/b&gt;&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;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;위 내용을 토대로 예제를 풀어서 설명하면 다음과 같습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도밥&lt;b&gt;(0)&lt;/b&gt;, 세인&lt;b&gt;(1)&lt;/b&gt;, 참새&lt;b&gt;(2)&lt;/b&gt; 의 key를 가지고 첫 렌더&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도밥 삭제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세인&lt;b&gt;(0)&lt;/b&gt;, 참새&lt;b&gt;(1)&lt;/b&gt; 의 key를 가지고 리렌더&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 react는&lt;b&gt; 0, 1이라는 key를 확인하고 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;기존 0, 1 key에 해당하는 컴포넌트 재사용&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존 0, 1 key에 해당하는 컴포넌트는 각각 '나는 도밥', '나는 세인'&lt;b&gt; text 상태를 가지고 있음.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;의도하지 않은 버그 발생&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4-4. Bug fix !&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이제 버그를 고쳐봅시다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686669896404&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; return (
    &amp;lt;div className=&quot;App&quot;&amp;gt;
      {names.map((name) =&amp;gt; (
        &amp;lt;Child key={name} name={name} deleteName={deleteName} /&amp;gt; // 고유한 key를 사용
      ))}
    &amp;lt;/div&amp;gt;
  );&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부모 컴포넌트에서 &lt;b&gt;고유한 key를&lt;/b&gt; 사용하도록 변경했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;올바른 동작.gif&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wHm6O/btsjO77UZnm/ZWro3RucWXHEBIMJOTLJ40/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wHm6O/btsjO77UZnm/ZWro3RucWXHEBIMJOTLJ40/img.gif&quot; data-alt=&quot;편안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wHm6O/btsjO77UZnm/ZWro3RucWXHEBIMJOTLJ40/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/wHm6O/btsjO77UZnm/ZWro3RucWXHEBIMJOTLJ40/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;292&quot; height=&quot;294&quot; data-filename=&quot;올바른 동작.gif&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;368&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이제 의도한 대로 동작하는 것을 확인할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #23272f; text-align: start;&quot;&gt;번외.&amp;nbsp; key 유무에 따른 렌더링 성능 테스트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #23272f; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;포스팅 당시 마침 &lt;a href=&quot;https://wzrabbit.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;크루 요술토끼&lt;/a&gt;가 &lt;b&gt;key의 유무에 따른 랜더링 성능 테스트를 하고 있었어요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #23272f; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;직관하다가 부탁해서 성능 측정 자료를 제공받았습니다! (고마워요)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #23272f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;1. 테스트 설명&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIH8CG/btsja6upbGL/0lDamcbKgk6Je98cTf1dx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIH8CG/btsja6upbGL/0lDamcbKgk6Je98cTf1dx0/img.png&quot; data-alt=&quot;총 5만개의 div, span&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIH8CG/btsja6upbGL/0lDamcbKgk6Je98cTf1dx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIH8CG%2Fbtsja6upbGL%2F0lDamcbKgk6Je98cTf1dx0%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;349&quot; height=&quot;334&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;총 5만개의 div, span&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;홀수 번째에는 div를, 짝수 번째에는 span을 넣어 총 &lt;b&gt;5만개의 요소가 들어있는 list를 랜더링한 모습입니다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;n번째 요소와 n+1 번째 요소의 위치를 서로 바꾸도록 하고 그 과정에서의 성능을 profiler로 측정한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대조군 1에는 &lt;b&gt;고유한 key를 제공한다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대조군 2에는 &lt;b&gt;key를 제공하지 않는다&lt;/b&gt;.&amp;nbsp;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;대조군 1은 자식요소의 &lt;/span&gt;위치만 변경되었다는 사실을 알 수 있고 &lt;b&gt;자식 컴포넌트는 재사용된다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대조군 2는 모든 자식 요소에게 부여된 새로운 key로 인해 5만개의&lt;b&gt; 자식&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;컴포넌트&lt;/span&gt;가 모두 새롭게 그려진다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 테스트 결과&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음은 profiler로 확인한 결과입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhfOjk/btsjdBf5iUr/du5uxL4ptne9X0y1KF92QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhfOjk/btsjdBf5iUr/du5uxL4ptne9X0y1KF92QK/img.png&quot; data-alt=&quot;Key: 3.7s / no Key: 18.5s&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhfOjk/btsjdBf5iUr/du5uxL4ptne9X0y1KF92QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhfOjk%2FbtsjdBf5iUr%2Fdu5uxL4ptne9X0y1KF92QK%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;423&quot; height=&quot;263&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Key: 3.7s / no Key: 18.5s&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: center;&quot;&gt;Key : 3.7s&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: center;&quot;&gt;no Key : 18.5s&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 조건들은 고려되지 않아 정확하지는 않겠지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;랜더링 성능 측면에서 &lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;key가 주는 영향은 생각보다 엄청나다는 사실을 확인할 수 있었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;끄읏...!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kv2C6/btsjRV6bfru/ycrqt8ybcftTIwKfKibJXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kv2C6/btsjRV6bfru/ycrqt8ybcftTIwKfKibJXk/img.png&quot; data-alt=&quot;공식문서는 언제나 옳다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kv2C6/btsjRV6bfru/ycrqt8ybcftTIwKfKibJXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKv2C6%2FbtsjRV6bfru%2Fycrqt8ybcftTIwKfKibJXk%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Frontend/React</category>
      <category>Key</category>
      <category>key props</category>
      <category>react</category>
      <category>성능측정</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/108</guid>
      <comments>https://think0wise.tistory.com/108#entry108comment</comments>
      <pubDate>Wed, 14 Jun 2023 00:58:20 +0900</pubDate>
    </item>
    <item>
      <title>serialization(직렬화)/deserialization(역직렬화)</title>
      <link>https://think0wise.tistory.com/107</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://solo5star.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;우테코 동료 크루 솔로스타&lt;/b&gt;&lt;/a&gt;의 미션 코드와 리뷰 내용을 보며 학습중, 한 hook 코드에서 &lt;b&gt;다소 생소한 단어들을 발견했어요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;생소한 단어들&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에 대한 의문을 해결하고 기억하기 위한 포스팅이 되겠습니다~!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;s&gt;하나의 스토리처럼 기억하기 위해 hook 추상화 과정도 넣게 되었습니다.&lt;br /&gt;&lt;/s&gt;작성하던 중, context가 자주 바뀌어 글 이해를 방해한다고 생각해 따로 분리하게 되었습니다.(hook 추상화 글 바로가기)&lt;br /&gt;솔로스타에게 허락을 받았음을 미리 알립니다 &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;출발~&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. &lt;b&gt;hydrate&amp;nbsp;/ &lt;b&gt;dehydrate&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1683517528867&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export const usePersistedState = &amp;lt;S = undefined&amp;gt;(key: string, initialState: S) =&amp;gt; {
  const dehydratedState = useMemo(() =&amp;gt; localStorage.getItem(key), [key]);  // &amp;lt;-- 여기 
  const hydratedState = hydratedState === null ? initialState : JSON.parse(dehydratedState);  // &amp;lt;-- 여기 

  const [internalState, internalSetState] = useState&amp;lt;S&amp;gt;(hydratedState);

  useEffect(() =&amp;gt; {
    localStorage.setItem(key, JSON.stringify(internalState));
  }, [key, internalState]);

  return [internalState, internalSetState] as const;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;위 hook 코드&lt;/b&gt;를 보면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;hydrate&lt;/b&gt;, &lt;b&gt;dehydrate&lt;/b&gt;&lt;/span&gt; 등의 생소한 단어들이 보입니다...&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;우선 사전적 의미를 찾아봤어요.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4pnr/btsedapbqeP/xtBZpJUVOhXNV8MmnSVyt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4pnr/btsedapbqeP/xtBZpJUVOhXNV8MmnSVyt1/img.png&quot; data-alt=&quot;papago swag&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4pnr/btsedapbqeP/xtBZpJUVOhXNV8MmnSVyt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4pnr%2FbtsedapbqeP%2FxtBZpJUVOhXNV8MmnSVyt1%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;693&quot; height=&quot;230&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;papago swag&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;'어떤 것'&lt;/b&gt;을 &lt;b&gt;'물'&lt;/b&gt;이라고 은유적으로 표현한 느낌인데... 어느정도 추측만 가능할 뿐,&amp;nbsp; 정확히는 모르겠네요...&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;GPT에게 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;물어보니 보다 명쾌한 대답을 받을 수 있었어요!&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FNJ2p/btseqb14lNj/eyKB7yb9qS21ksiTdDg7H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FNJ2p/btseqb14lNj/eyKB7yb9qS21ksiTdDg7H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FNJ2p/btseqb14lNj/eyKB7yb9qS21ksiTdDg7H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFNJ2p%2Fbtseqb14lNj%2FeyKB7yb9qS21ksiTdDg7H0%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;731&quot; height=&quot;551&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;hydrate&lt;/b&gt;: 간단한 형태로 변환된 데이터를 &lt;b&gt;&lt;b&gt;원래의 복잡한 구조나 객체로 변환하는 과정&lt;/b&gt;&lt;/b&gt;을 일컫는 말(수분 &lt;b&gt;보충&lt;/b&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;dehydrate&lt;/b&gt;: 복잡한 데이터 구조나 객체를&lt;b&gt; 더 간단한 형태로 변환하는 과정&lt;/b&gt;을 일컫는 말(수분 &lt;b&gt;제거&lt;/b&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 이제 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;코드를 다시 봅시다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683533185148&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; const dehydratedState = useMemo(() =&amp;gt; localStorage.getItem(key), [key]);  // &amp;lt;--- 여기 
 const hydratedState = hydratedState === null ? initialState : JSON.parse(dehydratedState);  // &amp;lt;--- 여기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;로컬스토리지에서 불러온, 이미 &lt;/span&gt;&lt;b&gt;간단한 형태로 변환되어있는 값을 &lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;'&lt;/span&gt;&lt;b&gt;dehydrated'&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;State&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변환된 데이터를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;JSON.parse 메서드를 통해&amp;nbsp;&lt;/span&gt;&lt;b&gt;원래의 구조로 재변환한 값을&amp;nbsp; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;'&lt;b&gt;hydrated'&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;State&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;라고 네이밍한 것을 알 수 있네요!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;Serialization(직렬화) / &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;Deserialization(역직렬화)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #374151;&quot;&gt;은유적인 표현을 알고나니, &lt;b&gt;정식 명칭이 궁금했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #374151;&quot;&gt;다시 GPT에게 물어봅시다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UP4I3/btseseJI78l/EZHGa87RdvVYC86TaFzLM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UP4I3/btseseJI78l/EZHGa87RdvVYC86TaFzLM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UP4I3/btseseJI78l/EZHGa87RdvVYC86TaFzLM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUP4I3%2FbtseseJI78l%2FEZHGa87RdvVYC86TaFzLM0%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;723&quot; height=&quot;355&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;serialization(직렬화)&lt;/span&gt; / &lt;span style=&quot;background-color: #dddddd;&quot;&gt;de&lt;b&gt;serialization(역직렬화)&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/b&gt;이라는 명칭을 알려주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조금 더 자세하게 물어봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX6zKi/btsetJpw5WB/2GTBuq8Pn0Bis0Gkjzuu5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX6zKi/btsetJpw5WB/2GTBuq8Pn0Bis0Gkjzuu5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX6zKi/btsetJpw5WB/2GTBuq8Pn0Bis0Gkjzuu5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX6zKi%2FbtsetJpw5WB%2F2GTBuq8Pn0Bis0Gkjzuu5k%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;745&quot; height=&quot;471&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;hydrate / dehydrate와 비슷하지만 &lt;b&gt;&lt;b&gt;데이터 저장, 전송, 공유의 늬양스가 추가되었습니다.&lt;/b&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;serialization&lt;/b&gt;: &lt;b&gt;저장, 전송, 공유에 유리하도록&lt;/b&gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;데이터를 &lt;/span&gt;특정 형식에 맞춰 변환하는 과정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;de&lt;b&gt;serialization&lt;/b&gt;&lt;/b&gt;: 위 이유로 변환된 데이터를&lt;b&gt; 다시 사용하기 위해 원래의 구조로 되돌리는 과정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시를 들면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬스토리지에 값을 저장하기 위해서는 &lt;b&gt;JSON 문자열 형식을 전달해야 합니다(특정 형식)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 위해 우리는 &lt;b&gt;JSON.stringify() 를 사용하죠(변환)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를&lt;b&gt; serialization(직렬화)한다고 할 수 있습니다.&lt;br /&gt;&lt;/b&gt;또한 &lt;b&gt;dehydrate(수분 제거)&lt;/b&gt;&amp;nbsp;라고 은유적으로 표현할 수 있죠.&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬스토리지에서 가져온 값을 사용하기 위해서는 JSON 문자열 형식을 &lt;b&gt;기존 형태로 변환해야합니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 위해 우리는 &lt;b&gt;JSON.parse() 를 사용하죠.(재변환)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 &lt;b&gt;deserialization(역직렬화)한다고 표현할 수 있습니다.&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;또한 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;hydrate(수분 보충)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&amp;nbsp;라고 은유적으로 표현할 수 있죠.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;dehydrate&amp;nbsp;==&amp;nbsp;serialization(직렬화)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;hydrate ==&amp;nbsp;deserialization(역직렬화)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 'de'의 쓰임이 같지 않다는 것에 유의합시다. &lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 사용되는 기술, 데이터 형식 및 처리 방법에 따라 용어들이 조금씩 차이가 있다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Marshalling / Unm&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;arshalling - &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;프로토콜 버퍼(Protocol Buffers), RPC(Remote Procedure Call) 등&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Encoding / De&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;coding - &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;base64 인코딩 등&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. parsing - 번외편&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;parsing&lt;/b&gt;은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;데이터를 읽고 &lt;b&gt;그 안에 포함된 정보를 추출하거나 원하는 형식으로 변경하는 작업&lt;/b&gt;입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;또한 &lt;b&gt;문법을 확인하고 검증하는 작업&lt;/b&gt;도 parsing이라고 표현합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;de&lt;b&gt;serialization과 비슷한 맥락이지만,&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt; parsing이 이를 포함하는&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;더 큰 개념&lt;/span&gt;이라고 할 수 있겠습니다 &lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. hook 코드 다시보기&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1683592419994&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export const usePersistedState = &amp;lt;S = undefined&amp;gt;(key: string, initialState: S) =&amp;gt; {
  const dehydratedState = useMemo(() =&amp;gt; localStorage.getItem(key), [key]); 
  const hydratedState = hydratedState === null ? initialState : JSON.parse(dehydratedState); 

  const [internalState, internalSetState] = useState&amp;lt;S&amp;gt;(hydratedState);

  useEffect(() =&amp;gt; {
    localStorage.setItem(key, JSON.stringify(internalState));
  }, [key, internalState]);

  return [internalState, internalSetState] as const;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단어가 내포한 뜻을 알고나니, 각 코드 라인을 이해하기 쉬워지지 않았나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 개발자와의 원활한 소통을 위해서라도 CS지식은 필수라고 생각드네요... &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;천천히 학습하겠다고 다짐하며 글을 마무리 하겠습니다~!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzkgId/btseoWYQD0R/xgv7YLtz6yC0CSN8bi3xE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzkgId/btseoWYQD0R/xgv7YLtz6yC0CSN8bi3xE1/img.png&quot; data-alt=&quot;기본이 중요하다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzkgId/btseoWYQD0R/xgv7YLtz6yC0CSN8bi3xE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzkgId%2FbtseoWYQD0R%2Fxgv7YLtz6yC0CSN8bi3xE1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>CS</category>
      <category>CS</category>
      <category>dehydrate</category>
      <category>hydrate</category>
      <category>역직렬화</category>
      <category>직렬화</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/107</guid>
      <comments>https://think0wise.tistory.com/107#entry107comment</comments>
      <pubDate>Tue, 9 May 2023 09:56:06 +0900</pubDate>
    </item>
    <item>
      <title>우테코 레벨1 학습 내용 총정리</title>
      <link>https://think0wise.tistory.com/106</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;우테코 레벨1 총정리.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rIO9c/btr79ejZ0nY/LPVsWamcpByil4wYQRPkOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rIO9c/btr79ejZ0nY/LPVsWamcpByil4wYQRPkOK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rIO9c/btr79ejZ0nY/LPVsWamcpByil4wYQRPkOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrIO9c%2Fbtr79ejZ0nY%2FLPVsWamcpByil4wYQRPkOK%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;900&quot; height=&quot;300&quot; data-filename=&quot;우테코 레벨1 총정리.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;레벨1 학습 내용 총정리&lt;/span&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;말도 많고 탈도 많았던 레벨1을 &lt;b&gt;성공적&lt;/b&gt;으로 마무리 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;폭풍처럼 지나간 &lt;b&gt;8주...&lt;/b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;배운 것이 정말 많다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;방대한 학습 내용을 정리하며 &lt;b&gt;지식을 조각모음 해보는 시간을 가져보자!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 뭘 배웠어?&lt;/span&gt; &amp;zwj;♂️&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;관심사의 분리(feat. &lt;b&gt;MVC 패턴)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;컴포넌트&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. MVC 패턴&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음은 MDN에 나와있는 &lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;MVC 패턴의 정의이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MVC는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 소프트웨어의 &lt;b&gt;비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1-1. why MVC? &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;'MVC? &lt;b&gt;프론트엔드에 적용하기엔&amp;nbsp;&lt;/b&gt;구리다는데...' &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;숱하게 들었던 말이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하지만 &lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;'비즈니스 로직과 UI로직의 &lt;/b&gt;&lt;b&gt;분리'&lt;/b&gt;&lt;/span&gt;에 대해 감이 오지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;전체 미션 요구사항 중 &lt;/b&gt;어쩌면 가장 중요하다고 할 수 있었던 핵심이었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 많은 사람들의 노력으로 만들어진 정형화된 패턴을 따라 코드를 작성하며 &lt;b&gt;감을 잡고 싶었다.&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;그중 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;레퍼런스가 가장 많았고, 여러 디자인 패턴의 근본이 된다고 생각하여 &lt;/span&gt;&lt;b&gt;MVC 패턴을 선택해 도입하게 되었다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 미션에 적용하며 직접 느낀 장점, 단점은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;1-2. MVC 패턴의 장점 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;명확한 관심사의 분리&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;console 기반&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;의&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;App을&lt;b&gt; web 기반&lt;/b&gt;으로 변경하는 과정에서 &lt;b&gt;위 장점을 체감했다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1단계에서 구현한 도메인 로직을 (최대한) 수정하지 않고, UI만 변경한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 로또 미션 2단계 요구사항 중 -&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;View를 변경함에 있어서, &lt;b&gt;domain로직의 큰 변화 없이 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;거의 모든 로직을 재사용할 수 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;서로의 관심사가 잘 나뉘어져 있었기에 가능한 일이었다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;가독성 및 코드 흐름 개선&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;디렉터리 &lt;b&gt;및 파일이 각 역할에 맞게 &lt;/b&gt;분리되었고, 이에따라 &lt;b&gt;자연스레 코드의 가독성이 좋아졌다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;App의 전반적인 흐름 또한 파악하기 쉬웠다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;패턴 도입 이전의 코드와 비교하면 정말 월등히 좋아졌다고 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇다면 단점은 무엇이었을까? &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1-3. MVC 패턴의 단점(web) &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffc9af; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;너무 많은 View 로직&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;web 환경에서는 DOM 조작, 사용자 입력 등 &lt;b&gt;컨트롤해야 할&lt;/b&gt; &lt;b&gt;View로직이 너무 많았다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 따라 자연스럽게 View가 커졌고, 이를 분리해야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;App의 규모가 조금만 커져도 무수히 많은 View가 필요했을 것이고, 관리가 힘들었을 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;자연스레 커진 Controller&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;View가 많아지면서, 자연스레 &lt;b&gt;이를 관리하는 Controller 또한 커졌다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;View와 Model 사이의 흐름 제어 역할을 수행하기에 원래도 비교적 로직이 많고 복잡했는데, &lt;b&gt;더 커졌다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;점차 가독성이 나빠졌다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;이벤트 관련 코드를 View, Controller로 나누기 애매함&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자와 인터렉션하는 코드를 작성할 때 &lt;b&gt;View와&amp;nbsp; Controller의 경계가 명확하지 않았다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;input요소로 사용자 입력을 받아&lt;/b&gt; &lt;b&gt;Model을 변화시키려고 한다.&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 위 이벤트의 트리거는 &lt;b&gt;button 요소의 click이다.&amp;nbsp;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1680761777109&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.querySelector('button').addEventListener('click', (e) =&amp;gt; {
	// input 요소의 값을 통해 Model 로직 실행 
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;button의 클릭이 곧 이벤트의 발생이고,&amp;nbsp;이벤트의 발생이 곧 Model의 변화였기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이벤트 등록 코드 및 핸들러 코드의 &lt;b&gt;위치를 나누기 애매했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Controller의 개입이 애매하지 않나... 생각했다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1-4. 결국 중요한것은 관심사의 분리&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MVC를 web에서 적용했을 때의 단점을 체감한 후 더 이상 사용하고 싶지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마침 컴포넌트 기반의 미션이 주어지면서 또 한번 사고의 전환이 필요했고, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;조금씩 MVC의 틀을 허물게 되었다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이후 제일 중요한 핵심은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;'관심사의 분리' 라고 생각했고, &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;'비즈니스, UI 로직 분리'&lt;/span&gt;와 같은 본질적인 부분에 집중하기로 했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 컴포넌트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재사용 가능한 독립 모듈, App을 구성하는 기본단위이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wakZc/btr8u2oSGRJ/Gi2MlGzFyQ72CsF3skNRDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wakZc/btr8u2oSGRJ/Gi2MlGzFyQ72CsF3skNRDk/img.png&quot; data-alt=&quot;블럭!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wakZc/btr8u2oSGRJ/Gi2MlGzFyQ72CsF3skNRDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwakZc%2Fbtr8u2oSGRJ%2FGi2MlGzFyQ72CsF3skNRDk%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;225&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;블럭!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. 컴포넌트에 대한 관점 변화 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미션3 초반) 도메인 데이터를 통해 동적으로 랜더 가능하면 &lt;b&gt;컴포넌트!&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미션3 중반) 상수 데이터로 랜더 가능한, 반복되는 태그들(ex. select - option)도 분리 - &lt;b&gt;이것도 컴포넌트!&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미션3 마지막) 자신의 이벤트를 가지면서 핸들러로직을 주입받아 랜더 + 이벤트 등록 가능&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;해야&amp;nbsp;&lt;/span&gt;&lt;b&gt;컴포넌트!&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;미션4) &lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;도&lt;/span&gt;메인과 관련없이 재사용 가능한 범용 컴포넌트 VS 도메인 종속적인 컴포넌트&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2-2. 범용 컴포넌트 vs 도메인 종속 컴포넌트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;범용 컴포넌트&lt;/span&gt;와 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;도메인 종속 컴포넌트&lt;/span&gt;는&lt;/b&gt; 개인적으로 가장 의미있었고, 또한 중요한 개념이라고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어쩌면 당연한 개념이지만, &lt;b&gt;미션중에는 개념이 확립되지 않고 &lt;b&gt;&amp;nbsp;마구&amp;nbsp;&lt;/b&gt;&lt;b&gt;뒤섞여 &lt;/b&gt;혼동이 왔었다.&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://github.com/woowacourse/javascript-movie-review/pull/98&quot;&gt;미션4 step2 PR&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에 첨부한&amp;nbsp;&lt;/span&gt;&lt;b&gt;구조도를 보면 혼동과 고통의 흔적이 남아있다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;장장 3일간의 사투를 복기해보자.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #006dd7;&quot;&gt;&lt;b&gt;2-2-1. 바라던 구조(&lt;/b&gt;하위 컴포넌트를 상위에서 전달 / 범용 컴포넌트)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLxzts/btr8xWBxPNs/ogjnTF6gkGJk9CgpPm4WHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLxzts/btr8xWBxPNs/ogjnTF6gkGJk9CgpPm4WHK/img.png&quot; data-alt=&quot;바라던 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLxzts/btr8xWBxPNs/ogjnTF6gkGJk9CgpPm4WHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLxzts%2Fbtr8xWBxPNs%2FogjnTF6gkGJk9CgpPm4WHK%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;550&quot; height=&quot;133&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;182&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MovieList, Modal처럼 &lt;b&gt;컨텐츠가 있는 컴포넌트는&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;상위 컴포넌트인 App을 통해 하위 컴포넌트(Card, DetailCard)를 전달 받는 구조로 구성하고 싶었다.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이유는 간단하다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Modal은 컨텐츠가&amp;nbsp;&lt;b&gt;무엇인지는 관심이 없고&lt;/b&gt;, 어떤 컨텐츠던&lt;b&gt; 전달 받아 랜더링 하는 역할만 가지도록 하고 싶었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;즉, 도메인에 종속되지 않고 재사용 가능한&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;범용 컴포넌트로&lt;/span&gt;&amp;nbsp;만들고 싶었다는 말이다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;피드백을 받기 전까지는 위 구조가 맞다고 생각했다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;반드시 전달 하는 구조로 구성하고 싶었지만, &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;결과는 실패&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;읽는 입장에서 &lt;b&gt;여러 의문이 들겠지만&lt;/b&gt; 잠시 접어두고&lt;b&gt; 최종 구조를 먼저 보자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;2-2-2. 최종 구조&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;하위 컴포넌트를 직접 import / 도메인 종속 컴포넌트)&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3IKjn/btr8u9VX461/U8fqMdOv4CkPwFohbOJRKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3IKjn/btr8u9VX461/U8fqMdOv4CkPwFohbOJRKk/img.png&quot; data-alt=&quot;최종 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3IKjn/btr8u9VX461/U8fqMdOv4CkPwFohbOJRKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3IKjn%2Fbtr8u9VX461%2FU8fqMdOv4CkPwFohbOJRKk%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;247&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;309&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; MovieList, Modal 컴포넌트가 &lt;b&gt;하위 컴포넌트&lt;b&gt;(Card, DetailCard)&lt;/b&gt;를 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;import 하여 직접적으로 알고 있다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;import를 통해 컨텐츠를 직접 알아버리면,&amp;nbsp;&lt;/span&gt;&lt;b&gt;도메인 종속적인 컴포넌트가&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;되어버려 재사용 할 수 없다...&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;피드백을 받기 전까지는 틀린 구조라고 생각했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2-3. &lt;span style=&quot;color: #000000;&quot;&gt;간단했던 해결 방법 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오랜 시간 고민했던 부분이고, 틀렸다고 생각했기에 리뷰어어게 도움을 청했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음은 리뷰어의 피드백 내용중 일부이다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 구조가 &lt;b&gt;일반적인 컴포넌트 멘탈모델에 부합하지 않나 싶은데...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 모든 컴포넌트가 App에서 관리되어야한다고 생각한 이유가 궁금합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Modal을 extend하는 MovieDetailModal을 별도로 구성해보면 어떨까 싶어요.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 그렇게한다면 Modal자체는 도메인을 알지 않는 일반적인 UI컴포넌트로 남을 수 있을거라는 생각이 있어요.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오히려 최종 구조가 일반적이라는 말씀을 해주셨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Modal은 내가 원하던 대로 범용적으로 유지하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 상속받는 도메인 종속적인 컴포넌트를 만들어 사용하면 되는 것이었다...!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고민이 무색하게도... 해결방법은 간단했다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2-4. 틀리지 않았다. 정답도 없다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Modal을 범용 컴포넌트로 잘 설계 했음에도,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'상위에서 컨텐츠를 전달받아야 한다'라는 스스로 세운 규칙 때문에 더 나아가지 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;행동을 과하게 제한하는&amp;nbsp;규칙에 대해 의심을 하지 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오히려 규칙에 맞지 않는 방법들을&amp;nbsp;&lt;b&gt;틀렸다고 단정지었다...&lt;/b&gt; &amp;zwj;♂️ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 삽질 경험으로 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;범용 컴포넌트, &lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;도메인 종속 컴포넌트&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;/span&gt;에 대한 개념을 확실하게 채울 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 현재 컴포넌트에 대한 개념을 실시간으로 확장중이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴포넌트와 관련된 여러&amp;nbsp;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://fe-developers.kakaoent.com/2022/221020-component-abstraction/&quot;&gt;아티클을 보며&lt;/a&gt;&amp;nbsp;생각을 넓혀나가고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실질적인 코드의 차이 없이 이름만으로도 구성이 맞고 틀리고가 가능하다는걸 알아가면 좋지 않을까 생각해봅니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 리뷰어의 한마디 -&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레벨1에서의 삽질이 레벨2의 나에게 큰 도움이 될거라고 생각한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 테스트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작성한 코드가 의도대로 동작하는 지 검증할 수 있는 수단이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발자들에게는 프로덕션 코드의 설명서 역할로 사용되기도 하고, 코드에 대한 검증을 통해 심리적 안정을 주기도 한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리팩토링이 필요한 상황에서 유연한 대응을 도와주는 역할도 한다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edxIU6/btr8znNuzUw/ZWaAkLhYccN6n9XH4eIFj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edxIU6/btr8znNuzUw/ZWaAkLhYccN6n9XH4eIFj0/img.png&quot; data-alt=&quot;테스트 피라미드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edxIU6/btr8znNuzUw/ZWaAkLhYccN6n9XH4eIFj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedxIU6%2Fbtr8znNuzUw%2FZWaAkLhYccN6n9XH4eIFj0%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;666&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테스트 피라미드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-1. 단위 테스트(Unit) - 테스트 하기 좋은코드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단위테스트의 장점들을 체감한 이후로는, '&lt;b&gt;테스트 하기 좋은 코드란 무엇인가?' &lt;/b&gt;에 대해 고민했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;같은 input에 대해 같은 output을 보장하는 코드(함수)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;output을 예측하기 쉬운 코드 === 코드가 의도대로 동작하는지 검증하기 쉽다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;제어할 수 없는 값, 동작에 의존하지 않는 코드&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제어할 수 없는 값, 동작 -&amp;gt; Random / Date , 사용자 input, API 호출 등의 코드&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 대상 코드(함수)에 위 동작이 혼재하면, 테스트 하기 어렵다. (mocking등 추가적인 처리를 해주어야 함)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;제어할 수 있는 값(제어해야 하는 값)만 제어하는 코드는&lt;/b&gt; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;관심사가 잘 분리되었을 확률이 높고&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 코드는 &lt;b&gt;다시 테스트 하기 좋은 코드로 귀결된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉, 테스트 하기 좋은 코드 == 좋은 코드라고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단위테스트 시 &lt;b&gt;mocking&lt;/b&gt;이 필요하다면, &lt;b&gt;먼저&lt;/b&gt; &lt;b&gt;관심사가 제대로 분리되지 않은 코드인지 생각해 보자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다행히?! 아직까지는 mocking이 필요한 적이 없었다. (Domain 로직에 대해서는 분리를 잘 하지 않았나...)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로도 최대한 경계해 볼 생각이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-2. E2E 테스트(feat. cypress)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생각보다 어렵지 않았던 E2E 테스트(빙산의 일각이라 그런 것 같다..ㅎ)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서비스를 이용하는 사용자의 입장에 서서 flow를 테스트 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 요청에 대해 &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;미리 만들어 놓은 고정된 응답(fixture)을 받게 해주는 &lt;/span&gt;intercept()&lt;/b&gt;도 사용해 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;cypress Custom command를 만들어&lt;/b&gt; &lt;b&gt;가독성을 높여보기도 했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;E2E 테스트를 작성하며 &lt;/span&gt;의미있는 수준의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;장, 단점을&lt;/span&gt; 느끼지는 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;unit 테스트에 비해 아직 경험치가 낮아 그렇다고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레벨2 미션에서도 추가로 적용하고 학습해 보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;꽉꽉 눌러담은 레벨1  &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아쉬운 부분이 있긴하지만 &lt;b&gt;정말 꽉~ 채워 학습했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mlu4x/btr8KIXZvRj/0k1tKGKlTPtYSkHxAB0JBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mlu4x/btr8KIXZvRj/0k1tKGKlTPtYSkHxAB0JBk/img.png&quot; data-alt=&quot;푸짐하다 푸짐해!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mlu4x/btr8KIXZvRj/0k1tKGKlTPtYSkHxAB0JBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmlu4x%2Fbtr8KIXZvRj%2F0k1tKGKlTPtYSkHxAB0JBk%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;313&quot; height=&quot;298&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;푸짐하다 푸짐해!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총 정리 포스팅을 통해 학습했던 지식이 넘쳐 흐르지 않도록 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잘 눌러 담은 것 같아 기분이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;잘 쉬고 잘 소화해서 레벨2에도 가득 먹어보자!&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>5기</category>
      <category>e2e테스트</category>
      <category>MVC패턴</category>
      <category>단위테스트</category>
      <category>우아한테크코스</category>
      <category>우테코</category>
      <category>컴포넌트</category>
      <category>테스트</category>
      <category>프론트엔드</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/106</guid>
      <comments>https://think0wise.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 6 Apr 2023 21:56:35 +0900</pubDate>
    </item>
    <item>
      <title>22년의 이도현</title>
      <link>https://think0wise.tistory.com/105</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다니던 회사를 그만두고 프로그래밍 공부에 전념해야겠다고 다짐한 후 벌써 1년이 흘렀다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;22년을 마무리하는 시점에서 지난 1년 동안 이루어 낸 것들과 아쉬웠던 부분을 정리해 보고,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;23년 목표를 설정해 보려고 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TICqT/btrUV39pHcN/KbTOwaVXW2aSsiefKrUKpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TICqT/btrUV39pHcN/KbTOwaVXW2aSsiefKrUKpk/img.png&quot; data-alt=&quot;이 열정 내년에도 가득하기를&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TICqT/btrUV39pHcN/KbTOwaVXW2aSsiefKrUKpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTICqT%2FbtrUV39pHcN%2FKbTOwaVXW2aSsiefKrUKpk%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;925&quot; height=&quot;216&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 열정 내년에도 가득하기를&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #a6bc00;&quot;&gt;&lt;b&gt;22년에 이루어 낸 것들&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개발과 관련된 기반 지식을 많이 쌓았다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멀게만 느껴졌던 &lt;b&gt;서버, DB 와 같은 분야를 가볍게나마 배워보면서&lt;/b&gt; &lt;b&gt;전체적인 웹의 흐름을 조금 더 이해할 수 있게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한&lt;b&gt; 알고리즘과 자료구조에 대한 공부를 통해 구현능력과 사고력도 높아진 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자바스크립트 코어도 꾸준히 학습하면서 기본 동작 방식에 대한 이해도 할 수 있었다.&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;처음으로 누군가에게 도움 되는 서비스를 만들었다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;친구의 업무 환경을 개선해 줄 수 있는 서비스를 만들어 실제로 유의미한 성과를 냈는데,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해 &lt;b&gt;내가 공부하고 있는 방향에 대한 불확실한 마음을 덜어 낼 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 프로젝트를 통해&lt;b&gt; 나에게 어떤 부분이 부족한지 명확하게 알게 되었다.&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;우아한테크코스 5기 프론트엔드 과정에 최종 합격했고, 많은 것을 배웠다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxHKE/btrUWRt4yVO/1srtGVuBSMJiVCEXFPDoU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxHKE/btrUWRt4yVO/1srtGVuBSMJiVCEXFPDoU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxHKE/btrUWRt4yVO/1srtGVuBSMJiVCEXFPDoU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxHKE%2FbtrUWRt4yVO%2F1srtGVuBSMJiVCEXFPDoU1%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;535&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회고를 쓰는 지금 이 순간에도 어안이 벙벙하다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지원 준비 과정, 4주간의 프리코스, 1차 합격자 발표 및 최종 테스트까지 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대략 5개월간의 긴 여정 끝에 운이 좋게도 합격하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 시간 동안 &lt;b&gt;클린 코드와 OOP, 테스트 코드와 같이 막연했던 부분들을 정면돌파하며 배울 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #ef6f53;&quot;&gt;&lt;b&gt;22년에 아쉬웠던 것들&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작은 조각들로 이루어진 지식들을 하나로 모으지 못했다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Javascript, React, TypeScript, Node, Express, mySQL과 같은 언어나 기술부터&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자료구조, 알고리즘, CS, 네트워크처럼 개발의 근본이라고 할 수 있는 것들까지...&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나의 뇌 속에 &lt;b&gt;정리되어 있지 않은 상태로 여기저기 흩어져 있는 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;하나라도 더욱더 확실하게 파고들었어야 한다는 아쉬움이 든다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가벼운 토이 프로젝트라도 다양하게 시도했어야 한다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;22년에는 1개의 프로젝트만 만들었는데, 작은 것이라도 여러 개 만들어 봤으면 어땠을까 생각이 든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TS, 서버 등등 다양한 것을 배웠지만, &lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;실제로 이것들을 적용해서 프로젝트를 만들어보는 것만큼 더 좋은 복습은 없었을 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;그러지 못한 것이 아쉽다.&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 &lt;b&gt;지금까지 만든 2개의 프로젝트에서 느꼈던 부족한 점이 많은데&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;새로운 프로젝트를 만들면서 이를 보완해 보는 시간을 가졌다면 더 좋았을 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #0593d3;&quot;&gt;&lt;b&gt;23년에 이루어 낼 것들&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당장 1월 2일부터 평일에는 아르바이트, 주말에는 서울에서 생활할 방을 구하러 다녀야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2월부터 시작되는 우테코를 위해 마음가짐을 바로 하는 시간이 될 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 후에는 12월까지 10개월간 진행되는 우테코 5기 과정을 잘 마치고 싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우테코를 통해 성장해서 &lt;b&gt;누구나 함께 일하고 싶은 개발자가 될 것이다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기술적으로는 &lt;/b&gt;&lt;b&gt;&lt;b&gt;현재 사용 중인 react를 보다 명확한 목적을 가지고 사용할 수 있도록 공부할 것이다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이후 서버와 ssr에 대한 공부를 바탕으로 next.js 를 꼭 배워 사용해 볼 것이다.&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&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;23년 이후의 내가 바로 취업할 수 있도록,&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;그에 맞는 실력을 가질 수 있도록 노력해야한다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;좋은 동료들도 많이 알고 싶고 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;나 역시 그들에게 좋은 동료가 됐으면 좋겠다 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조금만 더 힘내자!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxdwAa/btrUV2Xe38q/ibNjkK9TsTs4iv8Y3WZKrk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxdwAa/btrUV2Xe38q/ibNjkK9TsTs4iv8Y3WZKrk/img.jpg&quot; data-alt=&quot;고생했다 22년! 잘가라!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxdwAa/btrUV2Xe38q/ibNjkK9TsTs4iv8Y3WZKrk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxdwAa%2FbtrUV2Xe38q%2FibNjkK9TsTs4iv8Y3WZKrk%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;807&quot; height=&quot;514&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;고생했다 22년! 잘가라!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>22년회고</category>
      <category>23년 목표</category>
      <category>우테코</category>
      <category>우테코 최종합격</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/105</guid>
      <comments>https://think0wise.tistory.com/105#entry105comment</comments>
      <pubDate>Fri, 30 Dec 2022 18:39:20 +0900</pubDate>
    </item>
    <item>
      <title>우테코 프론트엔드 5기 - 최종 코딩 테스트 후기</title>
      <link>https://think0wise.tistory.com/104</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;우테코 최종.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwa41R/btrTT7Y7hHy/iFDz9iXEj8ko0yk7lSfFy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwa41R/btrTT7Y7hHy/iFDz9iXEj8ko0yk7lSfFy0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwa41R/btrTT7Y7hHy/iFDz9iXEj8ko0yk7lSfFy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdwa41R%2FbtrTT7Y7hHy%2FiFDz9iXEj8ko0yk7lSfFy0%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;900&quot; height=&quot;300&quot; data-filename=&quot;우테코 최종.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;12월 17일 토요일, 최종 코딩 테스트를 치렀다.&lt;br /&gt;이번 후기에서는 프리코스 종료부터 시험 이후의 복기까지의 과정과&amp;nbsp;&lt;br /&gt;우테코 지원 과정을 최종적으로 마치며 드는 생각을 정리해 보려고 한다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  1차 합격자 발표까지 주어진&amp;nbsp; 3주&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프리코스 4주 차를 마치고, 1차 합격자 발표까지는 3주 정도의 시간이 있었는데,&lt;br /&gt;프리코스 종료 안내 메일에서는 2~4주 차 미션을 다시 구현해 보길 권했다.&lt;br /&gt;매주 미션을 진행하면서도 스스로 부족함을 느낀 부분이 많았고,&lt;br /&gt;&lt;b&gt;제출했던 미션 코드를 보면서 경악을 했던 기억도 있던 터라 자체적으로 프리코스를 연장해서 진행했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;zwj;♀️&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;기존 미션 복습&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프리코스 종료 이후 바로 &lt;b&gt;숫자 야구, 로또, 다리 건너기 미션을 복습했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;복습을 하면서, 이전 제출 코드와는 확연히 비교되는 코드를 작성할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 이미 한 번씩 구현해 본 기능들이라 익숙하기도 했지만, &lt;b&gt;이를 감안하더라도 분명한 발전이 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간단히 정리하자면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;새로운 클래스로 기능을 나누고자 할 때, 분리의 기준이 생겼다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;분리를 통해 어떤 필드 변수를 생성하게 될지, &lt;/b&gt;&lt;b&gt;분리로 인한 이점과 단점은 어떤 것일지 생각하고 분리할 수 있게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;기존에 비해 &lt;/b&gt;생각할 시간이 더 필요해졌는데, &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이전까지는 너무 가볍게 생각하며 분리한 게 아닌가 싶다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXq0XS/btrTZzgaZHm/DFQ4pONxDDFLYAXsossj71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXq0XS/btrTZzgaZHm/DFQ4pONxDDFLYAXsossj71/img.png&quot; data-alt=&quot;밑줄 친 필드는 모두 같은 데이터이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXq0XS/btrTZzgaZHm/DFQ4pONxDDFLYAXsossj71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXq0XS%2FbtrTZzgaZHm%2FDFQ4pONxDDFLYAXsossj71%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;285&quot; height=&quot;306&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;306&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2주 차 미션 제출 코드를 보면 &lt;b&gt;기준 없는 클래스 분리의 결과가 그대로 나타난다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 클래스에 같은 데이터인 &lt;b&gt;필드가 3개나 중복되어 존재한다.&lt;/b&gt; 물론 중복되어 존재할 이유가 없다.&lt;b&gt;&lt;br /&gt;이제는 더 이상 이런 코드를 작성하지 않을 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트에 대한 생각을 하며 기능 &lt;b&gt;코드 작성을 &lt;/b&gt;할 수 있게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;제어할 수 없는 코드가 무엇인지 구분할 수 있게 되었고, &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 인지해서 미리&amp;nbsp;&lt;b&gt;도메인 로직에서 분리할 수 있도록 코드를 작성하는 능력이 생겼다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 코드를 도메인 로직이 있는 클래스에서 사용하게 되었을 때, 테스트가 어려워진다는 사실을 4주 차에서 경험했기 때문이다.&lt;b&gt;&lt;br /&gt;또한 '좋은 코드란 무엇인가?'에 대해 테스트를 관점으로 생각할 수 있는 능력도 생겼다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/balyaY/btrTSMOK1Bv/MvhZE15P4G4oYzpKmhsO9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/balyaY/btrTSMOK1Bv/MvhZE15P4G4oYzpKmhsO9k/img.png&quot; data-alt=&quot;4주 차 제출 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/balyaY/btrTSMOK1Bv/MvhZE15P4G4oYzpKmhsO9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbalyaY%2FbtrTSMOK1Bv%2FMvhZE15P4G4oYzpKmhsO9k%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;458&quot; height=&quot;192&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4주 차 제출 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음엔 제어할 수 없는 코드의 개념을 몰랐기에 흐름이 자연스럽다고 생각하면 그대로 작성했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개념을 알고 난 후에는 코드의 문제점을 파악하여 리팩토링할 수 있게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최종적으로 현재는, 처음부터 충분한 생각을 통해 제어할 수 없는 코드를 도메인 로직에서 분리할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 아직 미션과 같은 콘솔 미니게임 형식 외의 코드에서 해당 상황을 접한 적은 없지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이런 부분들도 고려해야 한다는 것을 인지하게 된 것만으로도 큰 발전이라고 생각한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;zwj;♀️&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;커스텀 미션 만들어 풀어보기!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미션 복습 이후에는 &lt;b&gt;&lt;a href=&quot;https://github.com/Creative-Lee/javascript-weapon_upgrade&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;무기 강화 게임 커스텀 미션&lt;/a&gt;을 만들어 커뮤니티에 공유하고, 직접 풀어보기도 했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 최종 테스트 기회가 주어진다면 &lt;b&gt;새로운 미션을 마주해야 했기 때문에 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;과연 새로운 미션에서도 학습한 내용을 녹여낼 수 있을지 테스트해보고 싶었기 때문이다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체적인 틀은 4주 차 미션을 바탕으로 잡았고, 테스트 코드를 비롯한 조건을 변형하여 미션을 만들었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이후 완성된 커스텀 미션을 풀어보고 스터디원과 코드 리뷰하는 시간을 가졌는데,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프리코스에서 학습한 내용을 바탕으로 좋은 피드백을 주고받을 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;또한 해당 미션을 우테코 지원자 커뮤니티에도 공유했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/naYB6/btrT0SNL134/hhoKkxXxcTjJd4oA3zTRK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/naYB6/btrT0SNL134/hhoKkxXxcTjJd4oA3zTRK1/img.png&quot; data-alt=&quot;기분이 이상하더이다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/naYB6/btrT0SNL134/hhoKkxXxcTjJd4oA3zTRK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnaYB6%2FbtrT0SNL134%2FhhoKkxXxcTjJd4oA3zTRK1%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;1014&quot; height=&quot;339&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기분이 이상하더이다...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sY7YP/btrTRClN8Iw/vEnPsf0sgYNJKvDycX74K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sY7YP/btrTRClN8Iw/vEnPsf0sgYNJKvDycX74K0/img.png&quot; data-alt=&quot;하하...ㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sY7YP/btrTRClN8Iw/vEnPsf0sgYNJKvDycX74K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsY7YP%2FbtrTRClN8Iw%2FvEnPsf0sgYNJKvDycX74K0%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;314&quot; height=&quot;54&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;54&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 결과... 인생 처음으로 누군가 내 저장소를 fork 하는 경험을 할 수 있었고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미션의 완성도는 낮았겠지만, 지원자 동료들에게 작게나마 도움이 된 것 같아 뿌듯했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;가져가서 풀어주신 분들께 감사하다는 말씀을 전합니다! &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  1차 심사 발표 결과 합격!!&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇게 3주가 흘러 합격자 발표 당일 오후...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 프리코스를 후회 없이 마쳤기 때문에 덤덤하면서도, 기대 반 걱정 반으로 메일을 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnMdwp/btrT4ddzZsl/CBqr6fbBd1GlxkVL5NDve0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnMdwp/btrT4ddzZsl/CBqr6fbBd1GlxkVL5NDve0/img.png&quot; data-alt=&quot;감격...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnMdwp/btrT4ddzZsl/CBqr6fbBd1GlxkVL5NDve0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnMdwp%2FbtrT4ddzZsl%2FCBqr6fbBd1GlxkVL5NDve0%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;611&quot; height=&quot;219&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;219&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;결과는 1차 합격...&lt;/b&gt; 메일 확인하면서 '됐다!' 하며 크게 소리 질렀던 게 기억난다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  오프라인 테스트... 5시간의 시간 제한...&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 5분쯤 1차 합격의 기쁨을 누렸을까... &lt;b&gt;갑자기 엄청나게 긴장이 되기 시작했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;최종 코딩 테스트는 오프라인 테스트였고, 5시간이라는 한정된 시간 동안 최종 미션을 구현해야 했다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;자랑은 아니지만... &lt;b&gt;사실 나는 실력에 대해 평가를 받은 경험이 없었다...&lt;/b&gt; &lt;br /&gt;(현재는 '우테코 오프라인 최종 테스트' 라는 경험이 생겼다 )&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;흔하다면 흔한 온라인 코딩 테스트 응시 경험도 없었고, &lt;br /&gt;프로그래밍 공부를 시작하기 전에 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;근무했던 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;직장들도 면접 외에&amp;nbsp; '테스트'의 개념은 없는 회사였다...&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  최종 코딩 테스트 까지... 단 3일&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;발표 당일인 수요일부터 최종 테스트 날인 토요일까지&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt; 수, 목, 금&amp;nbsp; 딱 3일이 남았었다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당장 내가 해야 할 것은 무엇인가 생각해 봤고, &lt;b&gt;시간 내에 과제를 구현하는 연습이라고 생각했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;사실 프리코스 과정에서 스스로 구현 속도가 느리다는 것을 어림 짐작으로 느끼고 있었다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아침 9시부터 새벽까지 매일 구현했는데도 막상 구현한 것은&amp;nbsp; 얼마 되지 않는 상황이 여러 번 있었다. 대부분 가까스로 끝냈던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;때문에 남은 3일을 &lt;b&gt;구현 연습에 모두 &lt;/b&gt;사용하기로 했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;기능 구현 목록 작성 연습&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나는 구현 과제의 시작이었던&lt;b&gt; 2주 차 미션에서 기능 구현 목록 작성에만 하루 이상이 걸렸었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A1aSZ/btrTVhojjKF/2YuKe0O7iwrKDACaDTgdMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A1aSZ/btrTVhojjKF/2YuKe0O7iwrKDACaDTgdMK/img.png&quot; data-alt=&quot;2주 차 공통 피드백&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A1aSZ/btrTVhojjKF/2YuKe0O7iwrKDACaDTgdMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA1aSZ%2FbtrTVhojjKF%2F2YuKe0O7iwrKDACaDTgdMK%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;571&quot; height=&quot;113&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2주 차 공통 피드백&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 2주 차 공통 피드백을 통해 첫 작성 시 내용을 간소화하고자 했고, 구현하며 업데이트하는 식으로 개선했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼에도 목록 작성에 꽤나 많은 시간을 소모했다고 생각했기에, &lt;b&gt;기능 구현 목록 작성을 따로 연습했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2~4주 차 미션부터 커스텀 미션까지 구현 목록만 쭉 써보면서 시간을 최소한으로 사용하려고 했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;연습을 하면서 느꼈던 점은&lt;b&gt;&amp;nbsp;애플리케이션의 전체적인 흐름을 이해하는 것이 제일 중요하다는 점이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;흐름을 충분히 잘 이해했다면, 세부적인 조건과 제약사항은 그때그때 녹여낼 수 있다고 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;커스텀 미션 모의 고사 결과...&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 테스트 하루 전 금요일에는 스터디원이 만들어 공유해 준 커스텀 문제를 받아 1시부터 6시까지 모의고사를 진행해 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 환경과 비슷하면 좋지 않을까 싶어 근처 도서관 노트북 코너에서 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과는 좋지 않았다.&lt;/b&gt; 2/5 정도만 구현할 수 있었고 시간이 한참 부족했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스스로 복기해 보니 대부분의 시간을 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;클래스 분리, 특정 기능 메서드의 위치 고민, 파일 분리, 변수명 고민에 사용하고 있었다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평상시에 프로그래밍을 공부하면서 시간의 제약을 둘 일은 없었고, 그나마 촉박했던 것은 친구를 위한 개인 프로젝트였는데,&amp;nbsp; &lt;br /&gt;이 역시도 강제성이 있던 것은 아니었기 때문에 스스로 시간 조절을 할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시간의 제약이라고는 취업하기 전까지 나이를 먹어 가는 것 말고는 없었던 나로서는&lt;br /&gt;어쩌면 당연한 결과일 수도 있겠다며 스스로 위로했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 '조금 더 과감하게, 어떻게든 구현해 봐야겠다.' 생각하며 마인드 컨트롤을 하고 잤던 게 기억난다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  대망의 최종 코딩 테스트&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아침부터 눈이 펑펑 오는 바람에 예매해둔 시외버스 티켓을 취소하고 지하철로 잠실에 도착했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간단히 식사를 마치고 생리현상도 미리 해결한 뒤 건물에 입성했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고마웠던 스터디원분들에게 하나씩 드릴 겸 나도 하나 마시려고 1층 약국에서 박카스도 한 박스 샀다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시험장에 들어가고 나서부터 긴장이 시작되었다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;몇몇 스터디원분들을 만나 가볍게 대화하면서 화이팅도 하고, 자리 양옆 분들과도 괜히 막 인사 주고받고 그랬었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그럼에도 좀처럼 긴장이 사그라들지 않았다.&amp;nbsp;&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러던 중 시험 시작 전 안내 사항 메일을 먼저 받았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvZM5j/btrT4Qo6djx/yaA3UuKEIHIk91ma52vQMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvZM5j/btrT4Qo6djx/yaA3UuKEIHIk91ma52vQMk/img.png&quot; data-alt=&quot;시험 시작 전 안내 메일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvZM5j/btrT4Qo6djx/yaA3UuKEIHIk91ma52vQMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvZM5j%2FbtrT4Qo6djx%2FyaA3UuKEIHIk91ma52vQMk%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;756&quot; height=&quot;269&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;269&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;br /&gt;전날 밤에 했던 구현 시간에 대한 고민과 함께 &lt;b&gt;어떻게든 구현해 보자며 마인드 컨트롤했던 것이 생각나는 대목이었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇게&lt;b&gt; '보여지는 것에 신경 쓰지 않고, 돌아가는 쓰레기를 완성해 보자!' 다짐하며&lt;/b&gt; &lt;b&gt;긴장을 조금 덜어낸 뒤 시험을 시작했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;실전 경험의 중요성을 느끼다.&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;제목 그대로다.&lt;br /&gt;복기해 보자면, 정말 마지막 2시간 정도는 무아지경으로 코딩하지 않았나 싶다..&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;시작은 좋았다. &lt;br /&gt;연습했던 덕분에 기능 구현 목록 작성과 애플리케이션 파악은 대략 15분 정도 만에 해결할 수 있었다.&amp;nbsp;&lt;br /&gt;초반부터 중반까지는 나쁘지 않은 페이스로 &lt;b&gt;적당한? 쓰레기 코드를 써 내려가면서 기능을 구현했다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이때까지만 해도 적당히 시간을 남겨서&lt;b&gt; 반드시 코드 리팩토링을 해야겠다고 생각하기도 했다. (그저 꿈이었다..)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;이 시점에 긴장도 거의 다 풀렸던 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;하지만 시간이 흐를수록 사소한 에러 하나에도 멘탈이 정말 많이 흔들렸고, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;압박 속에서 기능 에러에 유연하게 대처하지 못했다.&lt;/b&gt;&lt;br /&gt;특히 애플리케이션의 마지막 2개의 기능이었던 메뉴 추천 기능, 최종 추천 결과 출력 기능은 &lt;b&gt;정말 앞만 보고 달렸다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;그렇게 종료시간 약 50분 정도를 남겨놓고 기능을 전부 구현했지만, &lt;b&gt;테스트 케이스에서 에러가 발생했다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;하필 문제가 발생한 코드는&lt;b&gt; 앞만 보고 내달렸던 메뉴 추천 기능. 정신없이 디버깅하면서 이유를 찾고자&lt;/b&gt; &lt;b&gt;했다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;남은 시간 모두를 디버깅에 쏟아부었고, &lt;b&gt;의심 가는 부분을 찾긴 했지만&lt;/b&gt; &lt;b&gt;끝내 &lt;/b&gt;&lt;b&gt;에러를&amp;nbsp; 잡지 못한 체 제출했다.&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;제출 소감문은 정말 점 하나 찍어 냈다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시험이 종료되고 한동안 자리를 떠나지 못했다.&lt;br /&gt;&lt;b&gt;돌아가는 쓰레기를 만들고자 함이 목표였는데, 돌아가지도 않는 쓰레기를 만들었다는 생각을 했던 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜 찾지 못했을까... 이유가 뭐였을까... 그렇게 한 30분 정도 생각에 잠겼던 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고민 끝에 &lt;b&gt;시간을 우선시 한 나머지, 뒤가 없는 코딩을 했기 때문이라고 결론지었고 짐을 쌌다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;뒤를 보니 코치님들이 모두 기다리고 계셨다... 시험 장소 정리를 하려고 하신 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;토요일이라 빨리 퇴근하고 싶으셨을 텐데 &lt;b&gt;정리해야 한다는 말 한마디 없이 그냥 기다려주고 있던 코치분들께 너무 감사하고 죄송하다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시험장 건물을 나와서는 조금 멍한 상태로 주변을 정처 없이 걸어 다녔다...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기저기 걷다가 추워서 지하철역에 들어갔는데, 그때 정신을 딱 차렸다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;인생에서 이제 한 번 경험한 건데 처음부터 잘 할 순 없다고 위로했고, 털어버렸다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 id=&quot;%F-%-F%--%A-%---%EC%A-%BC%--%EC%B-%A-%--%EA%B-%B-%ED%--%B-%--%ED%--%BC%EB%--%-C%EB%B-%B-%--%EC%--%--%EC%-A%A-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  끝나지 않은 에러 디버깅&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기분은 나아졌으나 끝내지 못한 숙제가 남아있었다. &lt;b&gt;아직 에러를 잡지 못했다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;집으로 돌아오는 지하철에서도 원인을 찾지 못해서 집에 도착하자마자 다시 코드를 열었고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그렇게 며칠을 하나씩 역으로 거슬러 올라가다 보니 원인을 찾을 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;에러의 원인은 생각보다 복잡하게 연쇄적으로 얽혀있었다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;&lt;/b&gt; &lt;b&gt;&lt;b&gt;&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;원인 1.&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;테스트 케이스가 내포하고 있는 의미를 파악하지 못함.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 코드의 입력값을 직접 입력하여 테스트할 때에는 &lt;b&gt;버그 없이 잘 동작하는데,&lt;/b&gt; &lt;br /&gt;&lt;b&gt;테스트를 돌리면 에러가 발생한 이유는!&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;테스트 코드가 내포하는 의미의 구현 코드와 내가 구현한 코드가 일치하지 않았기 때문이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2HKA/btrUattwt0c/nSDoLiYu8wojFkk77wowZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2HKA/btrUattwt0c/nSDoLiYu8wojFkk77wowZ1/img.png&quot; data-alt=&quot;mock함수는 1~9 값이 들어있는 배열을 사용한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2HKA/btrUattwt0c/nSDoLiYu8wojFkk77wowZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2HKA%2FbtrUattwt0c%2FnSDoLiYu8wojFkk77wowZ1%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;387&quot; height=&quot;330&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;mock함수는 1~9 값이 들어있는 배열을 사용한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 코드는 제공된 테스트 코드의 일부분이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서&lt;b&gt; sequenced 함수는&lt;/b&gt; shuffle 함수를 mocking할 때 사용되는데,&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;b&gt;shuffle 함수에게 전달되는 인자 배열의 값을 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;1~9&lt;/span&gt;로 매핑하는 역할을 한다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vgRDC/btrT5rYCHG3/4y7I3t5sh9wJYU6AoHPum1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vgRDC/btrT5rYCHG3/4y7I3t5sh9wJYU6AoHPum1/img.png&quot; data-alt=&quot;내가 구현한 실제 코드 - idx 배열은 0~8 값이 들어있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vgRDC/btrT5rYCHG3/4y7I3t5sh9wJYU6AoHPum1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvgRDC%2FbtrT5rYCHG3%2F4y7I3t5sh9wJYU6AoHPum1%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;541&quot; height=&quot;93&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내가 구현한 실제 코드 - idx 배열은 0~8 값이 들어있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하지만 내가 구현한 코드는&lt;br /&gt;배열의 &lt;b&gt;값을 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;0~8&lt;/span&gt;로 매핑한 뒤 &lt;b&gt;&lt;b&gt;shuffle 함수에게 전달한다.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;1~9 배열, 0~8 배열&lt;br /&gt;이 둘의 차이가 바로 에러의 첫 번째 원인이었다.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;0-8 값을 가진 배열을 넘기는 내 코드의 경우,&lt;/b&gt;&lt;br /&gt;shuffle 함수는 다음의 순서대로 값을 return 하게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B97un/btrT80MTsFx/9UoD8o3BSmsbrCwqRyGHZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B97un/btrT80MTsFx/9UoD8o3BSmsbrCwqRyGHZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B97un/btrT80MTsFx/9UoD8o3BSmsbrCwqRyGHZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB97un%2FbtrT80MTsFx%2F9UoD8o3BSmsbrCwqRyGHZ1%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;397&quot; height=&quot;32&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/76jS6/btrT9PqBIAY/Y7SOzxVfVe7VBN2dA0cbSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/76jS6/btrT9PqBIAY/Y7SOzxVfVe7VBN2dA0cbSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/76jS6/btrT9PqBIAY/Y7SOzxVfVe7VBN2dA0cbSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F76jS6%2FbtrT9PqBIAY%2FY7SOzxVfVe7VBN2dA0cbSK%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;864&quot; height=&quot;280&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 과정에서 mockQuestion 함수로 입력된 &lt;b&gt;제임스의 못 먹는 메뉴인 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;떡볶이가 선택되어버리고,&lt;/span&gt; &lt;br /&gt;못 먹는 메뉴 추천 시 새로운 메뉴를 다시 추천하도록 구현되어 있기 때문에,&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;제임스의 첫 번째 메뉴 선택에 총 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;2번의 shuffle 함수 return value를 사용하게 된다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최종적으로는 마지막 메뉴 추천을 받지 못한 상태이므로,&amp;nbsp; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;메뉴 추천 로직은 한 번 더 실행되는데&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;이때 더 이상 mocking된 shuffle 함수 return값이 없으므로 리턴값은 undefined가 된다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(추가적으로 6번째&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;mock return value처럼 '9'가 0번 idx 값으로 셔플 된 경우,&lt;/span&gt;&lt;br /&gt;menu의 9번 idx는 없으므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;undefined가 메뉴로 추천되는 경우도 발생한다.)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOHLiQ/btrT4Fo3DzW/XwSNhZ1dnCqrwaOs3FSvK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOHLiQ/btrT4Fo3DzW/XwSNhZ1dnCqrwaOs3FSvK0/img.png&quot; data-alt=&quot;shuffle 함수의 return값이 undefined 이므로 당연한 결과이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOHLiQ/btrT4Fo3DzW/XwSNhZ1dnCqrwaOs3FSvK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOHLiQ%2FbtrT4Fo3DzW%2FXwSNhZ1dnCqrwaOs3FSvK0%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;596&quot; height=&quot;196&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;shuffle 함수의 return값이 undefined 이므로 당연한 결과이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;undefined의 0번 idx 값을 읽으려 하니 &lt;b&gt;당연하게도 에러가 발생한 것이다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;&lt;b&gt; 해결 방법&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/73jNc/btrT9OFiCbi/428GKMzGE2oQDyuxPJADtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/73jNc/btrT9OFiCbi/428GKMzGE2oQDyuxPJADtk/img.png&quot; data-alt=&quot;추가된 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/73jNc/btrT9OFiCbi/428GKMzGE2oQDyuxPJADtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F73jNc%2FbtrT9OFiCbi%2F428GKMzGE2oQDyuxPJADtk%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;597&quot; height=&quot;90&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;90&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 케이스의&lt;b&gt; shuffle mock함수 구현 코드의 형태로&lt;/b&gt;&lt;br /&gt;&lt;b&gt;작성한 구현 코드를 수정하여 해결 할 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;원인 2. &lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;테스트 케이스가 요구사항과 일치하지 않음.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mH6NM/btrUbrCmq6C/dOAdWgB1dlOPHc8vRzUadK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mH6NM/btrUbrCmq6C/dOAdWgB1dlOPHc8vRzUadK/img.png&quot; data-alt=&quot;여전히 남아있는 문제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mH6NM/btrUbrCmq6C/dOAdWgB1dlOPHc8vRzUadK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmH6NM%2FbtrUbrCmq6C%2FdOAdWgB1dlOPHc8vRzUadK%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;632&quot; height=&quot;147&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;147&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 테스트를 다시 돌려보니, undefined 에러는 해결되었지만 &lt;b&gt;출력 형태가 달라 테스트는 실패하게 되는데&lt;/b&gt;&lt;br /&gt;&lt;b&gt;이 부분에서 2번째 원인을 파악할 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt;바로 테스트 케이스가 요구사항과 일치하지 않는다는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XtlxK/btrT9X3hk46/13nUoLl4RUNnEkUcXIjqfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XtlxK/btrT9X3hk46/13nUoLl4RUNnEkUcXIjqfK/img.png&quot; data-alt=&quot;구현 요구 사항&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XtlxK/btrT9X3hk46/13nUoLl4RUNnEkUcXIjqfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXtlxK%2FbtrT9X3hk46%2F13nUoLl4RUNnEkUcXIjqfK%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;419&quot; height=&quot;117&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;117&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;요구사항은&lt;/b&gt; [&lt;span&gt;&lt;b&gt;카테고리 추천 =&amp;gt; 1번 코치 메뉴 추천 =&amp;gt; 2번 코치 메뉴 추천] &lt;/b&gt;의 순서로 구현을 요구한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r6sJ2/btrUadY5H6S/TRjf8Kjj0iolMXoRbE2CsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r6sJ2/btrUadY5H6S/TRjf8Kjj0iolMXoRbE2CsK/img.png&quot; data-alt=&quot;테스트 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r6sJ2/btrUadY5H6S/TRjf8Kjj0iolMXoRbE2CsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr6sJ2%2FbtrUadY5H6S%2FTRjf8Kjj0iolMXoRbE2CsK%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;371&quot; height=&quot;261&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테스트 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ObOUb/btrT9XIZM55/Nnv5gp3nyV6FtEYjFcrWYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ObOUb/btrT9XIZM55/Nnv5gp3nyV6FtEYjFcrWYk/img.png&quot; data-alt=&quot;테스트 코드가 원하는 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ObOUb/btrT9XIZM55/Nnv5gp3nyV6FtEYjFcrWYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FObOUb%2FbtrT9XIZM55%2FNnv5gp3nyV6FtEYjFcrWYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;53&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;53&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하지만 테스트 코드는 그렇지 않다.&lt;br /&gt;테스트 케이스는&lt;/b&gt; &lt;b&gt;[카테고리 전부 추천 =&amp;gt; 1번 코치 메뉴 전부 추천 =&amp;gt; 2번 코치 메뉴 전부 추천] &lt;/b&gt;의&amp;nbsp;순서로 구현을 요구한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0kOFe/btrT9PqH8Dn/vhKZd0krZCUyHLxPmmG611/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0kOFe/btrT9PqH8Dn/vhKZd0krZCUyHLxPmmG611/img.png&quot; data-alt=&quot;실제로는 번갈아가며 메뉴가 정해진다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0kOFe/btrT9PqH8Dn/vhKZd0krZCUyHLxPmmG611/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0kOFe%2FbtrT9PqH8Dn%2FvhKZd0krZCUyHLxPmmG611%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;491&quot; height=&quot;239&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제로는 번갈아가며 메뉴가 정해진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sMye7/btrT9PjYmo9/zHBVDuSsXT3kEIXCCjHtkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sMye7/btrT9PjYmo9/zHBVDuSsXT3kEIXCCjHtkk/img.png&quot; data-alt=&quot;요구사항대로 구현했을 경우의 순서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sMye7/btrT9PjYmo9/zHBVDuSsXT3kEIXCCjHtkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsMye7%2FbtrT9PjYmo9%2FzHBVDuSsXT3kEIXCCjHtkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;53&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;53&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;요구 사항대로 코드를 구현할 경우 &lt;/b&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;mockShuffles 함수는 &lt;/b&gt;위에서부터 순차적으로&amp;nbsp;&lt;b&gt;각 코치의 메뉴를&amp;nbsp;&lt;/b&gt;추천하므로 &lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt;테스트를 통과할 수 없다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;해결 방법&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by1sni/btrUa2pgoIm/M7oWDeQCtdOuQMIKL5GBpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by1sni/btrUa2pgoIm/M7oWDeQCtdOuQMIKL5GBpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by1sni/btrUa2pgoIm/M7oWDeQCtdOuQMIKL5GBpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby1sni%2FbtrUa2pgoIm%2FM7oWDeQCtdOuQMIKL5GBpk%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;380&quot; height=&quot;404&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jj9Tm/btrT7GaaDxm/DOawI7zjavbv2DnbZjRYXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jj9Tm/btrT7GaaDxm/DOawI7zjavbv2DnbZjRYXk/img.png&quot; data-alt=&quot;테스트 코드 수정 시 통과 가능하다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jj9Tm/btrT7GaaDxm/DOawI7zjavbv2DnbZjRYXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJj9Tm%2FbtrT7GaaDxm%2FDOawI7zjavbv2DnbZjRYXk%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;344&quot; height=&quot;176&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;176&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트 케이스의&amp;nbsp;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;mockShuffles 함수 내 코드를&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&amp;nbsp;순서에 맞게 수정하거나,&amp;nbsp;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;각 코치의 일주일 치 메뉴를&lt;/b&gt; &lt;b&gt;일괄 추천 하도록 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;구현 코드를 변경해야 한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  &lt;b&gt;시험이 아닌 또 다른 교육&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHSjqe/btrT7GaeF9A/sXURNRYIUWRIL0dIPfaNnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHSjqe/btrT7GaeF9A/sXURNRYIUWRIL0dIPfaNnk/img.png&quot; data-alt=&quot;- 최종 테스트 안내 메일 -&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHSjqe/btrT7GaeF9A/sXURNRYIUWRIL0dIPfaNnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHSjqe%2FbtrT7GaeF9A%2FsXURNRYIUWRIL0dIPfaNnk%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;745&quot; height=&quot;26&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;26&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드의 에러를 수정하는 과정에서&lt;b&gt; 여러 가지 생각을 하게 됐다. &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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 최종 테스트 진행 중에 메뉴 추천 로직을 구현하면서,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 주어진 테스트 코드와 같이 '&lt;b&gt;일괄 추천으로 구현하는 것이 코드 맥락을 이해하기 쉽지 않을까?' 같은 생각을 했었다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 그게 더 구현하기도 쉬웠고, 코드도 깔끔하게 정리할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 무엇보다도 일괄 추천으로 구현해도 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;최종 구현 후 기능의 동작은 똑같았기 때문이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(테스트 코드를 명확하게 파악하고 한 생각은 아니었다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이내 '&lt;b&gt;요구사항은 요구사항이니 지켜야 한다' 생각하여 구현을 이어갔었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 과연 어떤 것이 옳은 선택일까? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 코딩 테스트가 아니었다면, &lt;b&gt;업무 중 이런 상황이 발생했다면 나는 어떤 선택을 해야 할까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✨&amp;nbsp;&lt;b&gt;우테코 지원과정을 마치면서...&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;우테코와 함께한 약 3개월간의 과정이 드디어 끝이 났다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;첫 지원, 자소서 작성부터 시작해서 운 좋게 얻게 된 최종 코딩 테스트까지...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;지원할 때만 해도 '벌써 10월이네.. 시간 빠르다...' 생각했는데 어느덧 크리스마스가 눈앞이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;머리를 싸매고 좌절한 적도 있었고, 약점이라고 생각한 부분을 극복하며 울컥한 적도 있었고,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;끝까지 해내는 나 자신을 보며 자신감을 얻기도 했었다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;이러나저러나 드는 생각은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;지원하길 정말 잘했다는 생각이다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;누구라도 지원을 망설이는 사람이 있다면 고민은 넣어두고 얼른 &lt;b&gt;자소서 &lt;/b&gt;작성하길 바란다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;b&gt;너무 나도 많은 걸 배웠고, 앞으로 어떻게 나아가야 하는지 방향을 잡을 수 있어 행복했다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvlUy/btrUaWQePsi/KTrdmyRPMAVRfOgoQ3phwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvlUy/btrUaWQePsi/KTrdmyRPMAVRfOgoQ3phwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvlUy/btrUaWQePsi/KTrdmyRPMAVRfOgoQ3phwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmvlUy%2FbtrUaWQePsi%2FKTrdmyRPMAVRfOgoQ3phwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;347&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 대단히 감사하다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>우아한테크코스</category>
      <category>우테코</category>
      <category>최종코딩테스트</category>
      <category>코딩테스트</category>
      <category>프론트엔드</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/104</guid>
      <comments>https://think0wise.tistory.com/104#entry104comment</comments>
      <pubDate>Wed, 21 Dec 2022 00:38:56 +0900</pubDate>
    </item>
    <item>
      <title>우테코 프론트엔드 5기 - 프리코스 4주 차 후기</title>
      <link>https://think0wise.tistory.com/103</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;우테코 4주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNipRI/btrRi0OnL3m/u97XSpdP42fT0VAv0m6gQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNipRI/btrRi0OnL3m/u97XSpdP42fT0VAv0m6gQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNipRI/btrRi0OnL3m/u97XSpdP42fT0VAv0m6gQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNipRI%2FbtrRi0OnL3m%2Fu97XSpdP42fT0VAv0m6gQ1%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;900&quot; height=&quot;300&quot; data-filename=&quot;우테코 4주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프리코스의 막이 내렸다. 말로 표현할 수 없는 감정이 오간다.&lt;br /&gt;&lt;/b&gt;지금 이 감정에 대한 이야기는 글 마지막에 하도록 하겠다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이번 후기에는 미션으로 성장했던 부분을 설명하고,&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333;&quot;&gt;마무리로는 앞으로 프로그래밍을 공부하며 내가 가져야 할 태도와 자세에 대해 적어 보겠다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  3&lt;/b&gt;주 차 공통 피드백 수용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4주 차 미션 시작에 앞서 3주 차 공통 피드백을 점검했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;객체의&amp;nbsp;상태&amp;nbsp;접근을&amp;nbsp;제한한다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;객체는 객체스럽게 사용한다. / 데이터를 꺼내지 말고 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;메시지를 던지도록 구현한다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;필드의 수를 줄이기 위해 노력한다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;피드백의 worst 코드가 내 코드와 정확히 일치해서.. 뜨끔했다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;객체를 분리했다면 getter메서드로 데이터를 꺼낼 것이 아니라, 분리한 이유에 맞는 기능이 구현되어 있어야 한다는 뜻으로 이해했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(위 내용은 이번 미션에서 중요한 역할을 했다... 뒤에 이어진다.)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;private 필드의 필요성도 피드백을 통해 알게 되어 따로 공부했다.&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성공하는 케이스뿐만 아니라 예외에 대한 케이스도 테스트한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트 코드도 코드다. 리팩터링을 통해 개선해나가야 한다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트를 위한 코드는 구현 코드에서 분리되어야 한다&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt;테스트 코드 역시 코드라는 말에 한 방 맞은 것 같았다...&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 미션까지의 테스트 코드를 돌아보며 메인 코드를 신경 써서 작성하는 것처럼&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트 코드 역시 가독성과 의미 전달에 신경 써야겠다고 생각했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  미션 레포지토리 링크&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 후기는 게임을 구현하는 과정에서의&lt;b&gt;&amp;nbsp;코드 변화를 중심으로 이어지기 때문에,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지원자분들 외의 분들의&amp;nbsp;&lt;b&gt;내용 이해를 위해&amp;nbsp;&lt;a href=&quot;https://github.com/woowacourse-precourse/javascript-bridge&quot;&gt;다리 건너기 미션 repository&lt;/a&gt;를 첨부한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;오징어 게임의 다리 건너기를 생각하면 되겠다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HgyTh/btrRRJ0t8dI/YbDEWHkw642QJGmyJeKrP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HgyTh/btrRRJ0t8dI/YbDEWHkw642QJGmyJeKrP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HgyTh/btrRRJ0t8dI/YbDEWHkw642QJGmyJeKrP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHgyTh%2FbtrRRJ0t8dI%2FYbDEWHkw642QJGmyJeKrP1%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;619&quot; height=&quot;307&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;zwj;♂️&lt;b&gt; &amp;zwj;♂️&lt;/b&gt;&amp;nbsp; 4&lt;/b&gt;&lt;b&gt;주 차 미션 -&amp;nbsp; 다리 건너기 게임&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4주 차 미션은 다리 건너기 게임을 구현하는 과제였다.&lt;br /&gt;&lt;b&gt;이번 미션에서는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;공통 피드백에 해당하는 문제를 직접 맞닥뜨리고 &lt;br /&gt;&lt;/span&gt;피드백을 적용해 개선하는 과정에서 엄청난 성장을 할 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;객체는 객체스럽게 사용한다. / &lt;span style=&quot;background-color: #dddddd;&quot;&gt;데이터를 꺼내지 말고 메시지를 던지도록 구현한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;테스트를 통과하기 위해 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;구현 코드를 변경하거나 테스트에서만 사용되는 로직을 만들지 않는다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;단위 테스트 하기 어려운 코드를 단위 테스트 가능하도록 리팩터링한다. ( + 구체적 예시 )&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;&lt;/b&gt;데이터를 꺼내지 말고 메시지를 던져라!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공통 피드백 중&lt;b&gt; getter 메서드를 사용하지 않고, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;객체에 메시지를 던져 객체가 일하도록 하라는 내용이 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;관련 예시와 자료들을 찾아보며 공부했고, 어느 정도 이해했다고 생각하여 구현을 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 어느 순간 &lt;b&gt;피드백 내용의&lt;/b&gt; &lt;b&gt;worst 케이스에 해당하는 코드를 또다시 작성하고 있음을 깨달았다.&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 &lt;b&gt;해당 코드를 개선하는 과정을 겪으면서,&amp;nbsp; &lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;피드백이 무엇을 말하고자 하는 것인지 온전히 이해할 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;⌛ 코드 작성 당시 상황 설명 1&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다리에 해당하는 Bridge 클래스를 만들어 다리 생성 기능을 구현한 뒤에 상황이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다리를 만들었으니 &lt;b&gt;다리를 건너는 기능을 구현해야 했다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이를 위해&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;다리의 방향과&amp;nbsp;&lt;b&gt;사용자가 입력한 방향을&amp;nbsp;&lt;/b&gt;비교하는 로직이&lt;/b&gt;&amp;nbsp;필요했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #ef6f53;&quot;&gt;개선 전 코드의 문제점&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yOLAK/btrRMJMOfOG/BKvDqeBTKqZRUaKy7y3s60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yOLAK/btrRMJMOfOG/BKvDqeBTKqZRUaKy7y3s60/img.png&quot; data-alt=&quot;Bridge 클래스에 저장된 다리 방향&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yOLAK/btrRMJMOfOG/BKvDqeBTKqZRUaKy7y3s60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyOLAK%2FbtrRMJMOfOG%2FBKvDqeBTKqZRUaKy7y3s60%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;286&quot; height=&quot;199&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bridge 클래스에 저장된 다리 방향&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다리의 방향을 꺼내기 위해 &lt;/b&gt;&lt;b&gt;getter 메서드를 작성했었다.&lt;/b&gt;&lt;b&gt;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DFUoH/btrRH6bpz0b/dOxfTFL713W42KYc4h1OiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DFUoH/btrRH6bpz0b/dOxfTFL713W42KYc4h1OiK/img.png&quot; data-alt=&quot;BridgeGame 클래스의 move 메서드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DFUoH/btrRH6bpz0b/dOxfTFL713W42KYc4h1OiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDFUoH%2FbtrRH6bpz0b%2FdOxfTFL713W42KYc4h1OiK%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;551&quot; height=&quot;161&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BridgeGame 클래스의 move 메서드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 BridgeGame 클래스의 move 메서드 내부에서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt; getter를 사용해 다리의 방향을 그대로 가져온다...&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 현재 위치에 해당하는 &lt;b&gt;다리의 방향이 사용자 방향 입력과 일치하는지 비교한다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;위 코드의 문제점은 Bridge 클래스가 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;아무 기능도 하지 않는다는 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단지 다리 방향을 저장할 뿐 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;클래스로 나눈 의미가 없었다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;또한 private 처리한 다리 방향 상태를 그대로 꺼내어 사용하여 private의 의미도 사라졌다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이를 개선하기 위해 &lt;b&gt;다리의 방향과 사용자 방향 입력을 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;비교하는 로직을 Bridge 클래스 내부로 넣어보았다.&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;개선 후 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xxez0/btrRMJMOoce/UszJorWTFeObh0qkyFcmlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xxez0/btrRMJMOoce/UszJorWTFeObh0qkyFcmlk/img.png&quot; data-alt=&quot;Bridge 클래스에 방향값을 전달받아 비교를 수행하는 메서드 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xxez0/btrRMJMOoce/UszJorWTFeObh0qkyFcmlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxxez0%2FbtrRMJMOoce%2FUszJorWTFeObh0qkyFcmlk%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;454&quot; height=&quot;198&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bridge 클래스에 방향값을 전달받아 비교를 수행하는 메서드 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Bridge 클래스에 &lt;b&gt;사용자 방향과 현재 위치 값을 전달받아 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;방향 값의 비교를 수행하는 메서드를 생성했다!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWnB3/btrRMAvM7co/wfKlP9q4cS10u3mYkDpwSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWnB3/btrRMAvM7co/wfKlP9q4cS10u3mYkDpwSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWnB3/btrRMAvM7co/wfKlP9q4cS10u3mYkDpwSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWnB3%2FbtrRMAvM7co%2FwfKlP9q4cS10u3mYkDpwSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;126&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다리 방향 상태 값을 가진 &lt;b&gt;Bridge 클래스에게 메시지를 던져&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;자신의 상태 값에 관련된 일을 하도록 개선된것이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상태 값을 &lt;b&gt;꺼내지 않고도 비교가 가능해졌고, &lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;getter 메서드는 더 이상 필요가 없어 삭제했다. &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;⌛ 코드 작성 당시 상황 설명 2&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다리를 건넌 후, 게임 상태에 따라 여러 가지 흐름으로 게임을 진행시켜야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중 게임을 클리어했다면 게임을 종료 시켜야 했고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이를 위해&lt;b&gt; 게임의 클리어 여부를 판단하는 로직이 필요했다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;color: #ef6f53;&quot;&gt;개선 전 코드의 문제점&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTG6dF/btrRN43KcS1/X3kkFWkMs0Ki3o9MGorkT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTG6dF/btrRN43KcS1/X3kkFWkMs0Ki3o9MGorkT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTG6dF/btrRN43KcS1/X3kkFWkMs0Ki3o9MGorkT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTG6dF%2FbtrRN43KcS1%2FX3kkFWkMs0Ki3o9MGorkT0%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;314&quot; height=&quot;73&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다리의 길이를 꺼내기 위해&amp;nbsp;&lt;/b&gt;&lt;b&gt;getter 메서드를 작성했었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5Bxc4/btrRNUtpOiW/lzcSwQAURDCBT7qamESiCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5Bxc4/btrRNUtpOiW/lzcSwQAURDCBT7qamESiCk/img.png&quot; data-alt=&quot;명확한 상황 설명을 위해 뒷 로직은 포함하지 않았습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5Bxc4/btrRNUtpOiW/lzcSwQAURDCBT7qamESiCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5Bxc4%2FbtrRNUtpOiW%2FlzcSwQAURDCBT7qamESiCk%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;505&quot; height=&quot;114&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;114&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 BridgeGame 클래스의 isEnd 메서드 내부에서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt;getter를 사용해 다리의 길이를 그대로 가져온다.&lt;br /&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 &lt;b&gt;지나온 블록 수와&lt;/b&gt; &lt;b&gt;다리 길이를 비교해 모든 블록을 지나왔는지 결과를 낸다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 코드 역시 동일한 문제점이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;지나온 블록 수와&lt;/b&gt;&amp;nbsp;&lt;b&gt;다리 길이를 비교하는 로직을 Bridge 클래스 내부로 넣어보았다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;개선 후 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bctV7R/btrRK2M627h/GNuDUeeEKpo9hp7xEMKp0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bctV7R/btrRK2M627h/GNuDUeeEKpo9hp7xEMKp0k/img.png&quot; data-alt=&quot;Bridge 클래스에 지나온 블록 수를 받아 다리길이와 비교하는 메서드 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bctV7R/btrRK2M627h/GNuDUeeEKpo9hp7xEMKp0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbctV7R%2FbtrRK2M627h%2FGNuDUeeEKpo9hp7xEMKp0k%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;456&quot; height=&quot;71&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bridge 클래스에 지나온 블록 수를 받아 다리길이와 비교하는 메서드 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Bridge 클래스에&lt;b&gt; 지나온 블록 수를 받아&lt;/b&gt; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;다리길이와 비교하는 메서드를 생성했다!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmarQ7/btrRNouLi6l/6vyp0Jimocnfwe41z2NOe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmarQ7/btrRNouLi6l/6vyp0Jimocnfwe41z2NOe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmarQ7/btrRNouLi6l/6vyp0Jimocnfwe41z2NOe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmarQ7%2FbtrRNouLi6l%2F6vyp0Jimocnfwe41z2NOe1%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;73&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Bridge 클래스가 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;자신의 상태 값에 대한 로직을 수행하도록 개선되었다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 역시 상태 값을 가져오는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;getter는 필요하지 않아 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;삭제했다. &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;테스트 코드 통과만을 위해 구현 코드를 변경하지 않기!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이 피드백 또한 테스트 코드 작성에 난항을 겪으며 이것저것 시도하고 나서야&amp;nbsp; 비로소 이해할 수 있게 되었다.&lt;br /&gt;테스트 편의를 위한 클래스를 생성하여 사용하다가 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;결국 근본 원인을 찾게 되어 삭제했던 과정을 소개한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;color: #ef6f53;&quot;&gt;테스트 편의를 위한 &lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&amp;nbsp;Builder &lt;/span&gt;&lt;/b&gt;클래스&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;우선 결론부터 말하자면 클래스 생성 - 삭제 - 생성 - 삭제,&lt;br /&gt;총 4번 생각의 변화가 있었다...&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JqNep/btrRN5Di8Ix/3o8EA6kjYgpHiK0y5N1HYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JqNep/btrRN5Di8Ix/3o8EA6kjYgpHiK0y5N1HYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JqNep/btrRN5Di8Ix/3o8EA6kjYgpHiK0y5N1HYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJqNep%2FbtrRN5Di8Ix%2F3o8EA6kjYgpHiK0y5N1HYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;387&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #ef6f53;&quot;&gt;Builder 클래스를 생성한 이유&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음 다리를 생성하는 부분의 코드는 다음과 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMB8uk/btrRMzcHaKE/E7KnDbOESq8ptTSRIuwPm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMB8uk/btrRMzcHaKE/E7KnDbOESq8ptTSRIuwPm1/img.png&quot; data-alt=&quot;BridgeGame 클래스의 build메서드로 다리 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMB8uk/btrRMzcHaKE/E7KnDbOESq8ptTSRIuwPm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMB8uk%2FbtrRMzcHaKE%2FE7KnDbOESq8ptTSRIuwPm1%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;541&quot; height=&quot;140&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BridgeGame 클래스의 build메서드로 다리 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BridgeGame 클래스의 build 매서드 내에서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미션에서 주어진 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;다리 생성 함수 makeBridge 를 통해&lt;/b&gt;&lt;/span&gt; &lt;b&gt;Bridge 클래스를 초기화하여 필드 변수에 저장하는 구조였다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구현 이후 테스트 코드를 작성하려는데, 이게 웬걸... &lt;b&gt;build 메서드는 테스트 자체가 불가능했다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;size 값을 전달하여 메서드를 실행시키면 &lt;b&gt;접근할 수 없는 필드 변수에 생성된 다리를 저장하기 때문에 &lt;br /&gt;테스트 할 방법이 없었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;나는 테스트 문제를 해결함과 동시에 &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;다리를 짓는 건축자라는 표현이 있으면 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;코드도 부드럽게 읽히지 않을까 하는 생각으로 &lt;/span&gt;&lt;b&gt;Builder 클래스를 만들었다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;color: #ef6f53;&quot;&gt;Builder 클래스로 상황이 개선되었다는 착각&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvyvPO/btrRNoVVBMk/hXKwXQOxXRVfpJrhXnZI10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvyvPO/btrRNoVVBMk/hXKwXQOxXRVfpJrhXnZI10/img.png&quot; data-alt=&quot;Builder 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvyvPO/btrRNoVVBMk/hXKwXQOxXRVfpJrhXnZI10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvyvPO%2FbtrRNoVVBMk%2FhXKwXQOxXRVfpJrhXnZI10%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;562&quot; height=&quot;177&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Builder 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 같이 &lt;b&gt;Builder 클래스를 만들고,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;메서드로 생성 로직을 한 번 더 묶어서 Bridge 인스턴스를 return 하게 했다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbjevs/btrRLKMsCuG/VgNNW3tqzVR7SdzrtN8z3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbjevs/btrRLKMsCuG/VgNNW3tqzVR7SdzrtN8z3K/img.png&quot; data-alt=&quot;BridgeGame 클래스의 build 메서드 변경 사항&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbjevs/btrRLKMsCuG/VgNNW3tqzVR7SdzrtN8z3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbjevs%2FbtrRLKMsCuG%2FVgNNW3tqzVR7SdzrtN8z3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;146&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BridgeGame 클래스의 build 메서드 변경 사항&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BridgeGame 클래스의 build 메서드는 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내부에서 Builder 클래스를 초기화하고 buildBridge 메서드를 실행하도록 변경했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(이때 여전히 build 메서드는 테스트 불가능하다는 사실을 알지 못했다... )&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgIPdn/btrRMcIOGgx/rq2hA4ZCGkcM8XKKuK9JPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgIPdn/btrRMcIOGgx/rq2hA4ZCGkcM8XKKuK9JPk/img.png&quot; data-alt=&quot;테스트 작성 가능..?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgIPdn/btrRMcIOGgx/rq2hA4ZCGkcM8XKKuK9JPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgIPdn%2FbtrRMcIOGgx%2Frq2hA4ZCGkcM8XKKuK9JPk%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;779&quot; height=&quot;251&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;251&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;위 코드처럼 &lt;b&gt;원래 할 수 없던 BridgeGame클래스의 build 메서드 테스트를 &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Builder 클래스로 대신하게 되면서, 해결이 됐다고 생각했다.&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;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하지만 곧 근본적인 문제를 맞닥뜨렸다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;color: #ef6f53;&quot;&gt;Builder 클래스를 삭제하게 된 이유&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beqmaC/btrRMZvb2Wm/KNpkGzDXO9jkGN7EWLq4Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beqmaC/btrRMZvb2Wm/KNpkGzDXO9jkGN7EWLq4Q0/img.png&quot; data-alt=&quot;BridgeGame클래스 내 move 메서드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beqmaC/btrRMZvb2Wm/KNpkGzDXO9jkGN7EWLq4Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeqmaC%2FbtrRMZvb2Wm%2FKNpkGzDXO9jkGN7EWLq4Q0%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;710&quot; height=&quot;239&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BridgeGame클래스 내 move 메서드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;문제는 위 코드처럼 사용자의 방향 입력을 받아 움직이는 기능을 만들고 나서 발생했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기능 구현 이후 테스트 코드를 작성하는데..&lt;b&gt; 이게 웬걸!! &lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;move 메서드 또한 테스트 자체가 불가능했다!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;BridgeGame 클래스 내의 모든 기능 메서드를 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;테스트할 수 없는 근본적인 원인은 &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;따로 있던 것이다...&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUHE0K/btrROrSmBLY/VprxUBuqkQhJiFZmsk316k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUHE0K/btrROrSmBLY/VprxUBuqkQhJiFZmsk316k/img.png&quot; data-alt=&quot;테스트 불가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUHE0K/btrROrSmBLY/VprxUBuqkQhJiFZmsk316k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUHE0K%2FbtrROrSmBLY%2FVprxUBuqkQhJiFZmsk316k%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;691&quot; height=&quot;196&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;196&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원인은 위 테스트 코드를 보면 알 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다리 건너기 게임은&lt;b&gt;&amp;nbsp;BridgeGame 클래스의&lt;/b&gt;&amp;nbsp;&lt;b&gt;build 메서드로 다리를 만들면서 시작하는데...&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다리를 만드는 과정에&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;제공된&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Random 유틸 함수가 사용된다.&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;BridgeGame 클래스 내부에서 Random 함수를 통해 다리를 생성하는 구조 자체만으로&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;다리와 연관된 모든 메서드를 테스트할 수 없게 되는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;원인을 알게 된 후 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;테스트 코드 작성이 주 목적이 되어 버린 Builder 클래스를 삭제했고, &lt;b&gt;코드를 리팩터링 했다.&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;&lt;/b&gt;단위 테스트하기 어려운 코드를 가능하도록 리팩터링 하기!&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #409d00;&quot;&gt;근본적인 원인 해결&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 근본적인 원인은 &lt;b&gt;Random 함수였고,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다리 성성을 BridgeGame 클래스 외부에서 해야한다는 결론이 나왔다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwP4TU/btrRME52QFc/kwb9VySq9vKUJt6zVQYvRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwP4TU/btrRME52QFc/kwb9VySq9vKUJt6zVQYvRK/img.png&quot; data-alt=&quot;GameController 클래스에서 다리생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwP4TU/btrRME52QFc/kwb9VySq9vKUJt6zVQYvRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwP4TU%2FbtrRME52QFc%2Fkwb9VySq9vKUJt6zVQYvRK%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;547&quot; height=&quot;237&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GameController 클래스에서 다리생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IvylD/btrRS5O7CNE/gJOP4Rl4aitoSrRbq5SKhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IvylD/btrRS5O7CNE/gJOP4Rl4aitoSrRbq5SKhk/img.png&quot; data-alt=&quot;전달 받은 다리를 필드에 할당&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IvylD/btrRS5O7CNE/gJOP4Rl4aitoSrRbq5SKhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIvylD%2FbtrRS5O7CNE%2FgJOP4Rl4aitoSrRbq5SKhk%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;227&quot; height=&quot;136&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;136&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자 입력을 전달받아 명령을 내려주는 &lt;b&gt;GameController 클래스에서 다리를 생성하고,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;BridgeGame 클래스의 인스턴스를 만들 때 생성된 다리를 전달하여 초기화하도록 개선하였다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kH8f0/btrRRvH7FXS/ZrHkKZ3KvDdI1bxkQEzVlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kH8f0/btrRRvH7FXS/ZrHkKZ3KvDdI1bxkQEzVlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kH8f0/btrRRvH7FXS/ZrHkKZ3KvDdI1bxkQEzVlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkH8f0%2FbtrRRvH7FXS%2FZrHkKZ3KvDdI1bxkQEzVlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;350&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 id=&quot;%F-%-F%--%--%---%EC%B-%A-%--%EB%A-%-C%EB%--%--%--%EC%--%B-%--%EA%B-%AC%EC%A-%B-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;테스트 가능해진 메서드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHfzLG/btrRNnJyfQp/VV0bShLoJa8lbCiZUn5WOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHfzLG/btrRNnJyfQp/VV0bShLoJa8lbCiZUn5WOk/img.png&quot; data-alt=&quot;move 메서드 테스트 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHfzLG/btrRNnJyfQp/VV0bShLoJa8lbCiZUn5WOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHfzLG%2FbtrRNnJyfQp%2FVV0bShLoJa8lbCiZUn5WOk%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;661&quot; height=&quot;197&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;move 메서드 테스트 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2dvb6/btrRRuPYT46/KtYkMulDUp9997huOA2OY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2dvb6/btrRRuPYT46/KtYkMulDUp9997huOA2OY1/img.png&quot; data-alt=&quot;retry 메서드 테스트 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2dvb6/btrRRuPYT46/KtYkMulDUp9997huOA2OY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2dvb6%2FbtrRRuPYT46%2FKtYkMulDUp9997huOA2OY1%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;668&quot; height=&quot;236&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;retry 메서드 테스트 가능&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개선 이후 Random 함수와 BridgeGame 클래스가 분리되었고,&lt;br /&gt;&lt;b&gt;원하는 값으로 다리 생성이 가능해졌다. 이로 인해 메서드의 테스트도 가능하게 됐다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/unf2E/btrRQjgEVag/uBKFm2D8kFKvimOxfbULo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/unf2E/btrRQjgEVag/uBKFm2D8kFKvimOxfbULo1/img.png&quot; data-alt=&quot;해냈다....이도현...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/unf2E/btrRQjgEVag/uBKFm2D8kFKvimOxfbULo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Funf2E%2FbtrRQjgEVag%2FuBKFm2D8kFKvimOxfbULo1%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;655&quot; height=&quot;189&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해냈다....이도현...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;b&gt;  프리코스를 마무리 하며...&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;마침내 결승선을 통과했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;4주간의 마라톤을 끝내고 나니 성취감에 뿌듯하면서도, 끝이 났다는 게 아쉽기도 하다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;짦은 시간 동안에도 충분히 많은 성장을 할 수 있다는 것을 느낄 수 있는 시간이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 나는 더 성장해야 한다. 아니 평생 성장해야 한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 프리코스 과정에서 온전히 학습에만 집중한 것처럼 같은 자세로 열심히 배워간다면, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;나는 분명 훌륭한 개발자가 되어있을 것이다.&lt;/span&gt;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4wVIq/btrRNBvuZWL/I0UzPzEArJSjgWV31Bt791/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4wVIq/btrRNBvuZWL/I0UzPzEArJSjgWV31Bt791/img.jpg&quot; data-alt=&quot;고생했다 도현아!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4wVIq/btrRNBvuZWL/I0UzPzEArJSjgWV31Bt791/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4wVIq%2FbtrRNBvuZWL%2FI0UzPzEArJSjgWV31Bt791%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;550&quot; height=&quot;480&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&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;</description>
      <category>목표와 회고</category>
      <category>5기</category>
      <category>우아한 테크코스</category>
      <category>우테코</category>
      <category>프론트엔드</category>
      <category>프리코스</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/103</guid>
      <comments>https://think0wise.tistory.com/103#entry103comment</comments>
      <pubDate>Tue, 22 Nov 2022 16:35:04 +0900</pubDate>
    </item>
    <item>
      <title>Git - merge, rebase 개념과 차이</title>
      <link>https://think0wise.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러분은 branch를 병합하는 방법을 알고 계시나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리는 협업 환경에서 Git을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;각 팀원은 자신이 맡은 기능을 개발하기 위해 branch를 만들어 작업합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀원들의 개발이 끝났다면, &lt;b&gt;&amp;nbsp;모두의 작업물(branch)을 한 곳에 모아 하나의 작품을 완성해야 합니다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 포스팅에서는 &lt;b&gt;branch를 병합하는 대표적인 방법인 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;merge와 rebase에 대해 알아보겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;포스팅에 쓰이는 모든 시각화 자료는 &lt;a href=&quot;https://learngitbranching.js.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://learngitbranching.js.org&lt;/a&gt; 에서 발췌하였습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Git의 여러가지 기능을 배우기 정말 좋은 사이트이니 사용해보시는 걸 추천합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1667301523252&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;Learn Git Branching&quot; data-og-description=&quot;An interactive Git visualization tool to educate and challenge!&quot; data-og-host=&quot;learngitbranching.js.org&quot; data-og-source-url=&quot;https://learngitbranching.js.org/&quot; data-og-url=&quot;https://pcottle.github.io/learnGitBranching/index.html?demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yf7cn/hyQptK8ajr/b8XHUUw7GXObyKn8S91Sak/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learngitbranching.js.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yf7cn/hyQptK8ajr/b8XHUUw7GXObyKn8S91Sak/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647');&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;Learn Git Branching&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interactive Git visualization tool to educate and challenge!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learngitbranching.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. merge란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;merge 키워드를 사용하면&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;두 개의 부모가 있는 새로운 커밋을 만들어 branch를 병합합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 branch의 커밋 내역은 순서대로 정리되고 merge commit이 하나 남습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그림으로 이해해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;merge 전&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMqY9s/btrP9zZbKZ2/5Znxkb3hVt5JOpctfqQKB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMqY9s/btrP9zZbKZ2/5Znxkb3hVt5JOpctfqQKB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMqY9s/btrP9zZbKZ2/5Znxkb3hVt5JOpctfqQKB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMqY9s%2FbtrP9zZbKZ2%2F5Znxkb3hVt5JOpctfqQKB0%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;278&quot; height=&quot;381&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;main branch&lt;/b&gt;에서 &lt;b&gt;C0, C1을 commit&lt;/b&gt; 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 &lt;b&gt;bugFix 브랜치가 생성되었고 버그는 C2 commit&lt;/b&gt;으로 해결되었습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그동안 &lt;b&gt;main branch&lt;/b&gt;에서는&lt;b&gt; C3 commit&lt;/b&gt;을 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;merge 후&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그럼 이제 merge 해봅시다! (main branch C3에서 진행합니다.)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667306266097&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git merge bugFix
git push&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/peSaA/btrQaKeSlbZ/JLJej9Ejm4Yk9KWlDJqGO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/peSaA/btrQaKeSlbZ/JLJej9Ejm4Yk9KWlDJqGO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/peSaA/btrQaKeSlbZ/JLJej9Ejm4Yk9KWlDJqGO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpeSaA%2FbtrQaKeSlbZ%2FJLJej9Ejm4Yk9KWlDJqGO0%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;267&quot; height=&quot;372&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;C2, C3를 부모로 하는 새로운 commit인 C4가 생성되면서 병합이 완료되었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 github에서 main branch의 commit log를 확인해 볼까요?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tr5uu/btrP8JuMeeH/rJjDygaV4vZTCKSGcPC5g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tr5uu/btrP8JuMeeH/rJjDygaV4vZTCKSGcPC5g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tr5uu/btrP8JuMeeH/rJjDygaV4vZTCKSGcPC5g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftr5uu%2FbtrP8JuMeeH%2FrJjDygaV4vZTCKSGcPC5g1%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;277&quot; height=&quot;244&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 branch의 커밋 이력은 순서대로 정리되었고 &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막에 merge commit이 하나 남았습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;main branch에선 버그가 해결되었겠네요!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이후 bugFix branch를 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유지하고 싶다면 git merge main하여 main &lt;span style=&quot;color: #000000;&quot;&gt;branch와 &lt;/span&gt;동일하게 C4를 가리키게 하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필요없다면 &lt;span style=&quot;color: #000000;&quot;&gt;삭제하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;merge --squash&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;--squash 옵션을 추가하면 합쳐질 branch의 커밋 이력을 하나의 커밋으로 정리할 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667307617606&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git merge bugFix --squash
git commit -m &quot;merge with --squash&quot;
git push&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R0J4d/btrP9fzWybj/NRDLfAsqtK1KeFsuxLMrAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R0J4d/btrP9fzWybj/NRDLfAsqtK1KeFsuxLMrAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R0J4d/btrP9fzWybj/NRDLfAsqtK1KeFsuxLMrAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR0J4d%2FbtrP9fzWybj%2FNRDLfAsqtK1KeFsuxLMrAk%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;277&quot; height=&quot;189&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bugFix branch의 커밋 이력은 &lt;b&gt;마지막에 원하는 커밋 하나를 남기는 것으로 대체되었습니다!&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;똑같이 main branch에선 버그가 해결되었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. rebase란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;rebase 키워드를 사용한 브랜치의 커밋을 다른 브랜치에 떨궈놓는 것으로 branch를 병합합니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 브랜치의 커밋은 병합 대상 브랜치의 커밋 뒤로 정리됩니다. &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마치 처음부터 병합 대상 브랜치에서 개발한 것처럼 보이게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;rebase&lt;/span&gt;&lt;/b&gt;를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그림으로 이해해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;rebase 전&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJORdw/btrP8Zdmay6/RqoW79ni92CRs6eVN6KEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJORdw/btrP8Zdmay6/RqoW79ni92CRs6eVN6KEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJORdw/btrP8Zdmay6/RqoW79ni92CRs6eVN6KEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJORdw%2FbtrP8Zdmay6%2FRqoW79ni92CRs6eVN6KEK1%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;270&quot; height=&quot;382&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;main branch&lt;/b&gt;에서&amp;nbsp;&lt;b&gt;C0, C1을 commit&lt;/b&gt;&amp;nbsp;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후&amp;nbsp;&lt;b&gt;bugFix 브랜치가 생성되었고 버그는 C3 commit&lt;/b&gt;으로 해결되었습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그동안&amp;nbsp;&lt;b&gt;main branch&lt;/b&gt;에서는&lt;b&gt;&amp;nbsp;C2 commit&lt;/b&gt;을 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;rebase 후&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그럼 이제 rebase 해봅시다! (bugFix branch C3에서 진행합니다.)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667361239251&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rebase main&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6gVPo/btrQd71Ti9w/5AWp1oXPNWjmLJIU0OpY1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6gVPo/btrQd71Ti9w/5AWp1oXPNWjmLJIU0OpY1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6gVPo/btrQd71Ti9w/5AWp1oXPNWjmLJIU0OpY1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6gVPo%2FbtrQd71Ti9w%2F5AWp1oXPNWjmLJIU0OpY1k%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;265&quot; height=&quot;344&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;bugFix branch의 C3 커밋이 Main branch의 C2 커밋 뒤로 떨궈졌네요! 병합이 완료되었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하지만 main branch는 아직 제자리에 있습니다.&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;main branch도 병합 완료된 커밋을 가리키게 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;main branch로 이동하여 똑같이 rebase 해줍니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667362216400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git switch main
git rebase bugFix&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjJ9wj/btrQb2NuHqr/T1TNfbeVpEZab9uY3mWYe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjJ9wj/btrQb2NuHqr/T1TNfbeVpEZab9uY3mWYe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjJ9wj/btrQb2NuHqr/T1TNfbeVpEZab9uY3mWYe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjJ9wj%2FbtrQb2NuHqr%2FT1TNfbeVpEZab9uY3mWYe1%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;264&quot; height=&quot;342&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이제 정말 병합이 완료되었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 github에서 main branch의 commit log를 확인해 볼까요?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdUGQ3/btrQCgY18Oh/G6IgKDrmbbDVDFVrUqQ8JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdUGQ3/btrQCgY18Oh/G6IgKDrmbbDVDFVrUqQ8JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdUGQ3/btrQCgY18Oh/G6IgKDrmbbDVDFVrUqQ8JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdUGQ3%2FbtrQCgY18Oh%2FG6IgKDrmbbDVDFVrUqQ8JK%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;282&quot; height=&quot;140&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boCjX4/btrQxcpxY30/BZWSIzOYKi2pcg0sE1awk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boCjX4/btrQxcpxY30/BZWSIzOYKi2pcg0sE1awk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boCjX4/btrQxcpxY30/BZWSIzOYKi2pcg0sE1awk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboCjX4%2FbtrQxcpxY30%2FBZWSIzOYKi2pcg0sE1awk1%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;339&quot; height=&quot;207&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;C3 커밋이 Main branch의 C2 커밋 뒤로 떨궈졌기 때문에&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;커밋 시간과는 무관하게 &lt;b&gt;bugFix commit 더 상단에 위치하네요!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;병합이 끝났습니다. &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;main branch에선 버그가 해결되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;변경된 커밋 해시&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjJ9wj/btrQb2NuHqr/T1TNfbeVpEZab9uY3mWYe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjJ9wj/btrQb2NuHqr/T1TNfbeVpEZab9uY3mWYe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjJ9wj/btrQb2NuHqr/T1TNfbeVpEZab9uY3mWYe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjJ9wj%2FbtrQb2NuHqr%2FT1TNfbeVpEZab9uY3mWYe1%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;264&quot; height=&quot;342&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그런데 자세히 보면 C3는 C3` 으로 병합되었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;rebase&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 특정 브랜치를 base로 커밋 이력을 재정렬하겠다는 명령어 입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;bugFix 브랜치에서 main브랜치를&amp;nbsp;기준으로 rebase 시켰기 때문에,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;main 브랜치를 기준으로 커밋이 재정렬 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 과정에서 커밋이력에는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;이전과는 다른 새로운 해시가 생성됩니다.&lt;/span&gt;&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;만약 main 브랜치에서 먼저 rebase를 실행하면 어떻게 될까요 ?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sTYNF/btrQDchHVY1/iqbHWnNA2G0WjyVFlb5PY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sTYNF/btrQDchHVY1/iqbHWnNA2G0WjyVFlb5PY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sTYNF/btrQDchHVY1/iqbHWnNA2G0WjyVFlb5PY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsTYNF%2FbtrQDchHVY1%2FiqbHWnNA2G0WjyVFlb5PY0%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;234&quot; height=&quot;338&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1667799293197&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rebase bugFix&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE2EJx/btrQxaZHKFt/22F2xiQgEaOzlbZ4EAKTik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE2EJx/btrQxaZHKFt/22F2xiQgEaOzlbZ4EAKTik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE2EJx/btrQxaZHKFt/22F2xiQgEaOzlbZ4EAKTik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE2EJx%2FbtrQxaZHKFt%2F22F2xiQgEaOzlbZ4EAKTik%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;246&quot; height=&quot;394&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;main 브랜치는 &lt;b&gt;모든 브랜치의 기준 브랜치 입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 main 브랜치에서 다른 브랜치를 기준으로&amp;nbsp;&lt;b&gt;rebase&lt;/b&gt;을 실행하면, &lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;main 브랜치의 커밋 해시가 변하게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 되면&lt;b&gt; main 브랜치에서 분기된 여러 브랜치에서 작업하던 팀원들은&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;변경된 해시로 인해 고통을 받게 됩니다!&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;때문에 main 브랜치에서 다른 브랜치를 기준으로 rebase을 하는 경우는 피하는게 좋겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WwVtY/btrQuNKNf2q/Hqs7WL6V4YqXGIM5gjA5D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WwVtY/btrQuNKNf2q/Hqs7WL6V4YqXGIM5gjA5D1/img.png&quot; data-alt=&quot;기본이 중요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WwVtY/btrQuNKNf2q/Hqs7WL6V4YqXGIM5gjA5D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWwVtY%2FbtrQuNKNf2q%2FHqs7WL6V4YqXGIM5gjA5D1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Git</category>
      <category>Git</category>
      <category>merge</category>
      <category>rebase</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/102</guid>
      <comments>https://think0wise.tistory.com/102#entry102comment</comments>
      <pubDate>Fri, 18 Nov 2022 18:03:55 +0900</pubDate>
    </item>
    <item>
      <title>우테코 프론트엔드 5기 - 프리코스 3주 차 후기</title>
      <link>https://think0wise.tistory.com/101</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;우테코 3주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRTr5h/btrQ6545gnU/md0rYe1Re0dPxdCQ9MYaz1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRTr5h/btrQ6545gnU/md0rYe1Re0dPxdCQ9MYaz1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRTr5h/btrQ6545gnU/md0rYe1Re0dPxdCQ9MYaz1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRTr5h%2FbtrQ6545gnU%2Fmd0rYe1Re0dPxdCQ9MYaz1%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;900&quot; height=&quot;300&quot; data-filename=&quot;우테코 3주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프리코스 3주 차를 마무리했다.&lt;b&gt;&lt;br /&gt;3주 차는 매일매일 눈 떠보면 시간이 사라지는 마법 같은 하루를 보냈다. &lt;br /&gt;뒤이어 설명할 추가된 요구사항이 큰 몫을 해줬다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이번 후기도 성장했던 부분과 차주 목표를 중점으로 적어 나가 보겠다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  2&lt;/b&gt;주 차 공통 피드백 수용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3주 차 미션 시작에 앞서 2주 차 공통 피드백을 점검했다.&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;README.md를 상세히 작성한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;기능 목록을 재검토한다.&lt;br /&gt;&lt;b&gt;기능 목록을 업데이트한다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이전 미션을 진행하면서, 기능 구현 목록 작성에 너무 많은 시간을 할애했던 기억이 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;상세히 작성하는 것은 중요하지만 그렇다고 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;함수, 메서드의 설계와 구현처럼 &lt;b&gt;언제든지 변경될 수 있고&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;b&gt;구현하는 시점이 되어봐야 알 수 있는 것들을&lt;/b&gt; 미리 생각하고 적지 않도록 주의하라는 내용이었다.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;이 피드백을 보고 첫 작성에 모든 것을 담으려는 생각을 버렸다!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;값을 하드 코딩하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번 3주 차 미션에는 &lt;b&gt;하마터면 하드 코딩할 만한 값들이 정말 많았다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;피드백으로 한 번 더 점검하는 시간을 가졌다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;한 함수가 한 가지 기능만 담당하게 한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;함수가 한 가지 기능을 하는지 확인하는 기준을 세운다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;한 가지 기능에 대한 &lt;b&gt;확인 기준을 세워야 한다는 말이 상당히 큰 도움이 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;코드를 작성하면서&lt;b&gt; '큰 범위로는 한 가지 기능인 것 같은데... 이걸 더 나눠야 하나..?&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;' &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;와&lt;/b&gt; 같은 생각을 정말 많이 했었다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;이게 모두 기준이 없기 때문이 아니었을까 생각했다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  피어 리뷰의 매력&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDe881/btrRdA3kvPC/oGHyb3gZivA3v2SOlRT1l1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDe881/btrRdA3kvPC/oGHyb3gZivA3v2SOlRT1l1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDe881/btrRdA3kvPC/oGHyb3gZivA3v2SOlRT1l1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDe881%2FbtrRdA3kvPC%2FoGHyb3gZivA3v2SOlRT1l1%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;189&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;프리코스 커뮤니티를 통해 많은 사람의 코드를 보고 리뷰하면서, 코드 작성 꿀팁들을 정말 많이 얻었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;또한 코드를 읽으면서&lt;b&gt; 내 코드에 대한 개선 방향을 정할 수 있는 것도 참 좋은 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;나 역시 이전 미션에 대한 피어 리뷰를 부탁했는데, &lt;/span&gt;&lt;b&gt;많은 분들이 코드에 대한 조언을 해주셨다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;그중 Airbnb JS 컨벤션에 대한 피드백이 가장 많았다.&lt;br /&gt;1주 차 시작과 함께 정독했었는데... &lt;b&gt;그럼에도 지키지 못한 부분이 많았다. 반성해야 할 부분이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰를 토대로&lt;b&gt;&amp;nbsp;3주 차 미션에서 많은 부분을 보완할 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DRUjy/btrRebhXkeB/kZc67nkKKBTf1UQkmye9U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DRUjy/btrRebhXkeB/kZc67nkKKBTf1UQkmye9U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DRUjy/btrRebhXkeB/kZc67nkKKBTf1UQkmye9U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDRUjy%2FbtrRebhXkeB%2FkZc67nkKKBTf1UQkmye9U0%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;850&quot; height=&quot;129&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BBFGx/btrQ890E5YT/tevZz5NQAAHP9GI9p5j5kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BBFGx/btrQ890E5YT/tevZz5NQAAHP9GI9p5j5kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BBFGx/btrQ890E5YT/tevZz5NQAAHP9GI9p5j5kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBBFGx%2FbtrQ890E5YT%2FtevZz5NQAAHP9GI9p5j5kK%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;846&quot; height=&quot;138&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OVFiE/btrRd7GLr12/Z9GSHK3ociVK1OKYGOgc3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OVFiE/btrRd7GLr12/Z9GSHK3ociVK1OKYGOgc3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OVFiE/btrRd7GLr12/Z9GSHK3ociVK1OKYGOgc3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOVFiE%2FbtrRd7GLr12%2FZ9GSHK3ociVK1OKYGOgc3K%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;857&quot; height=&quot;172&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다들 따듯한 말도 잊지 않으셨다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;오랜 시간 혼자 공부하면서 이런 말들을 해줄 사람이 거의 없었다. (훌쩍..)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다들 진심으로 너무 감사하다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  &lt;/b&gt;3&lt;b&gt;주 차 미션 -&amp;nbsp; 로또 게임&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3주 차 미션은 로또 게임을 구현하는 과제였고, &lt;b&gt;이번에도 역시 요구사항이 추가되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;클래스(객체)를 분리하는 연습을 할 것.&lt;/span&gt;&lt;br /&gt;-&lt;/b&gt; 메서드의&amp;nbsp;&lt;b&gt;길이가 15라인을 넘어가지 않도록 구현한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 메서드가&amp;nbsp;&lt;b&gt;한 가지 일만 하도록 구현한다.&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  클래스(객체) 분리의 중요성&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;나는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;[분리]와의 악연이 있다. &lt;/span&gt;&lt;/b&gt;&lt;b&gt;1주 차 후기 글에도 등장했던&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;&lt;a href=&quot;https://think0wise.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;내 개인 프로젝트 이야기&lt;/a&gt;를 조금 해보겠다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 당시 &lt;b&gt;몇 안 되는 파일에 모든 로직을 전부 모아 개발했고,&lt;/b&gt; &lt;b&gt;진행이 될수록 분리가 더욱 어려워&lt;/b&gt;&lt;b&gt;졌었다.&lt;/b&gt;&lt;br /&gt;&lt;span&gt;어떻게든 완성하여 원하던 사람에게 이롭게 쓰였지만, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;원하던 방향으로의 확장도, 리팩토링도 할 수 없는 기괴한 구조가 되어버려 프로젝트를 중단할 수밖에 없었다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이전까지의 나는 이런저런 사건과 이유로&lt;b&gt; 분리가 중요하다는 것은 뼈져리게 느꼈지만&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;그렇다고 &lt;b&gt;분리에 대한 기준이 생기거나 분리를 잘하게 된 건 또 아닌, &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;정체되어 있는 상태였다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3주 차 미션을 하기 전까지는 말이다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 미션의 요구사항은&lt;b&gt; 나의 정체기를 시원하게 뚫어주었다. &amp;zwj;♂️&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  클래스를 분리하는 이유! (feat. 도메인,비즈니스 로직이란 ?)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제일 먼저 구글에 검색을 해보았다.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFBRm/btrRdaxC7zC/XdQqGNjIKyl4ZPekyuNo2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFBRm/btrRdaxC7zC/XdQqGNjIKyl4ZPekyuNo2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFBRm/btrRdaxC7zC/XdQqGNjIKyl4ZPekyuNo2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFBRm%2FbtrRdaxC7zC%2FXdQqGNjIKyl4ZPekyuNo2k%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;716&quot; height=&quot;329&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대부분의 글에서&lt;b&gt; SOLID 원칙, 객체 지향 설계 등의 키워드를 볼 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체적으로 종합해 보면,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;클래스가 하나의 기능(책임)을 가져야만 관심사가 분리되고, 유지 보수에 용이하다는 결론이 나온다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;♂️ 그래서 어떻게 하는 건데..? (학습 과정)&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 자료를 보면서 느낌은 파악할 수 있었지만, &lt;b&gt;그래서 어떻게 하는 건지는 알 수 없었다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;상당히 부끄럽지만, 내가 3주 차 미션을 하면서 구현한 로또 앱의 구조를 공개한다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;내 생각의 과정을 적어두고, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;앞으로도 이런 사고방식으로 학습하고 싶어서 글로 남긴다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #ef5369;&quot;&gt;1차 로또 앱 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20221114_235226837.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bleeLL/btrRcFLvp3k/FF6J6Oq6EYpaEbblkxalSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bleeLL/btrRcFLvp3k/FF6J6Oq6EYpaEbblkxalSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bleeLL/btrRcFLvp3k/FF6J6Oq6EYpaEbblkxalSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbleeLL%2FbtrRcFLvp3k%2FFF6J6Oq6EYpaEbblkxalSk%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;474&quot; height=&quot;474&quot; data-filename=&quot;KakaoTalk_20221114_235226837.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;'UI를 담당하는 로직을 구분한다.'라는 요구사항을 의식하면서 코드를 작성하다 보니,&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자연스럽게 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;콘솔에 무언가를 보여주는 기능을 모아둔 LottoGameView 클래스&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 입력에 대한 유효성 검사 로직은 중복되는 부분이 있었고, 재사용을 하고 싶었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;유효성 검사 로직을 모아둔 유틸 느낌의 Validation 클래스&lt;/span&gt;&lt;/b&gt;를 만들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; LottoGame 클래스는 입력을 받아 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;로또를 발행하고 로또를 비교하여 당첨 통계를 냈다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 구현은 위와 같았고, 흐름에 문제가 없다고 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하지만 코드를 보고 있자니, 왜 인지 모르게 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;중단하였던 내 프로젝트가 떠올랐다.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;뭉쳐져 있고, 뭉쳐져 있고... 뭉쳐져있는...&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #ef5369;&quot;&gt;읽기 어려운 코드와 엄청난 분량&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시&lt;b&gt; LottoGame 클래스의&lt;/b&gt; &lt;b&gt;메서드 부분만 캡처해 보았다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/paoax/btrRfNnROs5/ka3wUJYIpn0LpAmnPiN751/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/paoax/btrRfNnROs5/ka3wUJYIpn0LpAmnPiN751/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/paoax/btrRfNnROs5/ka3wUJYIpn0LpAmnPiN751/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpaoax%2FbtrRfNnROs5%2Fka3wUJYIpn0LpAmnPiN751%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;447&quot; height=&quot;726&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;포스팅하는 지금도 한 화면에 꽉 찰 정도로 길다... &lt;b&gt;180줄 가량의 코드가 한데 뭉쳐있었다.&lt;br /&gt;로또 구매, 번호 비교, 당첨 통계에 대한 모든 메서드를 전부 가지고 있는 상태였고, 개선이 필요했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #409d00;&quot;&gt; 분리 기준 세우기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도메인 로직에 대한 이해를 통해 클래스의 분리 기준을 세웠다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 블로그의 자료가 상당히 큰 도움이 되었다. &lt;b&gt;&lt;a href=&quot;https://velog.io/@eddy_song/domain-logic&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;eddy_song 님의 포스팅&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAMb1x/btrRg8SSFJe/w7t9xNkZ6HWAJVgdCJQJ6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAMb1x/btrRg8SSFJe/w7t9xNkZ6HWAJVgdCJQJ6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAMb1x/btrRg8SSFJe/w7t9xNkZ6HWAJVgdCJQJ6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAMb1x%2FbtrRg8SSFJe%2Fw7t9xNkZ6HWAJVgdCJQJ6k%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;667&quot; height=&quot;299&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 내용을 바탕으로 &lt;b&gt;새로운 구조를 그려보았다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20221114_235226837_01.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUWujD/btrRa1VOx5j/OvkWSiIEyFAueNzTXkXGT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUWujD/btrRa1VOx5j/OvkWSiIEyFAueNzTXkXGT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUWujD/btrRa1VOx5j/OvkWSiIEyFAueNzTXkXGT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUWujD%2FbtrRa1VOx5j%2FOvkWSiIEyFAueNzTXkXGT1%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;1440&quot; data-filename=&quot;KakaoTalk_20221114_235226837_01.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 기능에 대한 &lt;b&gt;의사결정 코드를 구분하는 것을 목표로 했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로또 구매&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당첨 번호 입력&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 로또 번호 비교&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과 통계&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중 당첨번호 입력에 대한 기능은 단순히 번호를 저장하는 보관소 역할이라 &lt;b&gt;도메인 로직 범위에서 제외하기로 했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;나머지 3개의 기능에 대한 도메인 로직들을 각 클래스로 분리해 보았다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVTzou/btrRfJFQrbw/Eg5jlTtKzvFUnz8KcZzDPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVTzou/btrRfJFQrbw/Eg5jlTtKzvFUnz8KcZzDPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVTzou/btrRfJFQrbw/Eg5jlTtKzvFUnz8KcZzDPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVTzou%2FbtrRfJFQrbw%2FEg5jlTtKzvFUnz8KcZzDPK%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;464&quot; height=&quot;299&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;299&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로또 구매 : LottoPurchaseMachine&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;등수 계산 : PrizeCalculator&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과 통계 : Statistic&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #409d00;&quot;&gt; LottoGame 클래스의 변화&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;클래스를 나누고 나니, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;LottoGame 클래스에는 변화가 생겼다.&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. &lt;b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;LottoGame 클래스의&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;의미 파악이 쉬워졌고,&lt;/span&gt; &lt;/b&gt;파일의 길이가 줄었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KxMn6/btrRcOavWJa/CwfjuJtm7HnA2ualosdtw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KxMn6/btrRcOavWJa/CwfjuJtm7HnA2ualosdtw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KxMn6/btrRcOavWJa/CwfjuJtm7HnA2ualosdtw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKxMn6%2FbtrRcOavWJa%2FCwfjuJtm7HnA2ualosdtw0%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;624&quot; height=&quot;505&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개선 전 :&lt;/b&gt;&amp;nbsp;각 페이즈에서 필요한 여러 메서드가 모여있어&amp;nbsp;&lt;b&gt;클래스의 의미를 파악하기 힘들다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개선 후 :&lt;/b&gt;&amp;nbsp;&lt;b&gt;메서드 명만 보고도&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;'게임의 각 페이즈를 실행하는 곳'&lt;/span&gt;이라는 의미를 파악할 수 있다.&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;&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 각 페이즈의 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;기능 파악이 쉬워졌다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pgL8D/btrRb7BLhkj/rJrJk2jk8yoyLXQllS7Zrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pgL8D/btrRb7BLhkj/rJrJk2jk8yoyLXQllS7Zrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pgL8D/btrRb7BLhkj/rJrJk2jk8yoyLXQllS7Zrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpgL8D%2FbtrRb7BLhkj%2FrJrJk2jk8yoyLXQllS7Zrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;635&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개선 전 : &lt;/b&gt;drawLottoPhase에서 &lt;b&gt;너무 많은 기능을 담당하여&amp;nbsp;&lt;/b&gt;&lt;b&gt;정확히 무엇을 하는지 알기 어렵다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개선 후 :&lt;/b&gt; &lt;span&gt;&lt;b&gt;prizeCalculatePhase&lt;/b&gt;라는 메서드명과 내용으로 '&lt;b&gt;로또 등수를 계산한다' &lt;/b&gt;라는 의미를 알 수 있다.&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;statisticsPhase&lt;/b&gt;도 마찬가지로&lt;b&gt; '통계를 한다'&lt;/b&gt;&amp;nbsp;라는 의미를 알수있다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;각 메서드 본문의 가독성이 확연히 좋아졌다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #409d00;&quot;&gt;&amp;nbsp;디렉터리 생성 및 파일 분리&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로 각자의 역할 별로 디렉터리를 만들어 파일을 분리해 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRpm1k/btrRhksn1Ex/b8aGd2qsICPzQwAvDrWuR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRpm1k/btrRhksn1Ex/b8aGd2qsICPzQwAvDrWuR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRpm1k/btrRhksn1Ex/b8aGd2qsICPzQwAvDrWuR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRpm1k%2FbtrRhksn1Ex%2Fb8aGd2qsICPzQwAvDrWuR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;314&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;물론 위의 구조도 좋은 구조라고 말할 수 없다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하지만&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;이전보다 좋은 구조라고 당당히 말할 수 있다.&lt;/span&gt;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWqhTJ/btrReJ68grd/F5KFPJkjDOpxsLZ7jikhXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWqhTJ/btrReJ68grd/F5KFPJkjDOpxsLZ7jikhXk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWqhTJ/btrReJ68grd/F5KFPJkjDOpxsLZ7jikhXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWqhTJ%2FbtrReJ68grd%2FF5KFPJkjDOpxsLZ7jikhXk%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;307&quot; height=&quot;231&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;후기를 읽는 분들이 혹시 지루할까, 웃고 가시라고 짤을 넣었지만...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;화요일 새벽. 리팩토링을 마치고 잠자리에 들면서 조금 벅찬 감정을 느꼈다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평소 약점으로 생각했던 부분을 정면 돌파하면서 저런 구조를 완성해낸 것만으로 여러 감정이 밀려왔다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;무슨 감정인지는 모르겠다만... '열심히 잘 하고 있는 거겠지...' 같은 생각을 했던 것 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  앞으로 보완할 점!&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;1. 앱의 구조를 조금 더 명확히 파악하고 코드 작성하기.&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이번 3주 차 리팩토링은 다행히 성공으로 끝났지만, &lt;br /&gt;만약 조금만 더 복잡한 구조였다면 내 프로젝트처럼 &lt;b&gt;절반의 성공으로 끝났을 수도 있다.&lt;/b&gt;&lt;br /&gt;물론 처음부터 완벽한 구조를 만들 순 없겠지만, &lt;b&gt;깊은 고민을 통해 조금이라도 더 괜찮은 구조를 얻도록 노력할 것이다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2ac1bc; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;2. 클래스에 익숙해지기.&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;프리코스의 시작과 함께 사용하게 된 클래스는 여전히 어색하다.&lt;br /&gt;생성자에서 다른 클래스를 초기화해도 되는지,&lt;br /&gt;메서드 내에서 초기화하는 것과는 무슨 차이가 있는지, 이것저것 궁금하고 모르는 것 투성이다.&lt;br /&gt;더 많이 사용해 보고 관련 코드도 참고하면서&lt;b&gt; 하나씩 풀어가야 한다.&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;3주 차를 마무리 하며  &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저번 후기에서 3주 차에는 속력을 높여 달려보겠다고 다짐했었는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바람대로 정말 미친 듯이 달린 것 같다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이제 결승선을 통과하면 된다. 이대로 완주하자!  &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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dinpzQ/btrRiWye3Ai/kWuGz4sOvXix33NOglEft0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dinpzQ/btrRiWye3Ai/kWuGz4sOvXix33NOglEft0/img.jpg&quot; data-alt=&quot;가자아!!!!!!!!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dinpzQ/btrRiWye3Ai/kWuGz4sOvXix33NOglEft0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdinpzQ%2FbtrRiWye3Ai%2FkWuGz4sOvXix33NOglEft0%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;550&quot; height=&quot;480&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가자아!!!!!!!!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>우테코</category>
      <category>프리코스</category>
      <category>후기</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/101</guid>
      <comments>https://think0wise.tistory.com/101#entry101comment</comments>
      <pubDate>Tue, 15 Nov 2022 17:14:58 +0900</pubDate>
    </item>
    <item>
      <title>Jest - Matcher란?</title>
      <link>https://think0wise.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러분들은 Jest로 테스트 코드를 작성할 때 &lt;b&gt;다양한 Matcher를 사용하고 계시나요?&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오늘은&lt;b&gt; Jest에서 테스트 코드를 작성할 때 &lt;/b&gt;&lt;b&gt;자주 사용하는 Matcher에 대해서 알아보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. toBe( value )&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기본형을 비교할 때 자주 사용합니다. 값이 같은지 비교합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;대상이 원시형(primitive type)이라면 값을 비교하고,&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;참조형(reference type)이라면 같은 대상을 참조하는지 비교합니다. (얕은 비교)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668219790075&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toBe 테스트&quot;, () =&amp;gt; {
  test(&quot;원시형 비교&quot;, () =&amp;gt; {
    const result = &quot;123&quot;;

    expect(result).toBe(&quot;123&quot;); // test passed!
  });

  test(&quot;참조형 비교&quot;, () =&amp;gt; {
    const result = [1, 2, 3];

    expect(result).toBe([1, 2, 3]); // test failed!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 위 테스트 코드에서&lt;b&gt; 참조형인 배열 [1,2,3]의 toBe( ) 테스트는 실패하게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. toEqual( value )&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;참조형을 비교할 때 자주 사용됩니다. 참조형의 모든 필드(프로퍼티, 요소)를 재귀적으로 돌며 비교해 줍니다. (깊은 비교)&lt;br /&gt;원시형도 비교 가능합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668220894604&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toEqual 테스트&quot;, () =&amp;gt; {
  test(&quot;원시형 비교&quot;, () =&amp;gt; {
    const result = &quot;123&quot;;

    expect(result).toEqual(&quot;123&quot;); // test passed!
  });

  test(&quot;참조형 비교&quot;, () =&amp;gt; {
    const result = [1, 2, 3];

    expect(result).toEqual([1, 2, 3]); // test passed!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;toBe( ) 테스트와 다르게 &lt;b&gt;참조형인 배열의 toEqual() 테스트가 통과했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  주의할 점&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;객체의 프로퍼티나, 배열의 요소에&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;undefined가 추가되어 있어도 테스트는 통과됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668221538892&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toEqual undefined 테스트&quot;, () =&amp;gt; {
  test(&quot;참조형 비교 - 객체&quot;, () =&amp;gt; {
    const result = { a: 1, b: 2 };

    expect(result).toEqual({ a: 1, b: 2, c: undefined }); // test passed!!!!????
  });

  test(&quot;참조형 비교 - 배열&quot;, () =&amp;gt; {
    const result = [1, 2, 3];

    expect(result).toEqual([1, 2, 3, undefined]); // test passed!!!!!???
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 테스트 결과처럼 toEqual( ) 사용시 이 점에 유의하여 테스트 코드를 작성해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. toStrictEqual( value )&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;위와 같은 toEqual( )의 문제를 toStrictEqual( )로 해결할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt; &lt;b&gt;&amp;nbsp;toStrictEqual( )은 undefined까지 비교합니다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668222282725&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toStrictEqual undefined 테스트&quot;, () =&amp;gt; {
  test(&quot;참조형 비교 - 객체&quot;, () =&amp;gt; {
    const result = { a: 1, b: 2 };

    expect(result).toStrictEqual({ a: 1, b: 2, c: undefined }); // test failed ^^
  });

  test(&quot;참조형 비교 - 배열&quot;, () =&amp;gt; {
    const result = [1, 2, 3];

    expect(result).toStrictEqual([1, 2, 3, undefined]); //  test failed ^^
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 테스트는 실패합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmOvLU/btrQY2t6v6I/hjm1ZTyzgQA5mbaKK27Ov1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmOvLU/btrQY2t6v6I/hjm1ZTyzgQA5mbaKK27Ov1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmOvLU/btrQY2t6v6I/hjm1ZTyzgQA5mbaKK27Ov1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmOvLU%2FbtrQY2t6v6I%2Fhjm1ZTyzgQA5mbaKK27Ov1%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;564&quot; height=&quot;140&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;jest 공식 문서에서도 이러한 특징때문에 toStrictEqual( ) 이 선호된다고 알려주네요!&lt;/b&gt;&lt;/span&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 data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  &lt;b&gt;꼼꼼한 toStrictEqual( )&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;toStrcitEqual( )은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;객체의 인스턴스 타입까지 비교합니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668222896960&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe.only(&quot;toEqual vs toStrictEqual 인스턴스 테스트&quot;, () =&amp;gt; {
  class Test {
    constructor(test) {
      this.test = test;
    }
  }

  test(&quot;toEqual 인스턴스 테스트&quot;, () =&amp;gt; {
    const instance = new Test(1);
    const normal = { test: 1 };

    expect(normal).toEqual(instance); // test passed !!
  });

  test(&quot;toStrictEqual 인스턴스 테스트&quot;, () =&amp;gt; {
    const instance = new Test(1);
    const normal = { test: 1 };

    expect(normal).toStrictEqual(instance); // test failed !!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;같은 조건에 toEqual( ) 은 통과한 반면, toStrictEqual( )은 실패했습니다.&lt;/b&gt;&lt;/span&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 외에도 &lt;b&gt;toStrictEqual( )은 &lt;/b&gt;[ ,1] 과 [undefined, 1] 을 다르다고 비교해 주는 등 보다 엄격하게 비교합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tpuf1/btrQ2fkMxIn/kxGpKvxPIPu4vRRqASKEa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tpuf1/btrQ2fkMxIn/kxGpKvxPIPu4vRRqASKEa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tpuf1/btrQ2fkMxIn/kxGpKvxPIPu4vRRqASKEa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTpuf1%2FbtrQ2fkMxIn%2FkxGpKvxPIPu4vRRqASKEa0%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;1006&quot; height=&quot;154&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;toStrictEqual( )의 특징을 잘 활용하여 테스트 코드를 작성해 봅시다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. toBeTruthy&lt;b&gt;( )&lt;/b&gt;, toBeFalsy&lt;b&gt;( )&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;JS는 boolean 값을 true, false 만으로 한정하지 않습니다.&amp;nbsp; &lt;/b&gt;&lt;/b&gt;&lt;br /&gt;0, 빈 문자열 등을 false로 취급하는 것과 같이 말이죠.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;이런값들을 비교할 때 toBeTrythy( ), toBeFalsy( )를 사용합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668224094764&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toBeTruthy / toBeFalsy 테스트&quot;, () =&amp;gt; {
  test(&quot;toBeTruthy 테스트&quot;, () =&amp;gt; {
    const result = &quot;0&quot;;

    expect(result).toBeTruthy(); // test passed !!
  });

  test(&quot;toBeFalsy 테스트&quot;, () =&amp;gt; {
    const result = 0;

    expect(result).toBeFalsy(); // test passed !!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 밖에도 Truthiness를 비교할 수 있는 matcher는 다양하니 알아두면 좋겠습니다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;toBeNull: 대상이 null 인지 검증합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;toBeUndefined: 대상이 undefined 인지 검증합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;toBeDefined: 대상이 정의되었는지 검증합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;5. toContain( element )&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;배열이 특정 요소를 가지고 있는지 검증합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;배열, 문자열, Set, 노드 리스트, HTML 콜렉션과 같은&lt;b&gt; iterable에 사용할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668227915861&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toContain 테스트&quot;, () =&amp;gt; {
  test(&quot;배열 테스트&quot;, () =&amp;gt; {
    const result = [1, 2, 3];

    expect(result).toContain(1); // test passed !!
  });

  test(&quot;문자열 테스트&quot;, () =&amp;gt; {
    const result = &quot;문자열 테스트&quot;;

    expect(result).toContain(&quot;문자열&quot;); // test passed !!
  });

  test(&quot;Set 테스트&quot;, () =&amp;gt; {
    const result = new Set([1, 2, 3]);

    expect(result).toContain(1); // test passed !!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;6. t&lt;b&gt;oHaveLength( number )&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;대상이 length 프로퍼티를 가지고 있는지, 또한 length의 길이가 일치하는지 검증합니다.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;배열이나 문자열의 길이를 체크할 때 유용합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668228314632&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toHaveLength 테스트&quot;, () =&amp;gt; {
  test(&quot;배열 테스트&quot;, () =&amp;gt; {
    const result = [1, 2, 3];

    expect(result).toHaveLength(3); // test passed !!
  });

  test(&quot;문자열 테스트&quot;, () =&amp;gt; {
    const result = &quot;문자열 테스트&quot;;

    expect(result).toHaveLength(7); // test passed !!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;7. &lt;b&gt;&lt;b&gt;toThrow( error? )&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;대상 함수를 호출했을 때 에러가 발생하는지 여부를 검증합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668229272199&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toThrow 테스트&quot;, () =&amp;gt; {
  const testFunc = () =&amp;gt; {
    throw new Error(&quot;에러 테스트 함수입니다.&quot;);
  };
  const errorObj = new Error(&quot;에러 테스트 함수입니다.&quot;);

  test(&quot;인자 X&quot;, () =&amp;gt; {
    expect(testFunc).toThrow(); // test passed !!
  });

  test(&quot;문자열 인자&quot;, () =&amp;gt; {
    expect(testFunc).toThrow(&quot;에러 테스트&quot;); // test passed !!
  });

  test(&quot;Error 객체 인자&quot;, () =&amp;gt; {
    expect(testFunc).toThrow(errorObj); // test passed !!
  });

  test(&quot;클래스 인자&quot;, () =&amp;gt; {
    expect(testFunc).toThrow(Error); // test passed !!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인자가 없을 때:&amp;nbsp; &lt;b&gt;에러 발생을 검증합니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문자열 인자: 에러 발생 + &lt;b&gt;에러 메시지가 인자로 전달한 문자열을 포함하는지 검증합니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Error 객체 인자: 에러 발생 +&lt;b&gt; 에러 메시지가 인자로 전달한 Error 객체의 메세지와 일치하는지 검증합니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;class 인자: 에러 발생 + &lt;b&gt;에러 객체가 인자로 전달한 class의 instance 인지 검증합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;8&lt;b&gt;&lt;b&gt;. toBeInstanceOf( Class )&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;대상 객체가 인자 클래스의 instance 인지 검증합니다.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668231954175&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe(&quot;toBeInstanceOf 테스트&quot;, () =&amp;gt; {
  class Test {}
  const output = new Test();
  const fake = {};

  test(&quot;인스턴스 O&quot;, () =&amp;gt; {
    expect(output).toBeInstanceOf(Test); // test passed !!
  });
  test(&quot;인스턴스 X&quot;, () =&amp;gt; {
    expect(fake).toBeInstanceOf(Test); // test failed !!
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기까지 다양한 matcher를 알아보았습니다.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소개한 matcher 외의 더 많은 matcher에 대한 정보들은 공식 문서에서 찾으실 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jestjs.io/docs/expect&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jest Matcher 공식 문서&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668232707986&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;Expect &amp;middot; Jest&quot; data-og-description=&quot;When you're writing tests, you often need to check that values meet certain conditions. expect gives you access to a number of &amp;quot;matchers&amp;quot; that let you validate different things.&quot; data-og-host=&quot;jestjs.io&quot; data-og-source-url=&quot;https://jestjs.io/docs/expect&quot; data-og-url=&quot;https://jestjs.io/docs/expect&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0PaQk/hyQxM37xZN/IRx8UylcSlfhDKTpJBvbe1/img.png?width=796&amp;amp;height=416&amp;amp;face=0_0_796_416,https://scrap.kakaocdn.net/dn/c6ozmc/hyQxMiJzvP/ToZmgCQdz1yeBYjY1LF2l0/img.png?width=796&amp;amp;height=416&amp;amp;face=0_0_796_416&quot;&gt;&lt;a href=&quot;https://jestjs.io/docs/expect&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jestjs.io/docs/expect&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0PaQk/hyQxM37xZN/IRx8UylcSlfhDKTpJBvbe1/img.png?width=796&amp;amp;height=416&amp;amp;face=0_0_796_416,https://scrap.kakaocdn.net/dn/c6ozmc/hyQxMiJzvP/ToZmgCQdz1yeBYjY1LF2l0/img.png?width=796&amp;amp;height=416&amp;amp;face=0_0_796_416');&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;Expect &amp;middot; Jest&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;When you're writing tests, you often need to check that values meet certain conditions. expect gives you access to a number of &quot;matchers&quot; that let you validate different things.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jestjs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다음 포스트에서는&lt;/b&gt; &lt;b&gt;mock의 개념과 mock 메서드, &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;&lt;b&gt;mock 함수에 사용하는 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;Matcher에&lt;/b&gt; 대해 알아보겠습니다!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dycIZS/btrQ4a4qF9w/v2d5UOUjcfgPQmRHUob23K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dycIZS/btrQ4a4qF9w/v2d5UOUjcfgPQmRHUob23K/img.png&quot; data-alt=&quot;기본이 중요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dycIZS/btrQ4a4qF9w/v2d5UOUjcfgPQmRHUob23K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdycIZS%2FbtrQ4a4qF9w%2Fv2d5UOUjcfgPQmRHUob23K%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Testing</category>
      <category>JEST</category>
      <category>matcher</category>
      <category>테스트 코드</category>
      <category>테스팅</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/100</guid>
      <comments>https://think0wise.tistory.com/100#entry100comment</comments>
      <pubDate>Sat, 12 Nov 2022 15:07:37 +0900</pubDate>
    </item>
    <item>
      <title>우테코 프론트엔드 5기 - 프리코스 2주 차 후기</title>
      <link>https://think0wise.tistory.com/99</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;우테코 2주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpU025/btrP9d2p2sZ/qxScUK5RPUECjIf0ZjpZq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpU025/btrP9d2p2sZ/qxScUK5RPUECjIf0ZjpZq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpU025/btrP9d2p2sZ/qxScUK5RPUECjIf0ZjpZq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpU025%2FbtrP9d2p2sZ%2FqxScUK5RPUECjIf0ZjpZq1%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;900&quot; height=&quot;300&quot; data-filename=&quot;우테코 2주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프리코스 2주 차를 마무리했다.&lt;b&gt;&lt;br /&gt;2주 차 미션은 우여곡절이 훨씬 많았다.&lt;br /&gt;그걸 다 부셔내고&lt;/b&gt; 후기를 적고 있다니... 확실히 성장했다!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이번 후기도 성장했던 부분과 차주 목표를 중점으로 적어 나가 보겠다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;1주 차 공통 피드백 점검&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2주 차 미션 시작에 앞서 1주 차 공통 피드백을 점검했다.&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;&lt;b&gt;커밋 메시지를 의미 있게 작성한다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;1주 차 미션을 진행하며 커밋 컨벤션을 적용했지만, 익숙하지&amp;nbsp;&lt;/span&gt;않은 탓에&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;실수를 많이 했었다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의미 있는&lt;span style=&quot;background-color: #ffffff;&quot;&gt; 커밋 메시지에 대해 리마인드 했다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;&lt;b&gt;이름을 통해 의도를 드러낸다.&lt;br /&gt;축약하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333;&quot;&gt;&lt;b&gt;공백 라인을 의미 있게 사용한다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변수, 함수명을 축약하다가 &lt;b&gt;중의적인 표현이 되어버린 적이 많은 것 같다.&lt;/b&gt;&lt;br /&gt;이름이 길어지더라도 &lt;b&gt;확실한 의도를 전할 수 있도록&lt;/b&gt; 해야겠다고 생각했다.&lt;/span&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: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;space와 tab을 혼용하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;linter와 codeFormatter의 기능을 활용한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;EOL(End Of Line)을 확인한다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1주 차 미션을 진행하면서 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;작업 환경 별 코드 포멧팅이 상이하여&lt;/b&gt; 변경사항이 올바르게 표시되지 못한 커밋이 있었다.&lt;br /&gt;이번 미션 시작과 동시에 prettier 설정 파일부터 작성했던 이유이기도 하다 &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;⚾&lt;/b&gt; 2&lt;b&gt;주 차 미션 -&amp;nbsp; 숫자 야구&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2주 차 미션은 숫자 야구 게임을 구현하는 과제였고, &lt;b&gt;요구사항이 추가되었다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Jest를 이용하여&lt;/span&gt; 본인이 정리한 기능 목록이 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;정상 동작함을 테스트 코드로 확인한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;테스트 코드 작성의 중요성!&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'Javascript info'라는 사이트에서 JS를 공부하면서, &lt;a href=&quot;https://ko.javascript.info/testing-mocha&quot;&gt;테스트 자동화와 Mocha&lt;/a&gt;를 접한 적이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 코드라고 말하기도 부끄러운 '&lt;b&gt;1 + 1 은 2이다.' 같은 테스트 코드를 작성하며 이해해 보려 했었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;&lt;b&gt;당연하게도 테스트의 목적과 의미를 이해할 수 없었고, 심지어 문법조차 어렵게 다가왔다&lt;/b&gt;. &lt;br /&gt;그렇게 해당 챕터를 넘어갔었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그때부터 지금까지 '프로덕션 코드부터 잘 짜고 그 후에 테스트 코드 공부하자!'&lt;br /&gt;라는 생각으로 테스팅 공부를 미뤄왔던 것 같다. 그게 맞는 건 줄 알았다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2주 차 미션을 하기 전까지는 말이다. &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;쉽지 않은 테스트 코드...&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;우선 기본을 다지기 위해&amp;nbsp;&lt;a href=&quot;https://think0wise.tistory.com/98&quot;&gt;테스트 코드의 목적과 장점, Jest의 기본 문법에 대해 공부하며 포스팅하였고&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;이를 바탕으로 내가 만든&amp;nbsp;&lt;b&gt;기능에 대한 테스트 코드를 작성해 보았다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 쉽지 않았고,&lt;b&gt;&amp;nbsp;특히 코드의 형식을 어떻게 통일해야 하는지 감이 오지 않았다.&lt;br /&gt;예시로 주어진 테스트 코드를 보고서는 감을 잡기 어려웠다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;고민은 깊어만 갔다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 줄기의 빛... MissionUtils 테스트 파일!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 코드를 썼다 지웠다를 반복하며 고민을 이어가던 중,&lt;br /&gt;&lt;b&gt;'MissionUtils는 공개적으로 여러 명이 사용해야 하니깐 확실하게 검증하지 않았을까 ?'&lt;/b&gt;&lt;br /&gt;&lt;b&gt;'혹시... 테스트 파일이 있지 않을까 ?&quot;&lt;/b&gt;&lt;br /&gt;하는 마음에 뒤져 보았는데...&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg8GIs/btrQKuvKZHW/RWKMiwuk7YUaqzNcM0sdq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg8GIs/btrQKuvKZHW/RWKMiwuk7YUaqzNcM0sdq0/img.png&quot; data-alt=&quot;ㅇ..유..유레카!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg8GIs/btrQKuvKZHW/RWKMiwuk7YUaqzNcM0sdq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg8GIs%2FbtrQKuvKZHW%2FRWKMiwuk7YUaqzNcM0sdq0%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;729&quot; height=&quot;281&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;281&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;MissionUtils의 test 폴더를 발견했고,&amp;nbsp;&lt;/b&gt;&lt;b&gt;테스트 파일의 코드에서&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;given, when, then 키워드를 발견했다!!!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;given, when, the&lt;/span&gt;&lt;/span&gt;n은 일종의 테스트 코드 패턴으로 &lt;br /&gt;&lt;/b&gt;앞서 테스팅에 대해 공부하며 알게 됐던 키워드이지만, 미숙했던 탓에 올바르게 적용하지 못하고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 발견을 통해 &lt;b&gt;다양한 예시 코드를 보며&lt;/b&gt; 조금 더 나은 테스트 코드로 개선할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  재밌다! 테스트 코드!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트를 실행하고, 수정하고, 만들고를 반복하면서 이전에는 느끼지 못했던 &lt;b&gt;장점을 조금씩 느낄 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 &lt;b&gt;내가 작성한 코드가 잘 동작한다는 것을 검증할 수 있었고&lt;/b&gt;,&amp;nbsp;버그 발생에 대한 불안함이 줄어들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 &lt;b&gt;코드를 리팩토링한 뒤&lt;/b&gt; &lt;b&gt;테스트를 실행하는 것만으로도 &lt;/b&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이전과 같은 올바른 동작을 하는지 검증할 수 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자연스레 리팩토링에 소요되는 시간도 줄어들게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dhxi0/btrQCVAPxQ1/H7jHuym1ioCdv3kjWqCdT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dhxi0/btrQCVAPxQ1/H7jHuym1ioCdv3kjWqCdT1/img.png&quot; data-alt=&quot;Good~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dhxi0/btrQCVAPxQ1/H7jHuym1ioCdv3kjWqCdT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDhxi0%2FbtrQCVAPxQ1%2FH7jHuym1ioCdv3kjWqCdT1%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;234&quot; height=&quot;41&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Good~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작성한 테스트가 Pass✅ 하는 걸 볼 때마다 더해지는&lt;b&gt; 성취감은 덤이다.&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;물론 아직 기본적인 Matcher 메서드를 주로 사용하여 다소 1차원적인 모양이지만...&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;앞으로 의식적으로 테스팅을 연습하면서 더 깊게 공부해 볼 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;** 테스팅을 학습하면서 큰 도움이 됐던 영상을 소개한다. &lt;a href=&quot;https://youtu.be/bIeqAlmNRrA&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[우아한테크세미나 TDD 리팩토링 by 포비]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;** &lt;b&gt;어떤 방향으로 테스팅을 학습해야 하는지에 대해&lt;/b&gt; 중점적으로 보면 좋을 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  클린코드 작성하기 (feat. 동료의 관점)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클린 코드를 작성해야 하는 이유는 간단하다. &lt;b&gt;나만 볼 코드가 아니기 때문이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;동료와 협업하는 과정에서 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;필연히 내 코드를 이해시켜야 하는 순간이 올 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;추가된 &lt;/b&gt;요구사항도 비슷한 맥락에서의 의도가 아닐까 생각한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;메서드가 한 가지 일만 하도록 최대한 작게 만들어라.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작성이 끝난 코드를 다시 살펴보면서 위 요구사항을 지키지 못한 부분이 있는지,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;동료의 입장이 되어 코드를 처음 본다고 생각하며 읽어보았다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;상당히 주관적인 관점으로&lt;/b&gt; 작성한 코드가 많았고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;많은 시간을 할애하여 리팩토링을 했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #ef5369;&quot;&gt; 나만 아는 의미...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존 코드&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi3wAn/btrQxbSiGBN/mk1fTBkDcBSI7Ro7GLzlO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi3wAn/btrQxbSiGBN/mk1fTBkDcBSI7Ro7GLzlO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi3wAn/btrQxbSiGBN/mk1fTBkDcBSI7Ro7GLzlO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi3wAn%2FbtrQxbSiGBN%2Fmk1fTBkDcBSI7Ro7GLzlO1%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;424&quot; height=&quot;193&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;END_TRIGGER, Console.close()의 의미가 파악이 되지 않을 것이다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;위 코드는 trigger에 따라&amp;nbsp;&lt;b&gt;게임을 재시작하거나&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;종료하는 로직이다.&lt;/span&gt;&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;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;나는 '재시작, 종료' 라는 조건을 알기 때문에&amp;nbsp;&lt;/b&gt;&lt;b&gt;END&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;라는 단어에서 종료의 의미를 찾을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Console.close() 함수&lt;/b&gt;는 사용자 입출력 인스턴스를 종료시키는&amp;nbsp;&lt;b&gt;미션에서 제공한 유틸 함수이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;나는 해당 함수가 &lt;/b&gt;&lt;/b&gt;무슨 동작을 하는지 알고 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt;이 역시 나만 알고 있다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조건을 모르고 처음 읽는 동료는 &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;END&lt;/b&gt;,&lt;b&gt;&amp;nbsp;Console.close()의 동작을 바로 파악할 수 없다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리팩터링 후 코드 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpluCu/btrQyW8prlA/rRiJOSW4U9FtqRioik4qYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpluCu/btrQyW8prlA/rRiJOSW4U9FtqRioik4qYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpluCu/btrQyW8prlA/rRiJOSW4U9FtqRioik4qYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpluCu%2FbtrQyW8prlA%2FrRiJOSW4U9FtqRioik4qYk%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;425&quot; height=&quot;195&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Console.close() &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;  &lt;b&gt;quitGame()으로&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;END   &lt;b&gt;QUIT으로&lt;/b&gt; 변경해서&lt;b&gt; 종료의 의미를 강조하였다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;조건과 본문이 자연스럽게 이어지면서 의미 파악이 쉽다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #ef5369;&quot;&gt; 나만 편한 로직...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존 코드&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yOT6m/btrQErlpnsO/Zq6RWufqs5lXGK7pbVOhs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yOT6m/btrQErlpnsO/Zq6RWufqs5lXGK7pbVOhs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yOT6m/btrQErlpnsO/Zq6RWufqs5lXGK7pbVOhs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyOT6m%2FbtrQErlpnsO%2FZq6RWufqs5lXGK7pbVOhs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;269&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;getStrikeBallCount는 스트라이크와 볼의 개수를 반환하는 함수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;목적을 알았어도 로직을 파악하기 어려울 것이다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;특히 밑줄 친 코드를 이해하기는 더욱 어려울 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'볼 개수에서 스트라이크 개수를 왜 빼주는 것이지?' &lt;b&gt;하고 의문을 가지게 되며&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;맥락 파악을 위해 다시 위쪽 for문으로 시선이 옮겨가야 한다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 코드의&lt;b&gt; 장점은 작성자가 편하다는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 코드의&lt;b&gt; 단점은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;작성자만 편하다는 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리팩터링 후 코드&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KRrNI/btrQErsc7Sz/O4EwoXqfb0CtZeRUxdaJt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KRrNI/btrQErsc7Sz/O4EwoXqfb0CtZeRUxdaJt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KRrNI/btrQErsc7Sz/O4EwoXqfb0CtZeRUxdaJt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKRrNI%2FbtrQErsc7Sz%2FO4EwoXqfb0CtZeRUxdaJt1%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;374&quot; height=&quot;304&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2개의 for문을 1개로 통합했고, 볼 개수에서 스트라이크 개수를 빼주는 로직도 제거하였다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 조건문에서 각자의 카운트만 계산하기 때문에&amp;nbsp;&lt;b&gt; 의미도 단순하고 파악하기 쉽다.&lt;br /&gt;위에서 아래로 읽어 내려오면서 자연스럽게 로직의 맥락을 파악할 수 있는 코드가 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;** 클린 코드를 학습하면서 큰 도움이 됐던 repository를 소개한다. [&lt;a href=&quot;https://github.com/qkraudghgh/clean-code-javascript-ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;clean-code-javascript-ko]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;**&lt;b&gt; 코드를 작성할 때 어떤 것을 유의해야 하는가&lt;/b&gt;에 대해 중점적으로 보면 좋을 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  앞으로 보완할 점!&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;1. 테스트 코드 또한 동료가 &lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;이해할 수 있도록 가독성 있게 작성하기&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 코드에서 내 코드가 잘 작동한다는 검증을 할 수 있다.&lt;br /&gt;&lt;b&gt;반대로 테스트 코드를 보고 어떤 동작을 하는지, 어떻게 사용되어야 하는지 알 수 있어야 한다.&lt;/b&gt;&lt;br /&gt;또한 프로덕션 코드를 추가했을 때, 테스트가 왜 실패하는지 쉽게 진단이 되어야 한다.&lt;br /&gt;이번에 내가 작성한 테스트 코드는 위와 같은 부분을 지키지 못한 것 같다.&lt;br /&gt;앞으로 &lt;b&gt;더 많은 테스트 코드를 작성해 보면서 테스트 코드의 질 또한 높일 수 있도록 노력할 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2ac1bc; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;2. 다른 사람이 작성한 코드 더 많이 보기&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프리코스를 진행하면서 &lt;b&gt;다른 사람의 코드를 읽는 경험을 하게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개념에 대한 예시 코드나, 공식 문서가 아닌 실제 코드는 처음 읽는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드를 읽으면서 문맥을 파악하는 것도 실력이라고 생각한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;앞으로 더 많은 사람들의 다양한 관점이 담긴 코드를 읽어보면서 배우고 흡수할 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;2주 차를 마무리 하며  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;2주 차에 학습한 모든 내용 중 가장 뇌리에 깊게 박힌 건 단연 테스트 코드이다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내겐 멀게만 느껴졌던 테스트 코드인데, &lt;b&gt;어느새 더 좋은 테스트 코드에 대한 고민도 하고 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트에 대한 &lt;b&gt;거리감을 어떻게 좁혀 나갈 수 있는지, &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;어떻게 내 것으로 만들 수 있는지 알게 되어 너무 좋다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1주 차 미션으로 성장할 수 있는 &lt;b&gt;길이 열렸었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 2주 차에는 목표했던 대로 &lt;b&gt;열린 길을 따라 열심히 걸었다고 생각한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다음 3주 차에는 천천히 속력을 높여 달려보도록 하겠다!  &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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmrUS/btrQEq8wrbM/imO0CMIgs476IXgYwRUbpk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmrUS/btrQEq8wrbM/imO0CMIgs476IXgYwRUbpk/img.jpg&quot; data-alt=&quot;가자!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmrUS/btrQEq8wrbM/imO0CMIgs476IXgYwRUbpk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmrUS%2FbtrQEq8wrbM%2FimO0CMIgs476IXgYwRUbpk%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;550&quot; height=&quot;480&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가자!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>5기</category>
      <category>우테코</category>
      <category>우테코 프리코스</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/99</guid>
      <comments>https://think0wise.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 8 Nov 2022 10:27:22 +0900</pubDate>
    </item>
    <item>
      <title>Testing - 테스트 코드의 목적과 규칙, Jest 기본 문법</title>
      <link>https://think0wise.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;여러분들은 테스트 코드의 중요성을 알고 계신가요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;많은 개발자들이 자신이 작성한 코드를 테스트하기 위해, 또는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;더 좋은 코드를 작성하기 위해 테스트 코드를 작성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;코드를 위해 또 코드를 작성한다니 의아하지 않나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;오늘은&lt;b&gt; 테스트 코드를 작성하는 이유와 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;많은 개발자들이 사용하고 있는 &lt;b&gt;Jest 테스팅 라이브러리&lt;/b&gt;에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;1. 테스트 코드의 목적&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;개발 과정 중 예상하지 못했던 문제를 미리 발견할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;작성한 코드가 의도대로 동작하는지 검증할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;코드 리팩터링 후 기존 소스와 동일한 동작을 하는지 검증할 수 있다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;장점만 있지 않겠죠?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;테스트 코드까지 작성해야 하므로 &lt;b&gt;개발 시간이 오래 걸리게 된다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;어플리케이션에 변경이 발생하면 &lt;b&gt;테스트 코드도 변경해야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;하지만 버그를 발견하고 수정하는 과정이 많아질수록 오히려&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;개발 시간을 줄일 수 있다거나,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;자유로운 수정과 삭제가 가능하므로 오히려 대처에 유연하다고 말하기도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;테스트 코드의 단점에 대해서는 &lt;b&gt;관점을 달리하는 개발자도 많이 있는 것 같습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2. 테스트 코드 작성 규칙&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&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 id=&quot;059a&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;독립적이어야 한다. 어떤 테스트도 다른 테스트에 의존하지 않아야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li id=&quot;dc40&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;격리되어야 한다. Ajax, LocalStorage, UI Event 등 테스트 대상이 의존하는 것을 다른 것으로 대체한다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li id=&quot;dc40&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;given, when, then 단계에 따라 테스트 코드를 작성한다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;1번 규칙은&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;2번 규칙의&lt;/b&gt; 의존 대상을 다른 것으로 대체하는 것을 &lt;span&gt;&lt;b&gt;테스트 더블&lt;/b&gt;(Dummy, Stub, Fake, Spy, Mock)이라고 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;3번 규칙의&lt;/b&gt; 예시를 들면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;주어진 상황에(given)&amp;nbsp; =&amp;gt; 어떤 것을 요청, 이동, 생성, 작동하면(when) =&amp;gt;&amp;nbsp; ~~ 한다. (then)&lt;br /&gt;&amp;nbsp;( , ) 콤마 구분자 없이&amp;nbsp; =&amp;gt;&amp;nbsp; split 메서드를 사용하면&amp;nbsp; =&amp;gt;&amp;nbsp; 그대로 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;3. Jest 라이브러리 맛보기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;지금까지 Jest를 설명하기 위한 빌드업이었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;이제 기본적인 테스트 코드를 작성하며 Jest를 배워봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Jest는 Test Runner와 Test Matcher Test Mock 을 한 번에 제공해 주고, 별도의 설정이 필요 없어 각광받고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;간단하게 Runner는 테스트 환경, Matcher는 비교 메서드, Mock은 테스트가 어려운 부분을 대체하는 도구입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세한 설명은 다음 포스트에서 알아보도록 하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;오늘은 테스트의 형태를 만드는 기본 문법만 알아보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-1. test 파일 생성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;Jest&lt;/b&gt;는 기본적으로&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;test.js&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;로 끝나거나,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;__test__&amp;nbsp;디렉터리&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;&amp;nbsp;안에 있는 파일들은&lt;/b&gt; 모두 테스트 파일로 인식합니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;취향에 따라 &lt;b&gt;파일명.test.js 을 생성하거나,&amp;nbsp; __test__ 디렉터리를 만들어 파일명.js 를 생성합시다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-2. test 파일 기본 문법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음은 테스트 파일의 기본 구조와 문법입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667484139844&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; /* --------- 문법 예제 ---------- */ 
describe(&quot;문자열 테스트&quot;, () =&amp;gt; {
  test(&quot;repeat 메서드로 문자열을 여러번 반복&quot;, () =&amp;gt; {
    const input = &quot;abc&quot;;
    const result = input.repeat(3);

    expect(result).toEqual(&quot;abcabcabc&quot;);
  });
 })
  
 /* --------- 문법 설명 ---------- */ 
 describe(&quot;테스트 그룹에 대한 설명&quot;, () =&amp;gt; {
  test(&quot;해당 테스트에 대한 설명&quot;, () =&amp;gt; { 
    expect( 검증 대상 ).toXxx( 기대 결과 );
  });
 })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;describe:&lt;/b&gt; 여러 테스트를 그룹으로 묶어주는 역할입니다.&lt;br /&gt;내부에 테스트에 쓰일 변수, 객체 등을 선언합니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;test:&lt;/b&gt; 개별 테스트를 의미하며 내부에서 검증을 실시합니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;expext ( 검증 대상 ) :&lt;/b&gt; 검증하고자 하는 대상입니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;.toXxx( 기대 결과 )&lt;/b&gt; :&lt;b&gt; toXxx 부분을 통해 검증 대상과, 기대 결과를 비교합니다.&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3-3.&amp;nbsp; toXxx&amp;nbsp; ( a.k.a&amp;nbsp; Test Matcher )&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 기본 문법에서 &lt;b&gt;toXxx 부분이 바로 Matcher 메서드입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;to&lt;span style=&quot;color: #000000;&quot;&gt;Be, to&lt;/span&gt;Equal, toContain 등 &lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;여러 가지 비교를 위한 다양한 matcher 메서드가 존재합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다시 3-2 예제를 봅시다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667485428587&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const input = &quot;abc&quot;;
const result = input.repeat(3);

expect(result).toEqual(&quot;abcabcabc&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;input 문자열인 &quot;abc&quot;를 3번 반복한 값과&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &quot;abcabcabc&quot; 문자열을 대상으로&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;toEqual 비교&lt;/b&gt;를 하고 있습니다. 상당히 직관적이죠?&amp;nbsp;&lt;br /&gt;&lt;b&gt;문자열은 서로 같기 때문에 test는 통과하게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;어느 정도 감이 잡히는 것 같나요?&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;다음 포스트에서는 Jest의 여러 Matcher 메서드를 알아보겠습니다.&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qj4by/btrQkHpA3aO/UAgccKCexWz3WfJjPEk3RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qj4by/btrQkHpA3aO/UAgccKCexWz3WfJjPEk3RK/img.png&quot; data-alt=&quot;기본이 중요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qj4by/btrQkHpA3aO/UAgccKCexWz3WfJjPEk3RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQj4by%2FbtrQkHpA3aO%2FUAgccKCexWz3WfJjPEk3RK%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Testing</category>
      <category>JEST</category>
      <category>matcher</category>
      <category>테스트 코드</category>
      <category>테스트의 목적</category>
      <category>테스트의 의미</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/98</guid>
      <comments>https://think0wise.tistory.com/98#entry98comment</comments>
      <pubDate>Thu, 3 Nov 2022 23:42:30 +0900</pubDate>
    </item>
    <item>
      <title>우테코 프론트엔드 5기 - 프리코스 1주 차 후기</title>
      <link>https://think0wise.tistory.com/97</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;우테코 1주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buCF9Q/btrP4W2uHME/mL9uTXskrogazbkOQvKvaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buCF9Q/btrP4W2uHME/mL9uTXskrogazbkOQvKvaK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buCF9Q/btrP4W2uHME/mL9uTXskrogazbkOQvKvaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuCF9Q%2FbtrP4W2uHME%2FmL9uTXskrogazbkOQvKvaK%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;900&quot; height=&quot;300&quot; data-filename=&quot;우테코 1주차.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;드디어 기다리던 프리코스가 시작되었다!&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;짧은 시간이었지만,&amp;nbsp;&lt;/span&gt;&lt;b&gt;배운 것은 엄청났고 성장했다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;남은 프리코스 기간동안 &lt;b&gt;성장과 약점 보완을 목표로 달려나갈 것이다!&lt;/b&gt;&lt;br /&gt;앞으로 &lt;b&gt;매주 프리코스 후기를 작성하며 지난 한 주를 정리하려 한다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;성장했던 부분과 차주 목표를 중점으로 적어 나가 보겠다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;zwj;♂️&lt;/b&gt;&amp;nbsp;&lt;b&gt;1주 차 미션 - 온보딩&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1주 차 미션은 코딩 테스트와 유사한 형식의 과제였고, 총 7개의 문제를 &lt;b&gt;요구사항대로 처리해야 했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;기능을 구현하기 전에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;기능 구현 목록의 중요성&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;&lt;b&gt;계획 없이 무작정 시작한&lt;/b&gt; 개인 프로젝트를 완성하기 위해&lt;b&gt; 정말 많은 시간을 투자한 경험이 있다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;구현할 기능에 대한 기준 없이 시작한 개발이 원인이었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또다시 이런 문제를 만들지 않겠다고 &lt;b&gt;&lt;a href=&quot;https://think0wise.tistory.com/83?category=1291662&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;다짐&lt;/a&gt;&lt;/b&gt;까지 했던 터라, 해당 요구사항에 더욱더 진지하게 임했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 코딩 테스트와 유사한 과제임에도 기능 구현 목록을 꼼꼼하게 작성하려고 노력했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVfwZr/btrPRBwRpAB/vYKPRCzBKDwMjzpuitg2Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVfwZr/btrPRBwRpAB/vYKPRCzBKDwMjzpuitg2Uk/img.png&quot; data-alt=&quot;README.md 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVfwZr/btrPRBwRpAB/vYKPRCzBKDwMjzpuitg2Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVfwZr%2FbtrPRBwRpAB%2FvYKPRCzBKDwMjzpuitg2Uk%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;451&quot; height=&quot;390&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;README.md 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제를 해결하기 위한 &lt;b&gt;기능들을 정리하면서&lt;/b&gt; &lt;b&gt;자연스럽게 전체적인 흐름이 이해되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 &lt;b&gt;명확한 목적이 생기다 보니&lt;/b&gt; &lt;b&gt;기능을&lt;/b&gt; &lt;b&gt;구현하는 시간도 단축됐다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기능 구현 목록의 중요성을 다시 한번 상기시킬 수 있는 값진 시간이었다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;다시는 다짜고짜 코드부터 입력하지 않을 것이다... &lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;올바른 커밋 메시지 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Git은&lt;/b&gt; 효과적인 버전 관리를 통해 &lt;b&gt;효율적인 협업 환경을 제공한다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 나에게 Git은 개인 프로젝트를 위한 &lt;b&gt;[혼자만의 저장소]&lt;/b&gt; 역할이었기에&lt;br /&gt;평소 commit message를 대수롭지 않게 생각했고, &lt;b&gt;자유분방하게&lt;/b&gt; &lt;b&gt;입맛대로 작성하곤 했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 나에게 있어&amp;nbsp;&lt;b&gt;[기능 단위 커밋]&lt;/b&gt;&amp;nbsp;이라는 요구사항은&amp;nbsp;&lt;b&gt;나쁜 커밋 습관들을 부실 수 있는 기회가 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 개발자들이 따르고 있는&amp;nbsp;&lt;b&gt;&lt;a href=&quot;https://think0wise.tistory.com/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;commit message convention&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에 대해 공부하고&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;포스팅 하였고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 온보딩 미션 커밋에 적용시켜보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;컨벤션을 따르는 것만으로도 월등히 좋은 가독성을 얻을 수 있었고,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작성한 기능 구현 목록을 바탕으로 자연스럽게&amp;nbsp;&lt;b&gt;기능 단위의 커밋 메시지를 작성할 수 있었다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여전히 익숙하지 않은 탓에&amp;nbsp;제목에서 작업 내용을 서술하여 길게 설명하기도 하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;commit&amp;nbsp;type을 빼먹는 실수를 하기도 하지만, 앞으로도 꾸준히 컨벤션을 지켜 작성할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다시는 이전과 같은 commit message를 작성하지 않을 것이다... &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이전 커밋을 보고있자니... 그 차이가 너무나 명확하다...&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/of8oU/btrPWVHT5hC/77ibTWSgsmqq3f2vGTeAx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/of8oU/btrPWVHT5hC/77ibTWSgsmqq3f2vGTeAx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/of8oU/btrPWVHT5hC/77ibTWSgsmqq3f2vGTeAx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fof8oU%2FbtrPWVHT5hC%2F77ibTWSgsmqq3f2vGTeAx1%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;427&quot; height=&quot;568&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8gPaG/btrPUn5WPAF/o7NERwHXkvXxk8ZwsOBpK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8gPaG/btrPUn5WPAF/o7NERwHXkvXxk8ZwsOBpK1/img.png&quot; data-alt=&quot;제목과 본문 사이에 줄바꿈 하나 만으로 --oneline 옵션에서의 가독성을 챙길 수 있었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8gPaG/btrPUn5WPAF/o7NERwHXkvXxk8ZwsOBpK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8gPaG%2FbtrPUn5WPAF%2Fo7NERwHXkvXxk8ZwsOBpK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;331&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제목과 본문 사이에 줄바꿈 하나 만으로 --oneline 옵션에서의 가독성을 챙길 수 있었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;  앞으로 보완할 점!&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;1. &lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;기능 구현 목록은&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt; 전체적인 흐름을 이해하기 위한 용도로 작성하기&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기능 구현 목록을 작성할 때 처음부터 구체적으로 작성하려고 하다 보니, &lt;b&gt;목록 작성 자체에 시간이 많이 소요됐다.&lt;/b&gt;&lt;br /&gt;그럼에도 문제를 해결하는 도중, 기능을 추가해야 하거나 수정해야 하는 경우가 생기곤 했다.&lt;br /&gt;앞으로&amp;nbsp;&lt;b&gt;처음부터 모든 기능을 작성하려고 하기보다는 전체적인 흐름을 이해하며 작성하도록 노력할 것이다.&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2ac1bc; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;2. 내가 아닌, 다른 사람이 편하게 읽을 수 있는 코드 작성하기&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;PR로 과제를 제출하는 프리코스의 특성상 많은 사람들이 코드를 볼 수 있고, 필요하다면 참고할 수 있다.&lt;/b&gt;&lt;br /&gt;때문에 &lt;b&gt;이해하기 쉬운 직관적인&amp;nbsp;변수명에 대해 고민하며 코드를 작성했고,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 문제의 테스트 통과 이후, 작성한 코드를 살펴보면서&amp;nbsp;&lt;b&gt;가독성이 좋지 못한 코드를 리팩토링했다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼에도&amp;nbsp;&lt;b&gt;타인이 나의 코드를 봤을 때 설명 없이 이해 하기엔 부족하다고 생각했다.&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;앞으로&amp;nbsp;&lt;b&gt;코드의 가독성을 중점으로 발전된 코드를 작성하도록 노력할 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;3.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;b&gt;VSC 자체 설정 대신 Prettier&lt;/b&gt;&amp;nbsp;사용하기&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과제를 진행하면서 &lt;b&gt;의도하지 않았던 코드의 변경이 그대로 commit 되는 경우가 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkodjT/btrP35DlPb1/V2fZJAry3QusC02C59YFFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkodjT/btrP35DlPb1/V2fZJAry3QusC02C59YFFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkodjT/btrP35DlPb1/V2fZJAry3QusC02C59YFFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkodjT%2FbtrP35DlPb1%2FV2fZJAry3QusC02C59YFFk%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;550&quot; height=&quot;302&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;노트북과 데스크탑을 오가며 과제를 수행하면서,&lt;b&gt; VSC 코드 포맷팅 설정이 달라서&amp;nbsp; 발생한 문제였다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CrXuq/btrP3jCo3Jx/ewSzwogcZcGQVTGIoAAJkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CrXuq/btrP3jCo3Jx/ewSzwogcZcGQVTGIoAAJkK/img.png&quot; data-alt=&quot;Tab size가 달라 위와 같은 문제가 발생했다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CrXuq/btrP3jCo3Jx/ewSzwogcZcGQVTGIoAAJkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCrXuq%2FbtrP3jCo3Jx%2FewSzwogcZcGQVTGIoAAJkK%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;116&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Tab size가 달라 위와 같은 문제가 발생했다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdjDcM/btrP3yzjBTv/8KzjlK5TTRgejSwGSMKcH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdjDcM/btrP3yzjBTv/8KzjlK5TTRgejSwGSMKcH1/img.png&quot; data-alt=&quot;width도 마찬가지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdjDcM/btrP3yzjBTv/8KzjlK5TTRgejSwGSMKcH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdjDcM%2FbtrP3yzjBTv%2F8KzjlK5TTRgejSwGSMKcH1%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;92&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;width도 마찬가지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 같은 커밋에선&lt;b&gt; 변경사항이 무엇인지 파악하기 어렵다. &lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;의도하진 않았지만, 나쁜 커밋이 되어버린 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 다음 미션부터는 &lt;b&gt;Prettier를 사용할 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모든 작업환경에서 동일한 코드 포맷팅을 하여&lt;/b&gt; 위와 같은 일이 발생하지 않도록 해볼 생각이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;1주 차를 마무리 하며  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2ac1bc;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;기능 목록과 기능별 커밋을 지키며 7문제를 풀었을 때&amp;nbsp; &amp;nbsp; VS&amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;백&lt;/span&gt;준, 프로그래머스에서 빠르게 7문제를 풀었을 때&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모든 면에서 전자의 압승이었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;앞으로의 성장에 필요한 중요한 키워드를 얻을 수 있어서 정말 좋았다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;미션을 진행하면서&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;새로운 방향으로 성장할 수 있는 길이 열린 것 같다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2주 차에는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;열린 길을 따라 쭈욱 걸어 나가보겠다!  &lt;/span&gt;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ3G01/btrPQyeqfRf/GG2eXRC5Uu64A4gfuojX41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ3G01/btrPQyeqfRf/GG2eXRC5Uu64A4gfuojX41/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ3G01/btrPQyeqfRf/GG2eXRC5Uu64A4gfuojX41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ3G01%2FbtrPQyeqfRf%2FGG2eXRC5Uu64A4gfuojX41%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;550&quot; height=&quot;480&quot; data-filename=&quot;지름길은 없다.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>우테코</category>
      <category>우테코 프리코스</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/97</guid>
      <comments>https://think0wise.tistory.com/97#entry97comment</comments>
      <pubDate>Tue, 1 Nov 2022 01:06:05 +0900</pubDate>
    </item>
    <item>
      <title>Git - Commit message convention이란 ?</title>
      <link>https://think0wise.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여러분은&lt;b&gt; Git&lt;/b&gt;을 어떻게 사용하고 계시나요?&amp;nbsp;&lt;br /&gt;&lt;b&gt;commit message&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저는&lt;b&gt; Git&lt;/b&gt;을 작업 내용을 저장하거나, 기록을 남기는&lt;b&gt; [혼자만의 저장소]&lt;/b&gt; 느낌으로 사용하고 있었습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 &lt;b&gt;commit message&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 실제 개발 업무는 대부분이&lt;b&gt; 협업으로 이루어지고&lt;/b&gt;, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 프로젝트를 &lt;b&gt;여러 명이서 관리하게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;때문에 협업 환경에서 &lt;b&gt;효과적으로 Git을 사용하려면&lt;/b&gt; &lt;b&gt;Commit message convention을 지켜야 합니다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 포스팅에서는 많은 개발자들이 사용하는 대표적인 구조를 토대로 설명하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. commit message 기본 구조&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본 구조는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667017858428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;type&amp;gt;(scope): &amp;lt;subject&amp;gt;
&amp;lt;공백 라인&amp;gt;
(body)
&amp;lt;공백 라인&amp;gt;
(footer)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt; type &amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;작업 내용을 대표하는 키워드이며 필수사항입니다.&lt;/b&gt; &lt;br /&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;feat: 기능의 추가, 수정, 삭제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;fix: 버그의 수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;docs: 문서의 변경&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;style: 코드 스타일 변경( 코드 포맷팅, 세미콜론 누락 등 )&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;design: UI 디자인 변경(css 수정 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;test: 테스트 코드에 대한 변경( production 코드 변경 X )&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;refactor: 코드 리팩토링( production 코드 변경 O )&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bulid: 빌드 관련 파일 수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ci:&amp;nbsp;CI&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;chore: 패키지 매니저 설정 변경과 같은 자잘한 수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;rename: 파일, 폴더명의 수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;remove: 파일을 삭제한 경우&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(scope)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;변경이 일어난 곳을 직접 표기하는 곳이며 선택사항입니다.&lt;br /&gt;&lt;/b&gt;환경, 디렉터리 명, 파일명, 변수명, 클래스명 등이 들어갈 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;lt;subject&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작업 내용에 대한 제목을 표기하는 곳이며 필수사항입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최대 50글자까지 허용하며, 제목의 끝에 마침표를 금지합니다. &lt;span&gt;( 한글 기준 25자 정도가 적당합니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;(body)&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작업 내용에 대한 상세한 설명을 표기하는 곳이며 선택사항입니다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'어떻게'보다는 '무엇을', '왜' 하였는가에 집중해 최대한 자세히 작성합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전과의 차이를 포함해도 좋습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;한 줄에 최대 72자까지 허용합니다. ( 한글 기준 36자 정도가 적당합니다.)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(footer)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;관련된 이슈를 표기하는 곳이며 선택사항입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span&gt;[키워드 #이슈 ID] 의 형태로 표기하면 자동으로 해당 이슈를 종료합니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;close: &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;일반 개발 이슈&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;fix: &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;버그 픽스나 핫 픽스 이슈&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;resolve: &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;문의나 요청 사항에 대응한 이슈&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. convention의 효과&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 좋은 가독성을 바탕으로 변경 내용을 이해하기 쉽다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 변경 내용을 보다 확실하고 정확하게 전달할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 쉬운 이해와 정확한 정보를 바탕으로 빠르게 탐색할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 결론적으로 협업 환경에서 좋은 업무 효율을 기대할 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 어느 쪽을 선택하시겠습니까?&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;둘 중 어떤 사람과 함께 일하고 싶나요?&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;659&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p1RaX/btrPQ4kNgpp/KVtAUyIpFUMfFbIAS0kjN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p1RaX/btrPQ4kNgpp/KVtAUyIpFUMfFbIAS0kjN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p1RaX/btrPQ4kNgpp/KVtAUyIpFUMfFbIAS0kjN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp1RaX%2FbtrPQ4kNgpp%2FKVtAUyIpFUMfFbIAS0kjN1%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;659&quot; height=&quot;182&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;좋은 코드를 작성하기 위해 많은 고민과 시간을 투자하는 것 처럼,&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;좋은 commit message를 작성하기 위해 노력해야겠습니다!&lt;br /&gt;같이 일하고 싶은 사람이 되어봅시다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H24pO/btrPQe9xL3R/Q5x4GSu6Wfa7TVsvY9zIHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H24pO/btrPQe9xL3R/Q5x4GSu6Wfa7TVsvY9zIHk/img.png&quot; data-alt=&quot;기본이 중요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H24pO/btrPQe9xL3R/Q5x4GSu6Wfa7TVsvY9zIHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH24pO%2FbtrPQe9xL3R%2FQ5x4GSu6Wfa7TVsvY9zIHk%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본이 중요하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>commit</category>
      <category>commit convention</category>
      <category>Git</category>
      <category>git commit</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/96</guid>
      <comments>https://think0wise.tistory.com/96#entry96comment</comments>
      <pubDate>Sat, 29 Oct 2022 15:42:36 +0900</pubDate>
    </item>
    <item>
      <title>JS - DocumentFragment 란?</title>
      <link>https://think0wise.tistory.com/95</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;우아한테크코스 5기를 준비하는 과정에서 프리코스 과제들을 접하게 됐습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;프리코스의 모든 과제들은&lt;b&gt; 바닐라 자바스크립트로만 구현하여 제출해야하는데.....&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;바닐라 자바스크립트만으로 무언가를 만들어본 경험은&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;개발을 처음 배우기 시작했을 때 밖에 없는 것 같아 자신감이 떨어졌슴다!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아니나 다를까! &lt;br /&gt;역대 지원자들의 코드를 찬찬히 살펴보던 중....&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;처음 보는 코드가 있더라구요...?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAfp06/btrNUGGbmwj/EeIR8D3A9fQJ30TmV6HEKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAfp06/btrNUGGbmwj/EeIR8D3A9fQJ30TmV6HEKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAfp06/btrNUGGbmwj/EeIR8D3A9fQJ30TmV6HEKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAfp06%2FbtrNUGGbmwj%2FEeIR8D3A9fQJ30TmV6HEKk%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;118&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;118&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;b&gt;createDocumentFragment()&amp;nbsp; &lt;b&gt;이게 무엇인고 ?&lt;br /&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;0. DocumentFragment 에 대한 이해!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아래는 DocumentFragment에 대한 설명입니다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;DocumentFragment은 웹 문서의 메인 DOM 트리에 포함되지 않는, &lt;br /&gt;&lt;b&gt;가상 메모리에 존재하는 DOM 노드 객체입니다.&lt;/b&gt;&lt;br /&gt;DocumentFragment 노드를 사용하면 메인 DOM 트리 외부에 경량화된 DOM을 만들 수 있어&lt;br /&gt;&lt;b&gt;브라우저 repaint 영향 없이 메모리에서 DOM 조작이 가능합니다.&lt;/b&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. createDocumentFragment( ) 로 DOM 요소 삽입하기!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DocumentFragment는 임시 바구니 입니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;우리는 자바스크립트를 사용해 DOM 요소를 동적으로 추가할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 사용할 수 있는 방법중 하나가 바로&amp;nbsp;&lt;b&gt;DocumentFragment&amp;nbsp; 임시 바구니입니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;임시 바구니로 DOM을 삽입해보면서,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DocumentFragment의 특징을 알아보겠습니다!&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;h4 data-ke-size=&quot;size20&quot;&gt;step 0. 목표&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O2ijf/btrNSXbcTJ3/Br6udeLBdEF2xZQ4dhrJd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O2ijf/btrNSXbcTJ3/Br6udeLBdEF2xZQ4dhrJd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O2ijf/btrNSXbcTJ3/Br6udeLBdEF2xZQ4dhrJd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO2ijf%2FbtrNSXbcTJ3%2FBr6udeLBdEF2xZQ4dhrJd1%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;271&quot; height=&quot;82&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;target-div에&lt;/b&gt; &lt;/span&gt;&lt;b&gt;3개의 &amp;lt;li&amp;gt; 태그&lt;/b&gt;를 자식으로 가지는 &lt;b&gt;&amp;lt;ul&amp;gt; 태그를 추가하고 싶습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;DOM 접근은 최소한으로 하고싶습니다.&lt;/b&gt;&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;step 1.&amp;nbsp; 바구니 만들기&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1665028455783&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let target = document.querySelector('.target-div') // 목표물
let $바구니 = document.createDocumentFragment() // 임시 바구니 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선 임시 바구니를 하나 만들었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바구니는 &lt;b&gt;document.createDocumentFragment() &lt;/b&gt;메서드로 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;*DOM 트리에 포함되지 않는, &lt;/b&gt;가상 메모리에&amp;nbsp;&lt;b&gt;바구니가 생성 되었습니다.*&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcWZ4z/btrNT60aJkU/0fgIRIFzzhweWkCDjedZdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcWZ4z/btrNT60aJkU/0fgIRIFzzhweWkCDjedZdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcWZ4z/btrNT60aJkU/0fgIRIFzzhweWkCDjedZdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcWZ4z%2FbtrNT60aJkU%2F0fgIRIFzzhweWkCDjedZdk%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;233&quot; height=&quot;149&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 바구니는 보이는 것 처럼 DOM 트리에 포함되지 않기 때문에,&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;*여기에 무엇을 담든 DOM에 영향을 주지 않습니다.*&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;step 2.&amp;nbsp; 바구니에 자식 담기&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1665029824670&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const target = document.querySelector('.target-div')
const $바구니 = document.createDocumentFragment()
const $ul = document.createElement('ul')

const liArray = [1, 2, 3]
liArray.forEach(num =&amp;gt; {
  const $li = document.createElement('li')
  $li.textContent = num
  $ul.appendChild($li) // ul에 li 담기
})

$바구니.appendChild($ul) // 바구니에 ul 담기
console.log($바구니)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ul의 자식으로 li를 담았고&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;바구니의 자식으로 ul을 담았습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바구니를 출력해보면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oA55p/btrNTLhcI15/J4woACBHKQqHsK7KxLCbk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oA55p/btrNTLhcI15/J4woACBHKQqHsK7KxLCbk1/img.png&quot; data-alt=&quot;바구니&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oA55p/btrNTLhcI15/J4woACBHKQqHsK7KxLCbk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoA55p%2FbtrNTLhcI15%2FJ4woACBHKQqHsK7KxLCbk1%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;147&quot; height=&quot;106&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바구니&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK7qEd/btrNXJo6CI3/zhFg2wdk9KQOV0PMksKWk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK7qEd/btrNXJo6CI3/zhFg2wdk9KQOV0PMksKWk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK7qEd/btrNXJo6CI3/zhFg2wdk9KQOV0PMksKWk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK7qEd%2FbtrNXJo6CI3%2FzhFg2wdk9KQOV0PMksKWk0%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;237&quot; height=&quot;147&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;*바구니에 무엇을 담던 &lt;b&gt;여전히&amp;nbsp;&lt;/b&gt;DOM에는 영향이 없습니다.*&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;step 3.&amp;nbsp; target DOM에 바구니 넣기&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1665030642480&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const $target = document.querySelector('.target-div')
const $바구니 = document.createDocumentFragment()
const $ul = document.createElement('ul')

const liArray = [1, 2, 3]
liArray.forEach(num =&amp;gt; {
  const $li = document.createElement('li')
  $li.textContent = num
  $ul.appendChild($li)
})

$바구니.appendChild($ul)

$target.appendChild($바구니) // 타겟에 바구니 넣기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 target-div에 바구니를 넣었습니다.&lt;br /&gt;&lt;b&gt;원하던 목표를 달성했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;*그런데 바구니는 사라지고, 내용물만 담겨있네요!*&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJwxL4/btrNSUTfgzX/ouXu6f1oGNTLagkVyb60l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJwxL4/btrNSUTfgzX/ouXu6f1oGNTLagkVyb60l1/img.png&quot; data-alt=&quot;바구니는 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJwxL4/btrNSUTfgzX/ouXu6f1oGNTLagkVyb60l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJwxL4%2FbtrNSUTfgzX%2FouXu6f1oGNTLagkVyb60l1%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;184&quot; height=&quot;124&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바구니는 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;111&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ67Wf/btrNT9JINw4/QiWks1OkmPnlHIEydcXRA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ67Wf/btrNT9JINw4/QiWks1OkmPnlHIEydcXRA1/img.png&quot; data-alt=&quot;ul 만 옮겨졌어요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ67Wf/btrNT9JINw4/QiWks1OkmPnlHIEydcXRA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ67Wf%2FbtrNT9JINw4%2FQiWks1OkmPnlHIEydcXRA1%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;111&quot; height=&quot;197&quot; data-origin-width=&quot;111&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ul 만 옮겨졌어요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;step 4.&amp;nbsp; 바구니 확인&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1665030807054&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$target.appendChild($바구니) // 담고나서~
console.log($바구니) // 출력하면?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 바구니를 출력해보면?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9Ti9U/btrNXkpegHo/vxEMJKmh0YcjGfFmKL2GF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9Ti9U/btrNXkpegHo/vxEMJKmh0YcjGfFmKL2GF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9Ti9U/btrNXkpegHo/vxEMJKmh0YcjGfFmKL2GF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9Ti9U%2FbtrNXkpegHo%2FvxEMJKmh0YcjGfFmKL2GF1%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;205&quot; height=&quot;67&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;*바구니도 비어있습니다*&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0w4iG/btrNYu53ZwO/7ou9EejczlaIV8t8oUZm5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0w4iG/btrNYu53ZwO/7ou9EejczlaIV8t8oUZm5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0w4iG/btrNYu53ZwO/7ou9EejczlaIV8t8oUZm5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0w4iG%2FbtrNYu53ZwO%2F7ou9EejczlaIV8t8oUZm5K%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;251&quot; height=&quot;195&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;바구니에서 내용물만 옮겨졌네요!&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;어찌됐든, 1번의 DOM 접근으로 목표를 달성했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 중간 점검&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기 까지의 DocumentFragment 특징을 정리해보면 다음과 같습니다.&lt;/b&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;*여기에 무엇을 담든 DOM에 영향을 주지 않습니다.*&lt;br /&gt;*바구니에 무엇을 담던&amp;nbsp;여전히&amp;nbsp;DOM에는 영향이 없습니다.*&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #c0d1e7;&quot;&gt;&lt;b&gt;&amp;nbsp;- 최종적으로 DOM에 삽입 하기 전 까지는 아무 영향을 주지 않습니다.&lt;/b&gt;&lt;/span&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;br /&gt;*바구니도 비어있습니다*&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt; - DocumentFragment를 DOM에 삽입하면&lt;br /&gt;&amp;nbsp; fragment를 제외한 자식 요소들만 삽입되고, 이후 &lt;/b&gt;&lt;b&gt;fragment 객체는 빈 객체가 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. createElement( ) 로 DOM 요소 삽입하기!&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제에서는 &lt;b&gt;DocumentFragment 바구니를 사용했지만,&lt;/b&gt;&lt;br /&gt;&lt;b&gt;createElement로 평범한 DIV 바구니를 만들어 사용해도 &lt;br /&gt;&lt;/b&gt;1번의 DOM 접근으로,&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;DOM에 삽입 하기 전 까지는 아무 영향을 주지 않으면서&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;문제 해결이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1665033417121&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const $target = document.querySelector('.target-div')
const $DIV바구니 = document.createElement('div') // div 바구니~!
const $ul = document.createElement('ul')

const liArray = [1, 2, 3]
liArray.forEach(num =&amp;gt; {
  const $li = document.createElement('li')
  $li.textContent = num
  $ul.appendChild($li)
})

$DIV바구니.appendChild($ul)

$target.appendChild($DIV바구니)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctqY4e/btrNT6y2aIf/iiwIFlKUtrBUJeZXK5sdTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctqY4e/btrNT6y2aIf/iiwIFlKUtrBUJeZXK5sdTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctqY4e/btrNT6y2aIf/iiwIFlKUtrBUJeZXK5sdTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctqY4e%2FbtrNT6y2aIf%2FiiwIFlKUtrBUJeZXK5sdTk%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;182&quot; height=&quot;153&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;153&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;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;하지만 이번에는 바구니도 같이 들어가 있네요!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1665034183774&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$target.appendChild($DIV바구니) // 담고나서~
console.log($DIV바구니) // 출력하면 ?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;131&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHfJKe/btrNWpYZHQ9/AfkK7CBZmEMb3IaqSoZuK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHfJKe/btrNWpYZHQ9/AfkK7CBZmEMb3IaqSoZuK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHfJKe/btrNWpYZHQ9/AfkK7CBZmEMb3IaqSoZuK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHfJKe%2FbtrNWpYZHQ9%2FAfkK7CBZmEMb3IaqSoZuK1%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;131&quot; height=&quot;124&quot; data-origin-width=&quot;131&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;그리고 DIV 바구니에는 여전히 자식들이 담겨있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그냥 ul 태그를 바구니로 사용하면 해결되지 않나요?&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1665038095306&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const $target = document.querySelector('.target-div')
const $ul바구니 = document.createElement('ul')  // ul 바구니~

const liArray = [1, 2, 3]
liArray.forEach(num =&amp;gt; {
	const $li = document.createElement('li')
	$li.textContent = num
	$ul바구니.appendChild($li)
})

$target.appendChild($ul바구니)&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ueL0e/btrNXJ3X418/qIdiCQEZ0HLk5MkCrKVBt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ueL0e/btrNXJ3X418/qIdiCQEZ0HLk5MkCrKVBt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ueL0e/btrNXJ3X418/qIdiCQEZ0HLk5MkCrKVBt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FueL0e%2FbtrNXJ3X418%2FqIdiCQEZ0HLk5MkCrKVBt1%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;185&quot; height=&quot;122&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네 실제로 해결된것 처럼 보이네요!&amp;nbsp;&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;pre id=&quot;code_1665038194636&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$target.appendChild($ul바구니)
console.log($ul바구니)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;123&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqv37o/btrNUaBMnXc/EwzB03jtQS5jPgyip1V9Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqv37o/btrNUaBMnXc/EwzB03jtQS5jPgyip1V9Fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqv37o/btrNUaBMnXc/EwzB03jtQS5jPgyip1V9Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqv37o%2FbtrNUaBMnXc%2FEwzB03jtQS5jPgyip1V9Fk%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;123&quot; height=&quot;92&quot; data-origin-width=&quot;123&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;여전히 ul 바구니에는 자식이 담겨 있긴 하지만요!&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 만약 여러개의 루트 노드들을 한 번에 추가하고 싶다면?&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그러면 이제 마지막으로 문제를 한번 바꿔보겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;target-div에 &lt;b&gt;&amp;lt;ul&amp;gt;, &amp;lt;div&amp;gt;, &amp;lt;h3&amp;gt; 이렇게 3개의 루트 노트만 깔끔하게 추가하고 싶다면 &lt;/b&gt;어떻게 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;createElement() 을 사용해서 DOM에 추가하면&amp;nbsp;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;무조건 바구니도 같이 들어갑니다.&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;깔끔하게 상위태그 없이 삽입하려면 &lt;br /&gt;어쩔 수 없이&lt;b&gt; &lt;b&gt;&lt;b&gt;3번 &lt;/b&gt;&lt;/b&gt;&lt;/b&gt;접근해서 DOM에 삽입해야겠네요.&amp;nbsp;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;create&lt;/b&gt;DocumentFragment() 를 사용하면 어떨까요?&lt;br /&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;여전히 1번의 접근으로&lt;/span&gt; DOM에 삽입가능합니다!&lt;/b&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. DocumentFragment 의 장점&lt;/b&gt;&lt;/h3&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;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. DocumentFragment는 브라우저 성능 최적화에 도움을 줍니다.&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DOM을 수정하는 행위는 브라우저의 &lt;/b&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;b&gt;Reflow를 일으킵니다.&lt;/b&gt;&lt;br /&gt;Reflow는 성능에 매우 큰 영향을 미치기 때문에 &lt;b&gt;최대한 적게 발생시키는게 중요합니다.&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;&lt;span style=&quot;color: #222222;&quot;&gt;즉 DOM에 요소를 여러개 삽입하더라도, 가능하다면 묶어서 &lt;b&gt;한 번에 삽입하는 것이 좋습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위와 같은 상황이라면, &lt;b&gt;DocumentFragment를 사용하는 것이 성능에 도움을 줄수 있겠죠?&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. DocumentFragment는 메모리 소비 걱정을 하지 않아도 됩니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zzosU/btrNX74lEwl/yIzliuaIrdJt7PGX7uEyx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zzosU/btrNX74lEwl/yIzliuaIrdJt7PGX7uEyx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zzosU/btrNX74lEwl/yIzliuaIrdJt7PGX7uEyx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzzosU%2FbtrNX74lEwl%2FyIzliuaIrdJt7PGX7uEyx1%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;678&quot; height=&quot;150&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제에서 봤던것 처럼 DocumentFragment는 &lt;b&gt;DOM에 삽입된 즉시 비어있게 됩니다.&amp;nbsp;&lt;br /&gt;메모리에 대한 걱정을 하지 않아도 되는 이유입니다.&lt;/b&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 성능상으로도 빠른가?&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmujpr/btrNTBTNxa6/BYHKPnOqSnpPKpkEIjyyfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmujpr/btrNTBTNxa6/BYHKPnOqSnpPKpkEIjyyfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmujpr/btrNTBTNxa6/BYHKPnOqSnpPKpkEIjyyfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmujpr%2FbtrNTBTNxa6%2FBYHKPnOqSnpPKpkEIjyyfK%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;760&quot; height=&quot;182&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그렇지 않습니다.&lt;br /&gt;createElement&amp;nbsp; &amp;nbsp; VS&amp;nbsp; &amp;nbsp; createDocumentFragment&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔진 별로 차이가 있다고 하네요. 미미해서 의미도 없다합니다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능보단 가독성의 향상 측면에서 바라보는 것이 좋겠습니다!&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;물론 Reflow가 여러 번 발생 될 수 있는 case라면 후자가 절대적으로 좋습니다!&lt;/span&gt;&lt;/b&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 찐 결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DOM에 요소를 삽입 할때에는&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;createDocumentFragment 메서드를 사용하자!&lt;/b&gt;&lt;/span&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT7bKV/btrNXs9oa7H/srUUpDmpTdVxMhz9IvgCP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT7bKV/btrNXs9oa7H/srUUpDmpTdVxMhz9IvgCP1/img.png&quot; data-alt=&quot;기본이 중요하다 !&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT7bKV/btrNXs9oa7H/srUUpDmpTdVxMhz9IvgCP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT7bKV%2FbtrNXs9oa7H%2FsrUUpDmpTdVxMhz9IvgCP1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본이 중요하다 !&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Frontend/JS</category>
      <category>createDocumentFragment()</category>
      <category>documentFragment</category>
      <category>DoM</category>
      <category>reflow</category>
      <category>브라우저 성능 최적화</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/95</guid>
      <comments>https://think0wise.tistory.com/95#entry95comment</comments>
      <pubDate>Thu, 6 Oct 2022 16:37:17 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘 - 투 포인터 (js 예제 구현)</title>
      <link>https://think0wise.tistory.com/94</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 투 포인터(Two pointer)&amp;nbsp; 알고리즘 이란 ?&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열이나 문자열 같이 선형으로 이루어진 구조에서 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각자 다른 값을 가리키는 2 개 혹은 그 이상의 포인터를 두고&lt;/b&gt; &lt;br /&gt;값 들을 비교하여 문제를 해결하는 알고리즘 입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 예제 문제로 이해하기&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1663743599200&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input = [-2, -1, 1, 0, 1, 2]  answer = [-2, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;위와 같이 숫자로 이루어진 배열이 주어졌을 때, &lt;br /&gt;배열의 요소 중&lt;b&gt; 2개의 합이 0 이 되는 경우 중 ,&lt;/b&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;가장 빠른 경우에서의 두 수를 구하여라!&lt;/b&gt;&amp;nbsp;&lt;br /&gt;(배열은 &lt;b&gt;오름차순으로&lt;/b&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-1. 이중 for문 사용하기&amp;nbsp; / O(n^2)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1663743857287&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution() {
  for (let i = 0; i &amp;lt; input.length; i++) {
    for (let j = i + 1; j &amp;lt; input.length; j++) {
      if (input[i] + input[j] === 0) {
        console.log([input[i], input[j]])
        return
      }
    }
  }
}

solution() // [-2, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 이중 for문을 사용하는 간단한 풀이를 생각해 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위와 같은 코드의 &lt;b&gt;시간 복잡도는 O(n^2) 입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제의 input 배열의 길이가 길어지면 코드의 효율이 떨어지게 됩니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-2. 투 포인터 알고리즘 사용하기&lt;b&gt;&amp;nbsp; / O(n)&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1663744277564&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution() {
  let leftPointer = 0 // 왼쪽 끝
  let rightPointer = input.length - 1 // 오른쪽 끝

  while (leftPointer &amp;lt; rightPointer) {  
    let sum = input[leftPointer] + input[rightPointer]
    if (sum === 0) {
      console.log([input[leftPointer], input[rightPointer]])
      return
    }
    if (sum &amp;gt; 0) {
       rightPointer --
    }else{
       leftPointer++
    }    
  }
}

solution() // [-2, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;투 포인터 알고리즘을 활용한 풀이입니다.&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;배열의 서로 다른 원소를 탐색할 포인터 &lt;b&gt;left, rightPointer를 만들었습니다.&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;반복문을 돌면서 로직을 수행합니다.&lt;br /&gt;&lt;br /&gt;2-1. 두 수의 합이 0이면 두 수를 리턴합니다.&lt;br /&gt;2-2. 두 수의 합이 0보다 크면 &lt;b&gt;rightPointer를 1 감소 시킵니다.&lt;/b&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(정렬된 배열이므로 &lt;b&gt;오른쪽 포인터를 1 낮추면 합이 낮아집니다.&lt;/b&gt;)&lt;br /&gt;&lt;br /&gt;2-3. 두 수의 합이 0보다 작으면&lt;b&gt; leftPointer를 1 증가 시킵니다.&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(정렬된 배열이므로 &lt;b&gt;왼쪽 포인터를 1 증가시키면 합이 높아집니다.&lt;/b&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 풀이는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 모든 요소를 한 번씩만 확인하면 되기 때문에 &lt;b&gt;O(n)의 시간복잡도를 가집니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 input &lt;b&gt;배열의 길이가 증가하여도 효율적인 탐색이 가능합니다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 상황에서 투 포인터 알고리즘이 효율적인 것은 아니지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;숙지하면 활용하기 상당히 좋은 알고리즘이다 !&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCYklV/btrMIOkR9jN/T4PISwRVuWcBSQJI2IsEgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCYklV/btrMIOkR9jN/T4PISwRVuWcBSQJI2IsEgK/img.png&quot; data-alt=&quot;재밌다 알고리즘!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCYklV/btrMIOkR9jN/T4PISwRVuWcBSQJI2IsEgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCYklV%2FbtrMIOkR9jN%2FT4PISwRVuWcBSQJI2IsEgK%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;재밌다 알고리즘!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>투포인터</category>
      <category>투포인터알고리즘</category>
      <category>프로그래머스</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/94</guid>
      <comments>https://think0wise.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 21 Sep 2022 16:30:08 +0900</pubDate>
    </item>
    <item>
      <title>6, 7, 8월 리뷰</title>
      <link>https://think0wise.tistory.com/93</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어느새 여름이 다 지났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9월이 시작됐다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 리뷰에서 목표로 했던 것들은 대부분 달성했다!&lt;/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;LOL 밴픽 프로젝트는 프로젝트 설계라는 과정이 거의 없다시피 시작해버린 바람에&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;프로젝트 종료 이후 7월까지는 계획했던대로 TypeScript를 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsx를 기반으로 만들어진 강의를 내가 tsx로 따라해보면서 문법 기초를 다졌다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8월부터 서버에 대한 기본적인 공부도 시작하며 현재 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 어쨋든, 나는 또 나아가야 하니 짧은 미래에 대한 계획을 세워본다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 우테코 준비&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10월 중순에 있을 우테코 5기 모집에 지원해 보려고 준비중이다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1차 코딩 테스트 통과할 수 있을 정도의 실력은 갖추어 놓기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;자소서에 진심을 담아 작성하기&lt;/li&gt;
&lt;li&gt;이전 기수 프리코스 과정 연습해 보기&lt;/li&gt;
&lt;li&gt;지원하기!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10월 중순까지 또 미친 듯이 달려야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 것을 다 가질 수는 없다.&lt;/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;b&gt;또 달려보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFzp0d/btrLedlXm6j/QjjimD7vDuMuxsW1F96140/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFzp0d/btrLedlXm6j/QjjimD7vDuMuxsW1F96140/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFzp0d/btrLedlXm6j/QjjimD7vDuMuxsW1F96140/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFzp0d%2FbtrLedlXm6j%2FQjjimD7vDuMuxsW1F96140%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>목표와 회고</category>
      <category>목표</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/93</guid>
      <comments>https://think0wise.tistory.com/93#entry93comment</comments>
      <pubDate>Fri, 2 Sep 2022 12:56:12 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘 - DFS, BFS (JS 구현)</title>
      <link>https://think0wise.tistory.com/92</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DFS와 BFS 모두 &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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. DFS&lt;/b&gt;(Depth-First-Search) 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;루트 노드에서 시작해서 한 분기를 모두 방문하고 다음 분기로 넘어가는 방식입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인접 노드를 깊이&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;우선으로&amp;nbsp; 탐색하기 때문에 &lt;b&gt;깊이 우선 탐색, DFS 라고 불립니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DFS의 예로 &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;다시 한 방향으로 이동하기를 반복함)&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8zz4S/btrIO2OJ47M/fldxjl2bMowISDp6zBVMi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8zz4S/btrIO2OJ47M/fldxjl2bMowISDp6zBVMi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8zz4S/btrIO2OJ47M/fldxjl2bMowISDp6zBVMi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8zz4S%2FbtrIO2OJ47M%2Ffldxjl2bMowISDp6zBVMi1%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;269&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위 예제 그래프를 DFS로 탐색하면 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방문한 &lt;/b&gt;&lt;b&gt;노드 순서는 1-2-4-5-3-6-7 입니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. BFS&lt;/b&gt;(Breadth-First-Search)&lt;span&gt;&amp;nbsp;&lt;/span&gt;란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;루트 노드에서 시작해서 인접한 노드들을 먼저 모두 탐색 하는 방식입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인접 노드를 너비를&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;우선으로&amp;nbsp; 탐색하기 때문에 &lt;b&gt;너비 우선 탐색, BFS라고 불립니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diwScZ/btrIO283IzK/UAa5a5zFCdHogf8DrUGrxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diwScZ/btrIO283IzK/UAa5a5zFCdHogf8DrUGrxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diwScZ/btrIO283IzK/UAa5a5zFCdHogf8DrUGrxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiwScZ%2FbtrIO283IzK%2FUAa5a5zFCdHogf8DrUGrxK%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;266&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위 예제 그래프를 BFS로 탐색하면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;방문한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;노드 순서는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1-2-3-4-5-6 입니다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;3. DFS, BFS 구현하기&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;DFS는 stack or 재귀함수&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;BFS는 queue로 구현 가능합니다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;1. Node 클래스&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1659521846474&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node {
  constructor(data) {
    this.data = data;
    this.adjacencyList = [];
    this.visited = false;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;2. Graph 클래스&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1659521881441&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Graph {
  nodes = null;
  constructor(size) {
    this.nodes = new Array(size);
    for (let i = 0; i &amp;lt; size; i++) {
      this.nodes[i] = new Node(i);
    }
  }
  addEdge(idx1, idx2) { // 노드의 인접 관계 생성 메서드
    let node1 = this.nodes[idx1];
    let node2 = this.nodes[idx2];

    if (!node1.adjacencyList.includes(node2)) {
      node1.adjacencyList.push(node2);
    }
    if (!node2.adjacencyList.includes(node1)) {
      node2.adjacencyList.push(node1);
    }
  }

  dfs(idx) {
    let root = this.nodes[idx]; //idx를 받아 nodes 배열에서 루트노드를 정함
    let stack = []; // 스택 생성
    stack.push(root); // 스택에 루트 노드 푸시
    root.visited = true; // 루트 노드 스택에 들어갔으니 방문 체크

    while (stack.length !== 0) { // 스택이 비어있을 때 까지
      let popedNode = stack.pop(); // 스택에서 노드 하나 꺼냄

      for (let adjacencyNode of popedNode.adjacencyList) { // 꺼낸 노드의 인접 노드들
        if (adjacencyNode.visited === false) { // 인접노드에 방문 안했으면
          adjacencyNode.visited = true; // 방문처리
          stack.push(adjacencyNode); // 스택에 해당 인접노드 푸시
        } // 스택에는 루트의 인접노드들이 쌓이고 인접노드들이 또 쌓이고 반복하다가
      } //  인접노드가 없으면 반복문이 종료되고 종료 되고 종료되고 반복하다가
      this.visit(popedNode);
    } //  stack의 모든 노드들을 방문하면 dfs 함수 최종 종료
  }

  bfs(idx) {
    let root = this.nodes[idx];
    let queue = []; // 큐 생성
    queue.push(root); // 큐에 루트 노드 푸시
    root.visited = true; // 방문 처리
					// 이하 dfs스택과 설명 동일
 
    while (queue.length !== 0) {
      let deQueuedNode = queue.shift();

      for (let adjacencyNode of deQueuedNode.adjacencyList) {
        if (adjacencyNode.visited === false) {
          deQueuedNode.visited = true;
          queue.push(adjacencyNode);
        }
      }
      this.visit(deQueuedNode);
    }
  }

  visit(node) {
    console.log(`방문한 노드 데이터: ${node.data}`);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 직접 구현한 함수 실행 결과&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKQwjj/btrIRHpOLC7/bPPt2LP5mKBsCIcEj6zQrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKQwjj/btrIRHpOLC7/bPPt2LP5mKBsCIcEj6zQrk/img.png&quot; data-alt=&quot;구현한 그래프 형태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKQwjj/btrIRHpOLC7/bPPt2LP5mKBsCIcEj6zQrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKQwjj%2FbtrIRHpOLC7%2FbPPt2LP5mKBsCIcEj6zQrk%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;262&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;316&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;b&gt;DFS 결과는 다음과 같습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBGIit/btrIOw3GzYt/zbOHCFxNsH7d36ber1ZPLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBGIit/btrIOw3GzYt/zbOHCFxNsH7d36ber1ZPLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBGIit/btrIOw3GzYt/zbOHCFxNsH7d36ber1ZPLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBGIit%2FbtrIOw3GzYt%2FzbOHCFxNsH7d36ber1ZPLk%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;163&quot; height=&quot;159&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;159&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;b&gt;BFS&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;결과는 다음과 같습니다.&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rZ8WW/btrIOwP55R6/V5W0DOCS9AZ41lJ4lgR6A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rZ8WW/btrIOwP55R6/V5W0DOCS9AZ41lJ4lgR6A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rZ8WW/btrIOwP55R6/V5W0DOCS9AZ41lJ4lgR6A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrZ8WW%2FbtrIOwP55R6%2FV5W0DOCS9AZ41lJ4lgR6A0%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;173&quot; height=&quot;169&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPheBy/btrIFJiphpA/l3azQIRAp4Qc6dsU77tsw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPheBy/btrIFJiphpA/l3azQIRAp4Qc6dsU77tsw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPheBy/btrIFJiphpA/l3azQIRAp4Qc6dsU77tsw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPheBy%2FbtrIFJiphpA%2Fl3azQIRAp4Qc6dsU77tsw1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>BFS</category>
      <category>dfs</category>
      <category>graph</category>
      <category>Queue</category>
      <category>Stack</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/92</guid>
      <comments>https://think0wise.tistory.com/92#entry92comment</comments>
      <pubDate>Wed, 3 Aug 2022 19:33:34 +0900</pubDate>
    </item>
    <item>
      <title>자료구조 - 트리, 이진 트리, 이진 탐색 트리, 트리 순회, JS 트리 구현</title>
      <link>https://think0wise.tistory.com/91</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 트리(tree) 란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;트리는 계층적인 자료를&lt;/b&gt; 표현하는 데 사용되는 자료구조입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXwNRn/btrIOwvaBMP/d5p3FbbKagmJNHzx4rxpj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXwNRn/btrIOwvaBMP/d5p3FbbKagmJNHzx4rxpj0/img.png&quot; data-alt=&quot;tree&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXwNRn/btrIOwvaBMP/d5p3FbbKagmJNHzx4rxpj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXwNRn%2FbtrIOwvaBMP%2Fd5p3FbbKagmJNHzx4rxpj0%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;290&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tree&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Node&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;tree의 각 요소 ( A, B, C, D.... 와 같은) 를 노드 (Node) 라고 부릅니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B를 A의 &lt;b&gt;자식 노드, &lt;/b&gt;A를 B의 &lt;b&gt;부모 노드 &lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 Node는&lt;b&gt; 자신의 데이터를 가지고 있으며, 자식 노드의 주소를 가지고 있을 수도 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Root Node&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A와 같이&lt;b&gt; 부모 노드가 없고 최상단에 위치한 Node를 루트 노드( Root Node ) &lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Leaf Node&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H, I, E, J, G 처럼 &lt;b&gt;자식 노드가 없는 Node를 단말 노드( Leaf Node ) &lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. size&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모든 Node의 갯수를 크기(size)&lt;/b&gt; 라고 합니다. (ex. size: 10)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. depth&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Root Node로부터의 거리를 깊이(depth)&lt;/b&gt; 라고 합니다. (ex. B, C: 1&amp;nbsp; /&amp;nbsp; D, E, F, G: 2)&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 이진 트리(binary tree) 란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 노드의 갯수가 최대 2개로 한정된 tree를 말합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw14Uy/btrINvwuCXg/7QCT97fflkXsVzuHCgyz01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw14Uy/btrINvwuCXg/7QCT97fflkXsVzuHCgyz01/img.png&quot; data-alt=&quot;binary tree&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw14Uy/btrINvwuCXg/7QCT97fflkXsVzuHCgyz01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw14Uy%2FbtrINvwuCXg%2F7QCT97fflkXsVzuHCgyz01%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;256&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;binary tree&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최대 자식 노드 갯수가 2개인것 뿐이므로&amp;nbsp;&lt;/b&gt;&lt;br /&gt;위 그림에서 G 노드가 없어도 이진 트리입니다.&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 이진 탐색 트리(binary search tree) 란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 탐색이 동작할 수 있도록 고안된 자료구조의 일종입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왼쪽 자식 노드가 부모 노드보다 작고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오른쪽 자식 노드가 부모 노드보다 큰 이진 트리를 말합니다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;왼쪽 자식 &amp;lt; 부모 &amp;lt; 오른쪽 자식&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRKsxL/btrIRGjwliV/J37plxXG6U2e90UIOpvKok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRKsxL/btrIRGjwliV/J37plxXG6U2e90UIOpvKok/img.png&quot; data-alt=&quot;binary search tree&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRKsxL/btrIRGjwliV/J37plxXG6U2e90UIOpvKok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRKsxL%2FbtrIRGjwliV%2FJ37plxXG6U2e90UIOpvKok%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;260&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;binary search tree&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;원하는 값을 찾고 싶을 때 해당 값을 Root node의 값과 비교하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 혹은 오른쪽으로 탐색 해 나갈 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(ex. Root node의 값인 10을 기준으로 &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;11은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;오른쪽에 있다는 것을 확신하고 검색할 수 있습니다.)&lt;/b&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 트리 순회(Tree Travercal) 란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리 자료구조에 포함된 노드를 특정한 방법으로 한 번씩 방문하는 방법을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 자신을 출력하는 방법과 같이 방문한 노드를 시각적으로 확인 가능합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대표적인 트리 순회 방법은 3가지가 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AGgCb/btrINuYLPTp/KkiyHL8ZoAamgyqYkZAee0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AGgCb/btrINuYLPTp/KkiyHL8ZoAamgyqYkZAee0/img.png&quot; data-alt=&quot;예제 tree&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AGgCb/btrINuYLPTp/KkiyHL8ZoAamgyqYkZAee0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAGgCb%2FbtrINuYLPTp%2FKkiyHL8ZoAamgyqYkZAee0%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;350&quot; height=&quot;231&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예제 tree&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. In order / 중위 순회 &lt;/b&gt;&amp;nbsp;( Left - Root - Right )&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왼쪽 노드부터 출력합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;b&gt;Root 노드를 출력합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;b&gt;오른쪽 노드를 출력합니다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제를 &lt;b&gt;중위 순회 하면&lt;/b&gt;&amp;nbsp;&lt;b&gt;D-B-E-A-F-C-G 입니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. pre order / 전위 순회 &lt;/b&gt;( Root - Left - Right )&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Root 노드를 먼저 출력합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;왼쪽 오른쪽 순으로 출력합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제를 &lt;b&gt;전위 순회 하면 A-B-D-E-C-F-G 입니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. post order / 후위 순회&lt;/b&gt; ( Left - Right - Root )&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왼쪽 노드부터 출력합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;b&gt;오른쪽 노드를 출력합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;b&gt;Root 노드를 출력합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제를 &lt;b&gt;후위 순회 하면 D-E-B-F-G-C-A 입니다.&lt;/b&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1. 트리 순회 직접 구현&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. node 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659504386743&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node {
  constructor() {
    this.left = null;
    this.value = null;
    this.right = null;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. tree 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659504441480&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Tree {
  contructor() {
    this.root = null;
  }

  setRoot(node) {
    this.root = node;
  }
  getRoot() {
    return this.root;
  }
  makeNode(left, value, right) {
    const node = new Node();
    node.left = left;
    node.value = value;
    node.right = right;
    return node;
  }

  inorder(node) {
    if (node !== null) {
      this.inorder(node.left);
      console.log(node.value);
      this.inorder(node.right);
    }
  }

  preorder(node) {
    if (node != null) {
      console.log(node.value);
      this.preorder(node.left);
      this.preorder(node.right);
    }
  }

  postorder(node) {
    if (node != null) {
      this.preorder(node.left);
      this.preorder(node.right);
      console.log(node.value);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 각 순회 함수 실행 결과&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;in oreder&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;73&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KsImj/btrISNiIdur/F7xOUZQaQkkb1N6VzjY9SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KsImj/btrISNiIdur/F7xOUZQaQkkb1N6VzjY9SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KsImj/btrISNiIdur/F7xOUZQaQkkb1N6VzjY9SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKsImj%2FbtrISNiIdur%2FF7xOUZQaQkkb1N6VzjY9SK%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;73&quot; height=&quot;164&quot; data-origin-width=&quot;73&quot; data-origin-height=&quot;164&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pre order&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;61&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tf61T/btrIO21YP9H/nuirSd4zQBoVStauzQnIw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tf61T/btrIO21YP9H/nuirSd4zQBoVStauzQnIw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tf61T/btrIO21YP9H/nuirSd4zQBoVStauzQnIw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftf61T%2FbtrIO21YP9H%2FnuirSd4zQBoVStauzQnIw0%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;61&quot; height=&quot;162&quot; data-origin-width=&quot;61&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;post order&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;59&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQMi0j/btrIO2OtABH/GPw3y7Pj9eRJDae6rsjffK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQMi0j/btrIO2OtABH/GPw3y7Pj9eRJDae6rsjffK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQMi0j/btrIO2OtABH/GPw3y7Pj9eRJDae6rsjffK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQMi0j%2FbtrIO2OtABH%2FGPw3y7Pj9eRJDae6rsjffK%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;59&quot; height=&quot;164&quot; data-origin-width=&quot;59&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF6Clu/btrISO9K3is/qzMFc3tasn4P6gOvaI4Aw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF6Clu/btrISO9K3is/qzMFc3tasn4P6gOvaI4Aw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF6Clu/btrISO9K3is/qzMFc3tasn4P6gOvaI4Aw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF6Clu%2FbtrISO9K3is%2FqzMFc3tasn4P6gOvaI4Aw0%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Data Structure</category>
      <category>binary search tree</category>
      <category>binary tree</category>
      <category>JS 트리구현</category>
      <category>tree</category>
      <category>전위 순회</category>
      <category>중위 순회</category>
      <category>트리 순회</category>
      <category>후위 순회</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/91</guid>
      <comments>https://think0wise.tistory.com/91#entry91comment</comments>
      <pubDate>Wed, 3 Aug 2022 14:52:46 +0900</pubDate>
    </item>
    <item>
      <title>TS -  Interface</title>
      <link>https://think0wise.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트에서 &lt;b&gt;객체의 type을 지정해주는 방법에는&lt;/b&gt; 2가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 type 키워드를 통한 기본적인 방법이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나머지 하나는 Interface 키워드를 통한 방법이다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. type의 쓰임새&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;type 키워드는 &lt;b&gt;여러가지 방법으로 다양하게 사용 가능하다.&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;객체 외의 다른 자료형의 타입도 지정 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-1. 기본적인 타입 지정 ( ailas )&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658202974583&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Dmg = number
type Name = string

type Player = {
  name: Name,
  dmg : Dmg,
}

const bob : Player = {
  name: 'bob',
  dmg: 10
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-2. 타입이 특정 값을 가지도록 제한&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658203314571&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Team = 'red' | 'green' | 'yellow'
type Health = 10 | 20 | 30

type Player ={
  name: string
  team: Team
  health: Health
}

const bob : Player = {
  name: 'Bob',
  team: 'red',
  health: 10
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. interface의 쓰임새&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;interface는 TS에게 객체의 형태를 설명하고 싶을 때 사용하는 키워드이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type으로는 불가능한 타입 지정 방식이 interface로는&amp;nbsp;가능하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-1. extends 키워드를 통한 상속&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658203783166&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface User {
  name: string
}

interface Player extends User{  
}

const bob : Player ={
  name: &quot;Bob&quot;,
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-2. 동일한 이름의 여러개의 interface를 자동으로 병합&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658204290707&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface User {
  name: string;
}

interface User {
  healthBar: number;
}

interface User {
  isAdmin: boolean;
}

const bob: User = {
  name: &quot;Bob&quot;,
  healthBar: 10,
  isAdmin: false,
};&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. interface사용법 ( feat. 추상 클래스 )&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-1. 추상 클래스의 단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 클래스의 상속과 구현을 강제하려면 추상 클래스를 사용했다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658206034936&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class User{
  constructor(
    protected firstName:string,
    protected lastName:string
  ){}
  abstract sayHi(name:string):string;
  abstract fullName():string;
}

class Player extends User{
  sayHi(name:string){
    return `Hello ${name}!`;
  }

  fullName(){
    return `${this.firstName} ${this.lastName}`;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 추상클래스에 단점이 있다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에는 abstract 라는 개념이 없기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상클래스도 일반적인 클래스로 변환된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속받는 다른 클래스들이 표준화된 프로퍼티, 메소드를 가지도록 청사진 역할을 할 뿐이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접적인 인스턴스 생성이 불가함에도...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JS로 변환된 코드에는 일반 클래스로 변환되어 남아있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위와 같은 상황에 interface 사용을 고려할 수 있다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-2. interface 사용법&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1658205841749&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface User {
  firstName: string
  lastName: string 
  sayHi(name: string): string
  fullName(): string
}

class Player implements User{
  constructor(
    public firstName: string,
    public lastName: string
  ){}
  
  sayHi(name: string){
    return `Hello ${name}!`;
  }

  fullName(){
    return `${this.firstName} ${this.lastName}`;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;interface를 정의한 후(메소드의 경우 abstract 키워드는 사용하지 않는다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 interface를 구현할 class에서 implements 키워드를 사용한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) class Player implements User&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 그대로 Player 클래스는 User 인터페이스를 구현한다.&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;interface 상속을 통해 구현하는 class에서 프로퍼티는 항상 public 이어야 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. interface VS type ( 차이점 )&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Type Alias는 새로운 프로퍼티 추가를 위해 같은 이름으로 선언할 수 없지만,&lt;br /&gt;interface는 항상 선언적 확장이 가능하다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Type Alias는 computed property 사용이 가능하지만,&lt;br /&gt;interface는 불가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ojxJB/btrHCY1W0K1/gDswGezGQwozUx3MS7bVhK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ojxJB/btrHCY1W0K1/gDswGezGQwozUx3MS7bVhK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ojxJB/btrHCY1W0K1/gDswGezGQwozUx3MS7bVhK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FojxJB%2FbtrHCY1W0K1%2FgDswGezGQwozUx3MS7bVhK%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/TS</category>
      <category>abstract</category>
      <category>Interface</category>
      <category>type alias</category>
      <category>typescript</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/90</guid>
      <comments>https://think0wise.tistory.com/90#entry90comment</comments>
      <pubDate>Tue, 19 Jul 2022 16:22:45 +0900</pubDate>
    </item>
    <item>
      <title>TS - Class</title>
      <link>https://think0wise.tistory.com/89</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. constructor - 프로퍼티 초기화&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 처럼 this.X = X 형태의 문법은 더이상 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타입스크립트에서는 constructor에서 한 번에 선언할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;접근 제한자도 붙여줄 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658126772549&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Player {
  constructor(
    private firstName: string,
    protected lastName: string,
    public nickName: string
  ){}
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-1. 프로퍼티 메뉴얼 초기화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스의 프로퍼티가 constructor에 의해 바로 초기화 되지 않도록 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1658132285374&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Words = {
  [key: string]: string;
};

class Dict {
  private words: Words;
  constructor() {
    this.words = {};
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서는&lt;b&gt; word 프로퍼티를 수동으로 초기화 시켜주었다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&amp;nbsp; 접근 제한자&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 접근 제한자 &lt;/b&gt;&lt;b&gt;- 메서드, 프로퍼티의 접근 범위를 지정할 때 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;private : 해당 클래스에서만 접근 가능&lt;/li&gt;
&lt;li&gt;protected :&amp;nbsp; 해당 클래스, 자식 클래스 에서 접근 가능.&lt;/li&gt;
&lt;li&gt;public : 어디에서나 접근 가능하며 생략 가능한 default 값.&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;b&gt;&lt;b&gt;* &lt;/b&gt;제한자 접근 가능 범위&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 65.2326%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.8582%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 17.6931%; height: 17px; text-align: center;&quot;&gt;클래스 내부&lt;/td&gt;
&lt;td style=&quot;width: 17.8714%; height: 17px; text-align: center;&quot;&gt;자식 클래스&lt;/td&gt;
&lt;td style=&quot;width: 16.1003%; height: 17px; text-align: center;&quot;&gt;외부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15px;&quot;&gt;
&lt;td style=&quot;width: 14.8582%; height: 15px;&quot;&gt;private&lt;/td&gt;
&lt;td style=&quot;width: 17.6931%; height: 15px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 17.8714%; height: 15px; text-align: center;&quot;&gt;&lt;b&gt;X&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.1003%; height: 15px; text-align: center;&quot;&gt;&lt;b&gt;X&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.8582%; height: 18px;&quot;&gt;protected&lt;/td&gt;
&lt;td style=&quot;width: 17.6931%; height: 18px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 17.8714%; height: 18px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 16.1003%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;X&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 14.8582%; height: 21px;&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 17.6931%; height: 21px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 17.8714%; height: 21px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 16.1003%; height: 21px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658127567874&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Parents {
  constructor(
    private firstName: string,
    protected lastName: string,
    public nickName: string
  ) {}
}

class Child extends Parents {
  privateTest(){
    return this.firstName // error
  }

  protectedTest(){
    return this.lastName
  }
  publicTest(){
    return this.nickName
  }
}

const test = new Child('t','e','st')

test.firstName // private --&amp;gt; error
test.lastName // lastName --&amp;gt; error
test.nickName // public 프로퍼티만 어디서든 접근 가능합니다.&lt;/code&gt;&lt;/pre&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Abstract class( 추상 클래스 )&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상 클래스는 자식 클래스에게 상속을 강제하기 위한 클래스이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상 클래스는 자신의 인스턴스 생성이 불가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658129440637&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class Abstract {
  constructor(
    private firstName: string,
    protected lastName: string,
    public nickName: string
  ) {}
}

class Test extends Abstract {}

new Abstract // cannot create an instance of an abstract class.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. Abstract Method (추상 메소드)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상 메소드는 추상 클래스 안에서만 생성 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 역시 자식 클래스에게 메소드의 구현을 강제하기 위해 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상 메소드에는 call signature만 정의하고,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상속 받는 자식 클래스에서 추상 메소드를 구현한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658131433332&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class Abstract {
  constructor(
    protected firstName: string,
    protected lastName: string,
  ) {}

  abstract speak():string
}

class Test extends Abstract {
  speak(){
    return `${this.firstName} ${this.lastName}`
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfuE15/btrHwk48thr/1vWuudkb1vl4RtrWd7U0m1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfuE15/btrHwk48thr/1vWuudkb1vl4RtrWd7U0m1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfuE15/btrHwk48thr/1vWuudkb1vl4RtrWd7U0m1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfuE15%2FbtrHwk48thr%2F1vWuudkb1vl4RtrWd7U0m1%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/TS</category>
      <category>Abstract Class</category>
      <category>Class</category>
      <category>typesrcipt</category>
      <category>추상클래스</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/89</guid>
      <comments>https://think0wise.tistory.com/89#entry89comment</comments>
      <pubDate>Mon, 18 Jul 2022 17:26:08 +0900</pubDate>
    </item>
    <item>
      <title>TS - 제네릭(generic)</title>
      <link>https://think0wise.tistory.com/88</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;제네릭이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선언 시점이 아닌 생성 시점에 타입을 명시하여 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하는 기법이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 한번의 선언으로 다양한 타입에 재사용이 가능하다는 장점이 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;T&amp;gt;는 제네릭을 선언할 때 관용적으로 사용되는 식별자이며, 타입 파라미터(Type parameter)라 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 'T' 외의 값을 사용해도 된다고 하는데 대부분 'T' 를 쓰는것 같다.)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;함수에서의 제네릭&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1657869872490&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type SuperPrint = {
  &amp;lt;T&amp;gt;(arr: T[]): void;
};

const superPrint: SuperPrint = (arr) =&amp;gt; {
  arr.forEach((item) =&amp;gt; console.log(item));
};

superPrint([1, 2, 3]); // superPrint &amp;lt;number&amp;gt;(arr: number[]) =&amp;gt; void
superPrint([&quot;1&quot;, &quot;2&quot;, &quot;3&quot;]); // superPrint &amp;lt;string&amp;gt;(arr: string[]) =&amp;gt; void
superPrint([true, true, false]); // superPrint &amp;lt;boolean&amp;gt;(arr: boolean[]) =&amp;gt; void
superPrint([1, &quot;2&quot;, true]);
// superPrint &amp;lt;number|string|boolean&amp;gt;(arr: (number|string|boolean)[]) =&amp;gt; void&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 SuperPrint type에는 &lt;b&gt;제네릭이 사용되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 superPrint 함수의 &lt;b&gt;파라미터 타입은 인수의 타입에 의해 결정된다. (* 코드 하단 4줄 참고)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// 의 내용에서 알 수 있듯 각 함수 호출마다 &lt;b&gt;전달되는 인수의 타입을 통해 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;타입 파라미터를 추론하여 정한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;* superPrint&amp;lt;number&amp;gt;( [1,2,3] )의 형태로 직접 명시도 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 제일 하단에는 3가지 타입의 인수를 전달했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제네릭이 없었다면&lt;/b&gt; 모든 타입의 경우의 수를 전부 명시해 줘야 했을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 제네릭 대신 any를 사용해도 에러 없이 동작하지만,&amp;nbsp;&lt;br /&gt;코드가 조금만 추가되면 언제나 터질수 있는 시한폭탄을 설치한 것과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;type checker의 도움을 받을 수 있도록 제네릭을 사용하도록 하자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 생성하기 전,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 매개변수, 리턴 값의 타입을 Call Signature로 먼저 정해보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그 과정에서 다양한 타입을 명시해줘야 하는 경우에는 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제네릭 사용을 고려해 보도록 하자!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJgdUp/btrHn8DbENr/fneKJ5Fe8p7i8CPFndzgtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJgdUp/btrHn8DbENr/fneKJ5Fe8p7i8CPFndzgtK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJgdUp/btrHn8DbENr/fneKJ5Fe8p7i8CPFndzgtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJgdUp%2FbtrHn8DbENr%2FfneKJ5Fe8p7i8CPFndzgtK%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Frontend/TS</category>
      <category>Generic</category>
      <category>Type Parameter</category>
      <category>typescript</category>
      <category>제네릭</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/88</guid>
      <comments>https://think0wise.tistory.com/88#entry88comment</comments>
      <pubDate>Fri, 15 Jul 2022 18:21:09 +0900</pubDate>
    </item>
    <item>
      <title>TS - Function Overloading</title>
      <link>https://think0wise.tistory.com/87</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;함수 오버로딩이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;타입스크립트 에서는&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러 개의 Call signature를 갖는 함수를 하나의 이름으로 정의하는 것,&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉 &lt;b&gt;여러 타입의 매개변수를 받지만&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그에 의한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;함수의 동작은 같아 하나의 함수 명으로 표현하고 싶을 때&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 수 있는 함수 정의 기술입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 객체 지향 프로그래밍의 특징 중 다형성( polymorphism ) 의 구현입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;call signature의 파라미터 수가 같을 때&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1657859067074&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Add = {
  (a: number, b: number): number;
  (a: number, b: string): number;
};

const add: Add = (a, b) =&amp;gt; {
  if (typeof b === &quot;string&quot;) return a; 
  return a + b;
};

console.log(add(1,'문자열'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 add 함수는&lt;b&gt; 파라미터 수가 같은&lt;/b&gt; &lt;b&gt;2종류의 call signature를 가지고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 add 함수 내부에서 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;타입이 &lt;/span&gt;&lt;b&gt;number | string인 b에 대해&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; type 체크를 진행해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각자 다른 값을 return 하도록 했습니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;call signature의 파라미터 수가 다를 때&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1657864340883&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Add = {
  (a: number, b: number): number;
  (a: number, b: number, c:number): number;
};

const add: Add = (a, b, c? :number)=&amp;gt; {
    if(c) return a + b + c
    return a + b
};

console.log(add(1,2)) // 3
console.log(add(1,2,3)) // 6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 add 함수는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파라미터 수가 다른&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;2종류의 call signature를 가지고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 type checker가 알수 있도록&amp;nbsp; '파라미터 c는 옵션이고 number일 수 있다' 라고 명시하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUqQN/btrHnxJAEsS/YW3mQyWJtKXnIwX1JybaO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUqQN/btrHnxJAEsS/YW3mQyWJtKXnIwX1JybaO1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUqQN/btrHnxJAEsS/YW3mQyWJtKXnIwX1JybaO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUqQN%2FbtrHnxJAEsS%2FYW3mQyWJtKXnIwX1JybaO1%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/TS</category>
      <category>Function Overloading</category>
      <category>Polymorphism</category>
      <category>다형성</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/87</guid>
      <comments>https://think0wise.tistory.com/87#entry87comment</comments>
      <pubDate>Fri, 15 Jul 2022 16:01:17 +0900</pubDate>
    </item>
    <item>
      <title>TS - Call Signatures</title>
      <link>https://think0wise.tistory.com/86</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Call Signatures란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 매개변수와 return값의 Type을 미리 정하는 문법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;함수선언 안에서 타입을 명시한 코드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1657792525058&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function hello(name: string): void {
  console.log(`hello ${name}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Call Signatures를 사용한 코드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1657793069201&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Hello = (name: string) =&amp;gt; void;

const hello: Hello = (name) =&amp;gt; {
  console.log(`hello ${name}`)
}

hello('bob') //&quot;hello bob&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Call Signatures를 사용하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 함수의 구현과 타입선언을 분리하여 구현할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 체커는 hello 함수의 타입을 이미 알기 때문에 에러없이 실행됩니다.&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr4Sty/btrHhclNds4/YDd99xR5QAw1fIAR6au1J0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr4Sty/btrHhclNds4/YDd99xR5QAw1fIAR6au1J0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr4Sty/btrHhclNds4/YDd99xR5QAw1fIAR6au1J0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr4Sty%2FbtrHhclNds4%2FYDd99xR5QAw1fIAR6au1J0%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Frontend/TS</category>
      <category>Call Signatures</category>
      <category>함수 시그니처</category>
      <category>호출 시그니처</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/86</guid>
      <comments>https://think0wise.tistory.com/86#entry86comment</comments>
      <pubDate>Thu, 14 Jul 2022 19:32:32 +0900</pubDate>
    </item>
    <item>
      <title>TS - 새로운 타입과 기본 문법</title>
      <link>https://think0wise.tistory.com/85</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 타입 추론과 타입 표기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-1. 타입 추론&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타입스크립트의 타입 체커는 추론을 통해 타입을 정한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657777485848&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 'hello'
let b = false
let c = 1
let d = [1,2,3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 각 변수의 타입은 &lt;b&gt;타입 체커에 의해 추론되어 정해진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a - string&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b - boolean&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c - number&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d - number[ ]&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-2. 타입 표기(Type Annotation)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발자가 직접 타입을 명시할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: type 을 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657777951785&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a : string = 'hello'
let b : boolean = false
let c : number = 1
let d : number[] = [1,2,3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가능하다면 타입 체커가 추론을 통해 타입을 지정하도록 하는게 좋다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 길이나 가독성이 좋아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 체커가 추론할 수 없는 상황이거나 명확한 이유가 있다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;명시적으로 타입을 표기한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Optional Parameter ( ? )&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택적인 프로퍼티, 파라미터를 만들어야 한다면&amp;nbsp; '?' 를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1657782477752&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const player : {
  name: string,
  age?: number
} = {
  name: 'bob'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;age 프로퍼티의 &lt;b&gt;type은 number, undefined 입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 age 프로퍼티의 값을 전달하지 않아도 에러가 발생하지 않습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Type alias&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자주 사용되는 타입을 변수의 형태로 지정할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;type 변수명 = 타입 &lt;/b&gt;의 형태로 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1657783010022&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Player = {
  name: string,
  age?: number
}

const player1 : Player = {
  name: 'bob'
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 함수의 arguments, return type&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수 코드에서는 인자의 타입과, 반환되는 값의 타입을 명시할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 return type은 파라미터 다음에 명시합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) function xxx ( ) : type { }&lt;/p&gt;
&lt;pre id=&quot;code_1657783441153&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Player = {
  name: string,
  age?: number
}

function playerMaker(name: string) : Player{
  return {
    name
  }
}

const bob = playerMaker('Bob')
bob.age = 27&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;playerMaker 함수는 Player type을 return 하므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 실행으로 생성된 객체 bob에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;optional property인 age 프로퍼티를 추가할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;화살표 함수의 경우 다음과 같이 명시합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657783860239&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const playerMaker = (name: string) : Player =&amp;gt;{
  return {
    name
  }
}

const bob = playerMaker('Bob')
bob.age = 27&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. readonly 속성&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;readonly 속성은 type 정의나 interface 정의에서 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 값을 읽기전용으로 만들 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657784639398&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Player = {
  readonly name: string,   // --&amp;gt; readonly 적용
  age?: number
}

const playerMaker = (name: string) : Player =&amp;gt;{
  return {
    name
  }
}

const bob = playerMaker('Bob')
bob.name = 'god' // Cannot assign to 'name' because it is a read-only property.&lt;/code&gt;&lt;/pre&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. Tuple&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트에서 고정된 길이와 각 요소의 타입이 지정된 배열을 Tuple이라 부릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1657785047414&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const player: [string, number, boolean] = ['bob', 27, false]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. any&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 타입을 허용하는 타입을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;떄문에 JS 프로젝트를 TS프로젝트로 점진적 마이그레이션 할때 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TypeScript의 타입 체커로 부터 자유로워지는 것은 &lt;b&gt;반대로&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;보호를 받지 못하는 것과 같습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657785880542&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const a : any[] = [1,'2',true]
const b : any = false

console.log(a + b) // &quot;1,2,truefalse&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위 코드처럼 의도한 바가 아닐수도 있는 코드가 에러없이 실행 될 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 명확한 이유로 any를 사용해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. unknown&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 값이 어떤 type인지 알수 없는 경우 unknown 타입을 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657786902398&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a : unknown = 'hello'

a.toUpperCase() // error : object is of type unknown&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;unknown의 경우 타입체커는 해당 값의 타입을 알지 못하므로&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타입을 체크하는 코드로 타입 확인 후 사용가능합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657787029059&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a : unknown = 'hello'

if(typeof a === 'string'){
  console.log(a.toUpperCase())
} 

// HELLO&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9. void&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;void는 아무것도 return하지 않는 함수를 대상으로 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657787254248&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function hello(){
  console.log(&quot;Hello!&quot;)
}

// function hello() : void&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10. never&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;never는 모든 타입의 하위타입 입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;때문에 어떤값도 never타입에 할당할 수 없습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수가 절대 return하지 않을 때&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657789835970&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function error(text: string): never{
  throw new Error(text) 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 타입 값을 할당받지 않도록 할 때 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657791083926&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type NonString&amp;lt;T&amp;gt; = T extends string ? never : T;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yDB3n/btrHiEBSyzD/VaqKINiYCWeHhyN8eeEKf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yDB3n/btrHiEBSyzD/VaqKINiYCWeHhyN8eeEKf1/img.jpg&quot; data-alt=&quot;운동하고 싶다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yDB3n/btrHiEBSyzD/VaqKINiYCWeHhyN8eeEKf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyDB3n%2FbtrHiEBSyzD%2FVaqKINiYCWeHhyN8eeEKf1%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&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;</description>
      <category>Frontend/TS</category>
      <category>alias</category>
      <category>Any</category>
      <category>never</category>
      <category>readonly</category>
      <category>tuple</category>
      <category>typescript</category>
      <category>Unknown</category>
      <category>void</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/85</guid>
      <comments>https://think0wise.tistory.com/85#entry85comment</comments>
      <pubDate>Thu, 14 Jul 2022 18:32:57 +0900</pubDate>
    </item>
    <item>
      <title>TS -  TypeScript란 ?</title>
      <link>https://think0wise.tistory.com/84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. TypeScript란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적 타입 언어인 JavaScript&lt;/b&gt;의 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;단점을 보완하기 위해&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;b&gt;JavaScript 기반으로 만들어진 정적 타입 언어이다!&amp;nbsp;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-1. JavaScript의 단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 &lt;b&gt;런타임에서 타입이 결정되는 동적 타입 언어이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 값의 종류, 즉 타입을 선언하지 않아도 되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 과정이 없기 때문에 이런 부분이 장점이 되기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이런 특징 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 예상치 못한 에러가 발생하면&lt;b&gt; 런타임에서야 오류를 발견할 수 있기 때문에&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최악의 경우, &lt;span style=&quot;background-color: #ffffff; color: #424242;&quot;&gt;이미 프로그램이 멈춘&lt;span&gt;&amp;nbsp;&lt;/span&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타입 안정성이 보장되지 않기 때문에&lt;/b&gt; (&lt;span&gt;프로그램에서 타입이 잘못 전달되어 발생되는 에러를 잡기 어려움)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트가 커질수록 디버깅이 어렵다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&amp;nbsp; 자바스크립트의 단점을 보완하기 위해&lt;/p&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. TypeScript의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 스크립트는 정적 타입 언어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드 작성 단계에서 부터 타입을 체크하고 오류를 확인할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6의 문법을 포함하고 있고 클래스, 인터페이스, 상속, 모듈 같은 객체지향 프로그래밍 패턴을 제공한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. TypeScript의 장점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&lt;b&gt; 변수나 함수에서 개발자의 목적에 맞지 않는 타입에 대한 에러를 발생시켜&lt;/b&gt;&amp;nbsp;버그를 미연에&amp;nbsp; 방지합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드 자동 완성, 피드백 제공을 통해 작업과 동시에 디버깅이 가능합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 대부분의 라이브러리들이 타입스크립트를 지원하고, VSC 같은 에디터에서 타입스크립트 관련 플러그인을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 자바스크립트 프로젝트에 대한 점진적 마이그레이션을 지원합니다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. TypeScript의 단점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 개발의 규모가 커질수록 타입을 설정하는 시간이 오래걸립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드의 가독성이 떨어질 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. TypeScript의 컴파일 과정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트 코드 --&amp;gt; 타입스크립트 AST --&amp;gt; &lt;b&gt;타입 체커가 AST 체크&lt;/b&gt;&amp;nbsp;--&amp;gt; 자바스크립트 코드로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;--------------------------&amp;nbsp; &amp;nbsp;여기까지 타입스크립트 컴파일러(tsc)에 의해 수행&amp;nbsp; ---------------------------------&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;자바스크립트 코드 --&amp;gt; 자바스크립트 AST --&amp;gt; 바이트 코드 --&amp;gt; 런타임이 바이트코드 평가 후 결과 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-------------------------&amp;nbsp; &amp;nbsp;여기까지 자바스크립트 런타임(V8, node.js)에 의해 수행&amp;nbsp; -------------------------&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 자바스크립트 컴파일러와 런타임(node.js)은 엔진(V8)이라는 하나의 프로그램으로 합쳐진다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;현대 모던 엔진은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자바스크립트를 인터프리터 방식으로 실행하고,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;필요하다면 컴파일도 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;nbsp;이렇게 인터프리팅과 컴파일을 혼합하여 사용하는 것을&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;JIT( Just-In-Time ) 컴파일러 라고 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;때문에 현 시점에서의 JS는 컴파일되지만, 문맥상 인터프리터 언어로 분류된다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5-1. 컴파일 vs 인터프리터&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 컴파일 언어 ( C, C++, Java 등)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;b&gt;코드 실행에 앞서 코드를 기계 언어로 미리 바꿔둔다.&lt;/b&gt; 때문에 &lt;span&gt;런타임에서 빠르게 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 컴파일 시간은 소요되지만, 그 과정에서 Syntax, Type error를 감지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 인터프리터 언어 ( JavaScript, Python 등)&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;&amp;nbsp;- &lt;b&gt;컴파일 과정 없이 고수준 프로그래밍 언어를 바로 실행시킬 수 있다.&lt;/b&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5-2. 용어 설명&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*AST( Abstract Syntax Tree )&lt;/p&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;* 컴파일( compile )&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;큰 의미로&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;한 언어로 작성된 코드를 다른 언어의 코드로 변환하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;일반적으로&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;소스 코드를 바이트 코드로 변환하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 트랜스파일 ( transpile )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 한 언어로 작성된 코드를 &lt;b&gt;비슷한 수준의 추상화를 가진 다른 언어로 변환하는 것.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;b&gt;컴파일의 하위 개념&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- ex) Babel -&amp;nbsp; es6+ 코드를 es5로 트랜스 파일&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. tsc는 컴파일러지만 트랜스 파일을 한다...?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말이 조금씩 다르기는 하지만 주류가 되는 의견은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;컴파일은 일반적으로 소스 코드를 바이트 코드로 변환하는 작업을 의미하므로,&lt;br /&gt;.ts 파일을 .js 파일로 변환 시키는&amp;nbsp;타입스크립트 컴파일러는&amp;nbsp;&lt;br /&gt;&lt;b&gt;실질적으로 트랜스 파일 하는 것이다.&lt;/b&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;(컴파일의 큰 의미에 속하기 때문에 TS의 컴파일 과정이라 부르면서도, '세부적으로 나누면 트랜스 파일이 맞지 않느냐'&lt;/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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bibi69/btrHiG7z5zF/mOyxN4i9E2qYgeP2Y2wT1K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bibi69/btrHiG7z5zF/mOyxN4i9E2qYgeP2Y2wT1K/img.jpg&quot; data-alt=&quot;운동하고 싶다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bibi69/btrHiG7z5zF/mOyxN4i9E2qYgeP2Y2wT1K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbibi69%2FbtrHiG7z5zF%2FmOyxN4i9E2qYgeP2Y2wT1K%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;1283&quot; height=&quot;419&quot; data-filename=&quot;도현로고2.jpg&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;419&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;</description>
      <category>Frontend/TS</category>
      <category>ts</category>
      <category>typescript</category>
      <category>v8</category>
      <category>컴파일</category>
      <category>타입스크립트</category>
      <category>트랜스파일</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/84</guid>
      <comments>https://think0wise.tistory.com/84#entry84comment</comments>
      <pubDate>Thu, 14 Jul 2022 14:35:53 +0900</pubDate>
    </item>
    <item>
      <title>단 1명의 유저를 위한 서비스 개발을 마치면서... </title>
      <link>https://think0wise.tistory.com/83</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;제목 그대로 무려 1명의 유저가 사용하는 서비스 개발을 마쳤다 &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성공했지만 실패했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작은 것을 만들고 큰 것을 얻었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LOL은 인생이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무슨 미친 소리인가 생각했다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 읽고 나면 이해가 될 것이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 전부 읽어주면 좋겠다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&amp;nbsp; LOL 밴픽 시뮬레이터 프로젝트의 시작 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;평화로운 오후. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LOL 프로팀 코치를 하고 있는 친구와의 대화 내용이다.&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;- 나&amp;nbsp; &amp;nbsp; &amp;nbsp;:&amp;nbsp; 요즘엔 일하는 거 어떻냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 친구 :&amp;nbsp; &amp;nbsp;&quot;아 맞다 너 뭐 좀 만들 수 있냐? 일하는데 개 답답함 &amp;zwj;♂️ &amp;zwj;♂️ &amp;zwj;♂️&quot; &lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 나&amp;nbsp; &amp;nbsp; :&amp;nbsp; &amp;nbsp;&quot;으음..? ㅇ..예에?? 뭘요?  &quot;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 심도 있는 대화가 오고 갔고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친구는 곧바로 업무지시를 하기 시작했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EOQvY/btrG1y3arI4/oLjR6yEBkLJ8qGpH7uGEd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EOQvY/btrG1y3arI4/oLjR6yEBkLJ8qGpH7uGEd0/img.png&quot; data-alt=&quot;노빠꾸 당일 업무시작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EOQvY/btrG1y3arI4/oLjR6yEBkLJ8qGpH7uGEd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEOQvY%2FbtrG1y3arI4%2FoLjR6yEBkLJ8qGpH7uGEd0%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;300&quot; height=&quot;237&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;237&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;b&gt;친구의 업무 환경 개선을 위한 프로젝트가 시작됐다!!&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 고객의 불만사항 파악&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코치는 선수들의 모든 경기를 모니터링하고, 분석하고, 전략을 짜야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이를 위해 항상 필요한 정보는 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;양 팀의 밴픽 데이터이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;친구는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(이하 고객이라 부르겠다 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;양 팀의 밴픽 데이터를&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자료화하는 방식과 구조가 불만이었다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 해결을 위해 여러 불만 사항들과 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;그로 인한 문제점을 정리했다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제점 1. 대회 클라이언트와 일반 클라이언트의 UI 일관성이 없다&lt;b&gt;❌&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRdrVQ/btrG4fagSpu/kvkotY2Ymig48gGLtNvwX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRdrVQ/btrG4fagSpu/kvkotY2Ymig48gGLtNvwX0/img.png&quot; data-alt=&quot;스트레스는 만병의 근원&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRdrVQ/btrG4fagSpu/kvkotY2Ymig48gGLtNvwX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRdrVQ%2FbtrG4fagSpu%2FkvkotY2Ymig48gGLtNvwX0%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;300&quot; height=&quot;72&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;72&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;고객은 밴픽 데이터를 화면 캡처를 통해 정리하고 있었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제는 각 클라이언트가 관전자에게 제공하는 UI가 다르다는 것이었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡처마다 화면구성이 달라 일관적이지 못했고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;b&gt; 2. 캡쳐를 위해 항상 대기하고 있어야 한다&lt;b&gt;❌&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코치들은 관전자 권한으로 게임에 참여하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOL을 해본 사람은 알겠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;밴픽 과정은&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상황에 따라 길어질 수도 혹은 빠르게 끝날 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론상 짧으면 6분 정도. 길면 12분까지도 소요된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;양 팀의 밴픽이 끝나고 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;게임 시작 전까지 대략 30초~ 1분의 시간이 주어진다.&lt;/span&gt;&lt;/b&gt; ( 클라이언트, 게임 모드에 따라 상이하다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 짧은 시간이 문제가 되었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;30초~ 1분이라는 주어진 시간 내에 화면 캡쳐를 하지 못하면 그대로 게임이 시작되어 버린다는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황에 따라 평균 10분 정도 자리를 지키고 있어야 했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선수들의 밴픽과정을 지켜보면서 코칭 할 때에는 겸사겸사 같이 해결하면 됐지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않은 때에도 자리를 지켜야 한다는 강제적인 상황은 당연히 스트레스일 것이다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt; 을 참은 적도 있다고 한ㄷ...&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;만약 혹시나 캡쳐 타임을 놓치고 나면...&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 고객님은 엉엉 울며, 기존 캡처본에 짜깁기하여 직접 만들었다고 한다.&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 style=&quot;letter-spacing: 0px;&quot;&gt;이 역시 UI가 달라, &lt;/span&gt;&lt;b&gt;불만사항 1에 해당하는 문제가 또 발생했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 포기하고 직접 만드는 걸 택했다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;b&gt; 3. 즉각적으로 변경되는 상황에 대응하기 어렵다&lt;b&gt;&lt;b&gt;❌&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크림은 팀 간의 연습 경기이기 때문에 실제 대회 경기와는 달리 룰에 있어서 비교적 자유롭다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면, 스크림에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탑-정글-미드-원딜-서폿 포지션 순서를 맞추지 않고 게임을 시작할 때도 있고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밴픽 진행 중 혹은 밴픽이 모두 끝난 후에도 양 팀 합의하에 리방을 해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존과 다른 밴픽으로 진행하는 경우도 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 스펠 같은 경우 빈번하게 변경되기 마련이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런 즉각적으로 데이터가 변경되는 상황에서의 대응이 어려웠다고 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p 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. 미처 캡쳐하지 못했는데 리방을 해버린다거나...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이미 캡쳐했는데 스펠만 띵 하고 바뀐다거나...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 선수 한 명의 픽만 바꾸려고 리방 했을 때&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;암묵적으로 아무 챔피언으로&amp;nbsp;&lt;span&gt;밴카드를 &lt;span&gt;채워 빨&lt;/span&gt;리 진행시킨다거나...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 문제의 해결과 개발 시작!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 불만을 해결할 수 있는 방법은 아주 간단했다.&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[시간제한 없고, 순서 상관없이 자유롭게 선택, 수정이 가능한 밴픽툴]&lt;/b&gt; 을 만드는 것.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;항상 일관된 UI로 자료 저장이 가능할 것이고,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경기 전, 경기 중, 경기 후 언제든지 캡쳐가 가능하니 &lt;b&gt;캡쳐를 위해 자리를 지킬 필요도 없을 것이고,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택 수정이 항상 자유롭다면, &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 data-ke-size=&quot;size16&quot;&gt;개발 시작 전 크게 2가지 정도만 생각했던 것 같다.&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;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;(어떠한 준비 없이 개발을 시작한 것이 &lt;/span&gt;&lt;/span&gt;&lt;b&gt;훗날 엄청난 재앙과 함께 깨달음을 주는 계기가 되었다 &lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리 많은 생각을 하지 않고 바로 CRA로 개발을 시작했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대략적인 화면의 레이아웃을 만들고 생각했던 기능을 하나씩 붙여나가는 방식으로 개발했다&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;우선 필수 기능을 우선적으로 구현했다. (밴, 픽, 스펠 선택 기능)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;패치 버전 업데이트마다 코드를 직접 수정해야 하는 일을 만들지 않기 위해&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;라이엇이 제공하는 API를 사용했고, &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이를 통해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;서비스는 &lt;/span&gt;&lt;b&gt;항상 최신 버전의 챔피언, 스펠 이미지를 사용할 수 있게 되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;이후 고객이 원하는 부가적인 기능들을 추가해 나갔다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객이 원하는 기능을 구현하고 난 뒤에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;더 편리하게 &lt;span&gt;사용할 수 있도록 기능의 동작을 &lt;/span&gt;수정하는 식으로 발전시켰다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 검색 기능 사용 후 챔피언 선택을 확정하면, 검색 창이 자동 초기화 되도록 수정&amp;nbsp; -&amp;gt; 추가 검색이 편해졌다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 사용한다고 생각하니 사용자 경험을 계속 생각하게 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정을 계속 반복하면서 필요한 기능들이 모두 구현되었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 달 정도의 개발 끝에 배포를 하게 되었다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://banpick-simulator.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(훔쳐보기)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XEg4E/btrG8snJ0Dy/13wsPd9ZKVyN5i2goBKnr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XEg4E/btrG8snJ0Dy/13wsPd9ZKVyN5i2goBKnr0/img.png&quot; data-alt=&quot;완성된 서비스의 한 화면... 이것은 복선이오&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XEg4E/btrG8snJ0Dy/13wsPd9ZKVyN5i2goBKnr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXEg4E%2FbtrG8snJ0Dy%2F13wsPd9ZKVyN5i2goBKnr0%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;1454&quot; height=&quot;652&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;652&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.&amp;nbsp; 프로젝트 성공!?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포를 끝내자마자 바로 고객님께 사용을 요청했다. ( 뒤지게 설렜다... )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그리고 실제 사용을 마친 고객님께선 극찬을 아끼지 않으셨다 &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc28G2/btrOQqiNB0s/XhNl6BYo0N1NK5vesmn5fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc28G2/btrOQqiNB0s/XhNl6BYo0N1NK5vesmn5fK/img.png&quot; data-alt=&quot;고객의 입에서 욕이 나왔다는 건, 극찬이 아닐까?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc28G2/btrOQqiNB0s/XhNl6BYo0N1NK5vesmn5fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc28G2%2FbtrOQqiNB0s%2FXhNl6BYo0N1NK5vesmn5fK%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;873&quot; height=&quot;334&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;481&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;배포 후 고객이 실 사용하는 3주 정도의 시간 동안 추가 기능 요청이나, 불만사항이 없었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제 마지막 PR 후 개발을 마무리했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 서비스로 인해 개선된 업무효율&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 개인적으로 궁금해서 대화를 통해 단순 계산해 보았다.&lt;/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;관리하는 평균 경기 수&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 월&lt;/span&gt; 130경기 (1일 6경기 기준)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;밴픽 과정 &lt;span&gt;평균 &lt;/span&gt;소요 시간&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;= 10분&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;여러 변수로 인해 직접 자료를 만드는 평균 횟수&lt;br /&gt;&amp;nbsp;= 월 65회 (1일 3경기 이상)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;직접 자료를 만들 때 평균 소요 시간&lt;br /&gt;= 8분&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;서비스 사용시 평균 소요 시간&amp;nbsp;&lt;br /&gt;= 1분&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;size18&quot;&gt;&lt;b&gt;절약된 시간&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 X 2번 =&amp;nbsp; 21시간 30분 ( 밴픽이 끝나길 기다리며 다른 업무 못하는 시간 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 X 4번 =&amp;nbsp; 8시간 40분&amp;nbsp; &amp;nbsp;(직접 자료 만드는 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;합 = 월 평균 30시간 10분&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;size18&quot;&gt;&lt;b&gt;기존보다 더 소요된 시간&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 X 5번 = &lt;b&gt;월 평균 2시간 10분&lt;/b&gt; (내 서비스로 자료 만드는 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;고객님은 월 평균 28시간을 아끼게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 여러 조건들을 생각하지 않고 해본 단순 계산이지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1달에 하루가 넘는 시간과, &lt;/b&gt;&lt;b&gt;스트레스까지 줄였으니 대 성공이다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;똥을 참지 않아도 되는 것까지 하면 이건... 그야말로..&lt;/s&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 정말 성공일까...? ( feat. 시뮬레이션 없는 시뮬레이터 &amp;zwj;♂️)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객은 상당히 만족했고 실제로도 엄청난 시간을 절약하며, 스트레스까지 줄였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 여기까지만 본다면 이토록 성공적일 수가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만... 이 서비스에는 옥의 티가 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;바로 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;시뮬레이션 기능이 없는 시뮬레이터 프로젝트&lt;/span&gt;라는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_다운로드.jfif&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJBmpF/btrG3rwSzNl/XlOqLDWTToBgjcalsuhDvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJBmpF/btrG3rwSzNl/XlOqLDWTToBgjcalsuhDvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJBmpF/btrG3rwSzNl/XlOqLDWTToBgjcalsuhDvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJBmpF%2FbtrG3rwSzNl%2FXlOqLDWTToBgjcalsuhDvK%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;300&quot; height=&quot;157&quot; data-filename=&quot;edited_다운로드.jfif&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;157&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;br /&gt;&lt;b&gt;'내 친구에게 필요한 기능을 만들어 주는 것'&lt;/b&gt; 이 목표였다.&lt;br /&gt;그렇게 개발하던 중&amp;nbsp;&lt;b&gt;'모든 사람들이 사용할 수 있는 롤 밴픽 시뮬레이터의 구현'&lt;/b&gt;으로&amp;nbsp;목표를&amp;nbsp;확장시켰었다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;친구에게 필요한&lt;/b&gt; &lt;b&gt;빠른 밴픽 모드와&lt;/b&gt;&lt;br /&gt;&lt;b&gt;일반적인 lol 유저들이 사용할 수 있는&lt;/b&gt; &lt;b&gt;토너먼트 드래프트 모드로 &lt;/b&gt;나누어 개발하려고 했고,&lt;br /&gt;&lt;br /&gt;빠른&amp;nbsp;밴픽&amp;nbsp;모드의&amp;nbsp;개발이&amp;nbsp;끝난&amp;nbsp;후&amp;nbsp;1차&amp;nbsp;배포까지만&amp;nbsp;하더라도&amp;nbsp;&lt;br /&gt;각&amp;nbsp;모드의&amp;nbsp;기능은 비슷하니&amp;nbsp;금방&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있겠다&amp;nbsp;생각했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;내 처참한 코드를 되돌아보기 전까지만 해도 말이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6-1. 빠른 개발, 정말 나쁜 코드, 그리고 멸망&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LCK 프로 팀들은 시즌이 시작되기 몇 주 전부터 본격적으로 스크림(연습경기) 도 많아지곤 하는데,&lt;br /&gt;최대한의 효율을 위해 시즌 전까지 빠르게 개발하려고 노력했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 어느 순간부터는 점점 코드가 더러워지고 구려지는 걸 느낄 수가 있었는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그때마다 남은 시간을 생각하며 &lt;/b&gt;&lt;b&gt;코드보다 기능 구현에 초점을 맞추게 되었다..&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 달이라는 시간 동안 개발에만 몰두한 덕분에 나름대로 정해놓은 제작 기간 내에 완성할 수 있었고&lt;br /&gt;친구에게 좋은 업무용 툴을 선물할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;급한 일은 끝냈으니, 충분한 시간을 통해 천천히&lt;span&gt;&amp;nbsp;&lt;/span&gt; 드래프트 모드를 구현하려 했는데 &lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;그럴 수 없었다.&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생산성을 위한 컴포넌트 분리도 되어있지 않았고,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디렉터리 구조도 분리되어 있지 않았다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;.scss 파일 하나에 모든 스타일이 들어있었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;이미 내 코드는 엉망이 되어있었다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 싸지른 똥을 치우려&lt;/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;분리하고 나니 15개 정도의 컴포넌트로 나뉘었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역에서 엄청난 개수의 props를 각 depth의 컴포넌트로 전부 전달해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 하나의 파일에서 엄청난 수의 state와 함수로 동작하도록 구현했기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컴포넌트끼리의 결합도가 엄청나게 높아져서 어떻게 손을 댈 수가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;며칠간 코드를 정리하기 위해 노력했지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금의 내 능력으로는 &lt;span&gt;도저히&lt;span&gt; 진전이 없었고 개발을 중단하기로 했다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;그렇게 토너먼트 드래프트 모드는 개발하지 못했고,&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;시뮬 없는 시뮬레이터 프로젝트가 완성되었다.&lt;/span&gt;&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6-2. 초기 설계의 중요성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 초기 설계라는 개념 자체가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 초기 단계에서 해야 할 컴포넌트, 디렉터리 구조 설계 등을 하지 못했고 바로 개발을 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;흘러가는 대로 개발했고, 결국 프로젝트 미완성으로 이어졌다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 프로젝트를 통해 얻은 것들&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7-1. 개발 필수 규칙&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 꼭 충분한 초기 설계를 하고 개발할 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 사용하는 기술의 본질을 이해하고 사용할 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 내가 적은 코드에 발목 잡히는 일이 없도록 노력할 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;앞으로의 또 다른 개발에 있어서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;내가 꼭 지켜야 할 규칙을 정할 수 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 조금이라도 생각하며 개발했다면, 지금쯤 드래프트 모드 개발이 끝나지 않았을까 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아쉽지만 내 업보라고 생각하면서 &lt;b&gt;앞으로는 &lt;/b&gt;위의 철칙들을&amp;nbsp; 꼭 지켜보려 한다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7-2. 소통의 중요성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 과정중에 고객의 기습 기능 추가 요청이 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY3PWv/btrG8sgmama/aOCy3eqo1ArBVJDpUpD3q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY3PWv/btrG8sgmama/aOCy3eqo1ArBVJDpUpD3q0/img.png&quot; data-alt=&quot;노밴 기능 추가 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY3PWv/btrG8sgmama/aOCy3eqo1ArBVJDpUpD3q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY3PWv%2FbtrG8sgmama%2FaOCy3eqo1ArBVJDpUpD3q0%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;300&quot; height=&quot;333&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;333&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;하지만 고객은 처음부터 내가 고려할 줄 알았다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서로 충분했다고 생각한 소통이 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;충분하지 않았다는 것으로 결론지었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;앞으로 수없이 많은 개발을 할 테고,&amp;nbsp; 수없이 많은 소통을 할 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대상은 이번처럼 고객이 될 수도 있고, 디자이너가 될 수도 있고, 개발자가 될 수도 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 구체적으로 계획하고 소통해야&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7-3. 마무리&lt;/b&gt;&lt;/h4&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://think0wise.tistory.com/67&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;요구하는 대로 개발하는 것도,&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;b&gt;전부 처음이었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'내 개발 실력이 누군가에게 도움은 될 수 있는 정도구나'라는 기쁨도 있었지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'갈 길이 한참 남았구나'라는 좌절도 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그럼에도 멈추고 싶기보다는 더 빨리 가고 싶은 생각만 든다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이번 프로젝트는 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;성공했지만, 실패했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;작은 것을 만들고 큰 것을 얻었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;LOL은 인생이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wW8Z9/btrHapjnZix/kiEnSdME1AdyezOEfoF6Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wW8Z9/btrHapjnZix/kiEnSdME1AdyezOEfoF6Xk/img.png&quot; data-alt=&quot;기본이 중요하다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wW8Z9/btrHapjnZix/kiEnSdME1AdyezOEfoF6Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwW8Z9%2FbtrHapjnZix%2FkiEnSdME1AdyezOEfoF6Xk%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>프로젝트</category>
      <category>LOL</category>
      <category>개발 후기</category>
      <category>성공경험</category>
      <category>실패경험</category>
      <category>프로젝트</category>
      <category>회고</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/83</guid>
      <comments>https://think0wise.tistory.com/83#entry83comment</comments>
      <pubDate>Tue, 12 Jul 2022 19:59:59 +0900</pubDate>
    </item>
    <item>
      <title>class - mixin</title>
      <link>https://think0wise.tistory.com/82</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. mixin&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 단일상속만을 허용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체에는 단 하나의 [[ Prototype ]] 만 존재할 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 단 하나의 클래스만 상속 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 제약에서 벗어나기 위해&lt;b&gt; mixin 을 사용할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mixin이란 특정 행동을 실행해주는 메서드를 제공하는 객체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 객체를 다른 클래스에 병합해 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1656057662982&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let helloMixin = {
  sayHello(){
    console.log(`Hello ${this.name}`)
  }
}

class User {
  constructor(name){
    this.name = name;
  }
}

Object.assign(User.prototype, helloMixin);

new User('Bob').sayHello(); // 'Hello Bob'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속 없이 메서드를 복사하여 인스턴스에서 메소드를 사용할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;믹스인에서 믹스인을 상속받아 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1656057967218&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let say ={
  say(msg){
    console.log(msg)
  }
}

let sayHelloMixin = {
  __proto__: say,

  sayHello(){
    super.say(`hello ${this.name}`)
  }
}

class User {
  constructor(name){
    this.name = name;
  }
}

Object.assign(User.prototype, sayHelloMixin);

new User('Bob').sayHello(); // 'Hello Bob'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sayHelloMixin은 say객체를 상속 받았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, &lt;b&gt;생성된 인스턴스에서 호출한 sayHello()을 주목해 봅시다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;sayHelloMixin에서 부모메서드 super.say를 호출하면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;클래스의 프로토타입이 아닌 sayHelloMixin의 프로토타입에서 메서드를 찾게되는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;위와 같은 동작은 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;[[ HomeObject ]] 라는 함수 전용 특수 내부 프로퍼티와&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;super() 의 동작방식 때문에 발생합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;클래스이거나 객체 메서드인 함수의&lt;/span&gt;&lt;b&gt;&lt;span&gt; [[ HomeObject ]] 라는 프로퍼티에는 해당 객체가 저장됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;super는 [[ HomeObject ]] 를 통해 부모 프로토타입과 메서드를 찾습니다.&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x0OR0/btrFShN1DAY/pw22KkZybtfAPVBS5vKUW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x0OR0/btrFShN1DAY/pw22KkZybtfAPVBS5vKUW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x0OR0/btrFShN1DAY/pw22KkZybtfAPVBS5vKUW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx0OR0%2FbtrFShN1DAY%2Fpw22KkZybtfAPVBS5vKUW0%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;255&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 그림처럼&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User.prototype 의 프로퍼티인 &lt;b&gt;sayHello와 같은 메서드에서 사용된 super는&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;[[ HomeObject ]] 를 통해 &lt;/span&gt;&lt;/b&gt;메소드의 생성 근원지인 sayHelloMixin 객체를 알 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이를 통해 부모 프로토타입과 해당 메서드를 찾습니다.&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. mixin은 다른 클래스들의 메서드 조합을 포함하는 클래스를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자바스크립트에서는 다중 상속을 지원하지 않으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 믹스인을 사용하여 메서드 복사를 통해 프로토타입에 구현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. mixin이 기존 클래스 메서드를 덮어쓸 수 있으므로 충돌이 발생하지 않도록 이름을 신중하게 정해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m1VUa/btrFTOx2l8K/I50c4tggSzyaHT9SaKUdA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m1VUa/btrFTOx2l8K/I50c4tggSzyaHT9SaKUdA0/img.png&quot; data-alt=&quot;어렵구나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m1VUa/btrFTOx2l8K/I50c4tggSzyaHT9SaKUdA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm1VUa%2FbtrFTOx2l8K%2FI50c4tggSzyaHT9SaKUdA0%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&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;</description>
      <category>Frontend/JS.info 정리</category>
      <category>mixin</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/82</guid>
      <comments>https://think0wise.tistory.com/82#entry82comment</comments>
      <pubDate>Mon, 27 Jun 2022 13:33:05 +0900</pubDate>
    </item>
    <item>
      <title>class - 내장 class의 특성</title>
      <link>https://think0wise.tistory.com/81</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 내장 클래스 확장하기&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1656052201081&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PowerArray extends Array {
  isEmpty() {
    return this.length === 0;
  }
}

let arr = new PowerArray(1, 2, 5, 10, 50);
console.log(arr.isEmpty()); // false

let filteredArr = arr.filter(item =&amp;gt; item &amp;gt;= 10)
 //filter 내장 메소드로 새로운 배열 리턴

console.log(filteredArr); // [10, 50]  새로운 배열의 값
console.log(filteredArr.isEmpty()); // false 
// 새롭게 리턴된 배열에서도 PowerArray의 메소드를 사용할 수 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerArray 클래스로 생성한 arr 인스턴스의 내장 메서드를 사용했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그에 대한 반환값도 PowerArray의 인스턴스인 모습입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 배열을 리턴해주는 메소드의 내부에서 &lt;b&gt;객체의 constructor 프로퍼티를 사용하기 때문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656052438322&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(arr.constructor === PowerArray); // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 동작 방식으로 PowerArray에 구현된 메서드를 사용할 수 있다는 장점이 생깁니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특수 정적 getter인 Symbol.species를 클래스에 추가하여&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map, filter 등의 메소드 호출시 리턴되는 개체의 생성자를 직접 지정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1656052821402&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PowerArray extends Array {
  isEmpty() {
    return this.length === 0;
  }

  static get [Symbol.species](){
    return Array
  }
}

let arr = new PowerArray(1, 2, 5, 10, 50);
console.log(arr.isEmpty()); // false

let filteredArr = arr.filter(item =&amp;gt; item &amp;gt;= 10)

console.log(filteredArr.isEmpty()); // TypeError: filteredArr.isEmpty is not a function&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더이상 filteredArr에는 isEmpty() 가 없습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 내장 객체와 정적 메서드 상속&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 클래스가 다른 클래스를 상속받으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 메서드는 Class 상속을 통해, 일반 메서드는 Class.prototype 객체 상속을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모두 상속 받아 사용 가능했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만 내장 클래스는 다릅니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내장 클래스는 정적 메서드는 상속받지 못합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그 이유는 간단합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내장 객체끼리는 Class 상속이 이뤄지지 않습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656053390977&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(Array.prototype.__proto__ === Object.prototype) // true
console.log(Array.__proto__ === Object) // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3nuOo/btrFDfYy3FH/b8aRGbsQ5bFd8PT8gRbKUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3nuOo/btrFDfYy3FH/b8aRGbsQ5bFd8PT8gRbKUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3nuOo/btrFDfYy3FH/b8aRGbsQ5bFd8PT8gRbKUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3nuOo%2FbtrFDfYy3FH%2Fb8aRGbsQ5bFd8PT8gRbKUK%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;306&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;477&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;인스턴스에서 Array.keys() 나 Date.keys() 같은 정적 메서드를 사용할 수 없는 것입니다.&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QAZz8/btrFEXJFrv4/ykPc8Ully912TuKHRv6FUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QAZz8/btrFEXJFrv4/ykPc8Ully912TuKHRv6FUK/img.png&quot; data-alt=&quot;쉬어가는 단계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QAZz8/btrFEXJFrv4/ykPc8Ully912TuKHRv6FUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQAZz8%2FbtrFEXJFrv4%2FykPc8Ully912TuKHRv6FUK%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쉬어가는 단계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>Frontend/JS.info 정리</category>
      <category>Class</category>
      <category>Symbol.species</category>
      <category>내장 객체와 정적 메서드</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/81</guid>
      <comments>https://think0wise.tistory.com/81#entry81comment</comments>
      <pubDate>Fri, 24 Jun 2022 15:53:26 +0900</pubDate>
    </item>
    <item>
      <title>class - private, protected</title>
      <link>https://think0wise.tistory.com/80</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 객체 지향의 캡슐화&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 지향 프로그래밍의 중요한 원리 중 하나는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내부 인터페이스와 외부 인터페이스를 구분 짓는 것, &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉 캡슐화 입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 지향 프로그래밍에서 프로퍼티와 메서드는 2개의 그룹으로 분류됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 인터페이스 - &lt;b&gt;동일한 클래스 내의 다른 메서드에서는 접근할 수 있지만,&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; 클래스 밖에서는 접근 할 수 없는 프로퍼티와 메서드&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;외부 인터페이스 - &lt;b&gt;클래스 밖에서도 접근 가능한 프로퍼티와 메서드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;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;b&gt;세부사항들은 서로의 정보를 이용해서 객체를 동작시킵니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커피 머신은 보호 커버에 쌓여 있기 때문에 벗기지 않고는 커피머신 외부에서 내부로 접근할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밖에서는 내부를 알 수 없고, 접근할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내부 인터페이스의 기능은 외부 인터페이스를 통해야만 사용할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 특징 덕분에 외부 인터페이스만 알아도 객체를 가지고 무언가를 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 내부 동작이 어떤지 몰라도 괜찮다는 점은 큰 장점으로 작용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에는 두 가지 타입의 객체 필드가 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;public : 어디서든지 접근할 수 있으며 &lt;b&gt;외부 인터페이스를 구성합니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;private : 클래스 내부에서만 접근할 수 있으며 &lt;b&gt;내부 인터페이스를 구성할 때 사용됩니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. protected 필드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서는 &lt;b&gt;프로퍼티명 앞에 밑줄 _ ( under score )을 붙여&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 자신과 자손 클래스에서만 접근을 허용하는 'protected' 필드를 모방해서 사용할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(정식으로 지원하지 않습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;protected 필드는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private와 비슷하지만, &lt;b&gt;자손 클래스에서도 접근이 가능하다는 차이점이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655885370311&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CoffeeMachine {
  waterAmount = 0; // 물통에 차 있는 물의 양

  constructor(power) {
    this.power = power;
    console.log( `전력량이 ${power}인 커피머신을 만듭니다.` );
  }

}

// 커피 머신 생성
let coffeeMachine = new CoffeeMachine(100);

// 물 추가
coffeeMachine.waterAmount = 200;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 waterAmount 와 power는 public입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 값으로 쉽게 변경 할 수 있는 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;waterAmount를 protected 프로퍼티로 바꿔서 통제해보겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655885777907&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CoffeeMachine {
  _waterAmount = 0;

  set waterAmount(value) {
    if (value &amp;lt; 0){
      console.log(&quot;물의 양은 음수가 될 수 없습니다.&quot;)
      return 
    }

    this._waterAmount = value;
  }

  get waterAmount() {
    return this._waterAmount;
  }

  constructor(power) {
    this._power = power;
  }
}

// 커피 머신 생성
let coffeeMachine = new CoffeeMachine(100);

// 물 추가
coffeeMachine.waterAmount = -10 // 물의 양은 음수가 될 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getter와 setter를 활용해서 &lt;b&gt;waterAmount 프로퍼티를 protected 프로퍼티로 바꿨습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에 따라 waterAmount 프로퍼티는 조건에 부합할 때에만 수정할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;읽기 전용 프로퍼티&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;power 프로퍼티는&lt;b&gt; 인스턴스 생성시에만 값을 할당할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커피 머신의 전력량은 항상 같아야 겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런 경우에 읽기 전용 프로퍼티를 활용할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽기 전용 프로퍼티는 &lt;b&gt;setter를 구현하지 않고,&amp;nbsp; getter만 구현하면 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655886578950&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CoffeeMachine {
  constructor(power) {
    this._power = power;
  }

  get power() {
    return this._power;
  }
}

let coffeeMachine = new CoffeeMachine(100);

console.log(`전력량이 ${coffeeMachine.power}인 커피머신을 만듭니다.`); 

coffeeMachine.power = 25 // 코드가 동작 하지 않습니다.

console.log(coffeeMachine.power) // 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getter만 구현했으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인스턴스 생성시를 제외하고 power 프로퍼티를 수정할 수 없습니다.&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대부분의 코드에서는 get, set 문법보다 다음과 같이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;get.... set.....식의 함수가 선호됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다수의 인자를 받을 수 있다는 장점이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655886985326&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CoffeeMachine {
  _waterAmount = 0;

  setWaterAmount(value) {
    if (value &amp;lt; 0){
      console.log('물의 양은 음수가 될 수 없습니다.')
      return
    }

    this._waterAmount = value;
  }

  getWaterAmount() {
    return this._waterAmount;
  }
}

let coffeeMachine = new CoffeeMachine()
coffeeMachine.setWaterAmount(-1); // '물의 양은 음수가 될 수 없습니다.'
console.log(coffeeMachine.getWaterAmount()) // 0&lt;/code&gt;&lt;/pre&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;protected 필드는 상속됩니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제를 예로 들어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoffeeMachine 클래스를 상속 받는 자식 클래스가 있다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 클래스의 메서드에서 this._waterAmount, this.power 를 사용해 프로퍼티에 접근 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;protected 필드는 private 필드와는 다르게 상속이 가능하므로 ,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자손 클래스에서도 접근이 가능합니다!!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. private 필드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로퍼티나 메소드의 앞에&amp;nbsp;&lt;b&gt; # 을 붙여 private 필드로 만들 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655888992977&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CoffeeMachine {
  _waterAmount = 0
  #waterLimit = 200;

  #checkWater() {
    if (this._waterAmount &amp;lt; 0) throw new Error(&quot;물의 양은 음수가 될 수 없습니다.&quot;);
    if (this._waterAmount &amp;gt; this.#waterLimit) throw new Error(&quot;물이 용량을 초과합니다.&quot;);
  }

}

let coffeeMachine = new CoffeeMachine();

coffeeMachine.#checkWater(); // Private field '#checkWater' must be declared in an enclosing class
coffeeMachine.#waterLimit = 1000; // Private field '#checkWater' must be declared in an enclosing class&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;private 필드는 해당 클래스 안에서만 접근 가능하고,&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 외부나 자손 클래스에서 접근 할 수 없습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;private 프로퍼티와&amp;nbsp; public 프로퍼티를 동시에 가질 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655894897596&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CoffeeMachine {
  #waterAmount = 0;

  get waterAmount() {
    return this.#waterAmount; // 해당 클래스 내에서만 private 프로퍼티에 접근 가능합니다.
  }

  set waterAmount(value) {
    if (value &amp;lt; 0) throw new Error(&quot;물의 양은 음수가 될 수 없습니다.&quot;);
    this.#waterAmount = value; // 해당 클래스 내에서만 private 프로퍼티에 접근 가능합니다.
  }
}

let machine = new CoffeeMachine();

machine.waterAmount = 100; // --&amp;gt; setter호출
console.log(machine.waterAmount); // 100 --&amp;gt; getter호출
console.log(machine.#waterAmount) // Error: Private field '#waterAmount' must be declared in an enclosing class&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;waterAmount 는 public 프로퍼티이고,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;private 프로퍼티인 #waterAmount 의 접근자 입니다.&lt;/b&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;pre id=&quot;code_1655895701241&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MegaCoffeeMachine extends CoffeeMachine {
  test(){
    return this.#waterAmount // SyntaxError: Private field '#waterAmount' must be declared in an enclosing class
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스에서는 private 프로퍼티에 직접 접근 할 수 없습니다.&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;pre id=&quot;code_1655895844273&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MegaCoffeeMachine extends CoffeeMachine {}

let megaMachine = new MegaCoffeeMachine();

megaMachine.setWaterAmount(100);
console.log(megaMachine.getWaterAmount()); // 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스에서 private 프로퍼티에 접근하려면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; getter, setter를 사용하면 됩니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #313130;&quot;&gt;private 필드는 this[name]로 사용할 수 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #313130;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;private 필드는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #313130;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;computed property를 사용할 수 없습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655896657902&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class User {
  field = 'Bob'

  sayHi() {
    let fieldName = 'field'
    console.log(`Hello, ${this[fieldName]}`);
  }

  #private = 'God'

  test(){
    let fieldName = 'private'
    console.log(`Hello, ${this[fieldName]}`);
  }
}

let user = new User();
user.sayHi() // Hello, Bob
user.test() // Hello, undefined&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 시나리오에서 위와 같은 private의 제약사항은 너무 엄격합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스에서 &lt;span&gt;부모 클래스의 내부에 접근해야 하는 상황이 있을 수 있기 때문입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언어차원에서 지원하지 않는 protected 필드를 더 자주 사용하는 이유입니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. OOP에서 내부 인터페이스와 외부 인터페이스를 구분하는 것을 캡슐화 (encapsulation) 이라고 한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 캡슐화의 이점은 다음과 같다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 사용자의 내부 로직 조작으로 인한 에러를 방지함&lt;/li&gt;
&lt;li&gt;외부 사용자에게 알리지 않고도 자유롭게 내부 프로퍼티와 매서드 수정 가능 , 업그레이드 용이&lt;br /&gt;(사용자는 외부 인터페이스만 똑같다면 내부 로직이 바뀐걸 알지 못함)&lt;/li&gt;
&lt;li&gt;구현 세부 사항을 숨길 수 있어 편리해지고, 외부 인터페이스에 대한 문서화가 쉬워짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.&lt;/b&gt; &lt;b&gt;내부 인터페이스를 숨기려면 protected( 모방 가능 ) , private ( 지원 ) 필드를 사용하면 된다.&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;protected는 _ 로 시작하며, 정의된 클래스와 자손 클래스에서 접근 가능하다.&lt;/li&gt;
&lt;li&gt;private는 # 으로 시작하며, 정의된 클래스 에서만 접근 가능하다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxRkG/btrFsZhseC4/kuoyIUXmcbRnD8drkq7Hik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxRkG/btrFsZhseC4/kuoyIUXmcbRnD8drkq7Hik/img.png&quot; data-alt=&quot;많다 많아!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxRkG/btrFsZhseC4/kuoyIUXmcbRnD8drkq7Hik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxRkG%2FbtrFsZhseC4%2FkuoyIUXmcbRnD8drkq7Hik%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;많다 많아!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JS.info 정리</category>
      <category>Class</category>
      <category>encapsulation</category>
      <category>OOP</category>
      <category>private</category>
      <category>protected</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/80</guid>
      <comments>https://think0wise.tistory.com/80#entry80comment</comments>
      <pubDate>Wed, 22 Jun 2022 20:28:25 +0900</pubDate>
    </item>
    <item>
      <title>class - static method, property</title>
      <link>https://think0wise.tistory.com/79</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. static method&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;prototype 프로퍼티가 아닌&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 함수 자체에 메서드를 설정할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런 메서드를 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;static method ( 정적 메서드 )&lt;/span&gt;&amp;nbsp;라고 부릅니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655866206344&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
  static staticMethod(){
    console.log(this === Animal)
  }
}

class Animal {}
Animal.staticMethod = function(){
  console.log(this === Animal)
}


Animal.staticMethod() // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class 내에서 static 메소드를 선언 하는 것은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메서드를 프로퍼티 형태로 직접 할당하는 것과 같습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;static 메소드는 호출시 class명.method( ) 의 형태로 사용하게 되며,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이때 static 메소드의 this는 'class' 가 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. static method 의 쓰임새&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 메소드는 &lt;b&gt;각각의 인스턴스 객체가 아닌,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 전체에 필요한 기능을 구현하고자 할때 사용할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655867277388&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Summoner {
  constructor({name, power = 10}){
    this.name = name;    
    this.power = power;    
  }

  static createDummySummoner(){
    return new Summoner({name: 'dummy', power: 0})
  }
}

let summoner = new Summoner({name : 'Bob'})
let dummy = Summoner.createDummySummoner()

console.log(summoner) // {name: 'Bob', power: 10}
console.log(dummy) // {name: 'dummy', power: 0}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스에 &lt;b&gt;static 메서드 createDummySummoner를 선언했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더미 소환사가 필요할 때마다 Summoner.createDummySummoner( ) 를 호출하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 static 메서드는 전체 클래스의 메서드입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. static property&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 프로퍼티도 만들 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655869455709&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Summoner {
  static dummyName = 'dummy';
]

Summoner.dummyName = 'dummy'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 메소드와 동일하게&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class 내에서 static property를 선언 하는 것은&lt;/p&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. static property 의 쓰임새&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1655869091451&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Summoner {
  constructor({name, power = 10}){
    this.name = name;    
    this.power = power;    
  }

  static dummyName = 'dummy';

  static createDummySummoner(){
    return new Summoner({name: this.dummyName , power: 0})
  }

  static setDummyName(name){
    this.dummyName = name
  }

}

let summoner = new Summoner({name : 'Bob'})
let dummy = Summoner.createDummySummoner()

console.log(summoner) // {name: 'Bob', power: 10}
console.log(dummy) // {name: 'dummy', power: 0}

Summoner.setDummyName('poop')
let dummy2 = Summoner.createDummySummoner()

console.log(dummy2); // {name: 'poop', power: 0}

console.log(summoner.dummyName) // undefined
console.log(Summoner.dummyName) // dummy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 프로퍼티는 &lt;b&gt;데이터를 클래스 수준에 저장하고 싶을 때 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 맨 아랫줄과 같이 &lt;b&gt;정적 프로퍼티는 인스턴스가 아닌 클래스에 저장됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. static 의 상속&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 프로퍼티와 메소드는 상속됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655872268712&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Summoner {
  constructor({name, power = 10}){
    this.name = name;    
    this.power = power;    
  }

  static dummyName = 'dummy';

  static createDummySummoner(){
    return new Summoner({name: this.dummyName , power: 0})
  }

  static setDummyName(name){
    this.dummyName = name
  }
}

class SubSummoner extends Summoner{}

let dummy = SubSummoner.createDummySummoner()
console.log(dummy) // {name: 'dummy', power: 0}
console.log(SubSummoner.dummyName) // dummy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 부모 클래스 Summoner에 선언된 static 메소드와 프로퍼티가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스 SubSumonner에서 사용 가능한 것을 알 수 있습니다.&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;위와 같은 동작이 가능한 이유는 prototype 상속 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;extends 키워드로 상속을 사용할 때 다음과 같은 일이 일어납니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwGKs/btrFpEDEhcQ/DdFzf7M9QyPLvm0tZiPfd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwGKs/btrFpEDEhcQ/DdFzf7M9QyPLvm0tZiPfd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwGKs/btrFpEDEhcQ/DdFzf7M9QyPLvm0tZiPfd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwGKs%2FbtrFpEDEhcQ%2FDdFzf7M9QyPLvm0tZiPfd0%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;284&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 자식 클래스는 &lt;/b&gt;[[Prototype]] 을 통해&lt;b&gt; 부모클래스를 상속받습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 자식 클래스.prototype 은 &lt;/b&gt;[[Prototype]] 을 통해&lt;b&gt; 부모클래스.prototype을 상속받습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스에서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모클래스에 저장된 static 메소드와 프로퍼티를 상속받고 사용할 수 있고,&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;2번을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스의 인스턴스에서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스와 부모 클래스의 메소드를 사용할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&lt;b&gt; static method는&amp;nbsp;&lt;/b&gt;클래스의&lt;b&gt; 인스턴스가 아닌&lt;/b&gt; &lt;b&gt;클래스 전체에&lt;/b&gt; 필요한 기능을 만들 떄 사용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;b&gt; static property는 &lt;/b&gt;데이터를 &lt;b&gt;클래스 수준에 저장하고 싶을 때 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 1,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;&lt;b&gt;4. static은 자식 클래스의 [[ Prototype ]] 을 통해 부모 클래스에게 상속 받아 사용할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwaU7X/btrFpuokhGZ/8R1R8NH6tFItPTobUUlDM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwaU7X/btrFpuokhGZ/8R1R8NH6tFItPTobUUlDM0/img.png&quot; data-alt=&quot;gogo&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwaU7X/btrFpuokhGZ/8R1R8NH6tFItPTobUUlDM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwaU7X%2FbtrFpuokhGZ%2F8R1R8NH6tFItPTobUUlDM0%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gogo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JS.info 정리</category>
      <category>static</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/79</guid>
      <comments>https://think0wise.tistory.com/79#entry79comment</comments>
      <pubDate>Wed, 22 Jun 2022 14:27:38 +0900</pubDate>
    </item>
    <item>
      <title>class - class extends (상속)</title>
      <link>https://think0wise.tistory.com/78</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 클래스 상속 ( extends )&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 상속을 사용하면 클래스를 다른 클래스로 확장할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;extends 키워드로 상속을 구현할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655790622408&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
  constructor(name){
    this.name = name;
    this.speed = 0;
  }

  run(speed){
    this.speed = speed;
    console.log(`${this.name} 달리는 중 속도 : ${this.speed}`)
  }  
}

class Human extends Animal {
  think(){
    console.log(`${this.name} 생각하는 중`)
  }
}

let human = new Human('Bob')

human.run(100) // Bob 달리는 중 속도 : 100
human.think() // Bob 생각하는 중


console.log(human.__proto__ === Human.prototype) // true
console.log(Human.prototype.__proto__ === Animal.prototype) // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;human 인스턴스는 Human.prototype을 상속 받았고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Human.prototype은&amp;nbsp; Animal prototype를 상속 받았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 prototype chain 덕분에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Human class 로 생성된 인스턴스에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Animal class에 정의된 메소드를 사용할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;extends 뒤에는 표현식이 올 수도 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655792973067&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function func(msg) {
  return class {
    sayHi() { 
      console.log(msg)
    }
  }
}

class User extends func(&quot;Hello&quot;) {}

new User().sayHi(); // Hello&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 방법은 조건에 따라 다른 class를 상속 받게 할때 유용합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. super를 통한 메서드 오버라이딩&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속을 구현 함에 있어서 특별한 행동을 하지 않으면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 class의 메소드를 그대로 상속 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;만약 부모 class의 메소드와 같은 이름의 메서드를 정의하면, 자식 class의 메소드가 사용됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 부모 메소드의&lt;b&gt; 일부 기능만 수정하고 싶을땐&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;super 키워드&lt;/span&gt;를 사용하면 됩니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;super.method( ) 는 부모class에 정의 된 메서드, method 를 호출합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655793499066&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
  constructor(name){
    this.name = name;
    this.speed = 0;
  }

  run(speed){
    this.speed = speed;
    console.log(`${this.name} 달리는 중 속도 : ${this.speed}`)
  }  
}

class Human extends Animal {
  think(){
    console.log('생각도 하는 중')
  }

  run(){
    super.run()
    this.think()
  }
}

let human = new Human('Bob')

human.run()
// Bob 달리는 중 속도 : undefined
// 생각도 하는 중&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;화살표 함수에는 super 가 없습니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655793843889&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Human extends Animal {
  run(speed){
    setTimeout(() =&amp;gt; super.run(speed), 1000)
  }
}

let human = new Human('Bob')

human.run(10) // Bob 달리는 중 속도 : 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화살표 함수에서 super 키워드를 사용하면 외부 함수에서 super 를 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 동작은 run( ) 메소드의 컨텍스트에서 사용한 super와 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655794253136&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Human extends Animal {
  run(speed){
    setTimeout(function(){super.run(speed)}, 1000)
  }
}

let human = new Human('Bob')

human.run(10) // error&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 함수를 사용하면 error가 발생합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. super를 통한 생성자 오버라이딩&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 클래스를 상속 받을 때 자식 클래스에서&amp;nbsp; constructor 생성자를 명시하지 않으면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 비어있는 constructor가 생성됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655794558911&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Human extends Animal {
  // 보이지 않지만 생성됩니다.
  constructor(...args){
    super(...args);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;super( ... ) 는 자식 클래스의 constructor 내에서만 사용할 수 있는데,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모 클래스의 constructor를 호출합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 동작 방식 덕분에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 생성자를 명시하지 않으면&lt;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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이를 바탕으로 생성자를 오버라이딩 할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655795079504&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
  constructor(name){
    this.name = name;
    this.speed = 0;
  }
}

class Human extends Animal { 
  constructor(name, sex){
    super(name);
    this.sex = sex 
  }
}

let human = new Human('Bob', 'male')

console.log(human) // Human&amp;nbsp;{name: 'Bob', speed: 0, sex: 'male'}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;super 키워드를 사용하지 않고 오버라이딩 하면 어떻게 될까요 ?&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655795350609&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Human extends Animal { 
  constructor(name, sex){
    this.name = name;
    this.sex = sex 
  }
} 

let human = new Human('Bob', 'male')

// Uncaught ReferenceError: 
// Must call super constructor in derived class before accessing 'this'  
// or returning from derived constructor&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;상속 클래스의 생성자에서 &lt;b&gt;this를 사용하기 전에&lt;/b&gt;&lt;/b&gt;&lt;b&gt; 반드시 super( ) 를 호출해야 합니다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라는 에러가 발생합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에러의 발생 원인은 다음과 같은 자바스크립트의 동작방식 때문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자바스크립트는 &lt;b&gt;상속 클래스의 생성자 함수와 일반 클래스의 생성자 함수를 구분합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;일반 클래스가&lt;/b&gt; new와 함께 실행되면 &lt;b&gt;빈 객체를 만들고 this에 빈 객체를 할당합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 이후 constructor에 정의한 프로퍼티를 추가하고 리턴 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.&amp;nbsp;상속 클래스의 동작에선 2번과 같은 동작이 일어나지 않습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;상속 클래스의 constructor는 2번과 같은 동작을 부모 클래스에 위임합니다&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;정리하면, 상속 클래스의 this가 될 객체가 만들어지지 않아서 발생하는 에러입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 이유로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속 클래스의 &lt;b&gt;constructor 에서 super( ) 를 통해 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 클래스의 &lt;b&gt;constructor 를 실행해 주어야 합니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 클래스 필드 오버라이딩&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드부터 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655796733307&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
  name = 'Animal'
  constructor(){
    console.log(this.name)
  }
}

class Human extends Animal { 
  name = 'Human'
} 

let animal = new Animal() // Animal
let human = new Human() // Animal&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 클래스 Human에서 constructor를 명시 하지 않았으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 클래스 &lt;span&gt;Animal&lt;/span&gt;의 constructor가 호출됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 클래스에서 클래스 필드를 오버라이딩 했음에도 &lt;/b&gt;log에는 &lt;b&gt;둘 다 Animal이 출력됐습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모 생성자는 항상 부모 클래스 필드 값을 사용하기 때문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 그럴까요 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 필드의 초기화 규칙이 정해져 있기 때문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 클래스 필드의 초기화 순서는 다음과 같이 규칙에 따라 달라집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아무것도 상속 받지 않는 &lt;b&gt;베이스 클래스는 constructor 실행 이전에 초기화 됩니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부모 클래스가 존재하는 경우, super( ) 실행 직후에 초기화 됩니다.&lt;/b&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;부모 클래스 &lt;span&gt;Animal은&lt;/span&gt;&amp;nbsp;&lt;b&gt;생성자 함수 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;실행 이전에&lt;/span&gt; name = 'Animal' 클래스 필드가 초기화 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 클래스 &lt;span&gt;Human은 &lt;/span&gt;&lt;b&gt;부모 클래스 Animal의 생성자 함수 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;실행 직후에&lt;/span&gt;&lt;/b&gt; &lt;b&gt;name = 'Human' 클래스 필드가 초기화 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉 자식 클래스의 클래스 필드에 name 은 아직 존재 하지 않기 때문에, ( 초기화 x )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모 클래스의 클래스 필드에 이미 존재하는 name이 사용되는 것입니다. ( 초기화 o )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제는 오버라이딩한 클래스 필드를 부모 생성자에서 사용할 때만 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 문제들은 클래스 필드 대신 메서드를 사용하거나&amp;nbsp; getter, setter를 통해 해결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ec6Hpo/btrFoCeARSC/122S0GWhxr5kNJK4369Kv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ec6Hpo/btrFoCeARSC/122S0GWhxr5kNJK4369Kv1/img.png&quot; data-alt=&quot;OOP의 세계로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ec6Hpo/btrFoCeARSC/122S0GWhxr5kNJK4369Kv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fec6Hpo%2FbtrFoCeARSC%2F122S0GWhxr5kNJK4369Kv1%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;1920&quot; height=&quot;703&quot; data-filename=&quot;기본이 중요하다.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OOP의 세계로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Frontend/JS.info 정리</category>
      <category>Class</category>
      <category>class override</category>
      <category>Extends</category>
      <author>Creative_Lee</author>
      <guid isPermaLink="true">https://think0wise.tistory.com/78</guid>
      <comments>https://think0wise.tistory.com/78#entry78comment</comments>
      <pubDate>Tue, 21 Jun 2022 17:38:04 +0900</pubDate>
    </item>
  </channel>
</rss>