<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>흔적을 남겨</title>
    <link>https://muyeon95.tistory.com/</link>
    <description>gmakin36@gmail.com</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 00:12:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>muyeon</managingEditor>
    <image>
      <title>흔적을 남겨</title>
      <url>https://tistory1.daumcdn.net/tistory/6272690/attach/16883753b5e941dda6c7841c86a5dc31</url>
      <link>https://muyeon95.tistory.com</link>
    </image>
    <item>
      <title>2024년 회고</title>
      <link>https://muyeon95.tistory.com/341</link>
      <description>&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;588&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvbDaX/btsLFgIx5St/gcWGlfU0kQ4ZbZl3A9MRIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvbDaX/btsLFgIx5St/gcWGlfU0kQ4ZbZl3A9MRIk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvbDaX/btsLFgIx5St/gcWGlfU0kQ4ZbZl3A9MRIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvbDaX%2FbtsLFgIx5St%2FgcWGlfU0kQ4ZbZl3A9MRIk%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;588&quot; height=&quot;411&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Intro&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;올 한해 2024년은 나에게 많은 깨달음을 주었던 해이다. 나는 생각이 많고, 상당히 조심스러운 사람이다. 그만큼 겁도 많다. 이러한 문제 때문에 도전에 망설임이 있었는데 이를 극복한 한해라고 생각한다.&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 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;취준기간이 계속되던 중 우연히 2주간 교육을 받고 우수한 인원들중 일 할수 있는 기회를 주는 교육 프로그램에 참여하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 백엔드로서 참여하게 되었고, 매일 오전 CTO 님의 질의응답을 진행하고 과제를 내주는 방식이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행하면서 목표를 정했는데 기술을 사용해보는 것들의 대한 목표였다. 예를들어 yarnberry + pnp 방식을 사용해 본다던가, docker 를 사용하며 개발을 진행한다던가, ecs 를 활용해 배포를 진행해보겠다거나 하는 것들이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과제를 제출하며 오늘 하루의 회고와 배운점, 그리고 궁금한 점을 적도록 구성이 되어있었는데, 교육 초반부에 이 부분을 잘 활용하지 않았다. 지금 생각해보면 스스로 해내겠다는 고집때문이었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫주가 지나갈때 쯔음 CTO 님이 발제때 해주신 말이 나에게 큰 충격을 주었다.&lt;i&gt; &quot;why 에 대한게 빠져있다.&quot;,&lt;/i&gt; &lt;i&gt;&quot;기본이 중요하다.&quot;&lt;/i&gt; 사실 이는 공부하며 수도 없이 들었던 말이다. 이렇게만 말씀하셨다면 와닿지 않았을 것이다. CTO 님은 구체적으로 말씀해주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;jwt 를 왜써요?&quot;&lt;/i&gt;, &lt;i&gt;&quot;jwt 가 어떻게 구성되어 있나요?&quot;&lt;/i&gt;, &lt;i&gt;&quot;jwt 는 안전한가요?&quot;&lt;/i&gt;, &lt;i&gt;&quot;https 의 보안은 어떻게 추가되어 있나요?&quot;&lt;/i&gt; 등 예시를 들어 주셨는데 이에 자연스럽게 답이 나오지 않았다. 기본적인 어떻게보면 당연한 것에 대해서 기본적인 것들에 대해 제대로 알고 있는 것이 없었던 것이다. 코드를 짜고 사용하는데만 집중한 나는 코더였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 나아가 빠르게 배우고 빠르게 기술을 배우는 것이 빨리 배우는 것이 아니었다. 사실 나는 제자리였다는 것을 다시금 느꼈고, 이를 빨리 인지하게 되어 한편으로는 다행이라고 느꼈다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 기본을 다시 잡으면서 한 블로그 포스팅을 접하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/2281/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yozm.wishket.com/magazine/detail/2281/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735977779881&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;풀스택 개발자가 되어야 하는 5가지 이유 | 요즘IT&quot; data-og-description=&quot;풀스택 개발자라는 말을 들으면 어떤 생각이 드시나요? &amp;lsquo;나와는 거리가 멀어. 하나도 하기 벅찬데 풀스택? 그렇게까지 하고 싶지 않아. 특별한 사람만 가능한 거야 그냥 하나라도 잘하자.&amp;rsquo; 이&quot; data-og-host=&quot;yozm.wishket.com&quot; data-og-source-url=&quot;https://yozm.wishket.com/magazine/detail/2281/&quot; data-og-url=&quot;https://yozm.wishket.com/magazine/detail/2281/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pQoMU/hyXWqssYRc/xC4DuXbYM8bgOYEAjogV70/img.jpg?width=1999&amp;amp;height=1334&amp;amp;face=0_0_1999_1334,https://scrap.kakaocdn.net/dn/4hA4h/hyXWB8Bj3r/kab9sKZYaPWwOKbnGFoKCK/img.jpg?width=1999&amp;amp;height=1334&amp;amp;face=0_0_1999_1334&quot;&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/2281/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yozm.wishket.com/magazine/detail/2281/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pQoMU/hyXWqssYRc/xC4DuXbYM8bgOYEAjogV70/img.jpg?width=1999&amp;amp;height=1334&amp;amp;face=0_0_1999_1334,https://scrap.kakaocdn.net/dn/4hA4h/hyXWB8Bj3r/kab9sKZYaPWwOKbnGFoKCK/img.jpg?width=1999&amp;amp;height=1334&amp;amp;face=0_0_1999_1334');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;풀스택 개발자가 되어야 하는 5가지 이유 | 요즘IT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;풀스택 개발자라는 말을 들으면 어떤 생각이 드시나요? &amp;lsquo;나와는 거리가 멀어. 하나도 하기 벅찬데 풀스택? 그렇게까지 하고 싶지 않아. 특별한 사람만 가능한 거야 그냥 하나라도 잘하자.&amp;rsquo; 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yozm.wishket.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;기존 JS 기반으로 백엔드를 공부하고 있었기에 더더욱 관심을 가지게 되고 흥미를 가지게 되었다. 프로덕트를 만들고 가지고 싶다는 꿈이 하나 더 생겼다. 이런 나에게 한가지 생각이 머리를 스쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;하나를 깊게하는 T 자형 개발자가 되어야해.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꿈에 매료된 나는 이 질문에 대해 다르게 답했다. 백엔드만 하는 개발자가 아니라 개발을 잘하는 개발자. 프로덕트와 개발에 대해 깊은 사람. 이게 T 자형 개발자라고 생각하게 되었다.&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;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCFDz8/btsLFaIl7uS/7oA39I3247KKfagDuX2vMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCFDz8/btsLFaIl7uS/7oA39I3247KKfagDuX2vMk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCFDz8/btsLFaIl7uS/7oA39I3247KKfagDuX2vMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCFDz8%2FbtsLFaIl7uS%2F7oA39I3247KKfagDuX2vMk%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;169&quot; height=&quot;169&quot; data-origin-width=&quot;225&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;&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;260&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNpwZN/btsLEYnQgMt/NK5W2lgabqgwcVrhXYim81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNpwZN/btsLEYnQgMt/NK5W2lgabqgwcVrhXYim81/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNpwZN/btsLEYnQgMt/NK5W2lgabqgwcVrhXYim81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNpwZN%2FbtsLEYnQgMt%2FNK5W2lgabqgwcVrhXYim81%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;260&quot; height=&quot;194&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 회사는 크게 두가지를 느끼게 해주었다. 문화와 신뢰의 중요함, 코드의 문서화와 규칙은 꼭 필요하다는 것을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 운이 좋게 교육받았던 회사에서 인턴 근무를 할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞전 회사에서의 경험을 발판삼아 문서화와 작업을 하며 기존의 코드를 바꾸려고 노력했던 것 같다. 좋은 문화를 가진 회사이다 보니 더욱 일에 진심이 되었고, 성장을 갈망하게 되었다. 꽤 긴시간 안썼던 블로그도 스터디를 진행하며 다시금 시작하게 되었다. 현재 회사에서 진행하는 모든 일들이 새롭고 나에게 성장이 되고 있다.&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;outro&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;여러가지 경험을 했던 한해였다. 앞으로 2025 에 대한 목표가 있다면, 첫째는 성장이다. 여러모로 부족함을 많이 느꼈다. 여러 면접을 경험하며 모르는 부분을 두루뭉술 하게 넘어가거나 했던 적도 때때로 존재했다. 모르는게 없는 건 어렵겠지만, 최소화하며 이로 이야기와 의견을 나누며 즐기고 싶다. 또한 CS 와 알고리즘을 즐기고 싶다. 두번째는 정규직 취업이다. 왜 두번째냐고 한다면 성장을 하다보면 당연하게 따라 온다고 생각하고 성장이야 말로 기본적으로 계속 행해야 하는 일이라고 생각하기 때문이다. 기술적인 이야기와 대화를 좋아하는데, 처음에 떨렸던 면접이 이제 이야기와 대화하는 기대감을 안겨주는 곳이 되었다고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해도 성장하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pBuFn/btsLDU7wZQB/LRWhnpBzSboBWwHVaqaOe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pBuFn/btsLDU7wZQB/LRWhnpBzSboBWwHVaqaOe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pBuFn/btsLDU7wZQB/LRWhnpBzSboBWwHVaqaOe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpBuFn%2FbtsLDU7wZQB%2FLRWhnpBzSboBWwHVaqaOe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>TIL&amp;amp;WIL</category>
      <category>2024</category>
      <category>2024 회고</category>
      <category>2024년</category>
      <category>2024년 회고</category>
      <category>2025 목표</category>
      <category>백엔드 회고</category>
      <category>성장</category>
      <category>프론트엔드 회고</category>
      <category>회고</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/341</guid>
      <comments>https://muyeon95.tistory.com/341#entry341comment</comments>
      <pubDate>Sat, 4 Jan 2025 18:16:39 +0900</pubDate>
    </item>
    <item>
      <title>잔디 기부 캠페인 회고</title>
      <link>https://muyeon95.tistory.com/340</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;campaign_og.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqjxy7/btsLpdFlMMB/IJS3TVMIj7UhQs3zUntZKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqjxy7/btsLpdFlMMB/IJS3TVMIj7UhQs3zUntZKK/img.png&quot; data-alt=&quot;잔디 기부 캠페인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqjxy7/btsLpdFlMMB/IJS3TVMIj7UhQs3zUntZKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqjxy7%2FbtsLpdFlMMB%2FIJS3TVMIj7UhQs3zUntZKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;455&quot; data-filename=&quot;campaign_og.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1600&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;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;그로 인해 기획과 논의를 시작하는 데 힘들었고, 부정적인 생각에 사로잡히기도 했습니다. &quot;&lt;i&gt;어려울 것 같은데요&lt;/i&gt;&quot;, &quot;&lt;i&gt;힘들 것 같아요&lt;/i&gt;&quot;, &quot;&lt;i&gt;시간을 맞추기 어려울 것 같아요.&lt;/i&gt;&quot;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vI6PC/btsLnb3ieb2/imKUebO1KbbyD6oDl3SSFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vI6PC/btsLnb3ieb2/imKUebO1KbbyD6oDl3SSFK/img.jpg&quot; data-alt=&quot;오늘도 개발자는 안된다고 했다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vI6PC/btsLnb3ieb2/imKUebO1KbbyD6oDl3SSFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvI6PC%2FbtsLnb3ieb2%2FimKUebO1KbbyD6oDl3SSFK%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;188&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오늘도 개발자는 안된다고 했다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HBVxe/btsLoqLVdc0/36H3kuljTJsi0NMkohXCfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HBVxe/btsLoqLVdc0/36H3kuljTJsi0NMkohXCfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HBVxe/btsLoqLVdc0/36H3kuljTJsi0NMkohXCfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHBVxe%2FbtsLoqLVdc0%2F36H3kuljTJsi0NMkohXCfK%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;240&quot; height=&quot;210&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 제 모습이 너무 싫어서, 프로덕트에 좋지 않아 생각을 바꾸기로 했습니다. &quot;&lt;i&gt;가능하다&lt;/i&gt;&quot;, &quot;&lt;i&gt;될 것 같다&lt;/i&gt;&quot;는 마음으로, 이를 행동으로 옮겼습니다. 이에 기획을 진전시킬 수 있는 부분은 모두 반영하려 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획안에 맞춰 POC(Proof of Concept)를 만들어 보고, 개발을 진행하는 데 있어 가장 큰 문제는 시간이었습니다. 5일 안에 롤아웃을 해야 했고, 퍼블리싱은 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;이런 상황에서 QA를 받거나, 일정 내에 롤아웃을 하는 것은 거의 불가능했습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QA를 미루고 기능 구현에만 집중하다 보니, 추후 수정해야 할 부분이나 구조, 엣지 케이스, 재사용성 등 중요한 사항들을 놓친 채 진행되었습니다.&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;그 결과 QA 후 버그를 수정하거나, 코드 리뷰 후에 새로운 버그가 발생하는 일이 반복됐고, 결국 여러 번 QA를 거쳐야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이번 잔디 캠페인에서 중요한 것은, &lt;b&gt;반복적인 QA를 통해 여러 번 수정하고 개선할 수 있었던 점&lt;/b&gt;입니다.&lt;span&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 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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;메타인지&lt;/b&gt;&lt;br /&gt;내가 얼마나 구현할 수 있는지, 시간 내에 가능한지를 알게 되었습니다. 이번 경험을 통해 내 작업에 대한 객관적인 판단을 내릴 수 있는 기회를 얻었고, 앞으로 더 효율적인 시간 관리를 할 수 있을 것 같습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제는 즉시 해결해야 한다&lt;/b&gt;&lt;br /&gt;이전에는 문제가 발생해도 당장 크리티컬하지 않으면 뒤로 미루는 경향이 있었습니다. 하지만 이번 캠페인에서 그런 버릇 때문에 큰 어려움을 겪었습니다. 미뤘던 문제가 점점 커져 결국 크리티컬한 버그로 돌아왔습니다. 이후로는 발견 즉시 문제를 해결하려고 노력하고 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트의 중요성&lt;/b&gt;&lt;br /&gt;빨리 만드는 것만큼 중요한 것은 정확하게 만드는 것입니다. 코드를 빠르게 작성하는 것도 중요하지만, 그보다 더 중요한 것은 프로덕트가 제대로 작동하도록 하는 것입니다. 이번 캠페인에서 QA 중에 발견된 문제들을 수정할 때, 다른 부분에서 버그가 생기는 일이 많았습니다. 제대로 된 테스트가 있었다면 QA 및 버그 수정으로 인한 일정 지연을 줄일 수 있었을 것 같다는 생각이 듭니다.&lt;/li&gt;
&lt;/ol&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 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&gt; &lt;/span&gt;진심으로&lt;span&gt; &lt;/span&gt;감사드립니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;+ 잔디 인증(개발자 특혜 첫 기여 ㅎ)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNURyV/btsLn7ME6dh/gyFBfKwsSIhxNeeHPHK0F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNURyV/btsLn7ME6dh/gyFBfKwsSIhxNeeHPHK0F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNURyV/btsLn7ME6dh/gyFBfKwsSIhxNeeHPHK0F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNURyV%2FbtsLn7ME6dh%2FgyFBfKwsSIhxNeeHPHK0F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;472&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4ibp6/btsLnOGxbXE/kuIO9113Z6xWQ1v4JxW140/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4ibp6/btsLnOGxbXE/kuIO9113Z6xWQ1v4JxW140/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4ibp6/btsLnOGxbXE/kuIO9113Z6xWQ1v4JxW140/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4ibp6%2FbtsLnOGxbXE%2FkuIO9113Z6xWQ1v4JxW140%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;466&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;2340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crwlGE/btsLoIeukBk/5RAaLqdAK178K1FDMBvKLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crwlGE/btsLoIeukBk/5RAaLqdAK178K1FDMBvKLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crwlGE/btsLoIeukBk/5RAaLqdAK178K1FDMBvKLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrwlGE%2FbtsLoIeukBk%2F5RAaLqdAK178K1FDMBvKLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;359&quot; height=&quot;500&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;2340&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;a href=&quot;https://hanghae99.spartacodingclub.kr/campaign&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hanghae99.spartacodingclub.kr/campaign&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734537031485&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;개발자 커리어 개척 캠프 항해99 | 잔디 기부 캠페인&quot; data-og-description=&quot;세상의 성장에 기여하세요&quot; data-og-host=&quot;hanghae99.spartacodingclub.kr&quot; data-og-source-url=&quot;https://hanghae99.spartacodingclub.kr/campaign&quot; data-og-url=&quot;https://hanghae99.spartacodingclub.kr/campaign&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bmu54M/hyXOkskrRw/yatAy9vA3fzvq01kSOa6w1/img.png?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600,https://scrap.kakaocdn.net/dn/qeMiA/hyXOeMpwEj/LBkT22qO3j4dIJyVp3ledk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800&quot;&gt;&lt;a href=&quot;https://hanghae99.spartacodingclub.kr/campaign&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hanghae99.spartacodingclub.kr/campaign&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bmu54M/hyXOkskrRw/yatAy9vA3fzvq01kSOa6w1/img.png?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600,https://scrap.kakaocdn.net/dn/qeMiA/hyXOeMpwEj/LBkT22qO3j4dIJyVp3ledk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;개발자 커리어 개척 캠프 항해99 | 잔디 기부 캠페인&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;hanghae99.spartacodingclub.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hanghae99.spartacodingclub.kr/campaign/50113066&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hanghae99.spartacodingclub.kr/campaign/50113066&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734537039183&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;개발자 커리어 개척 캠프 항해99 | 잔디 기부 캠페인&quot; data-og-description=&quot;세상의 성장에 기여하세요&quot; data-og-host=&quot;hanghae99.spartacodingclub.kr&quot; data-og-source-url=&quot;https://hanghae99.spartacodingclub.kr/campaign/50113066&quot; data-og-url=&quot;https://hanghae99.spartacodingclub.kr/campaign&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gMGte/hyXOdtcNFA/L71cVz9y57JyUllQk5n2w1/img.png?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600,https://scrap.kakaocdn.net/dn/jWqjQ/hyXOdUh10O/YB1FarWdW7d1ByhQKaPwIk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800&quot;&gt;&lt;a href=&quot;https://hanghae99.spartacodingclub.kr/campaign/50113066&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hanghae99.spartacodingclub.kr/campaign/50113066&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gMGte/hyXOdtcNFA/L71cVz9y57JyUllQk5n2w1/img.png?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600,https://scrap.kakaocdn.net/dn/jWqjQ/hyXOdUh10O/YB1FarWdW7d1ByhQKaPwIk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;개발자 커리어 개척 캠프 항해99 | 잔디 기부 캠페인&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;hanghae99.spartacodingclub.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL&amp;amp;WIL/WIL</category>
      <category>기부</category>
      <category>잔디 기부</category>
      <category>잔디 기부 캠페인</category>
      <category>팀스파르타</category>
      <category>항해99</category>
      <category>회고</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/340</guid>
      <comments>https://muyeon95.tistory.com/340#entry340comment</comments>
      <pubDate>Thu, 19 Dec 2024 00:49:30 +0900</pubDate>
    </item>
    <item>
      <title>http 프로토콜 리퀘스트 라이프 사이클 (HTTP Protocol Request Life Cycle)</title>
      <link>https://muyeon95.tistory.com/339</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;http 프로토콜 리퀘스트 라이프 사이클?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 개발을 공부하며, 면접경험이 있다면 너무나 익숙할 주제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번쯤 면접에서 아래와 같은 질문을 받아본 적 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;a href=&quot;https://google.com&quot;&gt;https://google.com&lt;/a&gt;&amp;nbsp;을 입력하면 무슨일이 일어나나요?&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 네트워크 흐름을 물어보는 질문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대해 정확히 알고있지 않다면, 구구절절 늘어 놓는 답변에 면접관을 지루하게 하거나, 핵심을 빗겨나간 답으로 좋은 평가를 받지 못할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 일련의 네트워크 흐름에 대해 자세히 알아보고, 내가 생각하는 좋은 답변을 요약하는 것으로 마무리를 지으려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째로 URL 을 입력과 &lt;b&gt;파싱으로 시작&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 프로토콜과 호스트 명으로 파싱한다.&lt;/p&gt;
&lt;pre id=&quot;code_1733141254675&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https:// # 프로토콜
google.com # 호스트명&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;호스트명을 IP 주소로 변환하기 위해&lt;/b&gt; DNS 조회를 하기 위한 것이다.&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. DNS 조회&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;브라우저는 파싱한 호스트명의 IP 주소를 찾기 위해 질의를 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 &lt;b&gt;DNS 서버는 호스트명의 IP 를 찾아 반환&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;style5&quot; /&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;3-way handshake 를 통해 TCP 연결을 설정&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;281&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MCcYY/btsK4dUCCB9/Us1XBBOn0RfBIUB23PfkOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MCcYY/btsK4dUCCB9/Us1XBBOn0RfBIUB23PfkOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MCcYY/btsK4dUCCB9/Us1XBBOn0RfBIUB23PfkOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMCcYY%2FbtsK4dUCCB9%2FUs1XBBOn0RfBIUB23PfkOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;179&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) SYN 플래그를 보내 클라이언트에서 서버로 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; 이 패킷에는 클라이언트의 초기 시퀀스 번호가 포함된다. 이는 순서를 보장하기 위해 사용된다.&lt;/p&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) 요청을 받은 서버는 클라이언트로 받은 SYN 패킷을 수신하고, 연결을 수락하기 위해 응답을 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; [SYN : 연결을 수락한다는 신호]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; [ACK: 클라이언트가 보낸 SYN 패킷의 확인 응답, 클라이언트가 보낸 시퀀스 번호를 확인 후 +1 한 값을 ACK 번호로 설정한다.]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;서버는 자신의 시퀀스 번호를 포함해 SYN-ACK 패킷을 전송한다.&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;3) 클라이언트는 서버의 SYN-ACK 을 수신하고, 연결을 확인했다는 의미로 ACK 을 보낸다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트는 서버가 보낸 SYN-ACK 을 확인하고, 자신의 시퀀스 번호의 +1 더한 값을 ACK 번호로 설정해 응답한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-way handshake가 완료되면, 클라이언트와 서버 간의 TCP 연결이 완전히 확립됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후, 브라우저는 HTTP 요청을 전송할 수 있으며, 서버는 이 요청에 대해 응답을 보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때부터 클라이언트와 서버는 TCP 연결을 통해 데이터를 주고받을 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;꼭 알아야 할 특징⭐️&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 초기 시퀀스 번호를 교환하며 연결의 안정성을 확보함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시퀀스 번호를 사용함으로서 패킷이 제대로 도착 했는지, 순서대로 도착했는지 알수 있어 전송의 신뢰성을 높임. (오류 최소화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버의 존재와 접속여부를 확인하기에 안정적이고 신뢰성이 높다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. SSL-handshake&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;https 의 안전한 통신을 위해 SSL-handshake&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;이 부분은 이전에 적은 글이 있으니 간략히하고 링크를 첨부한다.&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;a href=&quot;https://muyeon95.tistory.com/331&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://muyeon95.tistory.com/331&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733148628927&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;https&quot; data-og-description=&quot;https 는 http 에 보안이 추가된 것이다.이는 너무 단순하며, 이렇게만 알고있으면 https 를 설명하기 어렵다. https&amp;nbsp;암호화 및 인증을 위해 SSL/TLS 프로토콜을 사용하는 http 의 보안 버전이다.기본적으&quot; data-og-host=&quot;muyeon95.tistory.com&quot; data-og-source-url=&quot;https://muyeon95.tistory.com/331&quot; data-og-url=&quot;https://muyeon95.tistory.com/331&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfdPVg/hyXGGPWpaE/CVkRHMsCB2a4gCLKn36Zf0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bifdRy/hyXGBgOMWg/q8tgNrqHNgCyVpxvjlHs3K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://muyeon95.tistory.com/331&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://muyeon95.tistory.com/331&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfdPVg/hyXGGPWpaE/CVkRHMsCB2a4gCLKn36Zf0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bifdRy/hyXGBgOMWg/q8tgNrqHNgCyVpxvjlHs3K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https 는 http 에 보안이 추가된 것이다.이는 너무 단순하며, 이렇게만 알고있으면 https 를 설명하기 어렵다. https&amp;nbsp;암호화 및 인증을 위해 SSL/TLS 프로토콜을 사용하는 http 의 보안 버전이다.기본적으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;muyeon95.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;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;5. 요청 전송&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;pre id=&quot;code_1733148685177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET / HTTP/1.1
Host: google.com
User-Agent: [브라우저 정보]
Accept: text/html,application/xhtml+xml,...&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 서버에서 요청 처리 - 응답&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;Google 서버는 HTTP 요청을 받으면, 요청된 리소스(/ 경로)에 대해 적절한 콘텐츠를 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 HTML 페이지, JavaScript 파일, CSS 파일, 이미지 등 여러 리소스를 조합하여 응답을 준비한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1733148766428&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; charset=UTF-8
Content-Length: [응답 크기]
Set-Cookie: [쿠키 정보]
Date: [응답 날짜]&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;7. 렌더링&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;HTML, CSS, Javascript 를 로드하고 실행해, 사용자가 볼 수 있는 페이지가 나타난다.&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8.  면접에 대한 생각&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;/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;b&gt;9. 어떻게 답할까?&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;i&gt;Q. &lt;a href=&quot;https://google.com&quot;&gt;https://google.com&lt;/a&gt; 을 브라우저에 입력하면 무슨일이 일어나는지 설명해주세요.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최초에 &lt;a href=&quot;https://google.com&quot;&gt;https://google.com&lt;/a&gt; 을 입력하면 프로토콜 부분과, 도메인명이 나누어져 파싱됩니다. 파싱된 도메인명은 DNS 서버를 통해 IP 주소로 변환됩니다. 이후 TCP 통신을 시작해 3-way handshake 를 통해 클라이언트와 서버를 확인해 연결합니다. 이어서 SSL-handshake 를 거쳐 통신 준비가 마무리됩니다. 이때 GET 요청이 발생해 서버로 부터 요청하게 되며, 서버에서 요청을 확인 후 응답을 해주게 됩니다. 이후 받은 컨텐츠가 브라우저에 렌더링되며 화면에 보여지게 됩니다.&lt;/p&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-way handshake 는 어떻게 일어나나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼬리질문: SSL-handshake 에서 키를 어떻게 전달하나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼬리질문: 요청과 응답시에 어떤 데이터들을 주고 받나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼬리질문: 여기에서 브라우저 렌더링은 어떻게 일어나게 되나요?&lt;/p&gt;</description>
      <category>브라우저&amp;amp;네트워크</category>
      <category>3 way handshake</category>
      <category>3-way handshake</category>
      <category>google.com 을 입력하면</category>
      <category>http</category>
      <category>https</category>
      <category>naver.com 을 입력하면</category>
      <category>TCP/IP</category>
      <category>TCPIP</category>
      <category>네트워크</category>
      <category>면접</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/339</guid>
      <comments>https://muyeon95.tistory.com/339#entry339comment</comments>
      <pubDate>Mon, 2 Dec 2024 23:31:13 +0900</pubDate>
    </item>
    <item>
      <title>여러개의 input 관리 [React]</title>
      <link>https://muyeon95.tistory.com/338</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;input 을 관리할때 onChange 와 value 를 통해 사용하고 useState 를 통해 관리한다.&lt;br /&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;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;아래 코드는 간단한 todo 리스트의 입력부분이다.&lt;/p&gt;
&lt;pre id=&quot;code_1715942284249&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from &quot;react&quot;;
import &quot;../../styles/index.css&quot;;
import TodoFormButton from &quot;./buttons/TodoFormButton&quot;;

const TodoForm = ({ setTodos }) =&amp;gt; {
  const [title, setTitle] = useState(&quot;&quot;);
  const [content, setContent] = useState(&quot;&quot;);

  const addTodoHandler = (e) =&amp;gt; {
    e.preventDefault();
    if (!title || !content) {
      alert(&quot;빈칸은 허용되지 않습니다.&quot;);
      return;
    }

    const newTodo = {
      id: Date.now(),
      title,
      content,
      complete: false,
    };

    setTodos((prevTodos) =&amp;gt; [...prevTodos, newTodo]);
    setTitle(&quot;&quot;);
    setContent(&quot;&quot;);
  };

  return (
    &amp;lt;div className=&quot;todo-form-wrapper&quot;&amp;gt;
      &amp;lt;form className=&quot;todo-form-container&quot; onSubmit={addTodoHandler}&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor=&quot;title&quot;&amp;gt;제목&amp;lt;/label&amp;gt;
          &amp;lt;input
            type=&quot;text&quot;
            id=&quot;title&quot;
            value={title}
            onChange={(e) =&amp;gt; setTitle(e.target.value)}
          /&amp;gt;
          &amp;lt;label htmlFor=&quot;content&quot;&amp;gt;내용&amp;lt;/label&amp;gt;
          &amp;lt;input
            type=&quot;text&quot;
            id=&quot;content&quot;
            value={content}
            onChange={(e) =&amp;gt; setContent(e.target.value)}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;TodoFormButton /&amp;gt;
      &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default TodoForm;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고민점은 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. onChange 함수를 보면 set 하는 부분을 제외하면 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 현재 코드는 input 이 늘어나면 useState 도 늘어나야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onChange 부분을 함수로 뺀다고 한들 set 부분이 다르기에 조건이 생겨 더욱 보기 안좋아 질 것이다.&lt;/p&gt;
&lt;p data-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;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;좋은 방법은 input 에 name 을 설정하고, 이벤트가 발생했을때 이를 참조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 형태의 관리가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715942583890&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ... 중략

const TodoForm = ({ setTodos }) =&amp;gt; {
  const [inputs, setInputs] = useState({
    title: &quot;&quot;,
    content: &quot;&quot;,
  });

  const onChange = (e) =&amp;gt; {
    
  };

  const addTodoHandler = (e) =&amp;gt; {
    // ... 중략
  };

  return (
    &amp;lt;div className=&quot;todo-form-wrapper&quot;&amp;gt;
      &amp;lt;form className=&quot;todo-form-container&quot; onSubmit={addTodoHandler}&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor=&quot;title&quot;&amp;gt;제목&amp;lt;/label&amp;gt;
          &amp;lt;input
            type=&quot;text&quot;
            id=&quot;title&quot;
            name=&quot;title&quot;
            value={title}
            onChange={onChange}
          /&amp;gt;
          &amp;lt;label htmlFor=&quot;content&quot;&amp;gt;내용&amp;lt;/label&amp;gt;
          &amp;lt;input
            type=&quot;text&quot;
            id=&quot;content&quot;
            name=&quot;content&quot;
            value={content}
            onChange={onChange}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;TodoFormButton /&amp;gt;
      &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default TodoForm;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 값을 참조해 객체를 업데이트 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 onChange 함수에서 구현한다.&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;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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715942844352&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ... 중략

const TodoForm = ({ setTodos }) =&amp;gt; {
  const [inputs, setInputs] = useState({
    title: &quot;&quot;,
    content: &quot;&quot;,
  });

  const onChange = (e) =&amp;gt; {
    const { name, value } = e.target;
    // name 은 input 의 name 이다.
    
    setInputs({
      ...inputs,
      [name]: value,
    })
    
  };

  // ... 중략

export default TodoForm;&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;&amp;nbsp;e.target.name 과 e.target.value 를 추출한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;...inputs 를 사용해 기존 state 를 유지한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;[name]: value 를 사용해 변경된 필드를 업데이트한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;setInputs 를 사용해 업데이트된 state 를 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의점은 [name]: value 부분에 [] 를 넣어주지 않는다면 문자열 name 자체가 들어가져 name 값에 따라 다른 key 값이 변경된다.&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 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;pre id=&quot;code_1715943119683&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from &quot;react&quot;;
import &quot;../../styles/index.css&quot;;
import TodoFormButton from &quot;./buttons/TodoFormButton&quot;;

const TodoForm = ({ setTodos }) =&amp;gt; {
  const [inputs, setInputs] = useState({
    title: &quot;&quot;,
    content: &quot;&quot;,
  });

  const { title, content } = inputs;

  const onChange = (e) =&amp;gt; {
    const { name, value } = e.target;

    setInputs({
      ...inputs,
      [name]: value,
    });
  };

  const addTodoHandler = (e) =&amp;gt; {
    e.preventDefault();
    if (!title || !content) {
      alert(&quot;빈칸은 허용되지 않습니다.&quot;);
      return;
    }

    const newTodo = {
      id: Date.now(),
      title,
      content,
      complete: false,
    };

    setTodos((prevTodos) =&amp;gt; [...prevTodos, newTodo]);
    setInputs({
      title: &quot;&quot;,
      content: &quot;&quot;,
    });
  };

  return (
    &amp;lt;div className=&quot;todo-form-wrapper&quot;&amp;gt;
      &amp;lt;form className=&quot;todo-form-container&quot; onSubmit={addTodoHandler}&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor=&quot;title&quot;&amp;gt;제목&amp;lt;/label&amp;gt;
          &amp;lt;input
            type=&quot;text&quot;
            id=&quot;title&quot;
            name=&quot;title&quot;
            value={title}
            onChange={onChange}
          /&amp;gt;
          &amp;lt;label htmlFor=&quot;content&quot;&amp;gt;내용&amp;lt;/label&amp;gt;
          &amp;lt;input
            type=&quot;text&quot;
            id=&quot;content&quot;
            name=&quot;content&quot;
            value={content}
            onChange={onChange}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;TodoFormButton /&amp;gt;
      &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default TodoForm;&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;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;이로서 여러개의 input이 있는 요구사항도 효율적으로 상태관리를 하는 방법에 대해 알게되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 객체 상태를 업데이트 할 때는 꼭 기존의 상태를 한번 복사하고 특정값을 덮어씌워 새로운 값을 설정해야한다. -&amp;gt; 불변성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hsp0418.tistory.com/171&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hsp0418.tistory.com/171&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715943263434&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;리액트 불변성이란 무엇이고, 왜 지켜야 할까?&quot; data-og-description=&quot;들어가면서 리액트와 불변성의 연관 관계는 리액트가 지향하는 함수형 프로그래밍의 특징에서 발견할 수 있습니다. 함수형 프로그램밍의 특징 중 하나가 순수함수를 사용하는 것인데, 여기서 &quot; data-og-host=&quot;hsp0418.tistory.com&quot; data-og-source-url=&quot;https://hsp0418.tistory.com/171&quot; data-og-url=&quot;https://hsp0418.tistory.com/171&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zu1dm/hyV57hrA5o/U5CpapKwQibkzIQkirYYd0/img.png?width=671&amp;amp;height=375&amp;amp;face=0_0_671_375,https://scrap.kakaocdn.net/dn/OidJX/hyV59M6wCn/ZZgH3Ib8Hiv1J2j8IBU0ok/img.png?width=671&amp;amp;height=375&amp;amp;face=0_0_671_375,https://scrap.kakaocdn.net/dn/dkOBbg/hyV6enj2Io/uyuyxfobmhGfD87JuAyj3k/img.png?width=671&amp;amp;height=375&amp;amp;face=0_0_671_375&quot;&gt;&lt;a href=&quot;https://hsp0418.tistory.com/171&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hsp0418.tistory.com/171&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zu1dm/hyV57hrA5o/U5CpapKwQibkzIQkirYYd0/img.png?width=671&amp;amp;height=375&amp;amp;face=0_0_671_375,https://scrap.kakaocdn.net/dn/OidJX/hyV59M6wCn/ZZgH3Ib8Hiv1J2j8IBU0ok/img.png?width=671&amp;amp;height=375&amp;amp;face=0_0_671_375,https://scrap.kakaocdn.net/dn/dkOBbg/hyV6enj2Io/uyuyxfobmhGfD87JuAyj3k/img.png?width=671&amp;amp;height=375&amp;amp;face=0_0_671_375');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;리액트 불변성이란 무엇이고, 왜 지켜야 할까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;들어가면서 리액트와 불변성의 연관 관계는 리액트가 지향하는 함수형 프로그래밍의 특징에서 발견할 수 있습니다. 함수형 프로그램밍의 특징 중 하나가 순수함수를 사용하는 것인데, 여기서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hsp0418.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.legacy.reactjs.org/docs/faq-state.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.legacy.reactjs.org/docs/faq-state.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715943278296&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;컴포넌트 State &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;ko.legacy.reactjs.org&quot; data-og-source-url=&quot;https://ko.legacy.reactjs.org/docs/faq-state.html&quot; data-og-url=&quot;https://ko.legacy.reactjs.org/docs/faq-state.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bFnfyU/hyV56iAtj6/79OjrV49nuAara0OPYQWmK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ko.legacy.reactjs.org/docs/faq-state.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.legacy.reactjs.org/docs/faq-state.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bFnfyU/hyV56iAtj6/79OjrV49nuAara0OPYQWmK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트 State &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A JavaScript library for building user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.legacy.reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@sunkim/React%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@sunkim/React%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715943250524&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;[React]여러개의 input 상태 관리하기&quot; data-og-description=&quot;input 여러 개 일때 useState를 여러개 사용하는건 좋은 방법이 아님. 좋은 방법은, input에 name이라는 값을 설정하고, 이벤트가 발생했을 때 이값을 참조하는거다. 여러개의 문자열 형태를 가지고 있&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@sunkim/React%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@sunkim/React에서-여러개의-input-상태-관리하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bP68vH/hyV6cQBkSd/WKsclXYbJth8kKqLAQaJp0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ewDCMD/hyV6lmuUIe/Mx7QD3V1ADzkNMzqz3e2R0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/r8UxH/hyV6daSKGt/hlCecC9dMzyRB8rIsxfeWk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://velog.io/@sunkim/React%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@sunkim/React%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bP68vH/hyV6cQBkSd/WKsclXYbJth8kKqLAQaJp0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ewDCMD/hyV6lmuUIe/Mx7QD3V1ADzkNMzqz3e2R0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/r8UxH/hyV6daSKGt/hlCecC9dMzyRB8rIsxfeWk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[React]여러개의 input 상태 관리하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;input 여러 개 일때 useState를 여러개 사용하는건 좋은 방법이 아님. 좋은 방법은, input에 name이라는 값을 설정하고, 이벤트가 발생했을 때 이값을 참조하는거다. 여러개의 문자열 형태를 가지고 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.legacy.reactjs.org/docs/state-and-lifecycle.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.legacy.reactjs.org/docs/state-and-lifecycle.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715943293628&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;State and Lifecycle &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;ko.legacy.reactjs.org&quot; data-og-source-url=&quot;https://ko.legacy.reactjs.org/docs/state-and-lifecycle.html&quot; data-og-url=&quot;https://ko.legacy.reactjs.org/docs/state-and-lifecycle.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LCeE3/hyV6dPuZhY/AajjuQQXSnJcAsdAAxgyu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ko.legacy.reactjs.org/docs/state-and-lifecycle.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.legacy.reactjs.org/docs/state-and-lifecycle.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LCeE3/hyV6dPuZhY/AajjuQQXSnJcAsdAAxgyu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;State and Lifecycle &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A JavaScript library for building user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.legacy.reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>input state</category>
      <category>input 상태관리</category>
      <category>JavaScript</category>
      <category>onChange</category>
      <category>React</category>
      <category>useState</category>
      <category>리액트</category>
      <category>리엑트</category>
      <category>여러 input 상태 관리</category>
      <category>자바스크립트</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/338</guid>
      <comments>https://muyeon95.tistory.com/338#entry338comment</comments>
      <pubDate>Fri, 17 May 2024 19:56:29 +0900</pubDate>
    </item>
    <item>
      <title>Vite</title>
      <link>https://muyeon95.tistory.com/337</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Vite 를 왜 사용해야 할까?&lt;br /&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;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;/p&gt;
&lt;p data-ke-size=&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;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;압축한 파일을 받아와 압축해제 전까지 파일을 조작할 수 없는 것처럼, 또한 번들링된 웹 애플리케이션은 사용자가 임의로 조작할 수 없다.&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;js 에서 변수는 기본적으로 전역범위를 가지기 때문에 하나의 프로젝트 폴더에서 여러 개의 js 파일이 있더라도 공유하는 위험이 있다.&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HMR (Hot Module Replacement)&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;vite 는 기존 HMR 구현 방식과 차별화된 방식으로 구현했다.&lt;/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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ESM (ECMAScript Modules)&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;ESM 은 자바스크립트에 도입된 네이티브 모듈 지원을 의미한다.&lt;/p&gt;
&lt;p data-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;&amp;nbsp;ECMAScript 스펙에 정의된 표준화 모듈 시스템이기에 자바스크립트 환경 및 도구에 호환성을 보장한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;개별 모듈을 가져오고 내보내는 것을 가능하게 해 모듈성과 코드 구성을 향상시킨다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;정적 분석 도구가 코드 종속성을 더 잘 이해하고 최적화 하도록 돕는다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;트리 쉐이킹을 지원하는데 이는 사용되지 않는 코드를 번들에서 제거하는 프로세스로, 결과적으로 더 작고 빠른 애플리케이션을 만들 수 있다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;자바스크립트에 네이티브로 통합되어 외부 모듈 로더나 구성이 필요하지 않다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;vite &amp;amp; ESM&lt;/b&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;&amp;nbsp;vite 는 ESM 네이티브 기능을 사용해 모듈을 효율적으로 로드한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;HMR 이 효과적으로, 수정된 모듈만 업데이트 한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;모듈을 번들링하고 최적화하여 프로덕션 배포를 위한 더 작고 빠른 코드를 생성한다.&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;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Vite 를 사용해야 하는 이유&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;브라우저에서 ESM 을 지원하기 전까지 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;webpack, rollup, percel 과 같은 도구는 이런 번들링 작업을 진행하 줌으로써 프론트엔드 개발자의 생산성을 크게 향상시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 웹 애플리케이션들이 발전함에 따라서 js 모듈의 개수도 많이 증가했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 상황에서 js 기반의 도구는 성능 병목 현상이 발생했고, 번들링 작업의 소요시간은 늘어났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번들러 기반의 도구는 애플리케이션 내의 모든 소스코드에 대해 빌드 작업을 마쳐야만 페이지를 제공할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vite 는 애플리케이션 모듈을 dependencies 와 source code 두가지 카테고리로 나누어 개발 서버의 시작 시간을 개선했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 작업 도구들은 js 로 만들어져 번들링과정이 비효율적이었고, vite 는 사전 번들링으로 Esbuild 를 사용한다. 이는 Go 로 작성되어 기존 번들러 대비 10~100배 빠른 속도를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드도 마찬가지로 컴파일링이 필요하고 수정또한 잦을 수 있다. 이를 모두 불러오는 것은 낭비이다. vite 는 Native ESM 을 통해 이를 제공하고 해결했다. vite 는 브라우저가 요청하는 대로 소스코드를 변환하고 제공하기만 하면 된다. 동적 import 의 경우 현재 화면에서 실제로 사용되는 경우에만 처리된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfPfpY/btsHocY6OL6/yQURijHqGFOvgSisvyD6Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfPfpY/btsHocY6OL6/yQURijHqGFOvgSisvyD6Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfPfpY/btsHocY6OL6/yQURijHqGFOvgSisvyD6Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfPfpY%2FbtsHocY6OL6%2FyQURijHqGFOvgSisvyD6Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;382&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dH5Sa9/btsHowC9M6r/k2hFUhuKR7zWsjpyVZ226k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dH5Sa9/btsHowC9M6r/k2hFUhuKR7zWsjpyVZ226k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dH5Sa9/btsHowC9M6r/k2hFUhuKR7zWsjpyVZ226k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH5Sa9%2FbtsHowC9M6r%2Fk2hFUhuKR7zWsjpyVZ226k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;382&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;382&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;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;이렇게 되는 이유는 &quot;모든 파일&quot; 을 번들링 해야하기 때문이다. 이러한 이슈를 해결하고자 HMR 이라는 대안이 등장했으나 이 역시 명확한 답은 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vite 는 HMR 을 지원하기는 하나 번들러가 아닌 ESM 을 이용한다. 어떤 모듈이 수정되면 vite 는 그저 수정된 모듈과 관련된 부분만을 교체할 뿐이고, 브라우저에서 해당 모듈을 요청하면 교체된 모듈을 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 과정에서 ESM 을 이용해 앱 사이즈가 커져도 HMR 을 포함한 갱신 시간에는 영향을 끼치지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vite 는 HTTP 헤더를 활용해 전체 페이지의 로드 속도를 높인다. 이로 요청 횟수를 최소화해 페이지 로딩을 빠르게 만들어 준다.&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 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;a href=&quot;https://ko.vitejs.dev/guide/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.vitejs.dev/guide/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715600214022&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;Vite&quot; data-og-description=&quot;Vite, 차세대 프런트엔드 개발 툴&quot; data-og-host=&quot;ko.vitejs.dev&quot; data-og-source-url=&quot;https://ko.vitejs.dev/guide/&quot; data-og-url=&quot;https://ko.vitejs.dev&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h0aSO/hyV6ca2D7v/OTmCv22SjVEMhLiuoNzgX0/img.png?width=2600&amp;amp;height=1302&amp;amp;face=0_0_2600_1302,https://scrap.kakaocdn.net/dn/mybCv/hyV58sWPKp/uVJKa4JqX6VR0wCfD4cFv1/img.png?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640&quot;&gt;&lt;a href=&quot;https://ko.vitejs.dev/guide/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.vitejs.dev/guide/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h0aSO/hyV6ca2D7v/OTmCv22SjVEMhLiuoNzgX0/img.png?width=2600&amp;amp;height=1302&amp;amp;face=0_0_2600_1302,https://scrap.kakaocdn.net/dn/mybCv/hyV58sWPKp/uVJKa4JqX6VR0wCfD4cFv1/img.png?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640');&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;Vite&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vite, 차세대 프런트엔드 개발 툴&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.vitejs.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1715600223124&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm create vite@latest&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;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;import 경로를 식별하는 것에 주의해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vite 가 임포트 경로를 추측하는데 사용하는 default 옵션은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715600346258&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이 상황에서 import './Component' 로 ./Component.jsx 를 임포트하는 경우 vite 는 다음 단계를 거친다.&lt;/p&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. /Component 가 존재하는지 확인, 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. /Component.mjs 가 존재하는지 확인, 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. /Component.js 가 존재하는지 확인, 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. /Component.mts 가 존재하는지 확인, 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. /Component.ts 가 존재하는지 확인, 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. /Component.jsx 가 존재하는지 확인, 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 임포트 경로를 식별하는데 6번의 작업이 필요하게 된다. 즉 암시적인 임포트가 많아질 수록 경로를 식별하는데 더 많은 시간이 필요하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임포트 방식을 import './Component.jsx' 와 같이 명시적으로 지정하는 것이 더 좋고, resolve.extensions 의 목록을 좁혀 파일시스템의 작업을 줄이는 방법도 있다. 하지만 후자의 경우 node_modules 내의 파일에 대해서도 잘 수행되는지 확인이 필요하다.&lt;/p&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 를 사용하는 경우 tsconfig.json 의 compilerOptions 에 &quot;moduleResolution&quot;: &quot;bundler&quot; 와 &quot;allowImportingTsExtensions&quot;: true 를 추가해 .ts 와 .tsx 확장자를 코드에서 바로 사용할 수 있다.&lt;/p&gt;
&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;a href=&quot;https://ko.vitejs.dev/guide/performance.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.vitejs.dev/guide/performance.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715600614037&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;Vite&quot; data-og-description=&quot;Vite, 차세대 프런트엔드 개발 툴&quot; data-og-host=&quot;ko.vitejs.dev&quot; data-og-source-url=&quot;https://ko.vitejs.dev/guide/performance.html&quot; data-og-url=&quot;https://ko.vitejs.dev&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ok4LQ/hyV571SIdC/lx22mq7ynZE1vgVmGiMA80/img.png?width=2600&amp;amp;height=1302&amp;amp;face=0_0_2600_1302,https://scrap.kakaocdn.net/dn/bwdbfM/hyV6jgVJKQ/YygHUwkznSMjvKUYkmLMYK/img.png?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640&quot;&gt;&lt;a href=&quot;https://ko.vitejs.dev/guide/performance.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.vitejs.dev/guide/performance.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ok4LQ/hyV571SIdC/lx22mq7ynZE1vgVmGiMA80/img.png?width=2600&amp;amp;height=1302&amp;amp;face=0_0_2600_1302,https://scrap.kakaocdn.net/dn/bwdbfM/hyV6jgVJKQ/YygHUwkznSMjvKUYkmLMYK/img.png?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640');&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;Vite&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vite, 차세대 프런트엔드 개발 툴&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.vitejs.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;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;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;/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;a href=&quot;https://ko.vitejs.dev/guide/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.vitejs.dev/guide/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715600748502&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;Vite&quot; data-og-description=&quot;Vite, 차세대 프런트엔드 개발 툴&quot; data-og-host=&quot;ko.vitejs.dev&quot; data-og-source-url=&quot;https://ko.vitejs.dev/guide/&quot; data-og-url=&quot;https://ko.vitejs.dev&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h0aSO/hyV6ca2D7v/OTmCv22SjVEMhLiuoNzgX0/img.png?width=2600&amp;amp;height=1302&amp;amp;face=0_0_2600_1302,https://scrap.kakaocdn.net/dn/mybCv/hyV58sWPKp/uVJKa4JqX6VR0wCfD4cFv1/img.png?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640&quot;&gt;&lt;a href=&quot;https://ko.vitejs.dev/guide/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.vitejs.dev/guide/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h0aSO/hyV6ca2D7v/OTmCv22SjVEMhLiuoNzgX0/img.png?width=2600&amp;amp;height=1302&amp;amp;face=0_0_2600_1302,https://scrap.kakaocdn.net/dn/mybCv/hyV58sWPKp/uVJKa4JqX6VR0wCfD4cFv1/img.png?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640');&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;Vite&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vite, 차세대 프런트엔드 개발 툴&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.vitejs.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>esm</category>
      <category>HMR</category>
      <category>vite</category>
      <category>번들링</category>
      <category>빌드</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/337</guid>
      <comments>https://muyeon95.tistory.com/337#entry337comment</comments>
      <pubDate>Mon, 13 May 2024 20:48:02 +0900</pubDate>
    </item>
    <item>
      <title>Virtual DOM</title>
      <link>https://muyeon95.tistory.com/336</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리엑트를 사용하는 이유에는 여러가지가 있다.&lt;br /&gt;&lt;/span&gt;그중에서 가상 DOM 은 큰 특징이다.&lt;/blockquote&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;DOM&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;웹 페이지나 웹 앱에 있는 HTML 요소들을 구조적으로 표현한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM 은 애플리케이션 전체 UI 를 나타내고 트리 구조로 표현된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 Web Document 에 있는 각 UI 요소에 대한 노드가 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발자가 자바스크립트를 통해 컨텐츠를 수정할 수 있기 때문에 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 구조화된 형식으로 되어 있어 특정 대상을 선택할 수 있고 모든 코드 작업이 쉬워지기 때문에 도움이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM 은 트리 구조로 되어 있어 이해하기 쉽지만, 노드의 수가 많아질 수록 느려지고, DOM 업데이트에 잦은 오류를 발생시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 최근 웹은 SPA 를 사용한다. 하나의 웹 페이지를 어플리케이션처럼 구성하는 SPA 에서는 HTML 문서 자체가 하나이며, 여러 동적인 기능이 들어가기에 안그래도 리소스가 모두 합쳐진 무거운 HTML 문서를 지속적으로 재렌더링 해주어야 하는 문제점이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM 을 업데이트 하는 것은 컨텐츠 변경을 포함할 뿐 아니라 훨씬 더 많은 작업들이 요구된다. 또한 CSS 를 다시 계산하고 레이아웃을 변경하려면 복잡하며 성능에 영향을 끼친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 화면의 변경사항을 DOM 을 직접 조작해 브라우저에 반영했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법의 큰 단점은 DOM 트리가 수정될 때마다 렌더 트리가 계속해서 실시간으로 갱신된다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에서 100개의 수정사항이 발생하면 수정 할 때마다 새로운 렌더 트리가 100번 수정되면서 새롭게 만들어지게 된다.&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;b&gt;Virtual DOM&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;리엑트에서 사용하는 가상 DOM 도 실제 DOM 내용에 기반하여 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 DOM 은 실제로 화면에 렌더링 하는 것이 아니기에 DOM 을 직접 업데이트하는 것 보다 상대적으로 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 DOM 은 가상 UI 표현이 메모리에 유지되고 React DOM 과 같은 라이브러리에 의해 실제 DOM 에 동기화된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 리엑트의 선언적 API 를 가능하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 DOM 에는 브라우저가 화면을 그리는데 필요한 모든 정보가 들어있어 실제 DOM 을 조작하는 작업이 무겁기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리엑트는 실제 DOM 의 변경 사항을 빠르게 파악하고 반영하기 위해 내부적으로 가상 DOM 을 만들어 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 DOM 은 실제 DOM 에서 처리하는 방식이 아닌 가상 DOM 과 메모리에서 미리 처리하고 저장한 후 실제 DOM 과 동기화하는 개념이다. 해당 DOM 을 컴포넌트 단위로 쪼개어 HTML 컴포넌트 조립품 처럼 다루는 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Virtual DOM 은 왜 효율적일까?&lt;/i&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;가상 DOM 을 사용하면 실제 DOM 을 접근해 조작하는 대신, 이를 추상화한 자바스크립트 객체를 구성해 사용한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DOM 의 상태를 메모리에 저장하고 변경 전과 변경 후의 상태를 비교한 뒤 최소한의 내용반 반영해 성능 향상이 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DOM 의 상태를 메모리 위에 계속 올려두고 DOM 에 변경이 있을 경우 해당 변경 사항만 반영한다.&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;b&gt;실제 DOM 은 느릴까?&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;리엑트는 대규모 SPA 와 다이나믹 UI 의 웹 페이지를 만들기 위해 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 규모가 작고 정적인 이전의 웹 애플리케이션이라면 일반 DOM 이 성능이 더 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 DOM 은 초기 정적인 웹페이지에 맞게 설계되어 정적인 성격을 가지고 있으며 현재 트렌드인 동적인 웹 애플리케이션에 사용하려면 성능적인 문제가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 SPA 에서는 DOM 조작이 빈번하게 발생하며 그 변화를 적용하기 위해 브라우저는 많은 연산을 하게 되고 전체적인 프로세스가 비효율적이게 된다.&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;b&gt;정리&lt;/b&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;&amp;nbsp;Virtual DOM 은 Real DOM 의 가상 표현이다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;리엑트는 먼저 Virtual DOM 의 상태 변경을 업데이트 한 다음 Real DOM 과 동기화 한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Virtual DOM 은 기계의 청사진과 같아서 청사진을 변경할 수 있지만 이런 변경사항은 직접 적용되지 않는다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Virtual DOM 은 UI의 가상 표현이 ReactDOM 과 같은 라이브러리에 의해 Real DOM 과 동기화된 메모리에 유지되는 프로그래밍 개념이며 이를 조정이라고 한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Virtual DOM 이 성능을 더 빠르게 만드는 것은 처리 자체가 더 짧은 시간에 완료되기 때문이 아니다. 그 이유는 변경된 정보의 양이다. 전체 페이지를 업데이트 하는 데 시간을 낭비하는 대식 작은 요소와 상호작용을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Real DOM&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Virtual DOM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;업데이트&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;느리다.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;빠르다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;HTML 업데이트 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;HTML 을 직접적으로 업데이트&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;HTML 을 직접적으로 업데이트 하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;새로운 element 업데이트 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;새로운 element 가 업데이트 된 경우 새로운 DOM 생성&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;새로운 element 가 업데이트 된 경우 새로운 Virtual DOM 생성 후 이전 DOM 과 비교해 차이점만 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;메모리&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;메모리 낭비가 심함&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;메모리 낭비가 덜함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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 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;a href=&quot;https://www.geeksforgeeks.org/reactjs-virtual-dom/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.geeksforgeeks.org/reactjs-virtual-dom/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714744222234&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;ReactJS Virtual DOM - GeeksforGeeks&quot; data-og-description=&quot;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&quot; data-og-host=&quot;www.geeksforgeeks.org&quot; data-og-source-url=&quot;https://www.geeksforgeeks.org/reactjs-virtual-dom/&quot; data-og-url=&quot;https://www.geeksforgeeks.org/reactjs-virtual-dom/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHnLsc/hyVZsTjYfT/yidIOn27OqaFsP55GiqyBK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/6kDg3/hyVZnEroXo/Kfmazw7y9mjy3Cr5CF1KB0/img.png?width=500&amp;amp;height=600&amp;amp;face=0_0_500_600&quot;&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/reactjs-virtual-dom/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.geeksforgeeks.org/reactjs-virtual-dom/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHnLsc/hyVZsTjYfT/yidIOn27OqaFsP55GiqyBK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/6kDg3/hyVZnEroXo/Kfmazw7y9mjy3Cr5CF1KB0/img.png?width=500&amp;amp;height=600&amp;amp;face=0_0_500_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ReactJS Virtual DOM - GeeksforGeeks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.geeksforgeeks.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@ctdlog/React-DOM%EC%9D%B4%EB%9E%80-Virtual-DOM%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@ctdlog/React-DOM%EC%9D%B4%EB%9E%80-Virtual-DOM%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714744012974&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;[React] DOM이란? Virtual DOM을 사용하는 이유?&quot; data-og-description=&quot;React의 장점 중에는 Virtual DOM이 있다. 근데 대체 Virtual DOM이 무엇일까?Virtual은 말 그대로 가상이라는 뜻이고 DOM은 Document Object Model의 약자로 그대로 해석하면 문서 객체 모델을 의미한다. 문서 객&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ctdlog/React-DOM%EC%9D%B4%EB%9E%80-Virtual-DOM%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot; data-og-url=&quot;https://velog.io/@ctdlog/React-DOM이란-Virtual-DOM을-사용하는-이유&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eIYoTR/hyVZnxHplT/qByP01pSCAkAENWVsybe11/img.png?width=1280&amp;amp;height=700&amp;amp;face=0_0_1280_700,https://scrap.kakaocdn.net/dn/c5VMfK/hyVZoi5agn/WiInRkK0HEE2lleJW0Yzt0/img.png?width=1280&amp;amp;height=700&amp;amp;face=0_0_1280_700,https://scrap.kakaocdn.net/dn/bsSyAv/hyVZeU5btw/YglmHYVgXck0fhOAbZ2x3K/img.png?width=1280&amp;amp;height=700&amp;amp;face=0_0_1280_700&quot;&gt;&lt;a href=&quot;https://velog.io/@ctdlog/React-DOM%EC%9D%B4%EB%9E%80-Virtual-DOM%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ctdlog/React-DOM%EC%9D%B4%EB%9E%80-Virtual-DOM%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eIYoTR/hyVZnxHplT/qByP01pSCAkAENWVsybe11/img.png?width=1280&amp;amp;height=700&amp;amp;face=0_0_1280_700,https://scrap.kakaocdn.net/dn/c5VMfK/hyVZoi5agn/WiInRkK0HEE2lleJW0Yzt0/img.png?width=1280&amp;amp;height=700&amp;amp;face=0_0_1280_700,https://scrap.kakaocdn.net/dn/bsSyAv/hyVZeU5btw/YglmHYVgXck0fhOAbZ2x3K/img.png?width=1280&amp;amp;height=700&amp;amp;face=0_0_1280_700');&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;[React] DOM이란? Virtual DOM을 사용하는 이유?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React의 장점 중에는 Virtual DOM이 있다. 근데 대체 Virtual DOM이 무엇일까?Virtual은 말 그대로 가상이라는 뜻이고 DOM은 Document Object Model의 약자로 그대로 해석하면 문서 객체 모델을 의미한다. 문서 객&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://junilhwang.github.io/TIL/Javascript/Design/Vanilla-JS-Virtual-DOM/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://junilhwang.github.io/TIL/Javascript/Design/Vanilla-JS-Virtual-DOM/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714744015886&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;Vanilla Javascript로 가상돔(VirtualDOM) 만들기 | 개발자 황준일&quot; data-og-description=&quot;Vanilla Javascript로 가상돔(VirtualDOM) 만들기 본 포스트는 React와 Vue에서 사용되고 있는 가상돔(VirtualDOM) 직접 만들어보는 내용이다. 그리고 이 포스트를 읽기 전에 Vanilla Javascript로 웹 컴포넌트 만들&quot; data-og-host=&quot;junilhwang.github.io&quot; data-og-source-url=&quot;https://junilhwang.github.io/TIL/Javascript/Design/Vanilla-JS-Virtual-DOM/&quot; data-og-url=&quot;https://junilhwang.github.io/TIL/Javascript/Design/Vanilla-JS-Virtual-DOM/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ckCMur/hyVZrfOHei/xKQk1KtG285yYbDG0f6EGK/img.png?width=1202&amp;amp;height=839&amp;amp;face=0_0_1202_839,https://scrap.kakaocdn.net/dn/bThgWM/hyVZiQH1p4/CinCgEkdRZASeZdgh9z6Fk/img.png?width=1123&amp;amp;height=622&amp;amp;face=0_0_1123_622,https://scrap.kakaocdn.net/dn/d2y91C/hyVZetZo6o/LIEZVGwN1qpZc8DX8TC3m1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=0_0_460_460&quot;&gt;&lt;a href=&quot;https://junilhwang.github.io/TIL/Javascript/Design/Vanilla-JS-Virtual-DOM/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://junilhwang.github.io/TIL/Javascript/Design/Vanilla-JS-Virtual-DOM/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ckCMur/hyVZrfOHei/xKQk1KtG285yYbDG0f6EGK/img.png?width=1202&amp;amp;height=839&amp;amp;face=0_0_1202_839,https://scrap.kakaocdn.net/dn/bThgWM/hyVZiQH1p4/CinCgEkdRZASeZdgh9z6Fk/img.png?width=1123&amp;amp;height=622&amp;amp;face=0_0_1123_622,https://scrap.kakaocdn.net/dn/d2y91C/hyVZetZo6o/LIEZVGwN1qpZc8DX8TC3m1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=0_0_460_460');&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;Vanilla Javascript로 가상돔(VirtualDOM) 만들기 | 개발자 황준일&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vanilla Javascript로 가상돔(VirtualDOM) 만들기 본 포스트는 React와 Vue에서 사용되고 있는 가상돔(VirtualDOM) 직접 만들어보는 내용이다. 그리고 이 포스트를 읽기 전에 Vanilla Javascript로 웹 컴포넌트 만들&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;junilhwang.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://doqtqu.tistory.com/316&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://doqtqu.tistory.com/316&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714744023496&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;Virtual DOM, 가상 돔 이란?&quot; data-og-description=&quot;DOM(Document Object Model) 웹 페이지나 웹 앱에 있는 HTML 요소들을 구조적으로 표현한 것이다. DOM은 애플리케이션의 전체 UI를 나타내며 트리 데이터 구조로 표현된다. 여기에는 Web Document에 있는 각 UI &quot; data-og-host=&quot;doqtqu.tistory.com&quot; data-og-source-url=&quot;https://doqtqu.tistory.com/316&quot; data-og-url=&quot;https://doqtqu.tistory.com/316&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dHsHUj/hyVZpPOJ1P/rzSQUTRAgHCt2aTGXC3B80/img.png?width=800&amp;amp;height=292&amp;amp;face=0_0_800_292,https://scrap.kakaocdn.net/dn/LHaPc/hyVZm6Dt7l/keJBG6nIt4tvdSxsUeDGCK/img.png?width=800&amp;amp;height=292&amp;amp;face=0_0_800_292,https://scrap.kakaocdn.net/dn/bxQ1YY/hyVZs6Q5iA/EwZOQq3FtPHX3zjsHOHEyk/img.png?width=1363&amp;amp;height=499&amp;amp;face=0_0_1363_499&quot;&gt;&lt;a href=&quot;https://doqtqu.tistory.com/316&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://doqtqu.tistory.com/316&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dHsHUj/hyVZpPOJ1P/rzSQUTRAgHCt2aTGXC3B80/img.png?width=800&amp;amp;height=292&amp;amp;face=0_0_800_292,https://scrap.kakaocdn.net/dn/LHaPc/hyVZm6Dt7l/keJBG6nIt4tvdSxsUeDGCK/img.png?width=800&amp;amp;height=292&amp;amp;face=0_0_800_292,https://scrap.kakaocdn.net/dn/bxQ1YY/hyVZs6Q5iA/EwZOQq3FtPHX3zjsHOHEyk/img.png?width=1363&amp;amp;height=499&amp;amp;face=0_0_1363_499');&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;Virtual DOM, 가상 돔 이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DOM(Document Object Model) 웹 페이지나 웹 앱에 있는 HTML 요소들을 구조적으로 표현한 것이다. DOM은 애플리케이션의 전체 UI를 나타내며 트리 데이터 구조로 표현된다. 여기에는 Web Document에 있는 각 UI&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;doqtqu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://legacy.reactjs.org/docs/faq-internals.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://legacy.reactjs.org/docs/faq-internals.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714744094857&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;Virtual DOM and Internals &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;legacy.reactjs.org&quot; data-og-source-url=&quot;https://legacy.reactjs.org/docs/faq-internals.html&quot; data-og-url=&quot;https://legacy.reactjs.org/docs/faq-internals.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CcvUG/hyVZtknjLD/kOS8SF1Kzlk3nREGEcDKv1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://legacy.reactjs.org/docs/faq-internals.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://legacy.reactjs.org/docs/faq-internals.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CcvUG/hyVZtknjLD/kOS8SF1Kzlk3nREGEcDKv1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Virtual DOM and Internals &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A JavaScript library for building user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;legacy.reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>dom</category>
      <category>JavaScript</category>
      <category>React</category>
      <category>real dom</category>
      <category>virtual dom</category>
      <category>가상 DOM</category>
      <category>리엑트</category>
      <category>자바스크립트</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/336</guid>
      <comments>https://muyeon95.tistory.com/336#entry336comment</comments>
      <pubDate>Fri, 3 May 2024 22:55:52 +0900</pubDate>
    </item>
    <item>
      <title>이벤트 버블링 &amp;amp; 캡처링</title>
      <link>https://muyeon95.tistory.com/335</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;바닐라 JS 로 프로그래밍을 하다보면 생기는 현상이 있다.&lt;br /&gt;&lt;/span&gt;이벤트를 다른 곳에 지정했는데 왜 상위요소가 지정되지?&lt;br /&gt;왜 하위요소도 전부..?&lt;/blockquote&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;event flow&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;DOM 이벤트 흐름에는 캡처링, 타겟, 버블링 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;/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;257&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvG4CF/btsG78WNc3k/qBmBpbsQbknVKEINAimMA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvG4CF/btsG78WNc3k/qBmBpbsQbknVKEINAimMA0/img.png&quot; data-alt=&quot;테이블 안 td 태그를 클릭했을때 이벤트의 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvG4CF/btsG78WNc3k/qBmBpbsQbknVKEINAimMA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvG4CF%2FbtsG78WNc3k%2FqBmBpbsQbknVKEINAimMA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;196&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테이블 안 td 태그를 클릭했을때 이벤트의 흐름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;td 태그를 클릭하게 되면 이벤트가 최상위에서 시작해 아래로 전파. -&amp;gt; 캡처링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트가 타겟 요소에 도착해 실행 된다. -&amp;gt; 타겟&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 위로 전파된다. -&amp;gt; 버블링&lt;/p&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개의 phase 중에서 이벤트 핸들러가 실행되는 과정은 원래 target phase, bubbling phase 이나, 필요에 따라서 capture phase 와 target phase 에서 발생하도록 할 수 있다.&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;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;이벤트 캡처링은 이벤트 리스너에 세번째 매개변수로 true 를 지정해 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1714657953629&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;element.addEventListener('click', (e) =&amp;gt; {
	// 이벤트 처리
}, true)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true 매개변수는 이벤트가 하위 요소로 캡처되는 단계에서 이벤트 핸들러를 실행하도록 한다.&lt;/p&gt;
&lt;p data-ke-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;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;/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 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;예를 들어 input 에 들어가는 onfocus 같은 이벤트는 버블링되지 않는다.&lt;/p&gt;
&lt;p data-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;style5&quot; /&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;&amp;nbsp;&lt;/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;이게 없다면 UI 요소에 로직 관련된 것이 너무 많이 들어가 보기 좋지 않고,&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 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;event.stopPropagation() 으로 버블링을 제어할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 사용하면 이벤트가 상위 요소로 전파되는 것을 막는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714657704968&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;element.addEventListener('click', (e) =&amp;gt; {
	e.stopPropagation();
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 방식으로 의도치 않은 버블링 발생을 피할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이를 사용할 땐 항상 주의해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때떄로 이벤트의 전파를 막는 것이 예상치 못한 문제를 일으킬 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 e.stopPropagation() 은 이벤트 버블링 뿐 아니라 이벤트 캡처링도 중단시킨다.&lt;/p&gt;
&lt;p data-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;style5&quot; /&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;a href=&quot;https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714659357712&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;이벤트 버블링, 이벤트 캡처 그리고 이벤트 위임까지&quot; data-og-description=&quot;(기본) 이벤트 버블링, 이벤트 캡처링, 그리고 이벤트 위임까지 이벤트 전달 방식과 관련된 모든 것을 파헤쳐 봅니다.&quot; data-og-host=&quot;joshua1988.github.io&quot; data-og-source-url=&quot;https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/&quot; data-og-url=&quot;https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/P57vL/hyVVIQK7iF/UZN3nDBXiphicKROlvrK0k/img.png?width=580&amp;amp;height=400&amp;amp;face=0_0_580_400,https://scrap.kakaocdn.net/dn/DIEFs/hyVVxhoZme/OZSkv8OTGl6azZlfh4zWIk/img.png?width=580&amp;amp;height=400&amp;amp;face=0_0_580_400,https://scrap.kakaocdn.net/dn/RnbNO/hyVVMyP9zi/GkmcQde8JIpOUkFTcB1rn1/img.png?width=918&amp;amp;height=840&amp;amp;face=0_0_918_840&quot;&gt;&lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/P57vL/hyVVIQK7iF/UZN3nDBXiphicKROlvrK0k/img.png?width=580&amp;amp;height=400&amp;amp;face=0_0_580_400,https://scrap.kakaocdn.net/dn/DIEFs/hyVVxhoZme/OZSkv8OTGl6azZlfh4zWIk/img.png?width=580&amp;amp;height=400&amp;amp;face=0_0_580_400,https://scrap.kakaocdn.net/dn/RnbNO/hyVVMyP9zi/GkmcQde8JIpOUkFTcB1rn1/img.png?width=918&amp;amp;height=840&amp;amp;face=0_0_918_840');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;이벤트 버블링, 이벤트 캡처 그리고 이벤트 위임까지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(기본) 이벤트 버블링, 이벤트 캡처링, 그리고 이벤트 위임까지 이벤트 전달 방식과 관련된 모든 것을 파헤쳐 봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;joshua1988.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/hcleedev/web-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81-%EC%9C%84%EC%9E%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f85d9c728561&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/hcleedev/web-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81-%EC%9C%84%EC%9E%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f85d9c728561&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714659367645&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;Web: 이벤트 버블링과 캡처링, 위임 알아보기&quot; data-og-description=&quot;DOM에서의 이벤트 버블링, 캡처링, target, 리고 위임 패턴에 대해 알아보자&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/hcleedev/web-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81-%EC%9C%84%EC%9E%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f85d9c728561&quot; data-og-url=&quot;https://medium.com/hcleedev/web-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81-%EC%9C%84%EC%9E%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f85d9c728561&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ST4Qk/hyVZnRIxZW/nRo0t4bXeKE2ODOrSNP6I1/img.jpg?width=1200&amp;amp;height=797&amp;amp;face=0_0_1200_797&quot;&gt;&lt;a href=&quot;https://medium.com/hcleedev/web-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81-%EC%9C%84%EC%9E%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f85d9c728561&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/hcleedev/web-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81-%EC%9C%84%EC%9E%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f85d9c728561&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ST4Qk/hyVZnRIxZW/nRo0t4bXeKE2ODOrSNP6I1/img.jpg?width=1200&amp;amp;height=797&amp;amp;face=0_0_1200_797');&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;Web: 이벤트 버블링과 캡처링, 위임 알아보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DOM에서의 이벤트 버블링, 캡처링, target, 리고 위임 패턴에 대해 알아보자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714659373689&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;  한눈에 이해하는 이벤트 흐름 제어 (버블링 &amp;amp; 캡처링)&quot; data-og-description=&quot;HTML 이벤트의 흐름 HTML 문서의 각 엘리먼트들은 아래와 같이 태그 안의 태그가 위치하는 식으로 계층적으로 이루어짐을 볼 수 있다. 이러한 계층적 구조 특징 때문에 만일 HTML 요소에 이벤트가 &quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81&quot; data-og-url=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zTpQ5/hyVZl7qfpj/9hCQt2sVbIeevAFqXal0I0/img.jpg?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/bf4Jz4/hyVZibNZym/gNCeXkRKyRYMpy3pYjwuVk/img.jpg?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/gE7I6/hyVVKVkcp8/3invd3Jgs3UXlHcumzMCD0/img.jpg?width=1400&amp;amp;height=840&amp;amp;face=0_0_1400_840&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zTpQ5/hyVZl7qfpj/9hCQt2sVbIeevAFqXal0I0/img.jpg?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/bf4Jz4/hyVZibNZym/gNCeXkRKyRYMpy3pYjwuVk/img.jpg?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/gE7I6/hyVVKVkcp8/3invd3Jgs3UXlHcumzMCD0/img.jpg?width=1400&amp;amp;height=840&amp;amp;face=0_0_1400_840');&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;  한눈에 이해하는 이벤트 흐름 제어 (버블링 &amp;amp; 캡처링)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML 이벤트의 흐름 HTML 문서의 각 엘리먼트들은 아래와 같이 태그 안의 태그가 위치하는 식으로 계층적으로 이루어짐을 볼 수 있다. 이러한 계층적 구조 특징 때문에 만일 HTML 요소에 이벤트가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/bubbling-and-capturing&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/bubbling-and-capturing&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714659391129&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;버블링과 캡처링&quot; data-og-description=&quot;&quot; data-og-host=&quot;ko.javascript.info&quot; data-og-source-url=&quot;https://ko.javascript.info/bubbling-and-capturing&quot; data-og-url=&quot;https://ko.javascript.info/bubbling-and-capturing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cfZ5lg/hyVVDhA0uv/J6Q2FM5hdWXyuLqgnYWDXk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/OJR1F/hyVZqgAHER/mRhuuRHiJoFjzsOiH8fYG1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/bubbling-and-capturing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.javascript.info/bubbling-and-capturing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cfZ5lg/hyVVDhA0uv/J6Q2FM5hdWXyuLqgnYWDXk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/OJR1F/hyVZqgAHER/mRhuuRHiJoFjzsOiH8fYG1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;버블링과 캡처링&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.javascript.info&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>event bubbling and event capturing</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>이벤트 버블링</category>
      <category>이벤트 버블링과 캡처링</category>
      <category>이벤트 버블링과 캡쳐링</category>
      <category>이벤트 캡처링</category>
      <category>이벤트 캡쳐링</category>
      <category>자바스크립트</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/335</guid>
      <comments>https://muyeon95.tistory.com/335#entry335comment</comments>
      <pubDate>Thu, 2 May 2024 23:17:49 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript &amp;amp; TypeScript</title>
      <link>https://muyeon95.tistory.com/334</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;요즘 TypeScript 가 선호된다. &lt;br /&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;javascript &amp;amp; typescript&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;&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;&lt;b&gt;typescript&lt;/b&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;* 컴파일은 컴퓨터가 이해할 수 있는 언어로 바꾸어 주는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-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;style5&quot; /&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;/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;개발자는 로직과 같은 큰 구조에 집중할 수 있게 된다. 또 객체 안의 필드값을 다 기억할 필요 없이 IDE가 자동으로 리스트업을 해주기 때문에 생산성에 큰 기여를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트는 자바스크립트의 슈퍼 셋이다. 슈퍼 셋은 특정한 언어의 모든 기능을 포함하면서 다른 기능까지 활용가능하도록 확장된 것을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트를 적용하는 경우 기존의 자바스크립트로 짜인 코드에 확장하는 식으로 대규모 수정 없이도 타입스크립트를 적용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;javascript vs typescript&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;i&gt;1. 동적 타입 vs 정적 타입&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/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;/p&gt;
&lt;p data-ke-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;i&gt;2. 컴파일 vs 인터프리터&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트와 타입스크립트는 언어를 해석하는 과정에 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 인터프리터 언어인데, 인터프리터 언어란 소스코드를 한줄한줄 읽어가며 명령을 바로 처리하는 언어로 코드가 즉시 실행되기 때문에 컴파일 언어에 비해 빠르다는 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 타입스크립트는 컴파일 언어이다. 컴파일 언어는 소스코드 전체를 컴퓨터가 이해할 수 있는 기계어로 변환하는 언어로 변환과 실행이 따로 이루어진다. 소스코드를 기계어로 번역하는 과정에서 인터프리터 언어에 비해 시간이 오래걸리지만 런타임 상황에서는 모든 소스코드가 변환되어 있기에 빠르게 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;typescript 의 단점은?&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;i&gt;1. 초기세팅&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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;i&gt;2. 생산성 저하&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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;또 타입스크립트에서 지원하는 interface, class 등에 매번 변수명을 지정하면서 길어지는 변수명과 관리 포인트가 늘어나 생산성이 저하될 수 있다.&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 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;/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;또 타입스크립트의 다양한 기능들이 존재한다. pick, emit, decorator 등 을 활용해 더욱 안전하고 편리한 기능들을 이용할 수 있어 사용을 안할 이유가 없다고 생각이든다.&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@theon2/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9E%A5%EB%8B%A8%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@theon2/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9E%A5%EB%8B%A8%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714564209864&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자바스크립트와 타입스크립트의 차이, 장/단점에 대해 설명해주세요.&quot; data-og-description=&quot;JavaScript와 TypeScript는 모두 널리 사용되는 프로그래밍 언어로, 웹 개발을 위해 주로 사용됩니다. 둘 사이에는 몇 가지 중요한 차이점이 있는데, 이를 통해 각 언어의 장점과 단점을 이해할 수 있&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@theon2/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9E%A5%EB%8B%A8%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94&quot; data-og-url=&quot;https://velog.io/@theon2/자바스크립트와-타입스크립트의-차이-장단점에-대해-설명해주세요&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPJVuO/hyVZnqqPuO/fPJh5cTSdbzUdmUcNPRNGK/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/gR5gf/hyVVBqkOGB/5tkGWHmexrAdHZlMCdtsDk/img.png?width=388&amp;amp;height=376&amp;amp;face=0_0_388_376&quot;&gt;&lt;a href=&quot;https://velog.io/@theon2/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9E%A5%EB%8B%A8%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@theon2/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9E%A5%EB%8B%A8%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPJVuO/hyVZnqqPuO/fPJh5cTSdbzUdmUcNPRNGK/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/gR5gf/hyVVBqkOGB/5tkGWHmexrAdHZlMCdtsDk/img.png?width=388&amp;amp;height=376&amp;amp;face=0_0_388_376');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트와 타입스크립트의 차이, 장/단점에 대해 설명해주세요.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript와 TypeScript는 모두 널리 사용되는 프로그래밍 언어로, 웹 개발을 위해 주로 사용됩니다. 둘 사이에는 몇 가지 중요한 차이점이 있는데, 이를 통해 각 언어의 장점과 단점을 이해할 수 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elancer.co.kr/blog/view?seq=183#:~:text=Javascript%EB%8A%94%20%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%20%EC%96%B8%EC%96%B4%EC%9D%B8%EB%8D%B0,%EB%8A%94%20'%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EC%96%B8%EC%96%B4'%EC%9E%85%EB%8B%88%EB%8B%A4.&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.elancer.co.kr/blog/view?seq=183#:~:text=Javascript%EB%8A%94%20%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%20%EC%96%B8%EC%96%B4%EC%9D%B8%EB%8D%B0,%EB%8A%94%20'%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EC%96%B8%EC%96%B4'%EC%9E%85%EB%8B%88%EB%8B%A4.&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714564216573&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;TypeScript 사용하는 이유, 현직 웹 개발가 알려드립니다! I 이랜서&quot; data-og-description=&quot;안정적인 개발과 높은 수준의 코드 품질을 유지하는데 좋은 프로그램 언어 'Typescript'의 특징과 사용하는 이유에 대해 이랜서에서 알려드립니다. I react typescript, typescript playground, typescript enum, type&quot; data-og-host=&quot;www.elancer.co.kr&quot; data-og-source-url=&quot;https://www.elancer.co.kr/blog/view?seq=183#:~:text=Javascript%EB%8A%94%20%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%20%EC%96%B8%EC%96%B4%EC%9D%B8%EB%8D%B0,%EB%8A%94%20'%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EC%96%B8%EC%96%B4'%EC%9E%85%EB%8B%88%EB%8B%A4.&quot; data-og-url=&quot;https://www.elancer.co.kr/blog/view?seq=183&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZncGD/hyVZrl3QV5/K2ytnUSLQcf464u03OtYsK/img.jpg?width=1920&amp;amp;height=1200&amp;amp;face=0_0_1920_1200,https://scrap.kakaocdn.net/dn/pX8xT/hyVVFfeeAD/Usf4EBPHOqJ7ngKulLuKM0/img.jpg?width=1920&amp;amp;height=1200&amp;amp;face=0_0_1920_1200,https://scrap.kakaocdn.net/dn/dLKwpW/hyVVyUF6vY/C9moBlgU6oCO13fO4VKV30/img.jpg?width=1920&amp;amp;height=1200&amp;amp;face=0_0_1920_1200&quot;&gt;&lt;a href=&quot;https://www.elancer.co.kr/blog/view?seq=183#:~:text=Javascript%EB%8A%94%20%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%20%EC%96%B8%EC%96%B4%EC%9D%B8%EB%8D%B0,%EB%8A%94%20'%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EC%96%B8%EC%96%B4'%EC%9E%85%EB%8B%88%EB%8B%A4.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.elancer.co.kr/blog/view?seq=183#:~:text=Javascript%EB%8A%94%20%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%20%EC%96%B8%EC%96%B4%EC%9D%B8%EB%8D%B0,%EB%8A%94%20'%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EC%96%B8%EC%96%B4'%EC%9E%85%EB%8B%88%EB%8B%A4.&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZncGD/hyVZrl3QV5/K2ytnUSLQcf464u03OtYsK/img.jpg?width=1920&amp;amp;height=1200&amp;amp;face=0_0_1920_1200,https://scrap.kakaocdn.net/dn/pX8xT/hyVVFfeeAD/Usf4EBPHOqJ7ngKulLuKM0/img.jpg?width=1920&amp;amp;height=1200&amp;amp;face=0_0_1920_1200,https://scrap.kakaocdn.net/dn/dLKwpW/hyVVyUF6vY/C9moBlgU6oCO13fO4VKV30/img.jpg?width=1920&amp;amp;height=1200&amp;amp;face=0_0_1920_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;TypeScript 사용하는 이유, 현직 웹 개발가 알려드립니다! I 이랜서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안정적인 개발과 높은 수준의 코드 품질을 유지하는데 좋은 프로그램 언어 'Typescript'의 특징과 사용하는 이유에 대해 이랜서에서 알려드립니다. I react typescript, typescript playground, typescript enum, type&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.elancer.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://f-lab.kr/insight/javascript-and-typescript-for-modern-web-development?gad_source=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://f-lab.kr/insight/javascript-and-typescript-for-modern-web-development?gad_source=1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714564227459&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;현대 웹 개발을 위한 자바스크립트와 타입스크립트의 이해&quot; data-og-description=&quot;이 글에서는 자바스크립트와 타입스크립트의 기본 개념과 차이점을 설명하고, 현대 웹 개발에 두 언어를 어떻게 효과적으로 활용할 수 있는지 탐구합니다. 또한, 자바스크립트와 타입스크립트&quot; data-og-host=&quot;f-lab.kr&quot; data-og-source-url=&quot;https://f-lab.kr/insight/javascript-and-typescript-for-modern-web-development?gad_source=1&quot; data-og-url=&quot;https://f-lab.kr/ai-blog/javascript-and-typescript-for-modern-web-development&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tAvYt/hyVVDuVzPt/niTDsqUvRQJy3kWluRvOE0/img.jpg?width=1792&amp;amp;height=1024&amp;amp;face=0_0_1792_1024,https://scrap.kakaocdn.net/dn/FGcO1/hyVVA52Fgh/kgoez2dBpcVNRDUqlXiOXK/img.jpg?width=1792&amp;amp;height=1024&amp;amp;face=0_0_1792_1024&quot;&gt;&lt;a href=&quot;https://f-lab.kr/insight/javascript-and-typescript-for-modern-web-development?gad_source=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://f-lab.kr/insight/javascript-and-typescript-for-modern-web-development?gad_source=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tAvYt/hyVVDuVzPt/niTDsqUvRQJy3kWluRvOE0/img.jpg?width=1792&amp;amp;height=1024&amp;amp;face=0_0_1792_1024,https://scrap.kakaocdn.net/dn/FGcO1/hyVVA52Fgh/kgoez2dBpcVNRDUqlXiOXK/img.jpg?width=1792&amp;amp;height=1024&amp;amp;face=0_0_1792_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;현대 웹 개발을 위한 자바스크립트와 타입스크립트의 이해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 자바스크립트와 타입스크립트의 기본 개념과 차이점을 설명하고, 현대 웹 개발에 두 언어를 어떻게 효과적으로 활용할 수 있는지 탐구합니다. 또한, 자바스크립트와 타입스크립트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;f-lab.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.guru99.com/ko/typescript-vs-javascript.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.guru99.com/ko/typescript-vs-javascript.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714564258077&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;TypeScript와 JavaScript &amp;ndash; 차이점&quot; data-og-description=&quot;TypeScript와 JavaScript: TypeScript와 JavaScript의 차이점 - JavaScript는 대화형 웹 페이지를 만드는 데 도움이 되는 스크립팅 언어인 반면 Typescript는 JavaScript의 상위 집합입니다.&quot; data-og-host=&quot;www.guru99.com&quot; data-og-source-url=&quot;https://www.guru99.com/ko/typescript-vs-javascript.html&quot; data-og-url=&quot;https://www.guru99.com/ko/typescript-vs-javascript.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XanIr/hyVVCQjYED/Ja1d8ISx490FQJxNtgjOb1/img.png?width=546&amp;amp;height=401&amp;amp;face=0_0_546_401,https://scrap.kakaocdn.net/dn/bI3zNy/hyVVL0MD36/UtblB6n6mIJEc4kKJInkaK/img.png?width=546&amp;amp;height=401&amp;amp;face=0_0_546_401&quot;&gt;&lt;a href=&quot;https://www.guru99.com/ko/typescript-vs-javascript.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.guru99.com/ko/typescript-vs-javascript.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XanIr/hyVVCQjYED/Ja1d8ISx490FQJxNtgjOb1/img.png?width=546&amp;amp;height=401&amp;amp;face=0_0_546_401,https://scrap.kakaocdn.net/dn/bI3zNy/hyVVL0MD36/UtblB6n6mIJEc4kKJInkaK/img.png?width=546&amp;amp;height=401&amp;amp;face=0_0_546_401');&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;TypeScript와 JavaScript &amp;ndash; 차이점&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TypeScript와 JavaScript: TypeScript와 JavaScript의 차이점 - JavaScript는 대화형 웹 페이지를 만드는 데 도움이 되는 스크립팅 언어인 반면 Typescript는 JavaScript의 상위 집합입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.guru99.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>JavaScript</category>
      <category>javascript vs typescript</category>
      <category>js</category>
      <category>TS</category>
      <category>TypeScript</category>
      <category>자바스크립트</category>
      <category>자바스크립트 vs 타입스크립트</category>
      <category>자바스크립트 타입스크립트</category>
      <category>컴파일</category>
      <category>타입스크립트</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/334</guid>
      <comments>https://muyeon95.tistory.com/334#entry334comment</comments>
      <pubDate>Wed, 1 May 2024 20:51:38 +0900</pubDate>
    </item>
    <item>
      <title>this [re:]</title>
      <link>https://muyeon95.tistory.com/333</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;this 는 무엇일까?&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;this&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;자바스크립트도 비슷할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않다. 자바스크립트가 조금 특별하기 때문인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 함수는 객체, 그 중에서도 일급 객체이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일급 객체인 자바스크립트 함수는 변수나 데이터에 할당할 수 있고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 함수에 인수 또는 반환값으로도 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714480986658&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 변수나 데이터에 저장

const myFunc = func

// 2. 함수의 인수로 전달

function func1(func2) {}

// 3. 함수의 반환값으로 사용

function func1() {
	...
    return func1
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 특징으로 자바스크립트의 함수는 다양한 환경에서 호출될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;func(), test.func(), tt.func()&lt;/p&gt;
&lt;p data-ke-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;그만큼 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;this 는 어떤 객체에 의해 호출되냐에 따라서 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;자바스크립트에서 모든 함수는 this 를 가지고 있다. 그리고 함수가 호출되면 상황에 따라 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;이렇게 this 가 동적으로 결정되는 것을 this 가 &quot;그 객체에 바인딩 된다&quot; 라고 표현을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 엔진은 프로그램을 실행하면 모든 실행 가능한 코드를 평가해서 실행 문맥을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 실행 가능한 코드는 전역 코드, 함수 코드, eval 코드 이다. 이 코드별로 실행 문맥이 만들어 진다.&lt;/p&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 바인딩 컴포넌트에 우리가 알고 있는 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;함수가 실행이 되면 전역 코드 실행을 잠깐 멈추고 또 다시 실행 문맥을 만들게 된다. 이 타이밍에 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;&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;그럼 함수가 객체에 의해 호출되지 않는 상황에서는 어떻게 this 가 바인딩 될까?&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;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;this binding rules&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 는 기본적으로 4가지 규칙에 의해서 바인딩 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 바인딩, 암시적 바인딩, new 바인딩, 명시적 바인딩&lt;/p&gt;
&lt;p data-ke-size=&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;i&gt;1. 기본 바인딩&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714482487109&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function showThis() {
	console.log(this);
}

function showThisStrictMode() {
	'use strict'
    console.log(this);
}

showThis(); // window
showThisStrictMode(); // 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;이처럼 함수를 단독호출 했을때 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;feat. 노드 환경에서는 global 을 가리킨다. 그리고 {}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;2. 암시적 바인딩&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714482672427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = {
	name: 'muyeon',
    getName() {
    	return this.name;
    }
}

console.log(obj.getName()); // muyeon&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 방식을 암시적 바인딩이라고 하는데 조심해야 할 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714482815747&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = {
	name: 'muyeon',
    getName() {
    	return this.name;
    },
};

function showReturnValue(callback) {
	console.log(callback());
}

showReturnValue(obj.getName); // 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;예상과 다르게 undefined 가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 객체를 할당한 변수는 해당 객체의 참조값을 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;obj.getName 프로퍼티에는 getName 함수에 대한 참조가 들어 있는 것이다.&lt;/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;마찬가지로 showReturnValue 에 obj.getName 을 전달하면 동일한 함수를 참조하는 또 다른 레퍼런스가 콜백 변수에 저장되어서 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/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;참조타입은 자바스크립트 명세서에서만 사용되는 타입인데, 프로퍼티 뿐만 아니라 프로퍼티를 가지고 있는 객체와 strict 모드인지 아닌지에 대한 여부를 같이 가지고 있는 하나의 타입이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/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;이렇게 한두다리만 건너도 바인딩된 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;i&gt;3. 명시적 바인딩 (call, apply, bind)&lt;/i&gt;&lt;/p&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;이를 통해 this 가 소실되는 문제를 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 객체는 call, apply, bind 를 통해 명시적으로 바인딩을 해결하는 방법을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714483556378&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;call(context, arg1, arg2, ...)

apply(context, args)&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 과 apply 를 사용하면 this 를 바인딩할 객체를 지정한 상태로 함수를 호출할 수 있다.&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 과 apply 는 인수를 전달하는 방법에만 차이가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714483660229&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func.bind(context, arg1, arg2, ...)&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;bind 메서드는 this 가 참조하는 객체를 고정시켜 준다.&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;이렇게 항상 같은 객체에 바인딩 되도록 강제하는 방법을 하드 바인딩이라고도 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;4. new 바인딩&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 함수를 new 방식으로도 호출할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 호출하게 되면 생성자 함수로서의 역할을 수행할 수 있게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1714483920182&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	obj = {} // create new Object
    this = obj // bind
    
    this.name = &quot;muyeon&quot; // obj : { name: &quot;muyeon&quot; }
    
    return this
}&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;new 연산자를 사용해 this 가 바인딩되는 규칙을 new 바인딩이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&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;5. 바인딩 우선 순위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new 바인딩 &amp;gt; 암시적 바인딩 &amp;gt; 명시적 바인딩 &amp;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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;arrow function&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;pre id=&quot;code_1714484092904&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = {
	name: 'muyeon'
    showNameInSec(sec) {
    	setTimeout(() =&amp;gt; {
        	console.log(this.name);
        }, sec);
    }
}

obj.showNameInSec(1000); // muyeon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화살표 함수는 상위 실행 문맥을 유지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렉시컬 스코프와 관계 없이 호출 당시에는 의존하는 기존의 바인딩 규칙은 화살표 함수 안에서 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;화살표 함수 안에서 this 는 선언될 당시에 상위 스코프 그 스코프에 해당하는 실행 문맥 상의 this 바인딩 컴포넌트를 참조한다.&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;이런 this 를 렉시컬 this, 어휘적 this 라고 부른다.&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 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;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714484359887&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;this - JavaScript | MDN&quot; data-og-description=&quot;JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bRjkh4/hyVVFzmLEQ/dOfDplwjYEzxCaejrnQ3Bk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bRjkh4/hyVVFzmLEQ/dOfDplwjYEzxCaejrnQ3Bk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;this - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/js-this&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://poiemaweb.com/js-this&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714484368882&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;this | PoiemaWeb&quot; data-og-description=&quot;자바스크립트의 this keyword는 Java와 같은 익숙한 언어의 개념과 달라 개발자에게 혼란을 준다. Java에서의 this는 인스턴스 자신(self)을 가리키는 참조변수이다. this가 객체 자신에 대한 참조 값을 &quot; data-og-host=&quot;poiemaweb.com&quot; data-og-source-url=&quot;https://poiemaweb.com/js-this&quot; data-og-url=&quot;https://poiemaweb.com/js-this&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dc96Gh/hyVVBcDLng/VK5HkopV7H0tAjlXjzCKt0/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/cy77vo/hyVZhp3xw0/d7MinGbwqrokMQqePMgal1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/dJ17td/hyVZlFYjNL/JuLhF79jPt3EAqpoc3iXbK/img.png?width=1504&amp;amp;height=535&amp;amp;face=0_0_1504_535&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/js-this&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://poiemaweb.com/js-this&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dc96Gh/hyVVBcDLng/VK5HkopV7H0tAjlXjzCKt0/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/cy77vo/hyVZhp3xw0/d7MinGbwqrokMQqePMgal1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/dJ17td/hyVZlFYjNL/JuLhF79jPt3EAqpoc3iXbK/img.png?width=1504&amp;amp;height=535&amp;amp;face=0_0_1504_535');&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;this | PoiemaWeb&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트의 this keyword는 Java와 같은 익숙한 언어의 개념과 달라 개발자에게 혼란을 준다. Java에서의 this는 인스턴스 자신(self)을 가리키는 참조변수이다. this가 객체 자신에 대한 참조 값을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;poiemaweb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-this-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-this-%EC%B4%9D%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714484379721&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;[JS]   자바스크립트 this   완전 정복&quot; data-og-description=&quot;this 정의 let group = { title: &amp;quot;1모둠&amp;quot;, students: [&amp;quot;보라&amp;quot;, &amp;quot;호진&amp;quot;, &amp;quot;지민&amp;quot;], title2 : this.title, title3() { console.log(this.title) } }; console.log(group.title2); //undefined group.title3(); // 1모둠 this는 함수의 블록 스코프 내에&quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-this-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; data-og-url=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-this-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctxQm2/hyVVL7oFyS/jxNjbBWIDyy3fp67InPKN0/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/c4oaFS/hyVZgEF7om/iTdEIgKr2B0kRfXkJqFZTK/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/eBdF9/hyVZjIarYD/J2uQj7X9SwQkjR2KlpE9PK/img.png?width=1482&amp;amp;height=527&amp;amp;face=0_0_1482_527&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-this-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-this-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctxQm2/hyVVL7oFyS/jxNjbBWIDyy3fp67InPKN0/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/c4oaFS/hyVZgEF7om/iTdEIgKr2B0kRfXkJqFZTK/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/eBdF9/hyVZjIarYD/J2uQj7X9SwQkjR2KlpE9PK/img.png?width=1482&amp;amp;height=527&amp;amp;face=0_0_1482_527');&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;[JS]   자바스크립트 this   완전 정복&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;this 정의 let group = { title: &quot;1모둠&quot;, students: [&quot;보라&quot;, &quot;호진&quot;, &quot;지민&quot;], title2 : this.title, title3() { console.log(this.title) } }; console.log(group.title2); //undefined group.title3(); // 1모둠 this는 함수의 블록 스코프 내에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7RiMu2DQrb4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=7RiMu2DQrb4&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=7RiMu2DQrb4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/pQs3u/hyVZsLSuRq/a87l9Yoflbg3PBnTVhmpj0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=812_146_892_234&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[10분 테코톡]   브콜의 This&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/7RiMu2DQrb4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://im-developer.tistory.com/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://im-developer.tistory.com/96&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714484397496&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;[JS/this] 자바스크립트, this의 4가지 역할&quot; data-og-description=&quot;Javascript, This. 자바스크립트에는 this라는 키워드가 있다. this는 문맥에 따라서 다양한 값을 가지는 데, this가 쓰이는 함수를 어떤 방식으로 실행하느냐에 따라서 그 역할이 구별된다. this의 값들&quot; data-og-host=&quot;im-developer.tistory.com&quot; data-og-source-url=&quot;https://im-developer.tistory.com/96&quot; data-og-url=&quot;https://im-developer.tistory.com/96&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SXwVV/hyVZk1nBMp/Lls0QH0kMZYDGjWNkhzoIk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ccVYgX/hyVZs6bEj6/KwTjTsbh03eQaUxTAyVfp1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://im-developer.tistory.com/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://im-developer.tistory.com/96&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SXwVV/hyVZk1nBMp/Lls0QH0kMZYDGjWNkhzoIk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ccVYgX/hyVZs6bEj6/KwTjTsbh03eQaUxTAyVfp1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JS/this] 자바스크립트, this의 4가지 역할&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Javascript, This. 자바스크립트에는 this라는 키워드가 있다. this는 문맥에 따라서 다양한 값을 가지는 데, this가 쓰이는 함수를 어떤 방식으로 실행하느냐에 따라서 그 역할이 구별된다. this의 값들&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;im-developer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>JavaScript</category>
      <category>javascript this</category>
      <category>js</category>
      <category>js this</category>
      <category>this</category>
      <category>자바스크립트</category>
      <category>자바스크립트 this</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/333</guid>
      <comments>https://muyeon95.tistory.com/333#entry333comment</comments>
      <pubDate>Tue, 30 Apr 2024 22:40:25 +0900</pubDate>
    </item>
    <item>
      <title>Javascript Closure</title>
      <link>https://muyeon95.tistory.com/332</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클로져를 알기위해서는 실행 컨텍스트에 대해 알아야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://muyeon95.tistory.com/317&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://muyeon95.tistory.com/317&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714391268981&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;실행 컨텍스트&quot; data-og-description=&quot;실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다. 이는 자바스크립트의 동적 언어로서의 성격을 가장 잘 파악할 수 있는 개념이다. 자바스크립트는 어떤 실행 컨텍스트&quot; data-og-host=&quot;muyeon95.tistory.com&quot; data-og-source-url=&quot;https://muyeon95.tistory.com/317&quot; data-og-url=&quot;https://muyeon95.tistory.com/317&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bi3TQ7/hyVZhwCYjF/yZlKNZvQIkRcJZnkKj6yHk/img.png?width=313&amp;amp;height=161&amp;amp;face=0_0_313_161,https://scrap.kakaocdn.net/dn/bCI50i/hyVZefAKt8/4XNcVzlICARL82k0YC1PO1/img.png?width=313&amp;amp;height=161&amp;amp;face=0_0_313_161,https://scrap.kakaocdn.net/dn/bnHG9V/hyVZqf1I8d/hGbkm0c7TQWYaZH4i4kie1/img.png?width=313&amp;amp;height=161&amp;amp;face=0_0_313_161&quot;&gt;&lt;a href=&quot;https://muyeon95.tistory.com/317&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://muyeon95.tistory.com/317&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bi3TQ7/hyVZhwCYjF/yZlKNZvQIkRcJZnkKj6yHk/img.png?width=313&amp;amp;height=161&amp;amp;face=0_0_313_161,https://scrap.kakaocdn.net/dn/bCI50i/hyVZefAKt8/4XNcVzlICARL82k0YC1PO1/img.png?width=313&amp;amp;height=161&amp;amp;face=0_0_313_161,https://scrap.kakaocdn.net/dn/bnHG9V/hyVZqf1I8d/hGbkm0c7TQWYaZH4i4kie1/img.png?width=313&amp;amp;height=161&amp;amp;face=0_0_313_161');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;실행 컨텍스트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다. 이는 자바스크립트의 동적 언어로서의 성격을 가장 잘 파악할 수 있는 개념이다. 자바스크립트는 어떤 실행 컨텍스트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;muyeon95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif 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;style5&quot; /&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;MDN : 함수와 함수가 선언된 어휘적 환경의 조합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;????????????&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 MDN 이 만능은 아니다.&lt;/p&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 에서 선언한 변수 a 를 참조하는 내부 함수 B를 외부로 전달할 경우 A 의 실행 컨텍스트가 종료된 이후에도 변수 a 가 사라지지 않는 현상&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex code&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;pre id=&quot;code_1714391633430&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function something() {
	const x = 10;
    function sum(y) {
    	return x + y; // something 함수에서 선언한 x 변수 참조
    }
    return sum; // 내부함수 sum 을 외부로 전달
}

const some = something();
console.log(some(3)); // 13
// x 변수가 사라지지 않는다.&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;2)&lt;/p&gt;
&lt;pre id=&quot;code_1714393705022&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function sum(x) {
	return function (y) {
    	return x + y;
    }
}

const add = sum(2);
console.log(add(7));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;1. 코드 평가&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;첫번째로 Global 에 LexicalEnvironment 를 생성하고 전역 코드 평가가 이루어 진다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;코드 평가에서는 sum 함수와 add 변수를 호이스팅해 record 에 add 와 sum 함수를 기록해둔다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;현재 전역 코드 평가가 이루어지고 있기 때문에 outer 에는 null 이 할당된다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;콜 스택에 Global 의 LexicalEnvironment 를 push 하게 된다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;코드 평가 과정 종료&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;i&gt;2. 코드 순차적으로 진행&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;add 변수에 값을 할당하기 위해 sum 함수를 호출한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Global 의 LexicalEnvironment 코드 평가 과정과 동일하게 sum 함수도 LexicalEnvironment 를 생성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;sum 함수 내부의 코드 평가 진행&lt;/li&gt;
&lt;li&gt;&amp;nbsp;코드 평가에서는 매개변수 x 와 return 문에 있는 익명함수를 호이스팅해 record 에 기록해둔다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;outer 에는 상위 스코프인 Global 의 LexicalEnvironment 를 가리킨다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;콜 스택에 sum 의 LexicalEnvironment 를 push 하게 된다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;sum의 LexicalEnvironment 의 outer 는 함수가 호출되어 평ㅇ가되는 시점이 아닌 함수가 선언되는 시점에 결정된다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Global 의 LexicalEnvironment 코드 평가 과정에 sum 함수가 선언되었으니 sum 의 LexicalEnvironment outer 에는 Global 의 LexicalEnvironment 를 가리키게 된다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;sum 의 코드 평가 과정이 종료되어 코드가 한 줄씩 실행된다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;매개변수 x 에는 인자로 넘겨준 2를 할당&lt;/li&gt;
&lt;li&gt;&amp;nbsp;record 안에 x 변수에 2를 기록&lt;/li&gt;
&lt;li&gt;&amp;nbsp;이후 실행할 코드가 없으니 sum 의 LexicalEnvironment 는 콜 스택에서 pop 된다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Global 의 LexicalEnvironment 로 돌아와 add 변수에 sum 함수의 리턴값인 익명함수를 할당한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;record 에 있는 add 변수에 익명함수를 할당한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;마지막 전역 코드인 console.log 를 실행하기 위해 add 함수를 호출하게 된다.&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;i&gt;3. add 함수 호출&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;add 함수에 호출이 일어나면 add 에 LexicalEnvironment 를 생성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;add 함수 내부 코드 평가&lt;/li&gt;
&lt;li&gt;&amp;nbsp;매개변수 y 를 호이스팅해 record 에 기록&lt;/li&gt;
&lt;li&gt;&amp;nbsp;outer 에는 sum 의 LexicalEnvironment 를 가리키게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 이상한 점은 현재 콜 스택에는 Global 의 LexicalEnvironment 만 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 add 의 LexicalEnvironment 의 outer 는 sum 의 LexicalEnvironment 를 가리키게 할 수 있을까?&lt;/p&gt;
&lt;p data-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;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;활용&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;1) before&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714395236262&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let cnt = 0;
function cntPlus() {
	cnt = cnt + 1;
}

console.log(cnt);
cntPlus();
console.log(cnt);

// 1억개의 코드
cnt = 100;
// 1억개의 코드
cntPlus();
console.log(cnt);&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;이를 해결하기 위해서 cnt 를 은닉화해 접근을 막고 cnt 의 state 를 유지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&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;i&gt;2) after&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714395485373&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function closure() {
	let cnt = 0;
    function cntPlus() {
    	cnt = cnt + 1;
    }
    function setCnt(value) {
    	cnt = value;
    }
    function printCnt() {
    	console.log(cnt);
    }
    return {
		cntPlus,
        setCnt,
        printCnt,
	}
}

const cntClosure = closure();
console.log(cntClosure);
cntClosure.printCnt();
cntClosure.cntPlus();
cntClosure.printCnt();
cntClosure.printCnt();
cntClosure.setCnt(100);
cntClosure.printCnt();&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;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;/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;a href=&quot;https://poiemaweb.com/js-closure&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://poiemaweb.com/js-closure&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714395527144&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;Closure | PoiemaWeb&quot; data-og-description=&quot;클로저(closure)는 자바스크립트에서 중요한 개념 중 하나로 자바스크립트에 관심을 가지고 있다면 한번쯤은 들어보았을 내용이다. execution context에 대한 사전 지식이 있으면 이해하기 어렵지 않&quot; data-og-host=&quot;poiemaweb.com&quot; data-og-source-url=&quot;https://poiemaweb.com/js-closure&quot; data-og-url=&quot;https://poiemaweb.com/js-closure&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e0NzY/hyVVzyVWXw/5rY6L3bJNjfwqLytya5jo1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/cAX83t/hyVVBQ4CfH/zk1fBlOWukpbV8GAExO920/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/iFyVn/hyVZfMmbRv/iAsslAV5V3i0xc6f8629z0/img.png?width=1575&amp;amp;height=958&amp;amp;face=0_0_1575_958&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/js-closure&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://poiemaweb.com/js-closure&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e0NzY/hyVVzyVWXw/5rY6L3bJNjfwqLytya5jo1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/cAX83t/hyVVBQ4CfH/zk1fBlOWukpbV8GAExO920/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/iFyVn/hyVZfMmbRv/iAsslAV5V3i0xc6f8629z0/img.png?width=1575&amp;amp;height=958&amp;amp;face=0_0_1575_958');&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;Closure | PoiemaWeb&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로저(closure)는 자바스크립트에서 중요한 개념 중 하나로 자바스크립트에 관심을 가지고 있다면 한번쯤은 들어보았을 내용이다. execution context에 대한 사전 지식이 있으면 이해하기 어렵지 않&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;poiemaweb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714395516772&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;Closures - JavaScript | MDN&quot; data-og-description=&quot;A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function's scope from an inner function. In JavaScript, closur&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c24tKQ/hyVVICFEVq/FZsdK0K0pF2HhvK3pIbVlk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c24tKQ/hyVVICFEVq/FZsdK0K0pF2HhvK3pIbVlk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;Closures - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function's scope from an inner function. In JavaScript, closur&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/closure&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/closure&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714395029009&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;변수의 유효범위와 클로저&quot; data-og-description=&quot;&quot; data-og-host=&quot;ko.javascript.info&quot; data-og-source-url=&quot;https://ko.javascript.info/closure&quot; data-og-url=&quot;https://ko.javascript.info/closure&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/l4t1s/hyVVFeScSI/lOH0YHSd2vAZT20wM6QU10/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jbVHv/hyVVMyhY2E/Uk0hdh8SJ6R5oItDN4woY1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/closure&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.javascript.info/closure&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/l4t1s/hyVVFeScSI/lOH0YHSd2vAZT20wM6QU10/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jbVHv/hyVVMyhY2E/Uk0hdh8SJ6R5oItDN4woY1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;변수의 유효범위와 클로저&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.javascript.info&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=LL0DGc5pg7A&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=LL0DGc5pg7A&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=LL0DGc5pg7A&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/b8nJI5/hyVZf6ElPN/BZa6gml80MNJ376IocvK6K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;자바스크립트 클로저 실용적이고 쉬운 설명&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/LL0DGc5pg7A&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PJjPVfQO61o&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=PJjPVfQO61o&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PJjPVfQO61o&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/90oqg/hyVVICFxkG/kIvQ6USKZq7AUeQCCfV0k0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[10분 테코톡] 꼬재의 클로저&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PJjPVfQO61o&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>closure</category>
      <category>JavaScript</category>
      <category>js 클로져</category>
      <category>스코프</category>
      <category>실행 컨텍스트</category>
      <category>자바스크립트</category>
      <category>자바스크립트 클로저</category>
      <category>클로저</category>
      <category>클로져</category>
      <category>호이스팅</category>
      <author>muyeon</author>
      <guid isPermaLink="true">https://muyeon95.tistory.com/332</guid>
      <comments>https://muyeon95.tistory.com/332#entry332comment</comments>
      <pubDate>Mon, 29 Apr 2024 21:59:37 +0900</pubDate>
    </item>
  </channel>
</rss>